@dxos/functions 0.5.9-next.a50ff17 → 0.6.0

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 (33) hide show
  1. package/dist/lib/browser/{chunk-YKYOGE5O.mjs → chunk-6ENHIEIP.mjs} +64 -34
  2. package/dist/lib/browser/chunk-6ENHIEIP.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-ERWZ4JUZ.mjs → chunk-YSDC6YCF.mjs} +2 -2
  4. package/dist/lib/browser/{chunk-ERWZ4JUZ.mjs.map → chunk-YSDC6YCF.mjs.map} +2 -2
  5. package/dist/lib/browser/index.mjs +2 -2
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/testing/index.mjs +3 -3
  8. package/dist/lib/browser/testing/index.mjs.map +2 -2
  9. package/dist/lib/browser/types.mjs +1 -1
  10. package/dist/lib/node/{chunk-BLLSDTKZ.cjs → chunk-3E6PY6JH.cjs} +5 -5
  11. package/dist/lib/node/{chunk-BLLSDTKZ.cjs.map → chunk-3E6PY6JH.cjs.map} +2 -2
  12. package/dist/lib/node/{chunk-CIFOOX2V.cjs → chunk-RC4NXTBG.cjs} +84 -54
  13. package/dist/lib/node/chunk-RC4NXTBG.cjs.map +7 -0
  14. package/dist/lib/node/index.cjs +10 -10
  15. package/dist/lib/node/meta.json +1 -1
  16. package/dist/lib/node/testing/index.cjs +10 -10
  17. package/dist/lib/node/testing/index.cjs.map +2 -2
  18. package/dist/lib/node/types.cjs +5 -5
  19. package/dist/lib/node/types.cjs.map +1 -1
  20. package/dist/types/src/runtime/dev-server.d.ts +2 -1
  21. package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
  22. package/dist/types/src/runtime/scheduler.d.ts +8 -1
  23. package/dist/types/src/runtime/scheduler.d.ts.map +1 -1
  24. package/dist/types/src/testing/setup.d.ts +1 -1
  25. package/package.json +15 -14
  26. package/src/runtime/dev-server.test.ts +3 -3
  27. package/src/runtime/dev-server.ts +6 -3
  28. package/src/runtime/scheduler.ts +29 -6
  29. package/src/testing/functions-integration.test.ts +1 -1
  30. package/src/testing/setup.ts +1 -1
  31. package/src/types.ts +1 -1
  32. package/dist/lib/browser/chunk-YKYOGE5O.mjs.map +0 -7
  33. package/dist/lib/node/chunk-CIFOOX2V.cjs.map +0 -7
@@ -3,7 +3,7 @@ import {
3
3
  FunctionDef,
4
4
  FunctionTrigger,
5
5
  __require
6
- } from "./chunk-ERWZ4JUZ.mjs";
6
+ } from "./chunk-YSDC6YCF.mjs";
7
7
 
8
8
  // packages/core/functions/src/function/function-registry.ts
9
9
  import { Event } from "@dxos/async";
@@ -112,6 +112,7 @@ import { Context } from "@dxos/context";
112
112
  import { invariant } from "@dxos/invariant";
113
113
  import { log as log2 } from "@dxos/log";
