«Требуемая» функциональность Clearscript Javascript

#c# #twilio-programmable-chat #clearscript

#c# #twilio-программируемый чат #clearscript

Вопрос:

Я пытаюсь написать оболочку C # для программируемого инструмента чата Twilio. Предоставляемая библиотека предназначена для клиентов JS. Я думал, что использование такого инструмента, как ClearScript (V8), позволит мне обернуть js по мере необходимости.

Примером кода на сайте является

 const Chat = require('twilio-chat');

// Make a secure request to your backend to retrieve an access token.
// Use an authentication mechanism to prevent token exposure to 3rd parties.

const accessToken = '<your accessToken>';

Chat.Client.create(accessToken)
  .then(client => {
   // Use Programmable Chat client
});
  

итак, после того, как я инициализирую

 using (var engine = new V8ScriptEngine())
{
  engine.Execute(@"
    const Chat = require('twilio-chat.js');

    const token = 'my token';

    Chat.Client.create(token).then(client=>{
    });
  ");
 }
  

Ошибки программы в строке ‘require’ с ошибкой require не определены.
Я прочитал, что require просто возвращает модуль экспорта, поэтому я заменил require(‘…
с

 engine.Execute(@"
    const Chat = ('twilio-chat.js').module.exports;
...
  

но эти ошибки с не удается прочитать свойство ‘exports’ из undefined’

Я получил файл js отhttps://media.twiliocdn.com/sdk/js/chat/releases/4.0.0/twilio-chat.js

Как я могу обойти это или, может быть, есть лучший способ. Я ценю любые идеи.

Спасибо

Ответ №1:

Я ничего не знаю о Twilio, но вот как включить поддержку модуля CommonJS в ClearScript. Этот пример загружает скрипт из Интернета, но вы можете ограничить его локальной файловой системой или предоставить пользовательский загрузчик:

 engine.AddHostType(typeof(Console));
engine.DocumentSettings.AccessFlags = DocumentAccessFlags.EnableWebLoading;
engine.DocumentSettings.SearchPath = "https://media.twiliocdn.com/sdk/js/chat/releases/4.0.0/";
engine.Execute(new DocumentInfo() { Category = ModuleCategory.CommonJS }, @"
    const Chat = require('twilio-chat');
    const token = 'my token';
    Chat.Client.create(token).then(
        client => Console.WriteLine(client.toString()),
        error => Console.WriteLine(error.toString())
    );
");
  

Это успешно загружает сценарий Twilio, который, по-видимому, зависит от других сценариев и ресурсов, которые не являются частью стандартной среды JavaScript, предоставляемой ClearScript / V8. Чтобы заставить его работать, вам придется увеличить путь поиска и, возможно, предоставить дополнительные ресурсы вручную. Как показано, этот код выводится ReferenceError: setTimeout is not defined .

Комментарии:

1. Спасибо. Это помогло мне лучше понять работу ClearScript, и я продвинулся так же далеко, как и вы. Спасибо, спасибо, спасибо вам.

2. @BitCortex — не могли бы вы расширить «Этот пример загружает скрипт из Интернета, но вы можете ограничить его локальной файловой системой или предоставить пользовательский загрузчик:» пожалуйста? Я заинтересован в загрузке начального локального скрипта, который затем назовет другие локальные скрипты, которые ему требуются. В моем случае начальный сценарий — это процедурный код, а сценарии, которые он захочет загрузить, — это файлы, представляющие классы JS, к которым он относится. Таким образом, первый сценарий может хотеть показать зарплату для сотрудника, для которого он хотел бы потребовать файл класса с именем emp.js в котором находится класс emp с методом showSalary.

3. @VanquishedWombat Можно использовать engine.DocumentSettings.AccessFlags для включения загрузки из Интернета, файловой системы или обоих. Вы также можете изменить engine.DocumentSettings.Loader (или даже engine.DocumentSettings себя), но это, вероятно, излишне. Ознакомьтесь с документацией ClearScript по API.