Пакет лежит в основном пуле хаба, а opm знает этот хаб по умолчанию: короткой формы достаточно.
opm install functions-framework-onescriptСкачанный файл ставится командой opm install -f <файл> — сеть для этого уже не нужна.
Описание
functions-framework-onescript
Реализация Functions Framework для OneScript. Превращает обычный файл OneScript с экспортной функцией в HTTP-сервер, следующий тому же контракту запросов/ответов, что и официальные реализации Google (Node.js, Python, Go, Java, ...) — благодаря этому одна и та же функция может выполняться локально, в контейнере или в любом облаке, где можно запустить контейнер с HTTP-сервером (Google Cloud Run, Yandex Cloud Serverless Containers и т.п.).
Поддерживаются два типа сигнатур функций:
| Тип сигнатуры | Аннотация | Форма функции |
|---|---|---|
http |
&HttpFunction |
Процедура(Запрос, Ответ) |
cloudevent |
&CloudEventFunction |
Процедура(Событие) |
Требования
OneScript 2.1.0 или новее, по двум причинам:
- Встроенный класс
ВебСервер, на котором держится HTTP-сервер фреймворка, появился в движке только начиная с версии 2.0. - В версиях до 2.1.0 есть баг в читателе/писателе JSON, который на round-trip незаметно теряет
завершающий ноль в строках-датах с точностью до миллисекунд (например,
.230Zпревращается в.23Z), когда такая строка вложена внутрь передаваемого насквозь объекта. Дляcloudevent-функций это означает порчу данных события.
Установка
opm install functions-framework-onescript
Помимо файлов библиотеки, это регистрирует в системе команду functions-framework
(алиас для oscript server.os).
Использование
Укажите фреймворку файл сценария и, при необходимости, какую экспортную функцию выполнять:
functions-framework --source my-function.os --target myFunction --port 8080
У каждого флага есть эквивалентная переменная окружения, которая используется, если флаг не передан:
| Флаг | Переменная окружения | Значение по умолчанию |
|---|---|---|
--source |
FUNCTION_SOURCE |
main.os |
--target |
FUNCTION_TARGET |
(см. ниже) |
--signature-type |
FUNCTION_SIGNATURE_TYPE |
http |
--port |
PORT |
8080 |
Переменная PORT — стандартный контракт serverless-контейнеров (Cloud Run, Yandex Serverless
Containers), поэтому готовый контейнер с фреймворком запускается там без дополнительной настройки.
Какая функция выполняется
Фреймворк выбирает функцию для выполнения в таком порядке приоритета:
- Аннотация — экспортная функция, помеченная
&HttpFunctionили&CloudEventFunction, используется автоматически, и по ней же определяется тип сигнатуры (поэтому--signature-type/FUNCTION_SIGNATURE_TYPEможно не указывать). В сценарии может быть только одна аннотированная функция. --target/FUNCTION_TARGET— выполняется указанная экспортная функция, а тип сигнатуры берётся из--signature-type/FUNCTION_SIGNATURE_TYPE(по умолчаниюhttp).- По умолчанию — если сценарий экспортирует функцию с именем
main, используется она, с типом сигнатурыhttp.
Примеры
HTTP-функция (examples/hello-world-http.os):
Процедура main( Запрос, Ответ ) Экспорт
html = "<h1>Hello, Function Framework for OneScript!</h1>";
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки( html );
Ответ.КодСостояния = 200;
Ответ.Тело.Записать( Буфер, 0, Буфер.Размер );
КонецПроцедуры
CloudEvent-функция:
&CloudEventFunction
Процедура HandleEvent( Событие ) Экспорт
// Событие - Соответствие с атрибутами CloudEvent: specversion, type, source, id, time, data ...
КонецПроцедуры
Функция получает CloudEvent как в structured-режиме (Content-Type: application/cloudevents+json),
так и в binary-режиме (атрибуты в заголовках Ce-*). Успешный вызов возвращает 204, ошибка разбора
запроса — 400, исключение в функции — 500.
Проверка на соответствие контракту (conformance)
conformance-http.os и conformance-cloudevent.os — минимальные целевые сценарии для запуска тестового клиента Google functions-framework-conformance против этого фреймворка, например:
client -type=http -buildpacks=false -cmd="oscript server.os --source conformance-http.os"
client -type=cloudevent -validate-mapping=false -buildpacks=false -cmd="oscript server.os --source conformance-cloudevent.os"
Флаг -validate-mapping=false нужен потому, что конвертация legacy-событий Google Cloud
(Pub/Sub, Storage, Firestore и т.д.) в CloudEvent и обратно пока не реализована.