@dxos/functions 0.3.7 → 0.3.8-main.152ec6f

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.
package/README.md CHANGED
@@ -50,7 +50,7 @@ runtime:
50
50
  Start functions in dev mode (from the related package):
51
51
 
52
52
  ```bash
53
- dx function dev-server -r ts-node/register --verbose
53
+ dx function dev -r ts-node/register --verbose
54
54
  ```
55
55
 
56
56
  > NOTE: `-r ts-node/register` configures native TypesScript support.
@@ -61,7 +61,7 @@ Install `nodemon` to support live reloading:
61
61
  npm i -g nodemon
62
62
 
63
63
  nodemon -w ./src -e ts --exec $(git rev-parse --show-toplevel)/packages/devtools/cli/bin/dev \
64
- function dev-server -r ts-node/register --verbose
64
+ function dev -r ts-node/register --verbose
65
65
  ```
66
66
 
67
67
  ## Invoking functions
@@ -9,12 +9,12 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
9
9
 
10
10
  // packages/core/functions/src/runtime/dev-server.ts
11
11
  import express from "express";
12
+ import { getPort } from "get-port-please";
12
13
  import { join } from "@dxos/node-std/path";
13
- import { getPortPromise } from "portfinder";
14
14
  import { Trigger } from "@dxos/async";
15
+ import { invariant } from "@dxos/invariant";
15
16
  import { log } from "@dxos/log";
16
- var __dxlog_file = "/home/circleci/project/packages/core/functions/src/runtime/dev-server.ts";
17
- var DEFAULT_PORT = 7e3;
17
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/dev-server.ts";
18
18
  var DevServer = class {
19
19
  // prettier-ignore
20
20
  constructor(_client, _options) {
@@ -22,28 +22,49 @@ var DevServer = class {
22
22
  this._options = _options;
23
23
  this._handlers = {};
24
24
  }
25
- get port() {
26
- return this._port;
27
- }
28
25
  get endpoint() {
29
- return this._port ? `http://localhost:${this._port}` : void 0;
26
+ invariant(this._port, void 0, {
27
+ F: __dxlog_file,
28
+ L: 43,
29
+ S: this,
30
+ A: [
31
+ "this._port",
32
+ ""
33
+ ]
34
+ });
35
+ return `http://localhost:${this._port}`;
36
+ }
37
+ get proxy() {
38
+ return this._proxy;
30
39
  }
31
40
  get functions() {
32
- return Object.keys(this._handlers);
41
+ return Object.values(this._handlers);
33
42
  }
