Как создается API в YodaOS?

Node.js

В сообществе Node.js на самом деле нет недостатка в фреймворках для генерации RESTful API через Markdown.Требуемые API данные согласовываются в определенном формате, затем ключевые данные извлекаются путем разбора документа Markdown, и, наконец, генерируются модель базы данных и служба HTTPS.

YodaOS, как интерфейсная операционная система, также использует аналогичную технологию. Приложения в YodaOS делятся на: lightapp и extapp.Первое представляет собой легкое приложение, интегрированное в процесс среды выполнения голосового взаимодействия (Vui-daemon).Он в основном используется для сценария с простым взаимодействием и быстрым откликом, таким как регулировка громкости, системный контроль и т.д. Последний, как самостоятельный процесс, общается с основным процессом через Дочерний процесс.Сценариями использования в основном являются музыка, игры, телефон и другие приложения, которыми нужно пользоваться длительное время.

Зачем нужны легкие приложения?Легкое приложение больше похоже на сценарий.Всякий раз, когда пользователь взаимодействует один раз, достаточно вызвать ответ из предварительно загруженного сценария, вызвав функцию, определенную в соответствующем сценарии.Часто этот тип взаимодействия с приложением относительно прост. ipc или даже форк при каждом взаимодействии расточительны с точки зрения производительности и памяти.

В начале проектирования мы рассчитывали, что для разработчиков нет необходимости в разных типах приложений, а нужно только изменить тип в package.json, а API YodaOS должен остаться точно таким же. В этом случае мы сталкиваемся с проблемой: даже если мы сможем достичь высокой степени абстракции, нам придется модифицировать два кода каждый раз, когда мы добавляем интерфейс, что на самом деле противоречит нашему первоначальному дизайнерскому замыслу.

API Descriptor

С этой целью мы вводим понятие дескриптора API:GitHub.com/yo'd-pro то есть...DSL, написанный на JavaScript, который описывает каждый API YodaOS, включая определения пространств имен, событий, методов и т. д. Когда система будет инициализирована, она загрузит все дескрипторы API, а затем сгенерирует соответствующие API в lightapp и extapp соответственно.

Object.assign(ActivityDescriptor.prototype,
  {
    /**
     * When the app is active.
     * @event yodaRT.activity.Activity#active
     */
    active: {
      type: 'event'
    },
    /**
     * When the Activity API is ready.
     * @event yodaRT.activity.Activity#ready
     */
    ready: {
      type: 'event'
    },
    /**
     * When an activity is created.
     * @event yodaRT.activity.Activity#create
     */
    created: {
      type: 'event'
    }
  }
)

Приведенный выше код определяет несколько событий в Activity соответственно:active,readyиcreate. Итак, в любом приложении вы можете написать:

module.exports = activity => {
  activity.on('active', () => console.log('app activated'))
  activity.on('ready', () => console.log('app is ready'))
  activity.on('created', () => console.log('app is created'))
}

Далее, давайте посмотрим, как определяются «методы»:

Object.assign(ActivityDescriptor.prototype,
  {
    /**
     * Get all properties, it contains the following fields:
     * - `deviceId` the device id.
     * - `deviceTypeId` the device type id.
     * - `key` the cloud key.
     * - `secret` the cloud secret.
     * - `masterId` the userId or masterId.
     *
     * @memberof yodaRT.activity.Activity
     * @instance
     * @function get
     * @returns {Promise<object>}
     * @example
     * module.exports = function (activity) {
     *   activity.on('ready', () => {
     *     activity.get().then((props) => console.log(props))
     *   })
     * }
     */
    get: {
      type: 'method',
      returns: 'promise',
      fn: function get () {
        return Promise.resolve(this._runtime.getCopyOfCredential())
      }
    },
  }
)

Видно, что так же, как и при определении событий, вам нужно только добавить соответствующий объект в цепочку прототипов дескриптора, затем установить тип в метод, а затем реализовать функцию в fn.

module.exports = activity => {
  activity.get().then(
    (data) => console.log('credentialse is', data),
    (err) => console.error('something went wrong', err))
}

Таким образом, в дополнение к унифицированным определениям API также проще создать унифицированный справочник API на основе JSDoc для разработчиков, чтобы модификация всего API была простой и легко читаемой, с низким порогом и низкой модификацией. Стоимость.

API Translator

Итак, как в YodaOS сгенерировать указанный выше дескриптор как интерфейс, непосредственно используемый разработчиками? Ниже приводится введение в Translator, который мы представили.

Трансляторы соответствуют типам поддерживаемых нами приложений, поэтому для lightapp и extapp мы тоже разделяем на два транслятора:

В этой статье не раскрывается принцип работы каждого переводчика, но представлены некоторые простые процессы. Возьмем, к примеру, переводчик-ipc:

module.exports.translate = translate
function translate (descriptor) {
  if (typeof process.send !== 'function') {
    throw new Error('IpcTranslator must work in child process.')
  }
  var activity = PropertyDescriptions.namespace(null, descriptor, null, null)
  listenIpc()
  return activity
}

Каждый переводчик обеспечивает функцию, а именноtranslate(descriptor). Он принимает объект-дескриптор, затем просматривает объекты в цепочке прототипов и генерирует объект, называемый активностью, в соответствии с пространством имен, событием и методом, и, наконец, возвращает этот объект разработчику.

Когда разработчик использует API, объект активности будет вызывать сервер (Vui-демон) в соответствии с логикой, предварительно сгенерированной (заключенной) транслятором, и, наконец, вернуть результат вызова через Promise для завершения вызова интерфейса.

постскриптум

В этой статье кратко рассказывается, как YodaOS использует DSL в процессе разработки API для решения проблемы, связанной с тем, что API YodaOS поддерживает согласованность в различных формах приложений. Имея это в виду, мы надеемся выявить следующее:

  • Помогите читателям лучше понять процесс создания YodaOS API
  • Помогите читателям понять DSL, а также применить эту идею в своих проектах.

Не стесняйтесь комментировать, если у вас есть дополнительные вопросы, или задайте их нам напрямую на GitHub:GitHub.com/yo'd-pro то есть...

Ссылаться на