@dxos/functions 0.5.4-next.70d721e → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/browser/index.mjs +1075 -17
  3. package/dist/lib/browser/index.mjs.map +4 -4
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/node/index.cjs +1069 -15
  6. package/dist/lib/node/index.cjs.map +4 -4
  7. package/dist/lib/node/meta.json +1 -1
  8. package/dist/types/src/function/function-registry.d.ts +0 -1
  9. package/dist/types/src/function/function-registry.d.ts.map +1 -1
  10. package/dist/types/src/runtime/dev-server.d.ts +0 -1
  11. package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
  12. package/dist/types/src/testing/index.d.ts +0 -1
  13. package/dist/types/src/testing/index.d.ts.map +1 -1
  14. package/dist/types/src/testing/setup.d.ts +1 -11
  15. package/dist/types/src/testing/setup.d.ts.map +1 -1
  16. package/dist/types/src/testing/util.d.ts +0 -2
  17. package/dist/types/src/testing/util.d.ts.map +1 -1
  18. package/package.json +14 -23
  19. package/src/function/function-registry.test.ts +1 -14
  20. package/src/function/function-registry.ts +0 -10
  21. package/src/runtime/dev-server.test.ts +24 -42
  22. package/src/runtime/dev-server.ts +13 -17
  23. package/src/testing/functions-integration.test.ts +45 -8
  24. package/src/testing/index.ts +0 -1
  25. package/src/testing/setup.ts +6 -63
  26. package/src/testing/util.ts +0 -10
  27. package/dist/lib/browser/chunk-ERL6PHMU.mjs +0 -1084
  28. package/dist/lib/browser/chunk-ERL6PHMU.mjs.map +0 -7
  29. package/dist/lib/browser/testing/index.mjs +0 -148
  30. package/dist/lib/browser/testing/index.mjs.map +0 -7
  31. package/dist/lib/node/chunk-INM6XAL7.cjs +0 -1097
  32. package/dist/lib/node/chunk-INM6XAL7.cjs.map +0 -7
  33. package/dist/lib/node/testing/index.cjs +0 -169
  34. package/dist/lib/node/testing/index.cjs.map +0 -7
  35. package/dist/types/src/testing/manifest.d.ts +0 -3
  36. package/dist/types/src/testing/manifest.d.ts.map +0 -1
  37. package/dist/types/src/testing/plugin-init.d.ts +0 -6
  38. package/dist/types/src/testing/plugin-init.d.ts.map +0 -1
  39. package/src/testing/manifest.ts +0 -15
  40. package/src/testing/plugin-init.ts +0 -20
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/handler.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { TextV0Type } from '@braneframe/types';\nimport { type Client, PublicKey } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { type EchoReactiveObject, type S } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { nonNullable } from '@dxos/util';\n\n// TODO(burdon): Model after http request. Ref Lambda/OpenFaaS.\n// https://docs.aws.amazon.com/lambda/latest/dg/typescript-handler.html\n// https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/#functions\n// https://www.npmjs.com/package/aws-lambda\n\n/**\n * Function handler.\n */\nexport type FunctionHandler<TData = {}, TMeta = {}> = (params: {\n context: FunctionContext;\n event: FunctionEvent<TData, TMeta>;\n response: FunctionResponse;\n}) => Promise<FunctionResponse | void>;\n\n/**\n * Function context.\n */\nexport interface FunctionContext {\n // TODO(burdon): Limit access to individual space.\n client: Client;\n // TODO(burdon): Replace with storage service abstraction.\n dataDir?: string;\n}\n\n/**\n * Event payload.\n */\nexport type FunctionEvent<TData = {}, TMeta = {}> = {\n data: FunctionEventMeta<TMeta> & TData;\n};\n\n/**\n * Metadata from trigger.\n */\nexport type FunctionEventMeta<TMeta = {}> = {\n meta: TMeta;\n};\n\n/**\n * Function response.\n */\nexport interface FunctionResponse {\n status(code: number): FunctionResponse;\n}\n\n//\n// Subscription utils.\n//\n\nexport type RawSubscriptionData = {\n spaceKey?: string;\n objects?: string[];\n};\n\nexport type SubscriptionData = {\n space?: Space;\n objects?: EchoReactiveObject<any>[];\n};\n\n/**\n * Handler wrapper for subscription events; extracts space and objects.\n *\n * To test:\n * ```\n * curl -s -X POST -H \"Content-Type: application/json\" --data '{\"space\": \"0446...1cbb\"}' http://localhost:7100/dev/email-extractor\n * ```\n *\n * NOTE: Get space key from devtools or `dx space list --json`\n */\n// TODO(burdon): Evolve into plugin definition like Composer.\nexport const subscriptionHandler = <TMeta>(\n handler: FunctionHandler<SubscriptionData, TMeta>,\n types?: S.Schema<any>[],\n): FunctionHandler<RawSubscriptionData, TMeta> => {\n return async ({ event: { data }, context, response, ...rest }) => {\n const { client } = context;\n const space = data.spaceKey ? client.spaces.get(PublicKey.from(data.spaceKey)) : undefined;\n if (!space) {\n log.error('Invalid space');\n return response.status(500);\n }\n\n registerTypes(space, types);\n const objects = space\n ? data.objects?.map<EchoReactiveObject<any> | undefined>((id) => space!.db.getObjectById(id)).filter(nonNullable)\n : [];\n\n if (!!data.spaceKey && !space) {\n log.warn('invalid space', { data });\n } else {\n log.info('handler', { space: space?.key.truncate(), objects: objects?.length });\n }\n\n return handler({ event: { data: { ...data, space, objects } }, context, response, ...rest });\n };\n};\n\n// TODO(burdon): Evolve types as part of function metadata.\nconst registerTypes = (space: Space, types: S.Schema<any>[] = []) => {\n const registry = space.db.graph.runtimeSchemaRegistry;\n for (const type of [...types, TextV0Type]) {\n if (!registry.hasSchema(type)) {\n registry.registerSchema(type);\n }\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAIA,SAASA,kBAAkB;AAC3B,SAAsBC,iBAAiB;AAGvC,SAASC,WAAW;AACpB,SAASC,mBAAmB;;AAwErB,IAAMC,sBAAsB,CACjCC,SACAC,UAAAA;AAEA,SAAO,OAAO,EAAEC,OAAO,EAAEC,KAAI,GAAIC,SAASC,UAAU,GAAGC,KAAAA,MAAM;AAC3D,UAAM,EAAEC,OAAM,IAAKH;AACnB,UAAMI,QAAQL,KAAKM,WAAWF,OAAOG,OAAOC,IAAIf,UAAUgB,KAAKT,KAAKM,QAAQ,CAAA,IAAKI;AACjF,QAAI,CAACL,OAAO;AACVX,UAAIiB,MAAM,iBAAA,QAAA;;;;;;AACV,aAAOT,SAASU,OAAO,GAAA;IACzB;AAEAC,kBAAcR,OAAOP,KAAAA;AACrB,UAAMgB,UAAUT,QACZL,KAAKc,SAASC,IAAyC,CAACC,OAAOX,MAAOY,GAAGC,cAAcF,EAAAA,CAAAA,EAAKG,OAAOxB,WAAAA,IACnG,CAAA;AAEJ,QAAI,CAAC,CAACK,KAAKM,YAAY,CAACD,OAAO;AAC7BX,UAAI0B,KAAK,iBAAiB;QAAEpB;MAAK,GAAA;;;;;;IACnC,OAAO;AACLN,UAAI2B,KAAK,WAAW;QAAEhB,OAAOA,OAAOiB,IAAIC,SAAAA;QAAYT,SAASA,SAASU;MAAO,GAAA;;;;;;IAC/E;AAEA,WAAO3B,QAAQ;MAAEE,OAAO;QAAEC,MAAM;UAAE,GAAGA;UAAMK;UAAOS;QAAQ;MAAE;MAAGb;MAASC;MAAU,GAAGC;IAAK,CAAA;EAC5F;AACF;AAGA,IAAMU,gBAAgB,CAACR,OAAcP,QAAyB,CAAA,MAAE;AAC9D,QAAM2B,WAAWpB,MAAMY,GAAGS,MAAMC;AAChC,aAAWC,QAAQ;OAAI9B;IAAON;KAAa;AACzC,QAAI,CAACiC,SAASI,UAAUD,IAAAA,GAAO;AAC7BH,eAASK,eAAeF,IAAAA;IAC1B;EACF;AACF;",
6
- "names": ["TextV0Type", "PublicKey", "log", "nonNullable", "subscriptionHandler", "handler", "types", "event", "data", "context", "response", "rest", "client", "space", "spaceKey", "spaces", "get", "from", "undefined", "error", "status", "registerTypes", "objects", "map", "id", "db", "getObjectById", "filter", "warn", "info", "key", "truncate", "length", "registry", "graph", "runtimeSchemaRegistry", "type", "hasSchema", "registerSchema"]
3
+ "sources": ["../../../src/function/function-registry.ts", "../../../src/handler.ts", "../../../src/runtime/dev-server.ts", "../../../src/runtime/scheduler.ts", "../../../src/trigger/trigger-registry.ts", "../../../src/trigger/type/subscription-trigger.ts", "../../../src/trigger/type/timer-trigger.ts", "../../../src/trigger/type/webhook-trigger.ts", "../../../src/trigger/type/websocket-trigger.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, type Space } from '@dxos/client/echo';\nimport { type Context, Resource } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap, diff } from '@dxos/util';\n\nimport { FunctionDef, type FunctionManifest } from '../types';\n\nexport type FunctionsRegisteredEvent = {\n space: Space;\n added: FunctionDef[];\n};\n\nexport class FunctionRegistry extends Resource {\n private readonly _functionBySpaceKey = new ComplexMap<PublicKey, FunctionDef[]>(PublicKey.hash);\n\n public readonly registered = new Event<FunctionsRegisteredEvent>();\n\n constructor(private readonly _client: Client) {\n super();\n }\n\n public getFunctions(space: Space): FunctionDef[] {\n return this._functionBySpaceKey.get(space.key) ?? [];\n }\n\n /**\n * Loads function definitions from the manifest into the space.\n * We first load all the definitions from the space to deduplicate by functionId.\n */\n public async register(space: Space, functions: FunctionManifest['functions']): Promise<void> {\n log('register', { space: space.key, functions: functions?.length ?? 0 });\n if (!functions?.length) {\n return;\n }\n if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionDef)) {\n space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionDef);\n }\n\n // Sync definitions.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();\n const { added } = diff(existing, functions, (a, b) => a.uri === b.uri);\n // TODO(burdon): Update existing templates.\n added.forEach((def) => space.db.add(create(FunctionDef, def)));\n }\n\n protected override async _open(): Promise<void> {\n log.info('opening...');\n const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._functionBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: FunctionDef[] = [];\n this._functionBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n\n // Subscribe to updates.\n this._ctx.onDispose(\n space.db.query(Filter.schema(FunctionDef)).subscribe(({ objects }) => {\n const { added } = diff(registered, objects, (a, b) => a.uri === b.uri);\n // TODO(burdon): Update and remove.\n if (added.length > 0) {\n registered.push(...added);\n this.registered.emit({ space, added });\n }\n }),\n );\n }\n });\n\n // TODO(burdon): API: Normalize unsubscribe methods.\n this._ctx.onDispose(() => spacesSubscription.unsubscribe());\n }\n\n protected override async _close(_: Context): Promise<void> {\n log.info('closing...');\n this._functionBySpaceKey.clear();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { TextV0Type } from '@braneframe/types';\nimport { type Client, PublicKey } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { type EchoReactiveObject, type S } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { nonNullable } from '@dxos/util';\n\n// TODO(burdon): Model after http request. Ref Lambda/OpenFaaS.\n// https://docs.aws.amazon.com/lambda/latest/dg/typescript-handler.html\n// https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/#functions\n// https://www.npmjs.com/package/aws-lambda\n\n/**\n * Function handler.\n */\nexport type FunctionHandler<TData = {}, TMeta = {}> = (params: {\n context: FunctionContext;\n event: FunctionEvent<TData, TMeta>;\n response: FunctionResponse;\n}) => Promise<FunctionResponse | void>;\n\n/**\n * Function context.\n */\nexport interface FunctionContext {\n // TODO(burdon): Limit access to individual space.\n client: Client;\n // TODO(burdon): Replace with storage service abstraction.\n dataDir?: string;\n}\n\n/**\n * Event payload.\n */\nexport type FunctionEvent<TData = {}, TMeta = {}> = {\n data: FunctionEventMeta<TMeta> & TData;\n};\n\n/**\n * Metadata from trigger.\n */\nexport type FunctionEventMeta<TMeta = {}> = {\n meta: TMeta;\n};\n\n/**\n * Function response.\n */\nexport interface FunctionResponse {\n status(code: number): FunctionResponse;\n}\n\n//\n// Subscription utils.\n//\n\nexport type RawSubscriptionData = {\n spaceKey?: string;\n objects?: string[];\n};\n\nexport type SubscriptionData = {\n space?: Space;\n objects?: EchoReactiveObject<any>[];\n};\n\n/**\n * Handler wrapper for subscription events; extracts space and objects.\n *\n * To test:\n * ```\n * curl -s -X POST -H \"Content-Type: application/json\" --data '{\"space\": \"0446...1cbb\"}' http://localhost:7100/dev/email-extractor\n * ```\n *\n * NOTE: Get space key from devtools or `dx space list --json`\n */\n// TODO(burdon): Evolve into plugin definition like Composer.\nexport const subscriptionHandler = <TMeta>(\n handler: FunctionHandler<SubscriptionData, TMeta>,\n types?: S.Schema<any>[],\n): FunctionHandler<RawSubscriptionData, TMeta> => {\n return async ({ event: { data }, context, response, ...rest }) => {\n const { client } = context;\n const space = data.spaceKey ? client.spaces.get(PublicKey.from(data.spaceKey)) : undefined;\n if (!space) {\n log.error('Invalid space');\n return response.status(500);\n }\n\n registerTypes(space, types);\n const objects = space\n ? data.objects?.map<EchoReactiveObject<any> | undefined>((id) => space!.db.getObjectById(id)).filter(nonNullable)\n : [];\n\n if (!!data.spaceKey && !space) {\n log.warn('invalid space', { data });\n } else {\n log.info('handler', { space: space?.key.truncate(), objects: objects?.length });\n }\n\n return handler({ event: { data: { ...data, space, objects } }, context, response, ...rest });\n };\n};\n\n// TODO(burdon): Evolve types as part of function metadata.\nconst registerTypes = (space: Space, types: S.Schema<any>[] = []) => {\n const registry = space.db.graph.runtimeSchemaRegistry;\n for (const type of [...types, TextV0Type]) {\n if (!registry.hasSchema(type)) {\n registry.registerSchema(type);\n }\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport express from 'express';\nimport { getPort } from 'get-port-please';\nimport type http from 'http';\nimport { join } from 'node:path';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionContext, type FunctionEvent, type FunctionHandler, type FunctionResponse } from '../handler';\nimport { type FunctionDef } from '../types';\n\nexport type DevServerOptions = {\n baseDir: string;\n port?: number;\n reload?: boolean;\n dataDir?: string;\n};\n\n/**\n * Functions dev server provides a local HTTP server for testing functions.\n */\nexport class DevServer {\n private _ctx = createContext();\n\n // Function handlers indexed by name (URL path).\n private readonly _handlers: Record<string, { def: FunctionDef; handler: FunctionHandler<any> }> = {};\n\n private _server?: http.Server;\n private _port?: number;\n private _functionServiceRegistration?: string;\n private _proxy?: string;\n private _seq = 0;\n\n public readonly update = new Event<number>();\n\n constructor(\n private readonly _client: Client,\n private readonly _functionsRegistry: FunctionRegistry,\n private readonly _options: DevServerOptions,\n ) {\n // TODO(burdon): Add/remove listener in start/stop.\n this._functionsRegistry.registered.on(async ({ added }) => {\n added.forEach((def) => this._load(def));\n await this._safeUpdateRegistration();\n log('new functions loaded', { added });\n });\n }\n\n get stats() {\n return {\n seq: this._seq,\n };\n }\n\n get endpoint() {\n invariant(this._port);\n return `http://localhost:${this._port}`;\n }\n\n get proxy() {\n return this._proxy;\n }\n\n get functions() {\n return Object.values(this._handlers);\n }\n\n async start() {\n invariant(!this._server);\n log.info('starting...');\n this._ctx = createContext();\n\n // TODO(burdon): Move to hono.\n const app = express();\n app.use(express.json());\n\n app.post('/:path', async (req, res) => {\n const { path } = req.params;\n try {\n log.info('calling', { path });\n if (this._options.reload) {\n const { def } = this._handlers['/' + path];\n await this._load(def, true);\n }\n\n // TODO(burdon): Get function context.\n res.statusCode = await this.invoke('/' + path, req.body);\n res.end();\n } catch (err: any) {\n log.catch(err);\n res.statusCode = 500;\n res.end();\n }\n });\n\n this._port = await getPort({ host: 'localhost', port: 7200, portRange: [7200, 7299] });\n this._server = app.listen(this._port);\n\n try {\n // Register functions.\n const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService!.register({\n endpoint: this.endpoint,\n });\n\n log.info('registered', { endpoint });\n this._proxy = endpoint;\n this._functionServiceRegistration = registrationId;\n\n // Open after registration, so that it can be updated with the list of function definitions.\n await this._functionsRegistry.open(this._ctx);\n } catch (err: any) {\n await this.stop();\n throw new Error('FunctionRegistryService not available (check plugin is configured).');\n }\n\n log.info('started', { port: this._port });\n }\n\n async stop() {\n invariant(this._server);\n log.info('stopping...');\n\n const trigger = new Trigger();\n this._server.close(async () => {\n log.info('server stopped');\n try {\n if (this._functionServiceRegistration) {\n invariant(this._client.services.services.FunctionRegistryService);\n await this._client.services.services.FunctionRegistryService.unregister({\n registrationId: this._functionServiceRegistration,\n });\n\n log.info('unregistered', { registrationId: this._functionServiceRegistration });\n this._functionServiceRegistration = undefined;\n this._proxy = undefined;\n }\n\n trigger.wake();\n } catch (err) {\n trigger.throw(err as Error);\n }\n });\n\n await trigger.wait();\n this._port = undefined;\n this._server = undefined;\n log.info('stopped');\n }\n\n /**\n * Load function.\n */\n private async _load(def: FunctionDef, force?: boolean | undefined) {\n const { uri, route, handler } = def;\n const filePath = join(this._options.baseDir, handler);\n log.info('loading', { uri, force });\n\n // Remove from cache.\n if (force) {\n Object.keys(require.cache)\n .filter((key) => key.startsWith(filePath))\n .forEach((key) => {\n delete require.cache[key];\n });\n }\n\n // TODO(burdon): Import types.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const module = require(filePath);\n if (typeof module.default !== 'function') {\n throw new Error(`Handler must export default function: ${uri}`);\n }\n\n this._handlers[route] = { def, handler: module.default };\n }\n\n private async _safeUpdateRegistration(): Promise<void> {\n invariant(this._functionServiceRegistration);\n try {\n await this._client.services.services.FunctionRegistryService!.updateRegistration({\n registrationId: this._functionServiceRegistration,\n functions: this.functions.map(({ def: { id, route } }) => ({ id, route })),\n });\n } catch (err) {\n log.catch(err);\n }\n }\n\n /**\n * Invoke function.\n */\n public async invoke(path: string, data: any): Promise<number> {\n const seq = ++this._seq;\n const now = Date.now();\n\n log.info('req', { seq, path });\n const statusCode = await this._invoke(path, { data });\n\n log.info('res', { seq, path, statusCode, duration: Date.now() - now });\n this.update.emit(statusCode);\n return statusCode;\n }\n\n private async _invoke(path: string, event: FunctionEvent) {\n const { handler } = this._handlers[path] ?? {};\n invariant(handler, `invalid path: ${path}`);\n const context: FunctionContext = {\n client: this._client,\n dataDir: this._options.dataDir,\n };\n\n let statusCode = 200;\n const response: FunctionResponse = {\n status: (code: number) => {\n statusCode = code;\n return response;\n },\n };\n\n await handler({ context, event, response });\n return statusCode;\n }\n}\n\nconst createContext = () => new Context({ name: 'DevServer' });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport path from 'node:path';\n\nimport { Mutex } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionEventMeta } from '../handler';\nimport { type TriggerRegistry } from '../trigger';\nimport { type FunctionDef, type FunctionManifest, type FunctionTrigger } from '../types';\n\nexport type Callback = (data: any) => Promise<void | number>;\n\nexport type SchedulerOptions = {\n endpoint?: string;\n callback?: Callback;\n};\n\n/**\n * The scheduler triggers function execution based on various triggers.\n */\nexport class Scheduler {\n private _ctx = createContext();\n\n private readonly _functionUriToCallMutex = new Map<string, Mutex>();\n\n constructor(\n public readonly functions: FunctionRegistry,\n public readonly triggers: TriggerRegistry,\n private readonly _options: SchedulerOptions = {},\n ) {\n this.functions.registered.on(async ({ space, added }) => {\n await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);\n });\n this.triggers.registered.on(async ({ space, triggers }) => {\n await this._safeActivateTriggers(space, triggers, this.functions.getFunctions(space));\n });\n }\n\n async start() {\n await this._ctx.dispose();\n this._ctx = createContext();\n await this.functions.open(this._ctx);\n await this.triggers.open(this._ctx);\n }\n\n async stop() {\n await this._ctx.dispose();\n await this.functions.close();\n await this.triggers.close();\n }\n\n // TODO(burdon): Remove and update registries directly.\n public async register(space: Space, manifest: FunctionManifest) {\n await this.functions.register(space, manifest.functions);\n await this.triggers.register(space, manifest);\n }\n\n private async _safeActivateTriggers(\n space: Space,\n triggers: FunctionTrigger[],\n functions: FunctionDef[],\n ): Promise<void> {\n const mountTasks = triggers.map((trigger) => {\n return this.activate(space, functions, trigger);\n });\n await Promise.all(mountTasks).catch(log.catch);\n }\n\n private async activate(space: Space, functions: FunctionDef[], trigger: FunctionTrigger) {\n const definition = functions.find((def) => def.uri === trigger.function);\n if (!definition) {\n log.info('function is not found for trigger', { trigger });\n return;\n }\n\n await this.triggers.activate(space, trigger, async (args) => {\n const mutex = this._functionUriToCallMutex.get(definition.uri) ?? new Mutex();\n this._functionUriToCallMutex.set(definition.uri, mutex);\n\n log.info('function triggered, waiting for mutex', { uri: definition.uri });\n return mutex.executeSynchronized(() => {\n log.info('mutex acquired', { uri: definition.uri });\n return this._execFunction(definition, trigger, {\n meta: trigger.meta ?? {},\n data: { ...args, spaceKey: space.key },\n });\n });\n });\n\n log('activated trigger', { space: space.key, trigger });\n }\n\n private async _execFunction<TData, TMeta>(\n def: FunctionDef,\n trigger: FunctionTrigger,\n { data, meta }: { data: TData; meta?: TMeta },\n ): Promise<number> {\n let status = 0;\n try {\n // TODO(burdon): Pass in Space key (common context)?\n const payload = Object.assign({}, meta && ({ meta } satisfies FunctionEventMeta<TMeta>), data);\n\n const { endpoint, callback } = this._options;\n if (endpoint) {\n // TODO(burdon): Move out of scheduler (generalize as callback).\n const url = path.join(endpoint, def.route);\n log.info('exec', { function: def.uri, url, triggerType: trigger.spec.type });\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n status = response.status;\n } else if (callback) {\n log.info('exec', { function: def.uri });\n status = (await callback(payload)) ?? 200;\n }\n\n // Check errors.\n if (status && status >= 400) {\n throw new Error(`Response: ${status}`);\n }\n\n // const result = await response.json();\n log.info('done', { function: def.uri, status });\n } catch (err: any) {\n log.error('error', { function: def.uri, error: err.message });\n status = 500;\n }\n\n return status;\n }\n}\n\nconst createContext = () => new Context({ name: 'FunctionScheduler' });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, getMeta, type Space } from '@dxos/client/echo';\nimport { Context, Resource } from '@dxos/context';\nimport { compareForeignKeys, ECHO_ATTR_META, foreignKey } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap, diff } from '@dxos/util';\n\nimport { createSubscriptionTrigger, createTimerTrigger, createWebhookTrigger, createWebsocketTrigger } from './type';\nimport { type FunctionManifest, FunctionTrigger, type FunctionTriggerType, type TriggerSpec } from '../types';\n\ntype ResponseCode = number;\n\nexport type TriggerCallback = (args: object) => Promise<ResponseCode>;\n\n// TODO(burdon): Make object?\nexport type TriggerFactory<Spec extends TriggerSpec, Options = any> = (\n ctx: Context,\n space: Space,\n spec: Spec,\n callback: TriggerCallback,\n options?: Options,\n) => Promise<void>;\n\nexport type TriggerHandlerMap = { [type in FunctionTriggerType]: TriggerFactory<any> };\n\nconst triggerHandlers: TriggerHandlerMap = {\n subscription: createSubscriptionTrigger,\n timer: createTimerTrigger,\n webhook: createWebhookTrigger,\n websocket: createWebsocketTrigger,\n};\n\nexport type TriggerEvent = {\n space: Space;\n triggers: FunctionTrigger[];\n};\n\ntype RegisteredTrigger = {\n activationCtx?: Context;\n trigger: FunctionTrigger;\n};\n\nexport class TriggerRegistry extends Resource {\n private readonly _triggersBySpaceKey = new ComplexMap<PublicKey, RegisteredTrigger[]>(PublicKey.hash);\n\n public readonly registered = new Event<TriggerEvent>();\n public readonly removed = new Event<TriggerEvent>();\n\n constructor(\n private readonly _client: Client,\n private readonly _options?: TriggerHandlerMap,\n ) {\n super();\n }\n\n public getActiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx != null);\n }\n\n public getInactiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx == null);\n }\n\n async activate(space: Space, trigger: FunctionTrigger, callback: TriggerCallback): Promise<void> {\n log('activate', { space: space.key, trigger });\n\n const activationCtx = new Context({ name: `FunctionTrigger-${trigger.function}` });\n this._ctx.onDispose(() => activationCtx.dispose());\n const registeredTrigger = this._triggersBySpaceKey.get(space.key)?.find((reg) => reg.trigger.id === trigger.id);\n invariant(registeredTrigger, `Trigger is not registered: ${trigger.function}`);\n registeredTrigger.activationCtx = activationCtx;\n\n try {\n const options = this._options?.[trigger.spec.type];\n await triggerHandlers[trigger.spec.type](activationCtx, space, trigger.spec, callback, options);\n } catch (err) {\n delete registeredTrigger.activationCtx;\n throw err;\n }\n }\n\n /**\n * Loads triggers from the manifest into the space.\n */\n public async register(space: Space, manifest: FunctionManifest): Promise<void> {\n log('register', { space: space.key });\n if (!manifest.triggers?.length) {\n return;\n }\n\n if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionTrigger)) {\n space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionTrigger);\n }\n\n // Create FK to enable syncing if none are set (NOTE: Possible collision).\n const manifestTriggers = manifest.triggers.map((trigger) => {\n let keys = trigger[ECHO_ATTR_META]?.keys;\n delete trigger[ECHO_ATTR_META];\n if (!keys?.length) {\n keys = [foreignKey('manifest', [trigger.function, trigger.spec.type].join(':'))];\n }\n\n return create(FunctionTrigger, trigger, { keys });\n });\n\n // Sync triggers.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionTrigger)).run();\n const { added } = diff(existing, manifestTriggers, compareForeignKeys);\n\n // TODO(burdon): Update existing.\n added.forEach((trigger) => {\n space.db.add(trigger);\n log.info('added', { meta: getMeta(trigger) });\n });\n\n if (added.length > 0) {\n await space.db.flush();\n }\n }\n\n protected override async _open(): Promise<void> {\n log.info('open...');\n const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._triggersBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: RegisteredTrigger[] = [];\n this._triggersBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n\n // Subscribe to updates.\n this._ctx.onDispose(\n space.db.query(Filter.schema(FunctionTrigger)).subscribe(async ({ objects: current }) => {\n log.info('update', { space: space.key, registered: registered.length, current: current.length });\n await this._handleRemovedTriggers(space, current, registered);\n this._handleNewTriggers(space, current, registered);\n }),\n );\n }\n });\n\n this._ctx.onDispose(() => spaceListSubscription.unsubscribe());\n log.info('opened');\n }\n\n protected override async _close(_: Context): Promise<void> {\n log.info('close...');\n this._triggersBySpaceKey.clear();\n log.info('closed');\n }\n\n private _handleNewTriggers(space: Space, current: FunctionTrigger[], registered: RegisteredTrigger[]) {\n const added = current.filter((candidate) => {\n return candidate.enabled && registered.find((reg) => reg.trigger.id === candidate.id) == null;\n });\n\n if (added.length > 0) {\n const newRegisteredTriggers: RegisteredTrigger[] = added.map((trigger) => ({ trigger }));\n registered.push(...newRegisteredTriggers);\n log.info('added', () => ({\n spaceKey: space.key,\n triggers: added.map((trigger) => trigger.function),\n }));\n\n this.registered.emit({ space, triggers: added });\n }\n }\n\n private async _handleRemovedTriggers(\n space: Space,\n current: FunctionTrigger[],\n registered: RegisteredTrigger[],\n ): Promise<void> {\n const removed: FunctionTrigger[] = [];\n for (let i = registered.length - 1; i >= 0; i--) {\n const wasRemoved =\n current.filter((trigger) => trigger.enabled).find((trigger) => trigger.id === registered[i].trigger.id) == null;\n if (wasRemoved) {\n const unregistered = registered.splice(i, 1)[0];\n await unregistered.activationCtx?.dispose();\n removed.push(unregistered.trigger);\n }\n }\n\n if (removed.length > 0) {\n log.info('removed', () => ({\n spaceKey: space.key,\n triggers: removed.map((trigger) => trigger.function),\n }));\n\n this.removed.emit({ space, triggers: removed });\n }\n }\n\n private _getTriggers(space: Space, predicate: (trigger: RegisteredTrigger) => boolean): FunctionTrigger[] {\n const allSpaceTriggers = this._triggersBySpaceKey.get(space.key) ?? [];\n return allSpaceTriggers.filter(predicate).map((trigger) => trigger.trigger);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { TextV0Type } from '@braneframe/types';\nimport { debounce, UpdateScheduler } from '@dxos/async';\nimport { Filter, type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { createSubscription, getAutomergeObjectCore, type Query } from '@dxos/echo-db';\nimport { log } from '@dxos/log';\n\nimport type { SubscriptionTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\nexport const createSubscriptionTrigger: TriggerFactory<SubscriptionTrigger> = async (\n ctx: Context,\n space: Space,\n spec: SubscriptionTrigger,\n callback: TriggerCallback,\n) => {\n const objectIds = new Set<string>();\n const task = new UpdateScheduler(\n ctx,\n async () => {\n if (objectIds.size > 0) {\n const objects = Array.from(objectIds);\n objectIds.clear();\n await callback({ objects });\n }\n },\n { maxFrequency: 4 },\n );\n\n // TODO(burdon): Factor out diff.\n // TODO(burdon): Don't fire initially?\n // TODO(burdon): Create queue. Only allow one invocation per trigger at a time?\n const subscriptions: (() => void)[] = [];\n const subscription = createSubscription(({ added, updated }) => {\n const sizeBefore = objectIds.size;\n for (const object of added) {\n objectIds.add(object.id);\n }\n for (const object of updated) {\n objectIds.add(object.id);\n }\n if (objectIds.size > sizeBefore) {\n log.info('updated', { added: added.length, updated: updated.length });\n task.trigger();\n }\n });\n\n subscriptions.push(() => subscription.unsubscribe());\n\n // TODO(burdon): Disable trigger if keeps failing.\n const { filter, options: { deep, delay } = {} } = spec;\n const update = ({ objects }: Query) => {\n log.info('update', { objects: objects.length });\n subscription.update(objects);\n\n // TODO(burdon): Hack to monitor changes to Document's text object.\n if (deep) {\n for (const object of objects) {\n const content = object.content;\n if (content instanceof TextV0Type) {\n subscriptions.push(\n getAutomergeObjectCore(content).updates.on(debounce(() => subscription.update([object]), 1_000)),\n );\n }\n }\n }\n };\n\n // TODO(burdon): OR not working.\n // TODO(burdon): [Bug]: all callbacks are fired on the first mutation.\n // TODO(burdon): [Bug]: not updated when document is deleted (either top or hierarchically).\n log.info('subscription', { filter });\n // const query = triggerCtx.space.db.query(Filter.or(filter.map(({ type, props }) => Filter.typename(type, props))));\n if (filter) {\n const query = space.db.query(Filter.typename(filter[0].type, filter[0].props));\n subscriptions.push(query.subscribe(delay ? debounce(update, delay) : update));\n }\n\n ctx.onDispose(() => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { CronJob } from 'cron';\n\nimport { DeferredTask } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { TimerTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\nexport const createTimerTrigger: TriggerFactory<TimerTrigger> = async (\n ctx: Context,\n space: Space,\n spec: TimerTrigger,\n callback: TriggerCallback,\n) => {\n const task = new DeferredTask(ctx, async () => {\n await callback({});\n });\n\n let last = 0;\n let run = 0;\n // https://www.npmjs.com/package/cron#constructor\n const job = CronJob.from({\n cronTime: spec.cron,\n runOnInit: false,\n onTick: () => {\n // TODO(burdon): Check greater than 30s (use cron-parser).\n const now = Date.now();\n const delta = last ? now - last : 0;\n last = now;\n\n run++;\n log.info('tick', { space: space.key.truncate(), count: run, delta });\n task.schedule();\n },\n });\n\n job.start();\n ctx.onDispose(() => job.stop());\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { getPort } from 'get-port-please';\nimport http from 'node:http';\n\nimport { type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { WebhookTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\nexport const createWebhookTrigger: TriggerFactory<WebhookTrigger> = async (\n ctx: Context,\n space: Space,\n spec: WebhookTrigger,\n callback: TriggerCallback,\n) => {\n // TODO(burdon): Enable POST hook with payload.\n const server = http.createServer(async (req, res) => {\n if (req.method !== spec.method) {\n res.statusCode = 405;\n return res.end();\n }\n res.statusCode = await callback({});\n res.end();\n });\n\n // TODO(burdon): Not used.\n // const DEF_PORT_RANGE = { min: 7500, max: 7599 };\n // const portRange = Object.assign({}, trigger.port, DEF_PORT_RANGE) as WebhookTrigger['port'];\n const port = await getPort({\n random: true,\n // portRange: [portRange!.min, portRange!.max],\n });\n\n // TODO(burdon): Update trigger object with actual port.\n server.listen(port, () => {\n log.info('started webhook', { port });\n spec.port = port;\n });\n\n ctx.onDispose(() => {\n server.close();\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'ws';\n\nimport { sleep, Trigger } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type WebsocketTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\ninterface WebsocketTriggerOptions {\n retryDelay: number;\n maxAttempts: number;\n}\n\n/**\n * Websocket.\n * NOTE: The port must be unique, so the same hook cannot be used for multiple spaces.\n */\nexport const createWebsocketTrigger: TriggerFactory<WebsocketTrigger, WebsocketTriggerOptions> = async (\n ctx: Context,\n space: Space,\n spec: WebsocketTrigger,\n callback: TriggerCallback,\n options: WebsocketTriggerOptions = { retryDelay: 2, maxAttempts: 5 },\n) => {\n const { url, init } = spec;\n\n let ws: WebSocket;\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\n const open = new Trigger<boolean>();\n\n ws = new WebSocket(url);\n Object.assign(ws, {\n onopen: () => {\n log.info('opened', { url });\n if (spec.init) {\n ws.send(new TextEncoder().encode(JSON.stringify(init)));\n }\n\n open.wake(true);\n },\n\n onclose: (event) => {\n log.info('closed', { url, code: event.code });\n // Reconnect if server closes (e.g., CF restart).\n // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code\n if (event.code === 1006) {\n setTimeout(async () => {\n log.info(`reconnecting in ${options.retryDelay}s...`, { url });\n await createWebsocketTrigger(ctx, space, spec, callback, options);\n }, options.retryDelay * 1_000);\n }\n\n open.wake(false);\n },\n\n onerror: (event) => {\n log.catch(event.error, { url });\n },\n\n onmessage: async (event) => {\n try {\n log.info('message');\n const data = JSON.parse(new TextDecoder().decode(event.data as Uint8Array));\n await callback({ data });\n } catch (err) {\n log.catch(err, { url });\n }\n },\n } satisfies Partial<WebSocket>);\n\n const isOpen = await open.wait();\n if (isOpen) {\n break;\n } else {\n const wait = Math.pow(attempt, 2) * options.retryDelay;\n if (attempt < options.maxAttempts) {\n log.warn(`failed to connect; trying again in ${wait}s`, { attempt });\n await sleep(wait * 1_000);\n }\n }\n }\n\n ctx.onDispose(() => {\n ws?.close();\n });\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Event", "create", "Filter", "Resource", "PublicKey", "log", "ComplexMap", "diff", "FunctionRegistry", "Resource", "constructor", "_client", "_functionBySpaceKey", "ComplexMap", "PublicKey", "hash", "registered", "Event", "getFunctions", "space", "get", "key", "register", "functions", "log", "length", "db", "graph", "runtimeSchemaRegistry", "hasSchema", "FunctionDef", "registerSchema", "objects", "existing", "query", "Filter", "schema", "run", "added", "diff", "a", "b", "uri", "forEach", "def", "add", "create", "_open", "info", "spacesSubscription", "spaces", "subscribe", "has", "set", "waitUntilReady", "_ctx", "disposed", "onDispose", "push", "emit", "unsubscribe", "_close", "_", "clear", "TextV0Type", "PublicKey", "log", "nonNullable", "subscriptionHandler", "handler", "types", "event", "data", "context", "response", "rest", "client", "space", "spaceKey", "spaces", "get", "from", "undefined", "error", "status", "registerTypes", "objects", "map", "id", "db", "getObjectById", "filter", "warn", "info", "key", "truncate", "length", "registry", "graph", "runtimeSchemaRegistry", "type", "hasSchema", "registerSchema", "express", "getPort", "join", "Event", "Trigger", "Context", "invariant", "log", "DevServer", "constructor", "_client", "_functionsRegistry", "_options", "_ctx", "createContext", "_handlers", "_seq", "update", "Event", "registered", "on", "added", "forEach", "def", "_load", "_safeUpdateRegistration", "log", "stats", "seq", "endpoint", "invariant", "_port", "proxy", "_proxy", "functions", "Object", "values", "start", "_server", "info", "app", "express", "use", "json", "post", "req", "res", "path", "params", "reload", "statusCode", "invoke", "body", "end", "err", "catch", "getPort", "host", "port", "portRange", "listen", "registrationId", "services", "FunctionRegistryService", "register", "_functionServiceRegistration", "open", "stop", "Error", "trigger", "Trigger", "close", "unregister", "undefined", "wake", "throw", "wait", "force", "uri", "route", "handler", "filePath", "join", "baseDir", "keys", "require", "cache", "filter", "key", "startsWith", "module", "default", "updateRegistration", "map", "id", "data", "now", "Date", "_invoke", "duration", "emit", "event", "context", "client", "dataDir", "response", "status", "code", "Context", "name", "path", "Mutex", "Context", "log", "Scheduler", "constructor", "functions", "triggers", "_options", "_ctx", "createContext", "_functionUriToCallMutex", "Map", "registered", "on", "space", "added", "_safeActivateTriggers", "getInactiveTriggers", "getFunctions", "start", "dispose", "open", "stop", "close", "register", "manifest", "mountTasks", "map", "trigger", "activate", "Promise", "all", "catch", "definition", "find", "def", "uri", "function", "info", "args", "mutex", "get", "set", "executeSynchronized", "_execFunction", "meta", "data", "spaceKey", "key", "status", "payload", "Object", "assign", "endpoint", "callback", "url", "join", "route", "triggerType", "spec", "type", "response", "fetch", "method", "headers", "body", "JSON", "stringify", "Error", "err", "error", "message", "name", "Event", "create", "Filter", "getMeta", "Context", "Resource", "compareForeignKeys", "ECHO_ATTR_META", "foreignKey", "invariant", "PublicKey", "log", "ComplexMap", "diff", "TextV0Type", "debounce", "UpdateScheduler", "Filter", "createSubscription", "getAutomergeObjectCore", "log", "createSubscriptionTrigger", "ctx", "space", "spec", "callback", "objectIds", "Set", "task", "size", "objects", "Array", "from", "clear", "maxFrequency", "subscriptions", "subscription", "added", "updated", "sizeBefore", "object", "add", "id", "info", "length", "trigger", "push", "unsubscribe", "filter", "options", "deep", "delay", "update", "content", "updates", "on", "query", "db", "typename", "type", "props", "subscribe", "onDispose", "forEach", "CronJob", "DeferredTask", "log", "createTimerTrigger", "ctx", "space", "spec", "callback", "task", "last", "run", "job", "from", "cronTime", "cron", "runOnInit", "onTick", "now", "Date", "delta", "info", "key", "truncate", "count", "schedule", "start", "onDispose", "stop", "getPort", "http", "log", "createWebhookTrigger", "ctx", "space", "spec", "callback", "server", "createServer", "req", "res", "method", "statusCode", "end", "port", "random", "listen", "info", "onDispose", "close", "WebSocket", "sleep", "Trigger", "log", "createWebsocketTrigger", "ctx", "space", "spec", "callback", "options", "retryDelay", "maxAttempts", "url", "init", "ws", "attempt", "open", "Object", "assign", "onopen", "info", "send", "TextEncoder", "encode", "JSON", "stringify", "wake", "onclose", "event", "code", "setTimeout", "onerror", "catch", "error", "onmessage", "data", "parse", "TextDecoder", "decode", "err", "isOpen", "wait", "Math", "pow", "warn", "onDispose", "close", "triggerHandlers", "subscription", "createSubscriptionTrigger", "timer", "createTimerTrigger", "webhook", "createWebhookTrigger", "websocket", "createWebsocketTrigger", "TriggerRegistry", "Resource", "constructor", "_client", "_options", "_triggersBySpaceKey", "ComplexMap", "PublicKey", "hash", "registered", "Event", "removed", "getActiveTriggers", "space", "_getTriggers", "t", "activationCtx", "getInactiveTriggers", "activate", "trigger", "callback", "log", "key", "Context", "name", "function", "_ctx", "onDispose", "dispose", "registeredTrigger", "get", "find", "reg", "id", "invariant", "options", "spec", "type", "err", "register", "manifest", "triggers", "length", "db", "graph", "runtimeSchemaRegistry", "hasSchema", "FunctionTrigger", "registerSchema", "manifestTriggers", "map", "keys", "ECHO_ATTR_META", "foreignKey", "join", "create", "objects", "existing", "query", "Filter", "schema", "run", "added", "diff", "compareForeignKeys", "forEach", "add", "info", "meta", "getMeta", "flush", "_open", "spaceListSubscription", "spaces", "subscribe", "has", "set", "waitUntilReady", "disposed", "current", "_handleRemovedTriggers", "_handleNewTriggers", "unsubscribe", "_close", "_", "clear", "filter", "candidate", "enabled", "newRegisteredTriggers", "push", "spaceKey", "emit", "i", "wasRemoved", "unregistered", "splice", "predicate", "allSpaceTriggers"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"inject-globals:@inject-globals":{"bytes":384,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/types.ts":{"bytes":9711,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/function/function-registry.ts":{"bytes":12532,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/function/index.ts":{"bytes":529,"imports":[{"path":"packages/core/functions/src/function/function-registry.ts","kind":"import-statement","original":"./function-registry"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/handler.ts":{"bytes":9375,"imports":[{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/dev-server.ts":{"bytes":28578,"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/scheduler.ts":{"bytes":18003,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/index.ts":{"bytes":598,"imports":[{"path":"packages/core/functions/src/runtime/dev-server.ts","kind":"import-statement","original":"./dev-server"},{"path":"packages/core/functions/src/runtime/scheduler.ts","kind":"import-statement","original":"./scheduler"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/subscription-trigger.ts":{"bytes":10741,"imports":[{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytes":4173,"imports":[{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/webhook-trigger.ts":{"bytes":4388,"imports":[{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/http","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytes":10551,"imports":[{"path":"ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/index.ts":{"bytes":865,"imports":[{"path":"packages/core/functions/src/trigger/type/subscription-trigger.ts","kind":"import-statement","original":"./subscription-trigger"},{"path":"packages/core/functions/src/trigger/type/timer-trigger.ts","kind":"import-statement","original":"./timer-trigger"},{"path":"packages/core/functions/src/trigger/type/webhook-trigger.ts","kind":"import-statement","original":"./webhook-trigger"},{"path":"packages/core/functions/src/trigger/type/websocket-trigger.ts","kind":"import-statement","original":"./websocket-trigger"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytes":27381,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/trigger/type/index.ts","kind":"import-statement","original":"./type"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/index.ts":{"bytes":523,"imports":[{"path":"packages/core/functions/src/trigger/trigger-registry.ts","kind":"import-statement","original":"./trigger-registry"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/index.ts":{"bytes":837,"imports":[{"path":"packages/core/functions/src/function/index.ts","kind":"import-statement","original":"./function"},{"path":"packages/core/functions/src/handler.ts","kind":"import-statement","original":"./handler"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"./runtime"},{"path":"packages/core/functions/src/trigger/index.ts","kind":"import-statement","original":"./trigger"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"./types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/testing/types.ts":{"bytes":1131,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/testing/setup.ts":{"bytes":12011,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/testing/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/core/functions/src/function/index.ts","kind":"import-statement","original":"../function"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"../runtime"},{"path":"packages/core/functions/src/trigger/index.ts","kind":"import-statement","original":"../trigger"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/testing/util.ts":{"bytes":4292,"imports":[{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/client/testing","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/testing/manifest.ts":{"bytes":1139,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/testing/index.ts":{"bytes":749,"imports":[{"path":"packages/core/functions/src/testing/setup.ts","kind":"import-statement","original":"./setup"},{"path":"packages/core/functions/src/testing/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/core/functions/src/testing/util.ts","kind":"import-statement","original":"./util"},{"path":"packages/core/functions/src/testing/manifest.ts","kind":"import-statement","original":"./manifest"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"packages/core/functions/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":4964},"packages/core/functions/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/core/functions/dist/lib/browser/chunk-ERL6PHMU.mjs","kind":"import-statement"},{"path":"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs","kind":"import-statement"},{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["DevServer","FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionRegistry","FunctionTrigger","Scheduler","TriggerRegistry","subscriptionHandler"],"entryPoint":"packages/core/functions/src/index.ts","inputs":{"packages/core/functions/src/index.ts":{"bytesInOutput":0},"packages/core/functions/src/handler.ts":{"bytesInOutput":1694}},"bytes":2205},"packages/core/functions/dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":9399},"packages/core/functions/dist/lib/browser/testing/index.mjs":{"imports":[{"path":"packages/core/functions/dist/lib/browser/chunk-ERL6PHMU.mjs","kind":"import-statement"},{"path":"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs","kind":"import-statement"},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/client/testing","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true}],"exports":["TestType","createFunctionRuntime","createInitializedClients","inviteMember","startFunctionsHost","testFunctionManifest","triggerWebhook"],"entryPoint":"packages/core/functions/src/testing/index.ts","inputs":{"packages/core/functions/src/testing/setup.ts":{"bytesInOutput":2603},"packages/core/functions/src/testing/types.ts":{"bytesInOutput":182},"packages/core/functions/src/testing/index.ts":{"bytesInOutput":0},"packages/core/functions/src/testing/util.ts":{"bytesInOutput":1034},"packages/core/functions/src/testing/manifest.ts":{"bytesInOutput":146}},"bytes":4615},"packages/core/functions/dist/lib/browser/chunk-ERL6PHMU.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":54572},"packages/core/functions/dist/lib/browser/chunk-ERL6PHMU.mjs":{"imports":[{"path":"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs","kind":"import-statement"},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/http","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["DevServer","FunctionRegistry","Scheduler","TriggerRegistry"],"inputs":{"packages/core/functions/src/function/function-registry.ts":{"bytesInOutput":2928},"packages/core/functions/src/function/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/dev-server.ts":{"bytesInOutput":7861},"packages/core/functions/src/runtime/scheduler.ts":{"bytesInOutput":4612},"packages/core/functions/src/runtime/index.ts":{"bytesInOutput":0},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytesInOutput":6996},"packages/core/functions/src/trigger/type/subscription-trigger.ts":{"bytesInOutput":2371},"packages/core/functions/src/trigger/type/index.ts":{"bytesInOutput":0},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytesInOutput":898},"packages/core/functions/src/trigger/type/webhook-trigger.ts":{"bytesInOutput":839},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytesInOutput":2837},"packages/core/functions/src/trigger/index.ts":{"bytesInOutput":0}},"bytes":30132},"packages/core/functions/dist/lib/browser/types.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/core/functions/dist/lib/browser/types.mjs":{"imports":[{"path":"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs","kind":"import-statement"}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger"],"entryPoint":"packages/core/functions/src/types.ts","inputs":{},"bytes":276},"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5396},"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs":{"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger","__require"],"inputs":{"inject-globals:@inject-globals":{"bytesInOutput":90},"packages/core/functions/src/types.ts":{"bytesInOutput":1848}},"bytes":2564}}}
1
+ {"inputs":{"inject-globals:@inject-globals":{"bytes":384,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/types.ts":{"bytes":9711,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/function/function-registry.ts":{"bytes":11375,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/function/index.ts":{"bytes":529,"imports":[{"path":"packages/core/functions/src/function/function-registry.ts","kind":"import-statement","original":"./function-registry"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/handler.ts":{"bytes":9375,"imports":[{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/dev-server.ts":{"bytes":27983,"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/scheduler.ts":{"bytes":18003,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/index.ts":{"bytes":598,"imports":[{"path":"packages/core/functions/src/runtime/dev-server.ts","kind":"import-statement","original":"./dev-server"},{"path":"packages/core/functions/src/runtime/scheduler.ts","kind":"import-statement","original":"./scheduler"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/subscription-trigger.ts":{"bytes":10741,"imports":[{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytes":4173,"imports":[{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/webhook-trigger.ts":{"bytes":4388,"imports":[{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/http","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytes":10551,"imports":[{"path":"ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/index.ts":{"bytes":865,"imports":[{"path":"packages/core/functions/src/trigger/type/subscription-trigger.ts","kind":"import-statement","original":"./subscription-trigger"},{"path":"packages/core/functions/src/trigger/type/timer-trigger.ts","kind":"import-statement","original":"./timer-trigger"},{"path":"packages/core/functions/src/trigger/type/webhook-trigger.ts","kind":"import-statement","original":"./webhook-trigger"},{"path":"packages/core/functions/src/trigger/type/websocket-trigger.ts","kind":"import-statement","original":"./websocket-trigger"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytes":27381,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/trigger/type/index.ts","kind":"import-statement","original":"./type"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/index.ts":{"bytes":523,"imports":[{"path":"packages/core/functions/src/trigger/trigger-registry.ts","kind":"import-statement","original":"./trigger-registry"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/index.ts":{"bytes":837,"imports":[{"path":"packages/core/functions/src/function/index.ts","kind":"import-statement","original":"./function"},{"path":"packages/core/functions/src/handler.ts","kind":"import-statement","original":"./handler"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"./runtime"},{"path":"packages/core/functions/src/trigger/index.ts","kind":"import-statement","original":"./trigger"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"./types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"packages/core/functions/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":58380},"packages/core/functions/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs","kind":"import-statement"},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@braneframe/types","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/http","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["DevServer","FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionRegistry","FunctionTrigger","Scheduler","TriggerRegistry","subscriptionHandler"],"entryPoint":"packages/core/functions/src/index.ts","inputs":{"packages/core/functions/src/function/function-registry.ts":{"bytesInOutput":2655},"packages/core/functions/src/function/index.ts":{"bytesInOutput":0},"packages/core/functions/src/index.ts":{"bytesInOutput":0},"packages/core/functions/src/handler.ts":{"bytesInOutput":1724},"packages/core/functions/src/runtime/dev-server.ts":{"bytesInOutput":7772},"packages/core/functions/src/runtime/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/scheduler.ts":{"bytesInOutput":4612},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytesInOutput":6996},"packages/core/functions/src/trigger/type/subscription-trigger.ts":{"bytesInOutput":2387},"packages/core/functions/src/trigger/type/index.ts":{"bytesInOutput":0},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytesInOutput":898},"packages/core/functions/src/trigger/type/webhook-trigger.ts":{"bytesInOutput":839},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytesInOutput":2837},"packages/core/functions/src/trigger/index.ts":{"bytesInOutput":0}},"bytes":31690},"packages/core/functions/dist/lib/browser/types.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/core/functions/dist/lib/browser/types.mjs":{"imports":[{"path":"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs","kind":"import-statement"}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger"],"entryPoint":"packages/core/functions/src/types.ts","inputs":{},"bytes":276},"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5396},"packages/core/functions/dist/lib/browser/chunk-4D4I3YMJ.mjs":{"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger","__require"],"inputs":{"inject-globals:@inject-globals":{"bytesInOutput":90},"packages/core/functions/src/types.ts":{"bytesInOutput":1848}},"bytes":2564}}}