34
43
  async initialize() {
35
- for (const { id } of this._options.manifest.functions) {
44
+ for (const def of this._options.manifest.functions) {
45
+ const { id, path, handler: dir } = def;
36
46
  try {
37
- const module = __require(join(this._options.directory, id));
47
+ const module = __require(join(this._options.directory, dir));
38
48
  const handler = module.default;
39
49
  if (typeof handler !== "function") {
40
50
  throw new Error(`Handler must export default function: ${id}`);
41
51
  }
42
- this._handlers[id] = handler;
52
+ if (this._handlers[path]) {
53
+ log.warn(`Function already registered: ${id}`, void 0, {
54
+ F: __dxlog_file,
55
+ L: 67,
56
+ S: this,
57
+ C: (f, a) => f(...a)
58
+ });
59
+ }
60
+ this._handlers[path] = {
61
+ def,
62
+ handler
63
+ };
43
64
  } catch (err) {
44
- log.error("parsing function (check functions.yml manifest)", err, {
65
+ log.error("parsing function (check manifest)", err, {
45
66
  F: __dxlog_file,
46
- L: 63,
67
+ L: 72,
47
68
  S: this,
48
69
  C: (f, a) => f(...a)
49
70
  });
@@ -53,36 +74,42 @@ var DevServer = class {
53
74
  async start() {
54
75
  const app = express();
55
76
  app.use(express.json());
56
- app.post("/:functionName", async (req, res) => {
57
- const functionName = req.params.functionName;
58
- log("invoke", {
59
- function: functionName,
60
- data: req.body
61
- }, {
62
- F: __dxlog_file,
63
- L: 74,
64
- S: this,
65
- C: (f, a) => f(...a)
66
- });
67
- const builder = {
77
+ app.post("/:name", async (req, res) => {
78
+ const { name } = req.params;
79
+ const response = {
68
80
  status: (code) => {
69
81
  res.statusCode = code;
70
- return builder;
82
+ return response;
71
83
  },
72
84
  succeed: (result = {}) => {
73
85
  res.end(JSON.stringify(result));
74
- return builder;
86
+ return response;
75
87
  }
76
88
  };
77
89
  const context = {
78
90
  client: this._client,
79
- status: builder.status.bind(builder)
91
+ status: response.status.bind(response)
80
92
  };
81
93
  void (async () => {
82
94
  try {
83
- await this._handlers[functionName]({
84
- event: req.body,
85
- context
95
+ log(`invoking: ${name}`, void 0, {
96
+ F: __dxlog_file,
97
+ L: 103,
98
+ S: this,
99
+ C: (f, a) => f(...a)
100
+ });
101
+ const { handler } = this._handlers[name];
102
+ const response2 = await handler({
103
+ context,
104
+ event: req.body
105
+ });
106
+ log("done", {
107
+ response: response2
108
+ }, {
109
+ F: __dxlog_file,
110
+ L: 106,
111
+ S: this,
112
+ C: (f, a) => f(...a)
86
113
  });
87
114
  } catch (err) {
88
115
  res.statusCode = 500;
@@ -90,21 +117,35 @@ var DevServer = class {
90
117
  }
91
118
  })();
92
119
  });
93
- this._port = await getPortPromise({
94
- startPort: DEFAULT_PORT
120
+ this._port = await getPort({
121
+ port: 7200,
122
+ portRange: [
123
+ 7200,
124
+ 7299
125
+ ]
95
126
  });
96
127
  this._server = app.listen(this._port);
97
128
  try {
98
- const { registrationId } = await this._client.services.services.FunctionRegistryService.register({
129
+ const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService.register({
99
130
  endpoint: this.endpoint,
100
- functions: this.functions.map((name) => ({
101
- name
131
+ functions: this.functions.map(({ def: { path } }) => ({
132
+ name: path
102
133
  }))
103
134
  });
135
+ log.info("registered", {
136
+ registrationId,
137
+ endpoint
138
+ }, {
139
+ F: __dxlog_file,
140
+ L: 126,
141
+ S: this,
142
+ C: (f, a) => f(...a)
143
+ });
104
144
  this._registrationId = registrationId;
145
+ this._proxy = endpoint;
105
146
  } catch (err) {
106
147
  await this.stop();
107
- throw new Error("FunctionRegistryService not available; check config (agent.plugins.functions).");
148
+ throw new Error("FunctionRegistryService not available (check plugin is configured).");
108
149
  }
109
150
  }
110
151
  async stop() {
@@ -114,13 +155,22 @@ var DevServer = class {
114
155
  await this._client.services.services.FunctionRegistryService.unregister({
115
156
  registrationId: this._registrationId
116
157
  });
158
+ log.info("unregistered", {
159
+ registrationId: this._registrationId
160
+ }, {
161
+ F: __dxlog_file,
162
+ L: 143,
163
+ S: this,
164
+ C: (f, a) => f(...a)
165
+ });
117
166
  this._registrationId = void 0;
167
+ this._proxy = void 0;
118
168
  }
119
169
  trigger.wake();
120
170
  });
121
171
  await trigger.wait();
122
- this._server = void 0;
123
172
  this._port = void 0;
173
+ this._server = void 0;
124
174
  }
125
175
  };
126
176
 
@@ -128,14 +178,14 @@ var DevServer = class {
128
178
  import { DeferredTask } from "@dxos/async";
129
179
  import { Context } from "@dxos/context";
130
180
  import { Filter, createSubscription } from "@dxos/echo-schema";
131
- import { invariant } from "@dxos/invariant";
181
+ import { invariant as invariant2 } from "@dxos/invariant";
132
182
  import { log as log2 } from "@dxos/log";
133
183
  import { ComplexMap } from "@dxos/util";
134
- var __dxlog_file2 = "/home/circleci/project/packages/core/functions/src/runtime/trigger-manager.ts";
184
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/trigger-manager.ts";
135
185
  var TriggerManager = class {
136
- constructor(_client, _triggers, _invokeOptions) {
186
+ constructor(_client, _manifest, _invokeOptions) {
137
187
  this._client = _client;
138
- this._triggers = _triggers;
188
+ this._manifest = _manifest;
139
189
  this._invokeOptions = _invokeOptions;
140
190
  this._mounts = new ComplexMap(({ name, spaceKey }) => `${spaceKey.toHex()}:${name}`);
141
191
  this._queries = /* @__PURE__ */ new Set();
@@ -144,7 +194,7 @@ var TriggerManager = class {
144
194
  this._client.spaces.subscribe(async (spaces) => {
145
195
  for (const space of spaces) {
146
196
  await space.waitUntilReady();
147
- for (const trigger of this._triggers) {
197
+ for (const trigger of this._manifest.triggers ?? []) {
148
198
  await this.mount(new Context(), space, trigger);
149
199
  }
150
200
  }
@@ -160,6 +210,16 @@ var TriggerManager = class {
160
210
  name: trigger.function,
161
211
  spaceKey: space.key
162
212
  };
213
+ const config = this._manifest.functions.find((config2) => config2.id === trigger.function);
214
+ invariant2(config, `Function not found: ${trigger.function}`, {
215
+ F: __dxlog_file2,
216
+ L: 57,
217
+ S: this,
218
+ A: [
219
+ "config",
220
+ "`Function not found: ${trigger.function}`"
221
+ ]
222
+ });
163
223
  const exists = this._mounts.get(key);
164
224
  if (!exists) {
165
225
  this._mounts.set(key, {
@@ -171,7 +231,7 @@ var TriggerManager = class {
171
231
  trigger
172
232
  }, {
173
233
  F: __dxlog_file2,
174
- L: 60,
234
+ L: 61,
175
235
  S: this,
176
236
  C: (f, a) => f(...a)
177
237
  });
@@ -180,7 +240,7 @@ var TriggerManager = class {
180
240
  }
181
241
  const objectIds = /* @__PURE__ */ new Set();
182
242
  const task = new DeferredTask(ctx, async () => {
183
- await this.invokeFunction(this._invokeOptions, trigger.function, {
243
+ await this.execFunction(this._invokeOptions, config.path, {
184
244
  space: space.key,
185
245
  objects: Array.from(objectIds)
186
246
  });
@@ -230,9 +290,9 @@ var TriggerManager = class {
230
290
  await ctx.dispose();
231
291
  }
232
292
  }
233
- async invokeFunction(options, functionName, data) {
234
- const { endpoint, runtime } = options;
235
- invariant(endpoint, "Missing endpoint", {
293
+ async execFunction(options, functionName, data) {
294
+ const { endpoint } = options;
295
+ invariant2(endpoint, "Missing endpoint", {
236
296
  F: __dxlog_file2,
237
297
  L: 120,
238
298
  S: this,
@@ -241,25 +301,16 @@ var TriggerManager = class {
241
301
  "'Missing endpoint'"
242
302
  ]
243
303
  });
244
- invariant(runtime, "Missing runtime", {
245
- F: __dxlog_file2,
246
- L: 121,
247
- S: this,
248
- A: [
249
- "runtime",
250
- "'Missing runtime'"
251
- ]
252
- });
253
304
  try {
254
305
  log2("invoke", {
255
306
  function: functionName
256
307
  }, {
257
308
  F: __dxlog_file2,
258
- L: 124,
309
+ L: 123,
259
310
  S: this,
260
311
  C: (f, a) => f(...a)
261
312
  });
262
- const url = `${endpoint}/${runtime}/${functionName}`;
313
+ const url = `${endpoint}/${functionName}`;
263
314
  const res = await fetch(url, {
264
315
  method: "POST",
265
316
  body: JSON.stringify(data),
@@ -272,7 +323,7 @@ var TriggerManager = class {
272
323
  result: await res.json()
273
324
  }, {
274
325
  F: __dxlog_file2,
275
- L: 134,
326
+ L: 133,
276
327
  S: this,
277
328
  C: (f, a) => f(...a)
278
329
  });
@@ -282,7 +333,7 @@ var TriggerManager = class {
282
333
  error: err.message
283
334
  }, {
284
335
  F: __dxlog_file2,
285
- L: 136,
336
+ L: 135,
286
337
  S: this,
287
338
  C: (f, a) => f(...a)
288
339
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/runtime/dev-server.ts", "../../../src/runtime/trigger-manager.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport express from 'express';\nimport type http from 'http';\nimport { join } from 'node:path';\nimport { getPortPromise } from 'portfinder';\n\nimport { Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { log } from '@dxos/log';\n\nimport { type FunctionContext, type FunctionHandler, type FunctionsManifest, type Response } from '../function';\n\nconst DEFAULT_PORT = 7000;\n\nexport type DevServerOptions = {\n directory: string;\n manifest: FunctionsManifest;\n};\n\n/**\n * Functions dev server provides a local HTTP server for testing functions.\n */\nexport class DevServer {\n private readonly _handlers: Record<string, FunctionHandler<any>> = {};\n\n private _server?: http.Server;\n private _port?: number;\n private _registrationId?: string;\n\n // prettier-ignore\n constructor(\n private readonly _client: Client,\n private readonly _options: DevServerOptions,\n ) {}\n\n get port() {\n return this._port;\n }\n\n get endpoint() {\n return this._port ? `http://localhost:${this._port}` : undefined;\n }\n\n get functions() {\n return Object.keys(this._handlers);\n }\n\n async initialize() {\n for (const { id } of this._options.manifest.functions) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const module = require(join(this._options.directory, id));\n const handler = module.default;\n if (typeof handler !== 'function') {\n throw new Error(`Handler must export default function: ${id}`);\n }\n\n this._handlers[id] = handler;\n } catch (err) {\n log.error('parsing function (check functions.yml manifest)', err);\n }\n }\n }\n\n async start() {\n const app = express();\n app.use(express.json());\n\n app.post('/:functionName', async (req, res) => {\n const functionName = req.params.functionName;\n log('invoke', { function: functionName, data: req.body });\n\n const builder: Response = {\n status: (code: number) => {\n res.statusCode = code;\n return builder;\n },\n succeed: (result = {}) => {\n res.end(JSON.stringify(result));\n return builder;\n },\n };\n\n const context: FunctionContext = {\n client: this._client,\n status: builder.status.bind(builder),\n };\n\n void (async () => {\n try {\n // TODO(burdon): Typed event handler.\n await this._handlers[functionName]({ event: req.body, context });\n } catch (err: any) {\n res.statusCode = 500;\n res.end(err.message);\n }\n })();\n });\n\n this._port = await getPortPromise({ startPort: DEFAULT_PORT });\n this._server = app.listen(this._port);\n\n // TODO(burdon): Check plugin is registered.\n // TypeError: Cannot read properties of undefined (reading 'register')\n try {\n const { registrationId } = await this._client.services.services.FunctionRegistryService!.register({\n endpoint: this.endpoint!,\n functions: this.functions.map((name) => ({ name })),\n });\n this._registrationId = registrationId;\n } catch (err: any) {\n await this.stop();\n throw new Error('FunctionRegistryService not available; check config (agent.plugins.functions).');\n }\n }\n\n async stop() {\n const trigger = new Trigger();\n this._server?.close(async () => {\n if (this._registrationId) {\n await this._client.services.services.FunctionRegistryService!.unregister({\n registrationId: this._registrationId,\n });\n this._registrationId = undefined;\n }\n\n trigger.wake();\n });\n\n await trigger.wait();\n this._server = undefined;\n this._port = undefined;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { DeferredTask } from '@dxos/async';\nimport { type Client, type PublicKey } from '@dxos/client';\nimport type { Query, Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { Filter, createSubscription } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { ComplexMap } from '@dxos/util';\n\nimport { type FunctionTrigger } from '../function';\n\n// TODO(burdon): Rename.\nexport type InvokeOptions = {\n endpoint: string;\n runtime: string;\n};\n\nexport class TriggerManager {\n private readonly _mounts = new ComplexMap<\n { name: string; spaceKey: PublicKey },\n { ctx: Context; trigger: FunctionTrigger }\n >(({ name, spaceKey }) => `${spaceKey.toHex()}:${name}`);\n\n private readonly _queries = new Set<Query>();\n\n constructor(\n private readonly _client: Client,\n private readonly _triggers: FunctionTrigger[],\n private readonly _invokeOptions: InvokeOptions,\n ) {}\n\n async start() {\n // TODO(burdon): Make runtime configurable (via CLI)?\n this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n await space.waitUntilReady();\n for (const trigger of this._triggers) {\n // TODO(burdon): New context? Shared?\n await this.mount(new Context(), space, trigger);\n }\n }\n });\n }\n\n async stop() {\n for (const { name, spaceKey } of this._mounts.keys()) {\n await this.unmount(name, spaceKey);\n }\n }\n\n private async mount(ctx: Context, space: Space, trigger: FunctionTrigger) {\n const key = { name: trigger.function, spaceKey: space.key };\n const exists = this._mounts.get(key);\n if (!exists) {\n this._mounts.set(key, { ctx, trigger });\n log('mount', { space: space.key, trigger });\n if (ctx.disposed) {\n return;\n }\n\n // TODO(burdon): Trigger binding.\n // TODO(burdon): Why DeferredTask? How to pass objectIds to function?\n const objectIds = new Set<string>();\n const task = new DeferredTask(ctx, async () => {\n await this.invokeFunction(this._invokeOptions, trigger.function, {\n space: space.key,\n objects: Array.from(objectIds),\n });\n });\n\n let count = 0;\n const subscription = createSubscription(({ added, updated }) => {\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\n log('updated', {\n trigger,\n space: space.key,\n objects: objectIds.size,\n count,\n });\n\n task.schedule();\n count++;\n });\n // TODO(burdon): DSL for query (replace props).\n const query = space.db.query(Filter.typename(trigger.subscription.type, trigger.subscription.props));\n this._queries.add(query);\n const unsubscribe = query.subscribe(({ objects }) => {\n subscription.update(objects);\n }, true);\n\n ctx.onDispose(() => {\n subscription.unsubscribe();\n unsubscribe();\n this._queries.delete(query);\n });\n }\n }\n\n private async unmount(name: string, spaceKey: PublicKey) {\n const key = { name, spaceKey };\n const { ctx } = this._mounts.get(key) ?? {};\n if (ctx) {\n this._mounts.delete(key);\n await ctx.dispose();\n }\n }\n\n private async invokeFunction(options: InvokeOptions, functionName: string, data: any) {\n const { endpoint, runtime } = options;\n invariant(endpoint, 'Missing endpoint');\n invariant(runtime, 'Missing runtime');\n\n try {\n log('invoke', { function: functionName });\n const url = `${endpoint}/${runtime}/${functionName}`;\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n log('result', { function: functionName, result: await res.json() });\n } catch (err: any) {\n log.error('error', { function: functionName, error: err.message });\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["express", "join", "getPortPromise", "Trigger", "log", "DEFAULT_PORT", "DevServer", "constructor", "_client", "_options", "_handlers", "port", "_port", "endpoint", "undefined", "functions", "Object", "keys", "initialize", "id", "manifest", "module", "require", "join", "directory", "handler", "default", "Error", "err", "log", "error", "start", "app", "express", "use", "json", "post", "req", "res", "functionName", "params", "function", "data", "body", "builder", "status", "code", "statusCode", "succeed", "result", "end", "JSON", "stringify", "context", "client", "bind", "event", "message", "getPortPromise", "startPort", "_server", "listen", "registrationId", "services", "FunctionRegistryService", "register", "map", "name", "_registrationId", "stop", "trigger", "Trigger", "close", "unregister", "wake", "wait", "DeferredTask", "Context", "Filter", "createSubscription", "invariant", "log", "ComplexMap", "TriggerManager", "constructor", "_client", "_triggers", "_invokeOptions", "_mounts", "name", "spaceKey", "toHex", "_queries", "Set", "start", "spaces", "subscribe", "space", "waitUntilReady", "trigger", "mount", "stop", "keys", "unmount", "ctx", "key", "function", "exists", "get", "set", "disposed", "objectIds", "task", "invokeFunction", "objects", "Array", "from", "count", "subscription", "added", "updated", "object", "add", "id", "size", "schedule", "query", "db", "typename", "type", "props", "unsubscribe", "update", "onDispose", "delete", "dispose", "options", "functionName", "data", "endpoint", "runtime", "url", "res", "fetch", "method", "body", "JSON", "stringify", "headers", "result", "json", "err", "error", "message"]
4
+ "sourcesContent": ["//\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 { Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { type FunctionContext, type FunctionHandler, type Response } from '../handler';\nimport { type FunctionDef, type FunctionManifest } from '../manifest';\n\nexport type DevServerOptions = {\n port?: number;\n directory: string;\n manifest: FunctionManifest;\n};\n\n/**\n * Functions dev server provides a local HTTP server for testing functions.\n */\n// TODO(burdon): Reconcile with agent/functions dev dispatcher.\nexport class DevServer {\n private readonly _handlers: Record<string, { def: FunctionDef; handler: FunctionHandler<any> }> = {};\n\n private _server?: http.Server;\n private _port?: number;\n private _registrationId?: string;\n private _proxy?: string;\n\n // prettier-ignore\n constructor(\n private readonly _client: Client,\n private readonly _options: DevServerOptions,\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 initialize() {\n for (const def of this._options.manifest.functions) {\n const { id, path, handler: dir } = def;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const module = require(join(this._options.directory, dir));\n const handler = module.default;\n if (typeof handler !== 'function') {\n throw new Error(`Handler must export default function: ${id}`);\n }\n\n if (this._handlers[path]) {\n log.warn(`Function already registered: ${id}`);\n }\n\n this._handlers[path] = { def, handler };\n } catch (err) {\n log.error('parsing function (check manifest)', err);\n }\n }\n }\n\n async start() {\n const app = express();\n app.use(express.json());\n\n app.post('/:name', async (req, res) => {\n const { name } = req.params;\n\n const response: Response = {\n status: (code: number) => {\n res.statusCode = code;\n return response;\n },\n\n succeed: (result = {}) => {\n res.end(JSON.stringify(result));\n return response;\n },\n };\n\n const context: FunctionContext = {\n client: this._client,\n status: response.status.bind(response),\n };\n\n void (async () => {\n try {\n log(`invoking: ${name}`);\n const { handler } = this._handlers[name];\n const response = await handler({ context, event: req.body });\n log('done', { response });\n } catch (err: any) {\n res.statusCode = 500;\n res.end(err.message);\n }\n })();\n });\n\n // TODO(burdon): Push down port management to agent.\n this._port = await getPort({ port: 7200, portRange: [7200, 7299] });\n this._server = app.listen(this._port);\n\n // TODO(burdon): Test during initialization.\n try {\n // Register functions.\n const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService!.register({\n endpoint: this.endpoint,\n functions: this.functions.map(({ def: { path } }) => ({ name: path })),\n });\n\n log.info('registered', { registrationId, endpoint });\n this._registrationId = registrationId;\n this._proxy = endpoint;\n } catch (err: any) {\n await this.stop();\n throw new Error('FunctionRegistryService not available (check plugin is configured).');\n }\n }\n\n async stop() {\n const trigger = new Trigger();\n this._server?.close(async () => {\n if (this._registrationId) {\n await this._client.services.services.FunctionRegistryService!.unregister({\n registrationId: this._registrationId,\n });\n\n log.info('unregistered', { registrationId: this._registrationId });\n this._registrationId = undefined;\n this._proxy = undefined;\n }\n\n trigger.wake();\n });\n\n await trigger.wait();\n this._port = undefined;\n this._server = undefined;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { DeferredTask } from '@dxos/async';\nimport { type Client, type PublicKey } from '@dxos/client';\nimport type { Query, Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { Filter, createSubscription } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { ComplexMap } from '@dxos/util';\n\nimport { type FunctionManifest, type FunctionTrigger } from '../manifest';\n\n// TODO(burdon): Rename.\nexport type InvokeOptions = {\n endpoint: string;\n};\n\nexport class TriggerManager {\n private readonly _mounts = new ComplexMap<\n { name: string; spaceKey: PublicKey },\n { ctx: Context; trigger: FunctionTrigger }\n >(({ name, spaceKey }) => `${spaceKey.toHex()}:${name}`);\n\n private readonly _queries = new Set<Query>();\n\n constructor(\n private readonly _client: Client,\n private readonly _manifest: FunctionManifest,\n private readonly _invokeOptions: InvokeOptions,\n ) {}\n\n async start() {\n // TODO(burdon): Make runtime configurable (via CLI)?\n this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n await space.waitUntilReady();\n for (const trigger of this._manifest.triggers ?? []) {\n // TODO(burdon): New context? Shared?\n await this.mount(new Context(), space, trigger);\n }\n }\n });\n }\n\n async stop() {\n for (const { name, spaceKey } of this._mounts.keys()) {\n await this.unmount(name, spaceKey);\n }\n }\n\n private async mount(ctx: Context, space: Space, trigger: FunctionTrigger) {\n const key = { name: trigger.function, spaceKey: space.key };\n const config = this._manifest.functions.find((config) => config.id === trigger.function);\n invariant(config, `Function not found: ${trigger.function}`);\n const exists = this._mounts.get(key);\n if (!exists) {\n this._mounts.set(key, { ctx, trigger });\n log('mount', { space: space.key, trigger });\n if (ctx.disposed) {\n return;\n }\n\n // TODO(burdon): Why DeferredTask? How to pass objectIds to function?\n const objectIds = new Set<string>();\n const task = new DeferredTask(ctx, async () => {\n await this.execFunction(this._invokeOptions, config.path, {\n space: space.key,\n objects: Array.from(objectIds),\n });\n });\n\n let count = 0;\n const subscription = createSubscription(({ added, updated }) => {\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\n log('updated', {\n trigger,\n space: space.key,\n objects: objectIds.size,\n count,\n });\n\n task.schedule();\n count++;\n });\n // TODO(burdon): DSL for query (replace props).\n const query = space.db.query(Filter.typename(trigger.subscription.type, trigger.subscription.props));\n this._queries.add(query);\n const unsubscribe = query.subscribe(({ objects }) => {\n subscription.update(objects);\n }, true);\n\n ctx.onDispose(() => {\n subscription.unsubscribe();\n unsubscribe();\n this._queries.delete(query);\n });\n }\n }\n\n private async unmount(name: string, spaceKey: PublicKey) {\n const key = { name, spaceKey };\n const { ctx } = this._mounts.get(key) ?? {};\n if (ctx) {\n this._mounts.delete(key);\n await ctx.dispose();\n }\n }\n\n private async execFunction(options: InvokeOptions, functionName: string, data: any) {\n const { endpoint } = options;\n invariant(endpoint, 'Missing endpoint');\n\n try {\n log('invoke', { function: functionName });\n const url = `${endpoint}/${functionName}`;\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n log('result', { function: functionName, result: await res.json() });\n } catch (err: any) {\n log.error('error', { function: functionName, error: err.message });\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;AAIA,OAAOA,aAAa;AACpB,SAASC,eAAe;AAExB,SAASC,YAAY;AAErB,SAASC,eAAe;AAExB,SAASC,iBAAiB;AAC1B,SAASC,WAAW;;AAeb,IAAMC,YAAN,MAAMA;;EASXC,YACmBC,SACAC,UACjB;mBAFiBD;oBACAC;SAVFC,YAAiF,CAAC;EAWhG;EAEH,IAAIC,WAAW;AACbC,cAAU,KAAKC,OAAK,QAAA;;;;;;;;;AACpB,WAAO,oBAAoB,KAAKA,KAAK;EACvC;EAEA,IAAIC,QAAQ;AACV,WAAO,KAAKC;EACd;EAEA,IAAIC,YAAY;AACd,WAAOC,OAAOC,OAAO,KAAKR,SAAS;EACrC;EAEA,MAAMS,aAAa;AACjB,eAAWC,OAAO,KAAKX,SAASY,SAASL,WAAW;AAClD,YAAM,EAAEM,IAAIC,MAAMC,SAASC,IAAG,IAAKL;AACnC,UAAI;AAEF,cAAMM,SAASC,UAAQC,KAAK,KAAKnB,SAASoB,WAAWJ,GAAAA,CAAAA;AACrD,cAAMD,UAAUE,OAAOI;AACvB,YAAI,OAAON,YAAY,YAAY;AACjC,gBAAM,IAAIO,MAAM,yCAAyCT,EAAAA,EAAI;QAC/D;AAEA,YAAI,KAAKZ,UAAUa,IAAAA,GAAO;AACxBS,cAAIC,KAAK,gCAAgCX,EAAAA,IAAI,QAAA;;;;;;QAC/C;AAEA,aAAKZ,UAAUa,IAAAA,IAAQ;UAAEH;UAAKI;QAAQ;MACxC,SAASU,KAAK;AACZF,YAAIG,MAAM,qCAAqCD,KAAAA;;;;;;MACjD;IACF;EACF;EAEA,MAAME,QAAQ;AACZ,UAAMC,MAAMC,QAAAA;AACZD,QAAIE,IAAID,QAAQE,KAAI,CAAA;AAEpBH,QAAII,KAAK,UAAU,OAAOC,KAAKC,QAAAA;AAC7B,YAAM,EAAEC,KAAI,IAAKF,IAAIG;AAErB,YAAMC,WAAqB;QACzBC,QAAQ,CAACC,SAAAA;AACPL,cAAIM,aAAaD;AACjB,iBAAOF;QACT;QAEAI,SAAS,CAACC,SAAS,CAAC,MAAC;AACnBR,cAAIS,IAAIC,KAAKC,UAAUH,MAAAA,CAAAA;AACvB,iBAAOL;QACT;MACF;AAEA,YAAMS,UAA2B;QAC/BC,QAAQ,KAAKhD;QACbuC,QAAQD,SAASC,OAAOU,KAAKX,QAAAA;MAC/B;AAEA,YAAM,YAAA;AACJ,YAAI;AACFd,cAAI,aAAaY,IAAAA,IAAM,QAAA;;;;;;AACvB,gBAAM,EAAEpB,QAAO,IAAK,KAAKd,UAAUkC,IAAAA;AACnC,gBAAME,YAAW,MAAMtB,QAAQ;YAAE+B;YAASG,OAAOhB,IAAIiB;UAAK,CAAA;AAC1D3B,cAAI,QAAQ;YAAEc,UAAAA;UAAS,GAAA;;;;;;QACzB,SAASZ,KAAU;AACjBS,cAAIM,aAAa;AACjBN,cAAIS,IAAIlB,IAAI0B,OAAO;QACrB;MACF,GAAA;IACF,CAAA;AAGA,SAAK/C,QAAQ,MAAMgD,QAAQ;MAAEC,MAAM;MAAMC,WAAW;QAAC;QAAM;;IAAM,CAAA;AACjE,SAAKC,UAAU3B,IAAI4B,OAAO,KAAKpD,KAAK;AAGpC,QAAI;AAEF,YAAM,EAAEqD,gBAAgBvD,SAAQ,IAAK,MAAM,KAAKH,QAAQ2D,SAASA,SAASC,wBAAyBC,SAAS;QAC1G1D,UAAU,KAAKA;QACfK,WAAW,KAAKA,UAAUsD,IAAI,CAAC,EAAElD,KAAK,EAAEG,KAAI,EAAE,OAAQ;UAAEqB,MAAMrB;QAAK,EAAA;MACrE,CAAA;AAEAS,UAAIuC,KAAK,cAAc;QAAEL;QAAgBvD;MAAS,GAAA;;;;;;AAClD,WAAK6D,kBAAkBN;AACvB,WAAKnD,SAASJ;IAChB,SAASuB,KAAU;AACjB,YAAM,KAAKuC,KAAI;AACf,YAAM,IAAI1C,MAAM,qEAAA;IAClB;EACF;EAEA,MAAM0C,OAAO;AACX,UAAMC,UAAU,IAAIC,QAAAA;AACpB,SAAKX,SAASY,MAAM,YAAA;AAClB,UAAI,KAAKJ,iBAAiB;AACxB,cAAM,KAAKhE,QAAQ2D,SAASA,SAASC,wBAAyBS,WAAW;UACvEX,gBAAgB,KAAKM;QACvB,CAAA;AAEAxC,YAAIuC,KAAK,gBAAgB;UAAEL,gBAAgB,KAAKM;QAAgB,GAAA;;;;;;AAChE,aAAKA,kBAAkBM;AACvB,aAAK/D,SAAS+D;MAChB;AAEAJ,cAAQK,KAAI;IACd,CAAA;AAEA,UAAML,QAAQM,KAAI;AAClB,SAAKnE,QAAQiE;AACb,SAAKd,UAAUc;EACjB;AACF;;;ACtJA,SAASG,oBAAoB;AAG7B,SAASC,eAAe;AACxB,SAASC,QAAQC,0BAA0B;AAC3C,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,OAAAA,YAAW;AACpB,SAASC,kBAAkB;;AASpB,IAAMC,iBAAN,MAAMA;EAQXC,YACmBC,SACAC,WACAC,gBACjB;mBAHiBF;qBACAC;0BACAC;SAVFC,UAAU,IAAIN,WAG7B,CAAC,EAAEO,MAAMC,SAAQ,MAAO,GAAGA,SAASC,MAAK,CAAA,IAAMF,IAAAA,EAAM;SAEtCG,WAAW,oBAAIC,IAAAA;EAM7B;EAEH,MAAMC,QAAQ;AAEZ,SAAKT,QAAQU,OAAOC,UAAU,OAAOD,WAAAA;AACnC,iBAAWE,SAASF,QAAQ;AAC1B,cAAME,MAAMC,eAAc;AAC1B,mBAAWC,WAAW,KAAKb,UAAUc,YAAY,CAAA,GAAI;AAEnD,gBAAM,KAAKC,MAAM,IAAIxB,QAAAA,GAAWoB,OAAOE,OAAAA;QACzC;MACF;IACF,CAAA;EACF;EAEA,MAAMG,OAAO;AACX,eAAW,EAAEb,MAAMC,SAAQ,KAAM,KAAKF,QAAQe,KAAI,GAAI;AACpD,YAAM,KAAKC,QAAQf,MAAMC,QAAAA;IAC3B;EACF;EAEA,MAAcW,MAAMI,KAAcR,OAAcE,SAA0B;AACxE,UAAMO,MAAM;MAAEjB,MAAMU,QAAQQ;MAAUjB,UAAUO,MAAMS;IAAI;AAC1D,UAAME,SAAS,KAAKtB,UAAUuB,UAAUC,KAAK,CAACF,YAAWA,QAAOG,OAAOZ,QAAQQ,QAAQ;AACvF3B,IAAAA,WAAU4B,QAAQ,uBAAuBT,QAAQQ,QAAQ,IAAE;;;;;;;;;AAC3D,UAAMK,SAAS,KAAKxB,QAAQyB,IAAIP,GAAAA;AAChC,QAAI,CAACM,QAAQ;AACX,WAAKxB,QAAQ0B,IAAIR,KAAK;QAAED;QAAKN;MAAQ,CAAA;AACrClB,MAAAA,KAAI,SAAS;QAAEgB,OAAOA,MAAMS;QAAKP;MAAQ,GAAA;;;;;;AACzC,UAAIM,IAAIU,UAAU;AAChB;MACF;AAGA,YAAMC,YAAY,oBAAIvB,IAAAA;AACtB,YAAMwB,OAAO,IAAIzC,aAAa6B,KAAK,YAAA;AACjC,cAAM,KAAKa,aAAa,KAAK/B,gBAAgBqB,OAAOW,MAAM;UACxDtB,OAAOA,MAAMS;UACbc,SAASC,MAAMC,KAAKN,SAAAA;QACtB,CAAA;MACF,CAAA;AAEA,UAAIO,QAAQ;AACZ,YAAMC,eAAe7C,mBAAmB,CAAC,EAAE8C,OAAOC,QAAO,MAAE;AACzD,mBAAWC,UAAUF,OAAO;AAC1BT,oBAAUY,IAAID,OAAOhB,EAAE;QACzB;AACA,mBAAWgB,UAAUD,SAAS;AAC5BV,oBAAUY,IAAID,OAAOhB,EAAE;QACzB;AAEA9B,QAAAA,KAAI,WAAW;UACbkB;UACAF,OAAOA,MAAMS;UACbc,SAASJ,UAAUa;UACnBN;QACF,GAAA;;;;;;AAEAN,aAAKa,SAAQ;AACbP;MACF,CAAA;AAEA,YAAMQ,QAAQlC,MAAMmC,GAAGD,MAAMrD,OAAOuD,SAASlC,QAAQyB,aAAaU,MAAMnC,QAAQyB,aAAaW,KAAK,CAAA;AAClG,WAAK3C,SAASoC,IAAIG,KAAAA;AAClB,YAAMK,cAAcL,MAAMnC,UAAU,CAAC,EAAEwB,QAAO,MAAE;AAC9CI,qBAAaa,OAAOjB,OAAAA;MACtB,GAAG,IAAA;AAEHf,UAAIiC,UAAU,MAAA;AACZd,qBAAaY,YAAW;AACxBA,oBAAAA;AACA,aAAK5C,SAAS+C,OAAOR,KAAAA;MACvB,CAAA;IACF;EACF;EAEA,MAAc3B,QAAQf,MAAcC,UAAqB;AACvD,UAAMgB,MAAM;MAAEjB;MAAMC;IAAS;AAC7B,UAAM,EAAEe,IAAG,IAAK,KAAKjB,QAAQyB,IAAIP,GAAAA,KAAQ,CAAC;AAC1C,QAAID,KAAK;AACP,WAAKjB,QAAQmD,OAAOjC,GAAAA;AACpB,YAAMD,IAAImC,QAAO;IACnB;EACF;EAEA,MAActB,aAAauB,SAAwBC,cAAsBC,MAAW;AAClF,UAAM,EAAEC,SAAQ,IAAKH;AACrB7D,IAAAA,WAAUgE,UAAU,oBAAA;;;;;;;;;AAEpB,QAAI;AACF/D,MAAAA,KAAI,UAAU;QAAE0B,UAAUmC;MAAa,GAAA;;;;;;AACvC,YAAMG,MAAM,GAAGD,QAAAA,IAAYF,YAAAA;AAC3B,YAAMI,MAAM,MAAMC,MAAMF,KAAK;QAC3BG,QAAQ;QACRC,MAAMC,KAAKC,UAAUR,IAAAA;QACrBS,SAAS;UACP,gBAAgB;QAClB;MACF,CAAA;AAEAvE,MAAAA,KAAI,UAAU;QAAE0B,UAAUmC;QAAcW,QAAQ,MAAMP,IAAIQ,KAAI;MAAG,GAAA;;;;;;IACnE,SAASC,KAAU;AACjB1E,MAAAA,KAAI2E,MAAM,SAAS;QAAEjD,UAAUmC;QAAcc,OAAOD,IAAIE;MAAQ,GAAA;;;;;;IAClE;EACF;AACF;",
6
+ "names": ["express", "getPort", "join", "Trigger", "invariant", "log", "DevServer", "constructor", "_client", "_options", "_handlers", "endpoint", "invariant", "_port", "proxy", "_proxy", "functions", "Object", "values", "initialize", "def", "manifest", "id", "path", "handler", "dir", "module", "require", "join", "directory", "default", "Error", "log", "warn", "err", "error", "start", "app", "express", "use", "json", "post", "req", "res", "name", "params", "response", "status", "code", "statusCode", "succeed", "result", "end", "JSON", "stringify", "context", "client", "bind", "event", "body", "message", "getPort", "port", "portRange", "_server", "listen", "registrationId", "services", "FunctionRegistryService", "register", "map", "info", "_registrationId", "stop", "trigger", "Trigger", "close", "unregister", "undefined", "wake", "wait", "DeferredTask", "Context", "Filter", "createSubscription", "invariant", "log", "ComplexMap", "TriggerManager", "constructor", "_client", "_manifest", "_invokeOptions", "_mounts", "name", "spaceKey", "toHex", "_queries", "Set", "start", "spaces", "subscribe", "space", "waitUntilReady", "trigger", "triggers", "mount", "stop", "keys", "unmount", "ctx", "key", "function", "config", "functions", "find", "id", "exists", "get", "set", "disposed", "objectIds", "task", "execFunction", "path", "objects", "Array", "from", "count", "subscription", "added", "updated", "object", "add", "size", "schedule", "query", "db", "typename", "type", "props", "unsubscribe", "update", "onDispose", "delete", "dispose", "options", "functionName", "data", "endpoint", "url", "res", "fetch", "method", "body", "JSON", "stringify", "headers", "result", "json", "err", "error", "message"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/core/functions/src/function.ts":{"bytes":1777,"imports":[],"format":"esm"},"packages/core/functions/src/runtime/dev-server.ts":{"bytes":14040,"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"portfinder","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/trigger-manager.ts":{"bytes":16473,"imports":[{"path":"@dxos/async","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/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/index.ts":{"bytes":579,"imports":[{"path":"packages/core/functions/src/runtime/dev-server.ts","kind":"import-statement","original":"./dev-server"},{"path":"packages/core/functions/src/runtime/trigger-manager.ts","kind":"import-statement","original":"./trigger-manager"}],"format":"esm"},"packages/core/functions/src/index.ts":{"bytes":545,"imports":[{"path":"packages/core/functions/src/function.ts","kind":"import-statement","original":"./function"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"./runtime"}],"format":"esm"}},"outputs":{"packages/core/functions/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":14517},"packages/core/functions/dist/lib/browser/index.mjs":{"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"portfinder","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","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/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["DevServer","TriggerManager"],"entryPoint":"packages/core/functions/src/index.ts","inputs":{"packages/core/functions/src/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/dev-server.ts":{"bytesInOutput":3242},"packages/core/functions/src/runtime/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/trigger-manager.ts":{"bytesInOutput":4315}},"bytes":8149}}}
1
+ {"inputs":{"packages/core/functions/src/handler.ts":{"bytes":1109,"imports":[],"format":"esm"},"packages/core/functions/src/manifest.ts":{"bytes":1346,"imports":[],"format":"esm"},"packages/core/functions/src/runtime/dev-server.ts":{"bytes":17196,"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/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/trigger-manager.ts":{"bytes":16867,"imports":[{"path":"@dxos/async","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/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/index.ts":{"bytes":584,"imports":[{"path":"packages/core/functions/src/runtime/dev-server.ts","kind":"import-statement","original":"./dev-server"},{"path":"packages/core/functions/src/runtime/trigger-manager.ts","kind":"import-statement","original":"./trigger-manager"}],"format":"esm"},"packages/core/functions/src/index.ts":{"bytes":637,"imports":[{"path":"packages/core/functions/src/handler.ts","kind":"import-statement","original":"./handler"},{"path":"packages/core/functions/src/manifest.ts","kind":"import-statement","original":"./manifest"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"./runtime"}],"format":"esm"}},"outputs":{"packages/core/functions/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":15788},"packages/core/functions/dist/lib/browser/index.mjs":{"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/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","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/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["DevServer","TriggerManager"],"entryPoint":"packages/core/functions/src/index.ts","inputs":{"packages/core/functions/src/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/dev-server.ts":{"bytesInOutput":4383},"packages/core/functions/src/runtime/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/trigger-manager.ts":{"bytesInOutput":4463}},"bytes":9438}}}