114
114
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/dev-server.ts";
115
+ var FN_TIMEOUT = 2e4;
115
116
  var DevServer = class {
116
117
  constructor(_client, _functionsRegistry, _options) {
117
118
  this._client = _client;
@@ -130,7 +131,7 @@ var DevServer = class {
130
131
  get endpoint() {
131
132
  invariant(this._port, void 0, {
132
133
  F: __dxlog_file2,
133
- L: 57,
134
+ L: 60,
134
135
  S: this,
135
136
  A: [
136
137
  "this._port",
@@ -148,7 +149,7 @@ var DevServer = class {
148
149
  async start() {
149
150
  invariant(!this._server, void 0, {
150
151
  F: __dxlog_file2,
151
- L: 70,
152
+ L: 73,
152
153
  S: this,
153
154
  A: [
154
155
  "!this._server",
@@ -157,7 +158,7 @@ var DevServer = class {
157
158
  });
158
159
  log2.info("starting...", void 0, {
159
160
  F: __dxlog_file2,
160
- L: 71,
161
+ L: 74,
161
162
  S: this,
162
163
  C: (f, a) => f(...a)
163
164
  });
@@ -171,7 +172,7 @@ var DevServer = class {
171
172
  path: path2
172
173
  }, {
173
174
  F: __dxlog_file2,
174
- L: 81,
175
+ L: 84,
175
176
  S: this,
176
177
  C: (f, a) => f(...a)
177
178
  });
@@ -179,12 +180,12 @@ var DevServer = class {
179
180
  const { def } = this._handlers["/" + path2];
180
181
  await this._load(def, true);
181
182
  }
182
- res.statusCode = await asyncTimeout(this.invoke("/" + path2, req.body), 2e4);
183
+ res.statusCode = await asyncTimeout(this.invoke("/" + path2, req.body), FN_TIMEOUT);
183
184
  res.end();
184
185
  } catch (err) {
185
186
  log2.catch(err, void 0, {
186
187
  F: __dxlog_file2,
187
- L: 91,
188
+ L: 94,
188
189
  S: this,
189
190
  C: (f, a) => f(...a)
190
191
  });
@@ -209,7 +210,7 @@ var DevServer = class {
209
210
  endpoint
210
211
  }, {
211
212
  F: __dxlog_file2,
212
- L: 106,
213
+ L: 109,
213
214
  S: this,
214
215
  C: (f, a) => f(...a)
215
216
  });
@@ -225,7 +226,7 @@ var DevServer = class {
225
226
  port: this._port
226
227
  }, {
227
228
  F: __dxlog_file2,
228
- L: 118,
229
+ L: 121,
229
230
  S: this,
230
231
  C: (f, a) => f(...a)
231
232
  });
@@ -236,7 +237,7 @@ var DevServer = class {
236
237
  }
237
238
  log2.info("stopping...", void 0, {
238
239
  F: __dxlog_file2,
239
- L: 126,
240
+ L: 129,
240
241
  S: this,
241
242
  C: (f, a) => f(...a)
242
243
  });
@@ -245,7 +246,7 @@ var DevServer = class {
245
246
  this._server.close(async () => {
246
247
  log2.info("server stopped", void 0, {
247
248
  F: __dxlog_file2,
248
- L: 131,
249
+ L: 134,
249
250
  S: this,
250
251
  C: (f, a) => f(...a)
251
252
  });
@@ -253,7 +254,7 @@ var DevServer = class {
253
254
  if (this._functionServiceRegistration) {
254
255
  invariant(this._client.services.services.FunctionRegistryService, void 0, {
255
256
  F: __dxlog_file2,
256
- L: 134,
257
+ L: 137,
257
258
  S: this,
258
259
  A: [
259
260
  "this._client.services.services.FunctionRegistryService",
@@ -267,7 +268,7 @@ var DevServer = class {
267
268
  registrationId: this._functionServiceRegistration
268
269
  }, {
269
270
  F: __dxlog_file2,
270
- L: 139,
271
+ L: 142,
271
272
  S: this,
272
273
  C: (f, a) => f(...a)
273
274
  });
@@ -284,7 +285,7 @@ var DevServer = class {
284
285
  this._server = void 0;
285
286
  log2.info("stopped", void 0, {
286
287
  F: __dxlog_file2,
287
- L: 153,
288
+ L: 156,
288
289
  S: this,
289
290
  C: (f, a) => f(...a)
290
291
  });
@@ -296,7 +297,7 @@ var DevServer = class {
296
297
  newFunctions
297
298
  }, {
298
299
  F: __dxlog_file2,
299
- L: 159,
300
+ L: 162,
300
301
  S: this,
301
302
  C: (f, a) => f(...a)
302
303
  });
@@ -312,7 +313,7 @@ var DevServer = class {
312
313
  force
313
314
  }, {
314
315
  F: __dxlog_file2,
315
- L: 168,
316
+ L: 171,
316
317
  S: this,
317
318
  C: (f, a) => f(...a)
318
319
  });
@@ -333,7 +334,7 @@ var DevServer = class {
333
334
  async _safeUpdateRegistration() {
334
335
  invariant(this._functionServiceRegistration, void 0, {
335
336
  F: __dxlog_file2,
336
- L: 190,
337
+ L: 193,
337
338
  S: this,
338
339
  A: [
339
340
  "this._functionServiceRegistration",
@@ -351,7 +352,7 @@ var DevServer = class {
351
352
  } catch (err) {
352
353
  log2.catch(err, void 0, {
353
354
  F: __dxlog_file2,
354
- L: 197,
355
+ L: 200,
355
356
  S: this,
356
357
  C: (f, a) => f(...a)
357
358
  });
@@ -368,7 +369,7 @@ var DevServer = class {
368
369
  path: path2
369
370
  }, {
370
371
  F: __dxlog_file2,
371
- L: 208,
372
+ L: 211,
372
373
  S: this,
373
374
  C: (f, a) => f(...a)
374
375
  });
@@ -382,7 +383,7 @@ var DevServer = class {
382
383
  duration: Date.now() - now
383
384
  }, {
384
385
  F: __dxlog_file2,
385
- L: 211,
386
+ L: 214,
386
387
  S: this,
387
388
  C: (f, a) => f(...a)
388
389
  });
@@ -393,7 +394,7 @@ var DevServer = class {
393
394
  const { handler } = this._handlers[path2] ?? {};
394
395
  invariant(handler, `invalid path: ${path2}`, {
395
396
  F: __dxlog_file2,
396
- L: 218,
397
+ L: 221,
397
398
  S: this,
398
399
  A: [
399
400
  "handler",
@@ -421,12 +422,17 @@ var DevServer = class {
421
422
  };
422
423
  var createContext = () => new Context({
423
424
  name: "DevServer"
425
+ }, {
426
+ F: __dxlog_file2,
427
+ L: 240
424
428
  });
425
429
 
426
430
  // packages/core/functions/src/runtime/scheduler.ts
427
431
  import path from "@dxos/node-std/path";
428
432
  import { Mutex } from "@dxos/async";
433
+ import { loadObjectReferences } from "@dxos/client/echo";
429
434
  import { Context as Context2 } from "@dxos/context";
435
+ import { Reference } from "@dxos/echo-protocol";
430
436
  import { log as log3 } from "@dxos/log";
431
437
  var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/scheduler.ts";
432
438
  var Scheduler = class {
@@ -454,7 +460,7 @@ var Scheduler = class {
454
460
  await this.functions.close();
455
461
  await this.triggers.close();
456
462
  }
457
- // TODO(burdon): Remove and update registries directly.
463
+ // TODO(burdon): Remove and update registries directly?
458
464
  async register(space, manifest) {
459
465
  await this.functions.register(space, manifest.functions);
460
466
  await this.triggers.register(space, manifest);
@@ -465,6 +471,9 @@ var Scheduler = class {
465
471
  });
466
472
  await Promise.all(mountTasks).catch(log3.catch);
467
473
  }
474
+ /**
475
+ * Activate trigger.
476
+ */
468
477
  async activate(space, functions, trigger) {
469
478
  const definition = functions.find((def) => def.uri === trigger.function);
470
479
  if (!definition) {
@@ -472,7 +481,7 @@ var Scheduler = class {
472
481
  trigger
473
482
  }, {
474
483
  F: __dxlog_file3,
475
- L: 78,
484
+ L: 83,
476
485
  S: this,
477
486
  C: (f, a) => f(...a)
478
487
  });
@@ -485,21 +494,33 @@ var Scheduler = class {
485
494
  uri: definition.uri
486
495
  }, {
487
496
  F: __dxlog_file3,
488
- L: 86,
497
+ L: 91,
489
498
  S: this,
490
499
  C: (f, a) => f(...a)
491
500
  });
492
- return mutex.executeSynchronized(() => {
501
+ return mutex.executeSynchronized(async () => {
493
502
  log3.info("mutex acquired", {
494
503
  uri: definition.uri
495
504
  }, {
496
505
  F: __dxlog_file3,
497
- L: 88,
506
+ L: 93,
498
507
  S: this,
499
508
  C: (f, a) => f(...a)
500
509
  });
510
+ await loadObjectReferences(trigger, (t) => Object.values(t.meta ?? {}));
511
+ const meta = {};
512
+ for (const [key, value] of Object.entries(trigger.meta ?? {})) {
513
+ if (value instanceof Reference) {
514
+ const object = await space.db.loadObjectById(value.objectId);
515
+ if (object) {
516
+ meta[key] = object;
517
+ }
518
+ } else {
519
+ meta[key] = value;
520
+ }
521
+ }
501
522
  return this._execFunction(definition, trigger, {
502
- meta: trigger.meta ?? {},
523
+ meta,
503
524
  data: {
504
525
  ...args,
505
526
  spaceKey: space.key
@@ -512,12 +533,15 @@ var Scheduler = class {
512
533
  trigger
513
534
  }, {
514
535
  F: __dxlog_file3,
515
- L: 96,
536
+ L: 116,
516
537
  S: this,
517
538
  C: (f, a) => f(...a)
518
539
  });
519
540
  }
520
- async _execFunction(def, trigger, { data, meta }) {
541
+ /**
542
+ * Invoke function RPC.
543
+ */
544
+ async _execFunction(def, trigger, { meta, data }) {
521
545
  let status = 0;
522
546
  try {
523
547
  const payload = Object.assign({}, meta && {
@@ -532,7 +556,7 @@ var Scheduler = class {
532
556
  triggerType: trigger.spec.type
533
557
  }, {
534
558
  F: __dxlog_file3,
535
- L: 113,
559
+ L: 136,
536
560
  S: this,
537
561
  C: (f, a) => f(...a)
538
562
  });
@@ -549,7 +573,7 @@ var Scheduler = class {
549
573
  function: def.uri
550
574
  }, {
551
575
  F: __dxlog_file3,
552
- L: 124,
576
+ L: 147,
553
577
  S: this,
554
578
  C: (f, a) => f(...a)
555
579
  });
@@ -563,7 +587,7 @@ var Scheduler = class {
563
587
  status
564
588
  }, {
565
589
  F: __dxlog_file3,
566
- L: 134,
590
+ L: 157,
567
591
  S: this,
568
592
  C: (f, a) => f(...a)
569
593
  });
@@ -573,7 +597,7 @@ var Scheduler = class {
573
597
  error: err.message
574
598
  }, {
575
599
  F: __dxlog_file3,
576
- L: 136,
600
+ L: 159,
577
601
  S: this,
578
602
  C: (f, a) => f(...a)
579
603
  });
@@ -584,6 +608,9 @@ var Scheduler = class {
584
608
  };
585
609
  var createContext2 = () => new Context2({
586
610
  name: "FunctionScheduler"
611
+ }, {
612
+ F: __dxlog_file3,
613
+ L: 167
587
614
  });
588
615
 
589
616
  // packages/core/functions/src/trigger/trigger-registry.ts
@@ -898,6 +925,9 @@ var TriggerRegistry = class extends Resource2 {
898
925
  });
899
926
  const activationCtx = new Context3({
900
927
  name: `FunctionTrigger-${trigger.function}`
928
+ }, {
929
+ F: __dxlog_file8,
930
+ L: 74
901
931
  });
902
932
  this._ctx.onDispose(() => activationCtx.dispose());
903
933
  const registeredTrigger = this._triggersBySpaceKey.get(space.key)?.find((reg) => reg.trigger.id === trigger.id);
@@ -1090,4 +1120,4 @@ export {
1090
1120
  Scheduler,
1091
1121
  TriggerRegistry
1092
1122
  };
1093
- //# sourceMappingURL=chunk-YKYOGE5O.mjs.map
1123
+ //# sourceMappingURL=chunk-6ENHIEIP.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/function/function-registry.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 public getUniqueByUri(): FunctionDef[] {\n const uniqueByUri = [...this._functionBySpaceKey.values()]\n .flatMap((defs) => defs)\n .reduce((acc, v) => {\n acc.set(v.uri, v);\n return acc;\n }, new Map<string, FunctionDef>());\n return [...uniqueByUri.values()];\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.schemaRegistry.hasSchema(FunctionDef)) {\n space.db.graph.schemaRegistry.addSchema([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 express from 'express';\nimport { getPort } from 'get-port-please';\nimport type http from 'http';\nimport { join } from 'node:path';\n\nimport { asyncTimeout, 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\nconst FN_TIMEOUT = 20_000;\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 loading and invoking functions.\n * Functions are executed in the context of an authenticated client.\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\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): Change 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 asyncTimeout(this.invoke('/' + path, req.body), FN_TIMEOUT);\n res.end();\n } catch (err: any) {\n log.catch(err);\n res.statusCode = 500;\n res.end();\n }\n });\n\n this._port = this._options.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._handleNewFunctions(this._functionsRegistry.getUniqueByUri());\n this._ctx.onDispose(this._functionsRegistry.registered.on(({ added }) => this._handleNewFunctions(added)));\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 if (!this._server) {\n return;\n }\n\n log.info('stopping...');\n await this._ctx.dispose();\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 private async _handleNewFunctions(newFunctions: FunctionDef[]) {\n newFunctions.forEach((def) => this._load(def));\n await this._safeUpdateRegistration();\n log('new functions loaded', { newFunctions });\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 { loadObjectReferences, type Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { Reference } from '@dxos/echo-protocol';\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 trigger configurations.\n * Functions are scheduled within the context of a specific space.\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 /**\n * Activate trigger.\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(async () => {\n log.info('mutex acquired', { uri: definition.uri });\n\n // Load potential references in meta properties to serialize.\n await loadObjectReferences(trigger, (t) => Object.values(t.meta ?? {}));\n const meta: FunctionTrigger['meta'] = {};\n for (const [key, value] of Object.entries(trigger.meta ?? {})) {\n if (value instanceof Reference) {\n const object = await space.db.loadObjectById(value.objectId);\n if (object) {\n meta[key] = object;\n }\n } else {\n meta[key] = value;\n }\n }\n\n return this._execFunction(definition, trigger, {\n meta,\n data: { ...args, spaceKey: space.key },\n });\n });\n });\n\n log('activated trigger', { space: space.key, trigger });\n }\n\n /**\n * Invoke function RPC.\n */\n private async _execFunction<TData, TMeta>(\n def: FunctionDef,\n trigger: FunctionTrigger,\n { meta, data }: { meta?: TMeta; data: TData },\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.schemaRegistry.hasSchema(FunctionTrigger)) {\n space.db.graph.schemaRegistry.addSchema([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 { TextType } 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, getObjectCore, 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 TextType) {\n subscriptions.push(getObjectCore(content).updates.on(debounce(() => subscription.update([object]), 1_000)));\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 wasOpen = false;\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 && wasOpen && !ctx.disposed) {\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 open.wake(false);\n },\n\n onerror: (event) => {\n log.catch(event.error, { url });\n open.wake(false);\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 (ctx.disposed) {\n break;\n }\n if (isOpen) {\n wasOpen = true;\n break;\n }\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 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", "getUniqueByUri", "uniqueByUri", "values", "flatMap", "defs", "reduce", "acc", "v", "set", "uri", "Map", "register", "functions", "log", "length", "db", "graph", "schemaRegistry", "hasSchema", "FunctionDef", "addSchema", "objects", "existing", "query", "Filter", "schema", "run", "added", "diff", "a", "b", "forEach", "def", "add", "create", "_open", "info", "spacesSubscription", "spaces", "subscribe", "has", "waitUntilReady", "_ctx", "disposed", "onDispose", "push", "emit", "unsubscribe", "_close", "_", "clear", "express", "getPort", "join", "asyncTimeout", "Event", "Trigger", "Context", "invariant", "log", "FN_TIMEOUT", "DevServer", "constructor", "_client", "_functionsRegistry", "_options", "_ctx", "createContext", "_handlers", "_seq", "update", "Event", "stats", "seq", "endpoint", "invariant", "_port", "proxy", "_proxy", "functions", "Object", "values", "start", "_server", "log", "info", "app", "express", "use", "json", "post", "req", "res", "path", "params", "reload", "def", "_load", "statusCode", "asyncTimeout", "invoke", "body", "end", "err", "catch", "port", "getPort", "host", "portRange", "listen", "registrationId", "services", "FunctionRegistryService", "register", "_functionServiceRegistration", "_handleNewFunctions", "getUniqueByUri", "onDispose", "registered", "on", "added", "stop", "Error", "dispose", "trigger", "Trigger", "close", "unregister", "undefined", "wake", "throw", "wait", "newFunctions", "forEach", "_safeUpdateRegistration", "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", "loadObjectReferences", "Context", "Reference", "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", "t", "Object", "values", "meta", "key", "value", "entries", "object", "db", "loadObjectById", "objectId", "_execFunction", "data", "spaceKey", "status", "payload", "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", "TextType", "debounce", "UpdateScheduler", "Filter", "createSubscription", "getObjectCore", "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", "wasOpen", "ws", "attempt", "open", "Object", "assign", "onopen", "info", "send", "TextEncoder", "encode", "JSON", "stringify", "wake", "onclose", "event", "code", "disposed", "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", "schemaRegistry", "hasSchema", "FunctionTrigger", "addSchema", "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
+ }
@@ -63,7 +63,7 @@ var FunctionTrigger = class extends TypedObject({
63
63
  enabled: S.optional(S.Boolean),
64
64
  function: S.String.pipe(S.description("Function URI.")),
65
65
  // The `meta` property is merged into the event data passed to the function.
66
- meta: S.optional(S.mutable(S.Any)),
66
+ meta: S.optional(S.mutable(S.Record(S.String, S.Any))),
67
67
  spec: TriggerSpecSchema
68
68
  }) {
69
69
  };
@@ -83,4 +83,4 @@ export {
83
83
  FunctionManifestSchema,
84
84
  FUNCTION_SCHEMA
85
85
  };
86
- //# sourceMappingURL=chunk-ERWZ4JUZ.mjs.map
86
+ //# sourceMappingURL=chunk-YSDC6YCF.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { RawObject, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Type discriminator for TriggerSpec.\n * Every spec has a type field of type FunctionTriggerType that we can use to understand which\n * type we're working with.\n * https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions\n */\nexport type FunctionTriggerType = 'subscription' | 'timer' | 'webhook' | 'websocket';\n\nconst SubscriptionTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('subscription'),\n // TODO(burdon): Define query DSL (from ECHO).\n filter: S.Array(\n S.Struct({\n type: S.String,\n props: S.optional(S.Record(S.String, S.Any)),\n }),\n ),\n options: S.optional(\n S.Struct({\n // Watch changes to object (not just creation).\n deep: S.optional(S.Boolean),\n // Debounce changes (delay in ms).\n delay: S.optional(S.Number),\n }),\n ),\n }),\n);\n\nexport type SubscriptionTrigger = S.Schema.Type<typeof SubscriptionTriggerSchema>;\n\nconst TimerTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('timer'),\n cron: S.String,\n }),\n);\n\nexport type TimerTrigger = S.Schema.Type<typeof TimerTriggerSchema>;\n\nconst WebhookTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('webhook'),\n method: S.String,\n // Assigned port.\n port: S.optional(S.Number),\n }),\n);\n\nexport type WebhookTrigger = S.Schema.Type<typeof WebhookTriggerSchema>;\n\nconst WebsocketTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('websocket'),\n url: S.String,\n init: S.optional(S.Record(S.String, S.Any)),\n }),\n);\n\nexport type WebsocketTrigger = S.Schema.Type<typeof WebsocketTriggerSchema>;\n\nconst TriggerSpecSchema = S.Union(\n TimerTriggerSchema,\n WebhookTriggerSchema,\n WebsocketTriggerSchema,\n SubscriptionTriggerSchema,\n);\n\nexport type TriggerSpec = TimerTrigger | WebhookTrigger | WebsocketTrigger | SubscriptionTrigger;\n\n/**\n * Function definition.\n */\nexport class FunctionDef extends TypedObject({\n typename: 'dxos.org/type/FunctionDef',\n version: '0.1.0',\n})({\n uri: S.String,\n description: S.optional(S.String),\n route: S.String,\n handler: S.String,\n}) {}\n\n/**\n * Function trigger.\n */\nexport class FunctionTrigger extends TypedObject({\n typename: 'dxos.org/type/FunctionTrigger',\n version: '0.1.0',\n})({\n enabled: S.optional(S.Boolean),\n function: S.String.pipe(S.description('Function URI.')),\n // The `meta` property is merged into the event data passed to the function.\n meta: S.optional(S.mutable(S.Any)),\n spec: TriggerSpecSchema,\n}) {}\n\n/**\n * Function manifest file.\n */\nexport const FunctionManifestSchema = S.Struct({\n functions: S.optional(S.mutable(S.Array(RawObject(FunctionDef)))),\n triggers: S.optional(S.mutable(S.Array(RawObject(FunctionTrigger)))),\n});\n\nexport type FunctionManifest = S.Schema.Type<typeof FunctionManifestSchema>;\n\n// TODO(burdon): Standards?\nexport const FUNCTION_SCHEMA = [FunctionDef, FunctionTrigger];\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAIA,SAASA,WAAWC,GAAGC,mBAAmB;AAU1C,IAAMC,4BAA4BC,EAAEC,QAClCD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,cAAA;;EAEhBC,QAAQL,EAAEM,MACRN,EAAEE,OAAO;IACPC,MAAMH,EAAEO;IACRC,OAAOR,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;EAC5C,CAAA,CAAA;EAEFC,SAASZ,EAAES,SACTT,EAAEE,OAAO;;IAEPW,MAAMb,EAAES,SAAST,EAAEc,OAAO;;IAE1BC,OAAOf,EAAES,SAAST,EAAEgB,MAAM;EAC5B,CAAA,CAAA;AAEJ,CAAA,CAAA;AAKF,IAAMC,qBAAqBjB,EAAEC,QAC3BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,OAAA;EAChBc,MAAMlB,EAAEO;AACV,CAAA,CAAA;AAKF,IAAMY,uBAAuBnB,EAAEC,QAC7BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,SAAA;EAChBgB,QAAQpB,EAAEO;;EAEVc,MAAMrB,EAAES,SAAST,EAAEgB,MAAM;AAC3B,CAAA,CAAA;AAKF,IAAMM,yBAAyBtB,EAAEC,QAC/BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,WAAA;EAChBmB,KAAKvB,EAAEO;EACPiB,MAAMxB,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;AAC3C,CAAA,CAAA;AAKF,IAAMc,oBAAoBzB,EAAE0B,MAC1BT,oBACAE,sBACAG,wBACAvB,yBAAAA;AAQK,IAAM4B,cAAN,cAA0BC,YAAY;EAC3CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDC,KAAK/B,EAAEO;EACPyB,aAAahC,EAAES,SAAST,EAAEO,MAAM;EAChC0B,OAAOjC,EAAEO;EACT2B,SAASlC,EAAEO;AACb,CAAA,EAAA;AAAI;AAKG,IAAM4B,kBAAN,cAA8BP,YAAY;EAC/CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDM,SAASpC,EAAES,SAAST,EAAEc,OAAO;EAC7BuB,UAAUrC,EAAEO,OAAO+B,KAAKtC,EAAEgC,YAAY,eAAA,CAAA;;EAEtCO,MAAMvC,EAAES,SAAST,EAAEC,QAAQD,EAAEW,GAAG,CAAA;EAChC6B,MAAMf;AACR,CAAA,EAAA;AAAI;AAKG,IAAMgB,yBAAyBzC,EAAEE,OAAO;EAC7CwC,WAAW1C,EAAES,SAAST,EAAEC,QAAQD,EAAEM,MAAMqC,UAAUhB,WAAAA,CAAAA,CAAAA,CAAAA;EAClDiB,UAAU5C,EAAES,SAAST,EAAEC,QAAQD,EAAEM,MAAMqC,UAAUR,eAAAA,CAAAA,CAAAA,CAAAA;AACnD,CAAA;AAKO,IAAMU,kBAAkB;EAAClB;EAAaQ;;",
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { RawObject, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Type discriminator for TriggerSpec.\n * Every spec has a type field of type FunctionTriggerType that we can use to understand which\n * type we're working with.\n * https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions\n */\nexport type FunctionTriggerType = 'subscription' | 'timer' | 'webhook' | 'websocket';\n\nconst SubscriptionTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('subscription'),\n // TODO(burdon): Define query DSL (from ECHO).\n filter: S.Array(\n S.Struct({\n type: S.String,\n props: S.optional(S.Record(S.String, S.Any)),\n }),\n ),\n options: S.optional(\n S.Struct({\n // Watch changes to object (not just creation).\n deep: S.optional(S.Boolean),\n // Debounce changes (delay in ms).\n delay: S.optional(S.Number),\n }),\n ),\n }),\n);\n\nexport type SubscriptionTrigger = S.Schema.Type<typeof SubscriptionTriggerSchema>;\n\nconst TimerTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('timer'),\n cron: S.String,\n }),\n);\n\nexport type TimerTrigger = S.Schema.Type<typeof TimerTriggerSchema>;\n\nconst WebhookTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('webhook'),\n method: S.String,\n // Assigned port.\n port: S.optional(S.Number),\n }),\n);\n\nexport type WebhookTrigger = S.Schema.Type<typeof WebhookTriggerSchema>;\n\nconst WebsocketTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('websocket'),\n url: S.String,\n init: S.optional(S.Record(S.String, S.Any)),\n }),\n);\n\nexport type WebsocketTrigger = S.Schema.Type<typeof WebsocketTriggerSchema>;\n\nconst TriggerSpecSchema = S.Union(\n TimerTriggerSchema,\n WebhookTriggerSchema,\n WebsocketTriggerSchema,\n SubscriptionTriggerSchema,\n);\n\nexport type TriggerSpec = TimerTrigger | WebhookTrigger | WebsocketTrigger | SubscriptionTrigger;\n\n/**\n * Function definition.\n */\nexport class FunctionDef extends TypedObject({\n typename: 'dxos.org/type/FunctionDef',\n version: '0.1.0',\n})({\n uri: S.String,\n description: S.optional(S.String),\n route: S.String,\n handler: S.String,\n}) {}\n\n/**\n * Function trigger.\n */\nexport class FunctionTrigger extends TypedObject({\n typename: 'dxos.org/type/FunctionTrigger',\n version: '0.1.0',\n})({\n enabled: S.optional(S.Boolean),\n function: S.String.pipe(S.description('Function URI.')),\n // The `meta` property is merged into the event data passed to the function.\n meta: S.optional(S.mutable(S.Record(S.String, S.Any))),\n spec: TriggerSpecSchema,\n}) {}\n\n/**\n * Function manifest file.\n */\nexport const FunctionManifestSchema = S.Struct({\n functions: S.optional(S.mutable(S.Array(RawObject(FunctionDef)))),\n triggers: S.optional(S.mutable(S.Array(RawObject(FunctionTrigger)))),\n});\n\nexport type FunctionManifest = S.Schema.Type<typeof FunctionManifestSchema>;\n\n// TODO(burdon): Standards?\nexport const FUNCTION_SCHEMA = [FunctionDef, FunctionTrigger];\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAIA,SAASA,WAAWC,GAAGC,mBAAmB;AAU1C,IAAMC,4BAA4BC,EAAEC,QAClCD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,cAAA;;EAEhBC,QAAQL,EAAEM,MACRN,EAAEE,OAAO;IACPC,MAAMH,EAAEO;IACRC,OAAOR,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;EAC5C,CAAA,CAAA;EAEFC,SAASZ,EAAES,SACTT,EAAEE,OAAO;;IAEPW,MAAMb,EAAES,SAAST,EAAEc,OAAO;;IAE1BC,OAAOf,EAAES,SAAST,EAAEgB,MAAM;EAC5B,CAAA,CAAA;AAEJ,CAAA,CAAA;AAKF,IAAMC,qBAAqBjB,EAAEC,QAC3BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,OAAA;EAChBc,MAAMlB,EAAEO;AACV,CAAA,CAAA;AAKF,IAAMY,uBAAuBnB,EAAEC,QAC7BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,SAAA;EAChBgB,QAAQpB,EAAEO;;EAEVc,MAAMrB,EAAES,SAAST,EAAEgB,MAAM;AAC3B,CAAA,CAAA;AAKF,IAAMM,yBAAyBtB,EAAEC,QAC/BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,WAAA;EAChBmB,KAAKvB,EAAEO;EACPiB,MAAMxB,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;AAC3C,CAAA,CAAA;AAKF,IAAMc,oBAAoBzB,EAAE0B,MAC1BT,oBACAE,sBACAG,wBACAvB,yBAAAA;AAQK,IAAM4B,cAAN,cAA0BC,YAAY;EAC3CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDC,KAAK/B,EAAEO;EACPyB,aAAahC,EAAES,SAAST,EAAEO,MAAM;EAChC0B,OAAOjC,EAAEO;EACT2B,SAASlC,EAAEO;AACb,CAAA,EAAA;AAAI;AAKG,IAAM4B,kBAAN,cAA8BP,YAAY;EAC/CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDM,SAASpC,EAAES,SAAST,EAAEc,OAAO;EAC7BuB,UAAUrC,EAAEO,OAAO+B,KAAKtC,EAAEgC,YAAY,eAAA,CAAA;;EAEtCO,MAAMvC,EAAES,SAAST,EAAEC,QAAQD,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA,CAAA;EACnD6B,MAAMf;AACR,CAAA,EAAA;AAAI;AAKG,IAAMgB,yBAAyBzC,EAAEE,OAAO;EAC7CwC,WAAW1C,EAAES,SAAST,EAAEC,QAAQD,EAAEM,MAAMqC,UAAUhB,WAAAA,CAAAA,CAAAA,CAAAA;EAClDiB,UAAU5C,EAAES,SAAST,EAAEC,QAAQD,EAAEM,MAAMqC,UAAUR,eAAAA,CAAAA,CAAAA,CAAAA;AACnD,CAAA;AAKO,IAAMU,kBAAkB;EAAClB;EAAaQ;;",
6
6
  "names": ["RawObject", "S", "TypedObject", "SubscriptionTriggerSchema", "S", "mutable", "Struct", "type", "Literal", "filter", "Array", "String", "props", "optional", "Record", "Any", "options", "deep", "Boolean", "delay", "Number", "TimerTriggerSchema", "cron", "WebhookTriggerSchema", "method", "port", "WebsocketTriggerSchema", "url", "init", "TriggerSpecSchema", "Union", "FunctionDef", "TypedObject", "typename", "version", "uri", "description", "route", "handler", "FunctionTrigger", "enabled", "function", "pipe", "meta", "spec", "FunctionManifestSchema", "functions", "RawObject", "triggers", "FUNCTION_SCHEMA"]
7
7
  }
@@ -4,13 +4,13 @@ import {
4
4
  FunctionRegistry,
5
5
  Scheduler,
6
6
  TriggerRegistry
7
- } from "./chunk-YKYOGE5O.mjs";
7
+ } from "./chunk-6ENHIEIP.mjs";
8
8
  import {
9
9
  FUNCTION_SCHEMA,
10
10
  FunctionDef,
11
11
  FunctionManifestSchema,
12
12
  FunctionTrigger
13
- } from "./chunk-ERWZ4JUZ.mjs";
13
+ } from "./chunk-YSDC6YCF.mjs";
14
14
 
15
15
  // packages/core/functions/src/handler.ts
16
16
  import { PublicKey } from "@dxos/client";