14 Детали препроцессинга при помощи Javascript

Javascript предобработка выполняется с помощью вызова JavaScript функции с одним параметром 'value' и заданным пользователем телом функции. Результатом шага предобработки является значение, которое возвращается из этой функции, например, для выполнения конвертации градусов с Фаренгейта в Цельсия пользователю необходимо ввести

return (value - 32)  * 5 / 9

в параметрах JavaScript предобработки, которая будет упакована сервером в JavaScript функцию:

function (value)
       {
          return (value - 32) * 5 / 9
       }

Входящий параметр 'value' всегда передается строкой. Возвращаемое значение автоматически приводится к строке через ToString() метод (если он завершится с ошибкой, тогда эта ошибка возвращается в виде строкового значения), с несколькими исключениями:

  • возврат не определенного значения приведет к ошибке
  • возврат null значения приведет к тому, что входящее значения будет отброшено, очень похоже на 'Отбросить значение' предобработку для действия 'Другое при ошибке'.

Ошибки можно возвращаться при помощи вызова исключения к значениям / объектам (обычно это строки или объекты ошибок).

Например:

if (value == 0)
           throw "Zero input value"
       return 1/value

У каждого скрипта есть 10 секундное время ожидания выполнения (в зависимости от скрипта выполнение может занять более длительное время, что вызовет превышение времени ожидания); превышение времени ожидания вернет ошибку. Также применяется ограничение heap памяти в 10 мегабайт.

Байтовое представление шага JavaScript предобработки кэшируется и используется повторно, когда шаг применяется в следующий раз. Любые изменения в шагах предобработки вызовут сброс кэширования скрипта и позже повторную компиляцию.

Последовательные ошибки во время выполнения (3 раза подряд) вызовут повторную инициализацию механизма для уменьшения вероятности варианта того, что один скрипт сломает всю среду выполнения для следующих скриптов (это действие журналируется с режимом отладки DebugLevel 4 и выше).

JavaScript предобработка реализована при помощи Duktape (https://duktape.org/) JavaScript механизма.