@dxos/functions 0.6.12-main.15a606f → 0.6.12-main.2d19bf1
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/dist/lib/browser/{chunk-JUASLIOP.mjs → chunk-2T5DP7TH.mjs} +2 -2
- package/dist/lib/browser/{chunk-2I75VGHZ.mjs → chunk-MWJ54RSV.mjs} +16 -5
- package/dist/lib/browser/chunk-MWJ54RSV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +5 -5
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +8 -8
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/types.mjs +1 -1
- package/dist/lib/node/{chunk-JV3VNH5X.cjs → chunk-O44VB3FE.cjs} +19 -8
- package/dist/lib/node/chunk-O44VB3FE.cjs.map +7 -0
- package/dist/lib/node/{chunk-DELILIR2.cjs → chunk-SCSHB4MF.cjs} +15 -15
- package/dist/lib/node/index.cjs +15 -15
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +14 -14
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/lib/node/types.cjs +5 -5
- package/dist/lib/node/types.cjs.map +1 -1
- package/dist/lib/node-esm/{chunk-H3RLSCYN.mjs → chunk-AM7SW4YW.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-OWEGFCYZ.mjs → chunk-TJ4S5QZ3.mjs} +16 -5
- package/dist/lib/node-esm/chunk-TJ4S5QZ3.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +5 -5
- package/dist/lib/node-esm/index.mjs.map +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +8 -8
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/types.mjs +1 -1
- package/dist/types/src/handler.d.ts +2 -1
- package/dist/types/src/handler.d.ts.map +1 -1
- package/dist/types/src/testing/setup.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +2 -2
- package/package.json +16 -15
- package/src/handler.ts +3 -1
- package/src/testing/setup.ts +9 -2
- package/src/types.ts +4 -4
- package/dist/lib/browser/chunk-2I75VGHZ.mjs.map +0 -7
- package/dist/lib/node/chunk-JV3VNH5X.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-OWEGFCYZ.mjs.map +0 -7
- /package/dist/lib/browser/{chunk-JUASLIOP.mjs.map → chunk-2T5DP7TH.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-DELILIR2.cjs.map → chunk-SCSHB4MF.cjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-H3RLSCYN.mjs.map → chunk-AM7SW4YW.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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({ key: S.String, value: 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({ key: S.String, value: 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 name: S.optional(S.String),\n enabled: S.optional(S.Boolean),\n function: S.String.pipe(S.annotations({ 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({ key: S.String, value: 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,yBAA0C;;;;;;;AAU1C,IAAMA,4BAA4BC,qBAAEC,QAClCD,qBAAEE,OAAO;EACPC,MAAMH,qBAAEI,QAAQ,cAAA;;EAEhBC,QAAQL,qBAAEM,MACRN,qBAAEE,OAAO;IACPC,MAAMH,qBAAEO;IACRC,OAAOR,qBAAES,SAAST,qBAAEU,OAAO;MAAEC,KAAKX,qBAAEO;MAAQK,OAAOZ,qBAAEa;IAAI,CAAA,CAAA;EAC3D,CAAA,CAAA;EAEFC,SAASd,qBAAES,SACTT,qBAAEE,OAAO;;IAEPa,MAAMf,qBAAES,SAAST,qBAAEgB,OAAO;;IAE1BC,OAAOjB,qBAAES,SAAST,qBAAEkB,MAAM;EAC5B,CAAA,CAAA;AAEJ,CAAA,CAAA;AAKF,IAAMC,qBAAqBnB,qBAAEC,QAC3BD,qBAAEE,OAAO;EACPC,MAAMH,qBAAEI,QAAQ,OAAA;EAChBgB,MAAMpB,qBAAEO;AACV,CAAA,CAAA;AAKF,IAAMc,uBAAuBrB,qBAAEC,QAC7BD,qBAAEE,OAAO;EACPC,MAAMH,qBAAEI,QAAQ,SAAA;EAChBkB,QAAQtB,qBAAEO;;EAEVgB,MAAMvB,qBAAES,SAAST,qBAAEkB,MAAM;AAC3B,CAAA,CAAA;AAKF,IAAMM,yBAAyBxB,qBAAEC,QAC/BD,qBAAEE,OAAO;EACPC,MAAMH,qBAAEI,QAAQ,WAAA;EAChBqB,KAAKzB,qBAAEO;EACPmB,MAAM1B,qBAAES,SAAST,qBAAEU,OAAO;IAAEC,KAAKX,qBAAEO;IAAQK,OAAOZ,qBAAEa;EAAI,CAAA,CAAA;AAC1D,CAAA,CAAA;AAKF,IAAMc,oBAAoB3B,qBAAE4B,MAC1BT,oBACAE,sBACAG,wBACAzB,yBAAAA;AAQK,IAAM8B,cAAN,kBAA0BC,gCAAY;EAC3CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDC,KAAKjC,qBAAEO;EACP2B,aAAalC,qBAAES,SAAST,qBAAEO,MAAM;EAChC4B,OAAOnC,qBAAEO;EACT6B,SAASpC,qBAAEO;AACb,CAAA,EAAA;AAAI;AAKG,IAAM8B,kBAAN,kBAA8BP,gCAAY;EAC/CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDM,MAAMtC,qBAAES,SAAST,qBAAEO,MAAM;EACzBgC,SAASvC,qBAAES,SAAST,qBAAEgB,OAAO;EAC7BwB,UAAUxC,qBAAEO,OAAOkC,KAAKzC,qBAAE0C,YAAY;IAAER,aAAa;EAAgB,CAAA,CAAA;;EAErES,MAAM3C,qBAAES,SAAST,qBAAEC,QAAQD,qBAAEU,OAAO;IAAEC,KAAKX,qBAAEO;IAAQK,OAAOZ,qBAAEa;EAAI,CAAA,CAAA,CAAA;EAClE+B,MAAMjB;AACR,CAAA,EAAA;AAAI;AAKG,IAAMkB,yBAAyB7C,qBAAEE,OAAO;EAC7C4C,WAAW9C,qBAAES,SAAST,qBAAEC,QAAQD,qBAAEM,UAAMyC,8BAAUlB,WAAAA,CAAAA,CAAAA,CAAAA;EAClDmB,UAAUhD,qBAAES,SAAST,qBAAEC,QAAQD,qBAAEM,UAAMyC,8BAAUV,eAAAA,CAAAA,CAAAA,CAAAA;AACnD,CAAA;AAKO,IAAMY,kBAAkB;EAACpB;EAAaQ;;",
|
|
6
|
+
"names": ["SubscriptionTriggerSchema", "S", "mutable", "Struct", "type", "Literal", "filter", "Array", "String", "props", "optional", "Record", "key", "value", "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", "name", "enabled", "function", "pipe", "annotations", "meta", "spec", "FunctionManifestSchema", "functions", "RawObject", "triggers", "FUNCTION_SCHEMA"]
|
|
7
|
+
}
|
|
@@ -16,8 +16,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var chunk_SCSHB4MF_exports = {};
|
|
20
|
+
__export(chunk_SCSHB4MF_exports, {
|
|
21
21
|
FunctionRegistry: () => FunctionRegistry,
|
|
22
22
|
TriggerRegistry: () => TriggerRegistry,
|
|
23
23
|
createSubscriptionTrigger: () => createSubscriptionTrigger,
|
|
@@ -25,8 +25,8 @@ __export(chunk_DELILIR2_exports, {
|
|
|
25
25
|
createWebSocket: () => createWebSocket,
|
|
26
26
|
createWebsocketTrigger: () => createWebsocketTrigger
|
|
27
27
|
});
|
|
28
|
-
module.exports = __toCommonJS(
|
|
29
|
-
var
|
|
28
|
+
module.exports = __toCommonJS(chunk_SCSHB4MF_exports);
|
|
29
|
+
var import_chunk_O44VB3FE = require("./chunk-O44VB3FE.cjs");
|
|
30
30
|
var import_async = require("@dxos/async");
|
|
31
31
|
var import_echo = require("@dxos/client/echo");
|
|
32
32
|
var import_context = require("@dxos/context");
|
|
@@ -89,14 +89,14 @@ var FunctionRegistry = class extends import_context.Resource {
|
|
|
89
89
|
if (!functions?.length) {
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
|
-
if (!space.db.graph.schemaRegistry.hasSchema(
|
|
92
|
+
if (!space.db.graph.schemaRegistry.hasSchema(import_chunk_O44VB3FE.FunctionDef)) {
|
|
93
93
|
space.db.graph.schemaRegistry.addSchema([
|
|
94
|
-
|
|
94
|
+
import_chunk_O44VB3FE.FunctionDef
|
|
95
95
|
]);
|
|
96
96
|
}
|
|
97
|
-
const { objects: existing } = await space.db.query(import_echo.Filter.schema(
|
|
97
|
+
const { objects: existing } = await space.db.query(import_echo.Filter.schema(import_chunk_O44VB3FE.FunctionDef)).run();
|
|
98
98
|
const { added } = (0, import_util.diff)(existing, functions, (a, b) => a.uri === b.uri);
|
|
99
|
-
added.forEach((def) => space.db.add((0, import_echo.create)(
|
|
99
|
+
added.forEach((def) => space.db.add((0, import_echo.create)(import_chunk_O44VB3FE.FunctionDef, def)));
|
|
100
100
|
if (added.length > 0) {
|
|
101
101
|
await space.db.flush({
|
|
102
102
|
indexes: true,
|
|
@@ -122,7 +122,7 @@ var FunctionRegistry = class extends import_context.Resource {
|
|
|
122
122
|
if (this._ctx.disposed) {
|
|
123
123
|
break;
|
|
124
124
|
}
|
|
125
|
-
this._ctx.onDispose(space.db.query(import_echo.Filter.schema(
|
|
125
|
+
this._ctx.onDispose(space.db.query(import_echo.Filter.schema(import_chunk_O44VB3FE.FunctionDef)).subscribe(({ objects }) => {
|
|
126
126
|
const { added } = (0, import_util.diff)(registered, objects, (a, b) => a.uri === b.uri);
|
|
127
127
|
if (added.length > 0) {
|
|
128
128
|
registered.push(...added);
|
|
@@ -457,9 +457,9 @@ var TriggerRegistry = class extends import_context2.Resource {
|
|
|
457
457
|
if (!manifest.triggers?.length) {
|
|
458
458
|
return;
|
|
459
459
|
}
|
|
460
|
-
if (!space.db.graph.schemaRegistry.hasSchema(
|
|
460
|
+
if (!space.db.graph.schemaRegistry.hasSchema(import_chunk_O44VB3FE.FunctionTrigger)) {
|
|
461
461
|
space.db.graph.schemaRegistry.addSchema([
|
|
462
|
-
|
|
462
|
+
import_chunk_O44VB3FE.FunctionTrigger
|
|
463
463
|
]);
|
|
464
464
|
}
|
|
465
465
|
const manifestTriggers = manifest.triggers.map((trigger) => {
|
|
@@ -473,11 +473,11 @@ var TriggerRegistry = class extends import_context2.Resource {
|
|
|
473
473
|
].join(":"))
|
|
474
474
|
];
|
|
475
475
|
}
|
|
476
|
-
return (0, import_echo3.create)(
|
|
476
|
+
return (0, import_echo3.create)(import_chunk_O44VB3FE.FunctionTrigger, trigger, {
|
|
477
477
|
keys
|
|
478
478
|
});
|
|
479
479
|
});
|
|
480
|
-
const { objects: existing } = await space.db.query(import_echo3.Filter.schema(
|
|
480
|
+
const { objects: existing } = await space.db.query(import_echo3.Filter.schema(import_chunk_O44VB3FE.FunctionTrigger)).run();
|
|
481
481
|
const { added } = (0, import_util2.diff)(existing, manifestTriggers, import_echo_schema.compareForeignKeys);
|
|
482
482
|
added.forEach((trigger) => {
|
|
483
483
|
space.db.add(trigger);
|
|
@@ -512,7 +512,7 @@ var TriggerRegistry = class extends import_context2.Resource {
|
|
|
512
512
|
if (this._ctx.disposed) {
|
|
513
513
|
break;
|
|
514
514
|
}
|
|
515
|
-
this._ctx.onDispose(space.db.query(import_echo3.Filter.schema(
|
|
515
|
+
this._ctx.onDispose(space.db.query(import_echo3.Filter.schema(import_chunk_O44VB3FE.FunctionTrigger)).subscribe(async ({ objects: current }) => {
|
|
516
516
|
import_log5.log.info("update", {
|
|
517
517
|
space: space.key,
|
|
518
518
|
registered: registered.length,
|
|
@@ -615,4 +615,4 @@ var TriggerRegistry = class extends import_context2.Resource {
|
|
|
615
615
|
createWebSocket,
|
|
616
616
|
createWebsocketTrigger
|
|
617
617
|
});
|
|
618
|
-
//# sourceMappingURL=chunk-
|
|
618
|
+
//# sourceMappingURL=chunk-SCSHB4MF.cjs.map
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -18,21 +18,21 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var node_exports = {};
|
|
20
20
|
__export(node_exports, {
|
|
21
|
-
FUNCTION_SCHEMA: () =>
|
|
22
|
-
FunctionDef: () =>
|
|
23
|
-
FunctionManifestSchema: () =>
|
|
24
|
-
FunctionRegistry: () =>
|
|
25
|
-
FunctionTrigger: () =>
|
|
26
|
-
TriggerRegistry: () =>
|
|
27
|
-
createSubscriptionTrigger: () =>
|
|
28
|
-
createTimerTrigger: () =>
|
|
29
|
-
createWebSocket: () =>
|
|
30
|
-
createWebsocketTrigger: () =>
|
|
21
|
+
FUNCTION_SCHEMA: () => import_chunk_O44VB3FE.FUNCTION_SCHEMA,
|
|
22
|
+
FunctionDef: () => import_chunk_O44VB3FE.FunctionDef,
|
|
23
|
+
FunctionManifestSchema: () => import_chunk_O44VB3FE.FunctionManifestSchema,
|
|
24
|
+
FunctionRegistry: () => import_chunk_SCSHB4MF.FunctionRegistry,
|
|
25
|
+
FunctionTrigger: () => import_chunk_O44VB3FE.FunctionTrigger,
|
|
26
|
+
TriggerRegistry: () => import_chunk_SCSHB4MF.TriggerRegistry,
|
|
27
|
+
createSubscriptionTrigger: () => import_chunk_SCSHB4MF.createSubscriptionTrigger,
|
|
28
|
+
createTimerTrigger: () => import_chunk_SCSHB4MF.createTimerTrigger,
|
|
29
|
+
createWebSocket: () => import_chunk_SCSHB4MF.createWebSocket,
|
|
30
|
+
createWebsocketTrigger: () => import_chunk_SCSHB4MF.createWebsocketTrigger,
|
|
31
31
|
subscriptionHandler: () => subscriptionHandler
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(node_exports);
|
|
34
|
-
var
|
|
35
|
-
var
|
|
34
|
+
var import_chunk_SCSHB4MF = require("./chunk-SCSHB4MF.cjs");
|
|
35
|
+
var import_chunk_O44VB3FE = require("./chunk-O44VB3FE.cjs");
|
|
36
36
|
var import_client = require("@dxos/client");
|
|
37
37
|
var import_log = require("@dxos/log");
|
|
38
38
|
var import_util = require("@dxos/util");
|
|
@@ -44,7 +44,7 @@ var subscriptionHandler = (handler, types) => {
|
|
|
44
44
|
if (!space) {
|
|
45
45
|
import_log.log.error("Invalid space", void 0, {
|
|
46
46
|
F: __dxlog_file,
|
|
47
|
-
L:
|
|
47
|
+
L: 133,
|
|
48
48
|
S: void 0,
|
|
49
49
|
C: (f, a) => f(...a)
|
|
50
50
|
});
|
|
@@ -57,7 +57,7 @@ var subscriptionHandler = (handler, types) => {
|
|
|
57
57
|
data
|
|
58
58
|
}, {
|
|
59
59
|
F: __dxlog_file,
|
|
60
|
-
L:
|
|
60
|
+
L: 143,
|
|
61
61
|
S: void 0,
|
|
62
62
|
C: (f, a) => f(...a)
|
|
63
63
|
});
|
|
@@ -67,7 +67,7 @@ var subscriptionHandler = (handler, types) => {
|
|
|
67
67
|
objects: objects?.length
|
|
68
68
|
}, {
|
|
69
69
|
F: __dxlog_file,
|
|
70
|
-
L:
|
|
70
|
+
L: 145,
|
|
71
71
|
S: void 0,
|
|
72
72
|
C: (f, a) => f(...a)
|
|
73
73
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/handler.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Client, PublicKey } from '@dxos/client';\nimport { type Space, type SpaceId } from '@dxos/client/echo';\nimport type { CoreDatabase } from '@dxos/echo-db';\nimport { type EchoReactiveObject
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Schema as S } from '@effect/schema';\n\nimport { type Client, PublicKey } from '@dxos/client';\nimport { type Space, type SpaceId } from '@dxos/client/echo';\nimport type { CoreDatabase } from '@dxos/echo-db';\nimport { type EchoReactiveObject } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { nonNullable } from '@dxos/util';\n\n// TODO(burdon): Model after http request. Ref Lambda/OpenFaaS.\n// https://docs.aws.amazon.com/lambda/latest/dg/typescript-handler.html\n// https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/#functions\n// https://www.npmjs.com/package/aws-lambda\n\n/**\n * Function handler.\n */\nexport type FunctionHandler<TData = {}, TMeta = {}> = (params: {\n context: FunctionContext;\n event: FunctionEvent<TData, TMeta>;\n\n /**\n * @deprecated\n */\n response: FunctionResponse;\n}) => Promise<Response | FunctionResponse | void>;\n\n/**\n * Function context.\n */\nexport interface FunctionContext {\n getSpace: (spaceId: SpaceId) => Promise<SpaceAPI>;\n\n /**\n * Space from which the function was invoked.\n */\n space: SpaceAPI | undefined;\n\n ai: FunctionContextAi;\n\n /**\n * @deprecated\n */\n // TODO(burdon): Limit access to individual space.\n client: Client;\n /**\n * @deprecated\n */\n // TODO(burdon): Replace with storage service abstraction.\n dataDir?: string;\n}\n\nexport interface FunctionContextAi {\n // TODO(dmaretskyi): Refer to cloudflare AI docs for more comprehensive typedefs.\n run(model: string, inputs: any, options?: any): Promise<any>;\n}\n\n/**\n * Event payload.\n */\nexport type FunctionEvent<TData = {}, TMeta = {}> = {\n data: FunctionEventMeta<TMeta> & TData;\n};\n\n/**\n * Metadata from trigger.\n */\nexport type FunctionEventMeta<TMeta = {}> = {\n meta: TMeta;\n};\n\n/**\n * Function response.\n */\nexport type FunctionResponse = {\n status(code: number): FunctionResponse;\n};\n\n//\n// API.\n//\n\n/**\n * Space interface available to functions.\n */\nexport interface SpaceAPI {\n get id(): SpaceId;\n get crud(): CoreDatabase;\n}\n\nconst __assertFunctionSpaceIsCompatibleWithTheClientSpace = () => {\n // eslint-disable-next-line unused-imports/no-unused-vars\n const y: SpaceAPI = {} as Space;\n};\n\n//\n// Subscription utils.\n//\n\nexport type RawSubscriptionData = {\n spaceKey?: string;\n objects?: string[];\n};\n\nexport type SubscriptionData = {\n space?: Space;\n objects?: EchoReactiveObject<any>[];\n};\n\n/**\n * Handler wrapper for subscription events; extracts space and objects.\n *\n * To test:\n * ```\n * curl -s -X POST -H \"Content-Type: application/json\" --data '{\"space\": \"0446...1cbb\"}' http://localhost:7100/dev/email-extractor\n * ```\n *\n * NOTE: Get space key from devtools or `dx space list --json`\n */\n// TODO(burdon): Evolve into plugin definition like Composer.\nexport const subscriptionHandler = <TMeta>(\n handler: FunctionHandler<SubscriptionData, TMeta>,\n types?: S.Schema<any>[],\n): FunctionHandler<RawSubscriptionData, TMeta> => {\n return async ({ event: { data }, context, response, ...rest }) => {\n const { client } = context;\n const space = data.spaceKey ? client.spaces.get(PublicKey.from(data.spaceKey)) : undefined;\n if (!space) {\n log.error('Invalid space');\n return response.status(500);\n }\n\n registerTypes(space, types);\n const objects = space\n ? data.objects?.map<EchoReactiveObject<any> | undefined>((id) => space!.db.getObjectById(id)).filter(nonNullable)\n : [];\n\n if (!!data.spaceKey && !space) {\n log.warn('invalid space', { data });\n } else {\n log.info('handler', { space: space?.key.truncate(), objects: objects?.length });\n }\n\n return handler({ event: { data: { ...data, space, objects } }, context, response, ...rest });\n };\n};\n\n// TODO(burdon): Evolve types as part of function metadata.\nconst registerTypes = (space: Space, types: S.Schema<any>[] = []) => {\n const registry = space.db.graph.schemaRegistry;\n for (const type of types) {\n if (!registry.hasSchema(type)) {\n registry.addSchema([type]);\n }\n }\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oBAAuC;AAIvC,iBAAoB;AACpB,kBAA4B;;AAiHrB,IAAMA,sBAAsB,CACjCC,SACAC,UAAAA;AAEA,SAAO,OAAO,EAAEC,OAAO,EAAEC,KAAI,GAAIC,SAASC,UAAU,GAAGC,KAAAA,MAAM;AAC3D,UAAM,EAAEC,OAAM,IAAKH;AACnB,UAAMI,QAAQL,KAAKM,WAAWF,OAAOG,OAAOC,IAAIC,wBAAUC,KAAKV,KAAKM,QAAQ,CAAA,IAAKK;AACjF,QAAI,CAACN,OAAO;AACVO,qBAAIC,MAAM,iBAAA,QAAA;;;;;;AACV,aAAOX,SAASY,OAAO,GAAA;IACzB;AAEAC,kBAAcV,OAAOP,KAAAA;AACrB,UAAMkB,UAAUX,QACZL,KAAKgB,SAASC,IAAyC,CAACC,OAAOb,MAAOc,GAAGC,cAAcF,EAAAA,CAAAA,EAAKG,OAAOC,uBAAAA,IACnG,CAAA;AAEJ,QAAI,CAAC,CAACtB,KAAKM,YAAY,CAACD,OAAO;AAC7BO,qBAAIW,KAAK,iBAAiB;QAAEvB;MAAK,GAAA;;;;;;IACnC,OAAO;AACLY,qBAAIY,KAAK,WAAW;QAAEnB,OAAOA,OAAOoB,IAAIC,SAAAA;QAAYV,SAASA,SAASW;MAAO,GAAA;;;;;;IAC/E;AAEA,WAAO9B,QAAQ;MAAEE,OAAO;QAAEC,MAAM;UAAE,GAAGA;UAAMK;UAAOW;QAAQ;MAAE;MAAGf;MAASC;MAAU,GAAGC;IAAK,CAAA;EAC5F;AACF;AAGA,IAAMY,gBAAgB,CAACV,OAAcP,QAAyB,CAAA,MAAE;AAC9D,QAAM8B,WAAWvB,MAAMc,GAAGU,MAAMC;AAChC,aAAWC,QAAQjC,OAAO;AACxB,QAAI,CAAC8B,SAASI,UAAUD,IAAAA,GAAO;AAC7BH,eAASK,UAAU;QAACF;OAAK;IAC3B;EACF;AACF;",
|
|
6
6
|
"names": ["subscriptionHandler", "handler", "types", "event", "data", "context", "response", "rest", "client", "space", "spaceKey", "spaces", "get", "PublicKey", "from", "undefined", "log", "error", "status", "registerTypes", "objects", "map", "id", "db", "getObjectById", "filter", "nonNullable", "warn", "info", "key", "truncate", "length", "registry", "graph", "schemaRegistry", "type", "hasSchema", "addSchema"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/core/functions/src/types.ts":{"bytes":9947,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/function/function-registry.ts":{"bytes":13004,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/function/index.ts":{"bytes":529,"imports":[{"path":"packages/core/functions/src/function/function-registry.ts","kind":"import-statement","original":"./function-registry"}],"format":"esm"},"packages/core/functions/src/handler.ts":{"bytes":10606,"imports":[{"path":"@dxos/client","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/trigger/type/subscription-trigger.ts":{"bytes":10343,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytes":4173,"imports":[{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytes":13341,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/index.ts":{"bytes":864,"imports":[{"path":"packages/core/functions/src/trigger/type/subscription-trigger.ts","kind":"import-statement","original":"./subscription-trigger"},{"path":"packages/core/functions/src/trigger/type/timer-trigger.ts","kind":"import-statement","original":"./timer-trigger"},{"path":"packages/core/functions/src/trigger/type/websocket-trigger.ts","kind":"import-statement","original":"./websocket-trigger"}],"format":"esm"},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytes":28453,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/trigger/type/index.ts","kind":"import-statement","original":"./type"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/trigger/index.ts":{"bytes":603,"imports":[{"path":"packages/core/functions/src/trigger/trigger-registry.ts","kind":"import-statement","original":"./trigger-registry"},{"path":"packages/core/functions/src/trigger/type/index.ts","kind":"import-statement","original":"./type"}],"format":"esm"},"packages/core/functions/src/index.ts":{"bytes":840,"imports":[{"path":"packages/core/functions/src/function/index.ts","kind":"import-statement","original":"./function"},{"path":"packages/core/functions/src/handler.ts","kind":"import-statement","original":"./handler"},{"path":"packages/core/functions/src/trigger/index.ts","kind":"import-statement","original":"./trigger"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/core/functions/src/testing/types.ts":{"bytes":1131,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/dev-server.ts":{"bytes":28958,"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/scheduler.ts":{"bytes":21084,"imports":[{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-protocol","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/index.ts":{"bytes":598,"imports":[{"path":"packages/core/functions/src/runtime/dev-server.ts","kind":"import-statement","original":"./dev-server"},{"path":"packages/core/functions/src/runtime/scheduler.ts","kind":"import-statement","original":"./scheduler"}],"format":"esm"},"packages/core/functions/src/testing/setup.ts":{"bytes":12671,"imports":[{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/testing/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/core/functions/src/function/index.ts","kind":"import-statement","original":"../function"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"../runtime"},{"path":"packages/core/functions/src/trigger/index.ts","kind":"import-statement","original":"../trigger"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/testing/util.ts":{"bytes":4292,"imports":[{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/client/testing","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/testing/manifest.ts":{"bytes":1139,"imports":[],"format":"esm"},"packages/core/functions/src/testing/index.ts":{"bytes":749,"imports":[{"path":"packages/core/functions/src/testing/setup.ts","kind":"import-statement","original":"./setup"},{"path":"packages/core/functions/src/testing/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/core/functions/src/testing/util.ts","kind":"import-statement","original":"./util"},{"path":"packages/core/functions/src/testing/manifest.ts","kind":"import-statement","original":"./manifest"}],"format":"esm"}},"outputs":{"packages/core/functions/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5746},"packages/core/functions/dist/lib/node/index.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-DELILIR2.cjs","kind":"import-statement"},{"path":"packages/core/functions/dist/lib/node/chunk-JV3VNH5X.cjs","kind":"import-statement"},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionRegistry","FunctionTrigger","TriggerRegistry","createSubscriptionTrigger","createTimerTrigger","createWebSocket","createWebsocketTrigger","subscriptionHandler"],"entryPoint":"packages/core/functions/src/index.ts","inputs":{"packages/core/functions/src/index.ts":{"bytesInOutput":0},"packages/core/functions/src/handler.ts":{"bytesInOutput":1624}},"bytes":2242},"packages/core/functions/dist/lib/node/testing/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":32212},"packages/core/functions/dist/lib/node/testing/index.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-DELILIR2.cjs","kind":"import-statement"},{"path":"packages/core/functions/dist/lib/node/chunk-JV3VNH5X.cjs","kind":"import-statement"},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-protocol","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/client/testing","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true}],"exports":["TestType","createFunctionRuntime","createInitializedClients","inviteMember","startFunctionsHost","testFunctionManifest","triggerWebhook"],"entryPoint":"packages/core/functions/src/testing/index.ts","inputs":{"packages/core/functions/src/testing/setup.ts":{"bytesInOutput":2783},"packages/core/functions/src/testing/types.ts":{"bytesInOutput":182},"packages/core/functions/src/runtime/dev-server.ts":{"bytesInOutput":7860},"packages/core/functions/src/runtime/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/scheduler.ts":{"bytesInOutput":5330},"packages/core/functions/src/testing/index.ts":{"bytesInOutput":0},"packages/core/functions/src/testing/util.ts":{"bytesInOutput":1051},"packages/core/functions/src/testing/manifest.ts":{"bytesInOutput":146}},"bytes":18063},"packages/core/functions/dist/lib/node/chunk-DELILIR2.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":33088},"packages/core/functions/dist/lib/node/chunk-DELILIR2.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-JV3VNH5X.cjs","kind":"import-statement"},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@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/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["FunctionRegistry","TriggerRegistry","createSubscriptionTrigger","createTimerTrigger","createWebSocket","createWebsocketTrigger"],"inputs":{"packages/core/functions/src/function/function-registry.ts":{"bytesInOutput":3046},"packages/core/functions/src/function/index.ts":{"bytesInOutput":0},"packages/core/functions/src/trigger/type/subscription-trigger.ts":{"bytesInOutput":2008},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytesInOutput":898},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytesInOutput":3491},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytesInOutput":7421},"packages/core/functions/src/trigger/type/index.ts":{"bytesInOutput":0},"packages/core/functions/src/trigger/index.ts":{"bytesInOutput":0}},"bytes":17447},"packages/core/functions/dist/lib/node/types.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/core/functions/dist/lib/node/types.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-JV3VNH5X.cjs","kind":"import-statement"}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger"],"entryPoint":"packages/core/functions/src/types.ts","inputs":{},"bytes":243},"packages/core/functions/dist/lib/node/chunk-JV3VNH5X.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5514},"packages/core/functions/dist/lib/node/chunk-JV3VNH5X.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger","__require"],"inputs":{"packages/core/functions/src/types.ts":{"bytesInOutput":1898}},"bytes":2452}}}
|
|
1
|
+
{"inputs":{"packages/core/functions/src/types.ts":{"bytes":10352,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/function/function-registry.ts":{"bytes":13004,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/function/index.ts":{"bytes":529,"imports":[{"path":"packages/core/functions/src/function/function-registry.ts","kind":"import-statement","original":"./function-registry"}],"format":"esm"},"packages/core/functions/src/handler.ts":{"bytes":10666,"imports":[{"path":"@dxos/client","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/trigger/type/subscription-trigger.ts":{"bytes":10343,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytes":4173,"imports":[{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytes":13341,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/trigger/type/index.ts":{"bytes":864,"imports":[{"path":"packages/core/functions/src/trigger/type/subscription-trigger.ts","kind":"import-statement","original":"./subscription-trigger"},{"path":"packages/core/functions/src/trigger/type/timer-trigger.ts","kind":"import-statement","original":"./timer-trigger"},{"path":"packages/core/functions/src/trigger/type/websocket-trigger.ts","kind":"import-statement","original":"./websocket-trigger"}],"format":"esm"},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytes":28453,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/trigger/type/index.ts","kind":"import-statement","original":"./type"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/trigger/index.ts":{"bytes":603,"imports":[{"path":"packages/core/functions/src/trigger/trigger-registry.ts","kind":"import-statement","original":"./trigger-registry"},{"path":"packages/core/functions/src/trigger/type/index.ts","kind":"import-statement","original":"./type"}],"format":"esm"},"packages/core/functions/src/index.ts":{"bytes":840,"imports":[{"path":"packages/core/functions/src/function/index.ts","kind":"import-statement","original":"./function"},{"path":"packages/core/functions/src/handler.ts","kind":"import-statement","original":"./handler"},{"path":"packages/core/functions/src/trigger/index.ts","kind":"import-statement","original":"./trigger"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/core/functions/src/testing/types.ts":{"bytes":1131,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/dev-server.ts":{"bytes":28958,"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/scheduler.ts":{"bytes":21084,"imports":[{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-protocol","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/index.ts":{"bytes":598,"imports":[{"path":"packages/core/functions/src/runtime/dev-server.ts","kind":"import-statement","original":"./dev-server"},{"path":"packages/core/functions/src/runtime/scheduler.ts","kind":"import-statement","original":"./scheduler"}],"format":"esm"},"packages/core/functions/src/testing/setup.ts":{"bytes":12717,"imports":[{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/functions/src/testing/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/core/functions/src/function/index.ts","kind":"import-statement","original":"../function"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"../runtime"},{"path":"packages/core/functions/src/trigger/index.ts","kind":"import-statement","original":"../trigger"},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/testing/util.ts":{"bytes":4292,"imports":[{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/client/testing","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"packages/core/functions/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/core/functions/src/testing/manifest.ts":{"bytes":1139,"imports":[],"format":"esm"},"packages/core/functions/src/testing/index.ts":{"bytes":749,"imports":[{"path":"packages/core/functions/src/testing/setup.ts","kind":"import-statement","original":"./setup"},{"path":"packages/core/functions/src/testing/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/core/functions/src/testing/util.ts","kind":"import-statement","original":"./util"},{"path":"packages/core/functions/src/testing/manifest.ts","kind":"import-statement","original":"./manifest"}],"format":"esm"}},"outputs":{"packages/core/functions/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5792},"packages/core/functions/dist/lib/node/index.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-SCSHB4MF.cjs","kind":"import-statement"},{"path":"packages/core/functions/dist/lib/node/chunk-O44VB3FE.cjs","kind":"import-statement"},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionRegistry","FunctionTrigger","TriggerRegistry","createSubscriptionTrigger","createTimerTrigger","createWebSocket","createWebsocketTrigger","subscriptionHandler"],"entryPoint":"packages/core/functions/src/index.ts","inputs":{"packages/core/functions/src/index.ts":{"bytesInOutput":0},"packages/core/functions/src/handler.ts":{"bytesInOutput":1624}},"bytes":2242},"packages/core/functions/dist/lib/node/testing/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":32241},"packages/core/functions/dist/lib/node/testing/index.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-SCSHB4MF.cjs","kind":"import-statement"},{"path":"packages/core/functions/dist/lib/node/chunk-O44VB3FE.cjs","kind":"import-statement"},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-protocol","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/client/testing","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true}],"exports":["TestType","createFunctionRuntime","createInitializedClients","inviteMember","startFunctionsHost","testFunctionManifest","triggerWebhook"],"entryPoint":"packages/core/functions/src/testing/index.ts","inputs":{"packages/core/functions/src/testing/setup.ts":{"bytesInOutput":2773},"packages/core/functions/src/testing/types.ts":{"bytesInOutput":182},"packages/core/functions/src/runtime/dev-server.ts":{"bytesInOutput":7860},"packages/core/functions/src/runtime/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/scheduler.ts":{"bytesInOutput":5330},"packages/core/functions/src/testing/index.ts":{"bytesInOutput":0},"packages/core/functions/src/testing/util.ts":{"bytesInOutput":1051},"packages/core/functions/src/testing/manifest.ts":{"bytesInOutput":146}},"bytes":18053},"packages/core/functions/dist/lib/node/chunk-SCSHB4MF.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":33088},"packages/core/functions/dist/lib/node/chunk-SCSHB4MF.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-O44VB3FE.cjs","kind":"import-statement"},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"cron","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@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/client/echo","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["FunctionRegistry","TriggerRegistry","createSubscriptionTrigger","createTimerTrigger","createWebSocket","createWebsocketTrigger"],"inputs":{"packages/core/functions/src/function/function-registry.ts":{"bytesInOutput":3046},"packages/core/functions/src/function/index.ts":{"bytesInOutput":0},"packages/core/functions/src/trigger/type/subscription-trigger.ts":{"bytesInOutput":2008},"packages/core/functions/src/trigger/type/timer-trigger.ts":{"bytesInOutput":898},"packages/core/functions/src/trigger/type/websocket-trigger.ts":{"bytesInOutput":3491},"packages/core/functions/src/trigger/trigger-registry.ts":{"bytesInOutput":7421},"packages/core/functions/src/trigger/type/index.ts":{"bytesInOutput":0},"packages/core/functions/src/trigger/index.ts":{"bytesInOutput":0}},"bytes":17447},"packages/core/functions/dist/lib/node/types.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/core/functions/dist/lib/node/types.cjs":{"imports":[{"path":"packages/core/functions/dist/lib/node/chunk-O44VB3FE.cjs","kind":"import-statement"}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger"],"entryPoint":"packages/core/functions/src/types.ts","inputs":{},"bytes":243},"packages/core/functions/dist/lib/node/chunk-O44VB3FE.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5698},"packages/core/functions/dist/lib/node/chunk-O44VB3FE.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["FUNCTION_SCHEMA","FunctionDef","FunctionManifestSchema","FunctionTrigger","__require"],"inputs":{"packages/core/functions/src/types.ts":{"bytesInOutput":2005}},"bytes":2559}}}
|
|
@@ -37,8 +37,8 @@ __export(testing_exports, {
|
|
|
37
37
|
triggerWebhook: () => triggerWebhook
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(testing_exports);
|
|
40
|
-
var
|
|
41
|
-
var
|
|
40
|
+
var import_chunk_SCSHB4MF = require("../chunk-SCSHB4MF.cjs");
|
|
41
|
+
var import_chunk_O44VB3FE = require("../chunk-O44VB3FE.cjs");
|
|
42
42
|
var import_get_port_please = require("get-port-please");
|
|
43
43
|
var import_node_path = __toESM(require("node:path"));
|
|
44
44
|
var import_async = require("@dxos/async");
|
|
@@ -276,11 +276,11 @@ var DevServer = class {
|
|
|
276
276
|
C: (f, a) => f(...a)
|
|
277
277
|
});
|
|
278
278
|
if (force) {
|
|
279
|
-
Object.keys(
|
|
280
|
-
delete
|
|
279
|
+
Object.keys(import_chunk_O44VB3FE.__require.cache).filter((key) => key.startsWith(filePath)).forEach((key) => {
|
|
280
|
+
delete import_chunk_O44VB3FE.__require.cache[key];
|
|
281
281
|
});
|
|
282
282
|
}
|
|
283
|
-
const module2 = (0,
|
|
283
|
+
const module2 = (0, import_chunk_O44VB3FE.__require)(filePath);
|
|
284
284
|
if (typeof module2.default !== "function") {
|
|
285
285
|
throw new Error(`Handler must export default function: ${uri}`);
|
|
286
286
|
}
|
|
@@ -567,7 +567,12 @@ var createContext2 = () => new import_context2.Context({
|
|
|
567
567
|
var createInitializedClients = async (testBuilder, count = 1, config) => {
|
|
568
568
|
const clients = (0, import_util.range)(count).map(() => new import_client.Client({
|
|
569
569
|
config,
|
|
570
|
-
services: testBuilder.createLocalClientServices()
|
|
570
|
+
services: testBuilder.createLocalClientServices(),
|
|
571
|
+
types: [
|
|
572
|
+
import_chunk_O44VB3FE.FunctionDef,
|
|
573
|
+
import_chunk_O44VB3FE.FunctionTrigger,
|
|
574
|
+
TestType
|
|
575
|
+
]
|
|
571
576
|
}));
|
|
572
577
|
testBuilder.ctx.onDispose(() => Promise.all(clients.map((client) => client.destroy())));
|
|
573
578
|
return Promise.all(clients.map(async (client, index) => {
|
|
@@ -576,11 +581,6 @@ var createInitializedClients = async (testBuilder, count = 1, config) => {
|
|
|
576
581
|
displayName: `Peer ${index}`
|
|
577
582
|
});
|
|
578
583
|
await client.spaces.isReady.wait();
|
|
579
|
-
client.addTypes([
|
|
580
|
-
import_chunk_JV3VNH5X.FunctionDef,
|
|
581
|
-
import_chunk_JV3VNH5X.FunctionTrigger,
|
|
582
|
-
TestType
|
|
583
|
-
]);
|
|
584
584
|
return client;
|
|
585
585
|
}));
|
|
586
586
|
};
|
|
@@ -607,7 +607,7 @@ var createFunctionRuntime = async (testBuilder, pluginInitializer) => {
|
|
|
607
607
|
};
|
|
608
608
|
var startFunctionsHost = async (testBuilder, pluginInitializer, options) => {
|
|
609
609
|
const functionRuntime = await createFunctionRuntime(testBuilder, pluginInitializer);
|
|
610
|
-
const functionsRegistry = new
|
|
610
|
+
const functionsRegistry = new import_chunk_SCSHB4MF.FunctionRegistry(functionRuntime);
|
|
611
611
|
const devServer = await startDevServer(testBuilder, functionRuntime, functionsRegistry, options);
|
|
612
612
|
const scheduler = await startScheduler(testBuilder, functionRuntime, devServer, functionsRegistry);
|
|
613
613
|
return {
|
|
@@ -621,7 +621,7 @@ var startFunctionsHost = async (testBuilder, pluginInitializer, options) => {
|
|
|
621
621
|
};
|
|
622
622
|
};
|
|
623
623
|
var startScheduler = async (testBuilder, client, devServer, functionRegistry) => {
|
|
624
|
-
const triggerRegistry = new
|
|
624
|
+
const triggerRegistry = new import_chunk_SCSHB4MF.TriggerRegistry(client);
|
|
625
625
|
const scheduler = new Scheduler(functionRegistry, triggerRegistry, {
|
|
626
626
|
endpoint: devServer.endpoint
|
|
627
627
|
});
|
|
@@ -641,7 +641,7 @@ var startDevServer = async (testBuilder, client, functionRegistry, options) => {
|
|
|
641
641
|
};
|
|
642
642
|
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/functions/src/testing/util.ts";
|
|
643
643
|
var triggerWebhook = async (space, uri) => {
|
|
644
|
-
const trigger = (await space.db.query(import_echo2.Filter.schema(
|
|
644
|
+
const trigger = (await space.db.query(import_echo2.Filter.schema(import_chunk_O44VB3FE.FunctionTrigger, (t) => t.function === uri)).run()).objects[0];
|
|
645
645
|
(0, import_invariant2.invariant)(trigger.spec.type === "webhook", void 0, {
|
|
646
646
|
F: __dxlog_file3,
|
|
647
647
|
L: 17,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/testing/setup.ts", "../../../../src/testing/types.ts", "../../../../src/runtime/dev-server.ts", "../../../../src/runtime/scheduler.ts", "../../../../src/testing/util.ts", "../../../../src/testing/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { getRandomPort } from 'get-port-please';\nimport path from 'node:path';\n\nimport { waitForCondition } from '@dxos/async';\nimport { Client, Config } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { type TestBuilder } from '@dxos/client/testing';\nimport { range } from '@dxos/util';\n\nimport { TestType } from './types';\nimport { FunctionRegistry } from '../function';\nimport { DevServer, type DevServerOptions, Scheduler } from '../runtime';\nimport { TriggerRegistry } from '../trigger';\nimport { FunctionDef, FunctionTrigger } from '../types';\n\nexport type FunctionsPluginInitializer = (client: Client) => Promise<{ close: () => Promise<void> }>;\n\n// TODO(burdon): Extend/wrap TestBuilder.\n\nexport const createInitializedClients = async (testBuilder: TestBuilder, count: number = 1, config?: Config) => {\n const clients = range(count).map(() => new Client({ config, services: testBuilder.createLocalClientServices() }));\n testBuilder.ctx.onDispose(() => Promise.all(clients.map((client) => client.destroy())));\n return Promise.all(\n clients.map(async (client, index) => {\n await client.initialize();\n await client.halo.createIdentity({ displayName: `Peer ${index}` });\n await client.spaces.isReady.wait();\n client.addTypes([FunctionDef, FunctionTrigger, TestType]);\n return client;\n }),\n );\n};\n\nexport const createFunctionRuntime = async (\n testBuilder: TestBuilder,\n pluginInitializer: FunctionsPluginInitializer,\n): Promise<Client> => {\n const functionsPort = await getRandomPort('127.0.0.1');\n const config = new Config({\n runtime: {\n agent: {\n plugins: [{ id: 'dxos.org/agent/plugin/functions', config: { port: functionsPort } }],\n },\n },\n });\n\n const [client] = await createInitializedClients(testBuilder, 1, config);\n const plugin = await pluginInitializer(client);\n testBuilder.ctx.onDispose(() => plugin.close());\n return client;\n};\n\nexport const startFunctionsHost = async (\n testBuilder: TestBuilder,\n pluginInitializer: FunctionsPluginInitializer,\n options?: DevServerOptions,\n) => {\n const functionRuntime = await createFunctionRuntime(testBuilder, pluginInitializer);\n const functionsRegistry = new FunctionRegistry(functionRuntime);\n const devServer = await startDevServer(testBuilder, functionRuntime, functionsRegistry, options);\n const scheduler = await startScheduler(testBuilder, functionRuntime, devServer, functionsRegistry);\n return {\n scheduler,\n client: functionRuntime,\n waitForActiveTriggers: async (space: Space) => {\n await waitForCondition({ condition: () => scheduler.triggers.getActiveTriggers(space).length > 0 });\n },\n };\n};\n\nconst startScheduler = async (\n testBuilder: TestBuilder,\n client: Client,\n devServer: DevServer,\n functionRegistry: FunctionRegistry,\n) => {\n const triggerRegistry = new TriggerRegistry(client);\n const scheduler = new Scheduler(functionRegistry, triggerRegistry, { endpoint: devServer.endpoint });\n await scheduler.start();\n testBuilder.ctx.onDispose(() => scheduler.stop());\n return scheduler;\n};\n\nconst startDevServer = async (\n testBuilder: TestBuilder,\n client: Client,\n functionRegistry: FunctionRegistry,\n options?: { baseDir?: string },\n) => {\n const server = new DevServer(client, functionRegistry, {\n baseDir: path.join(__dirname, '../testing'),\n port: await getRandomPort('127.0.0.1'),\n ...options,\n });\n await server.start();\n testBuilder.ctx.onDispose(() => server.stop());\n return server;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { S, TypedObject } from '@dxos/echo-schema';\n\nexport class TestType extends TypedObject({ typename: 'example.com/type/Test', version: '0.1.0' })({\n title: S.String,\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 } as any;\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 TriggerCallback, 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\n await Promise.all(mountTasks).catch(log.catch);\n }\n\n /**\n * Activate trigger.\n */\n // TODO(burdon): How are triggers deactivated?\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 const execFunction: TriggerCallback = 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 await this.triggers.activate(space, trigger, execFunction);\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 type { Client } from '@dxos/client';\nimport { Filter, type Space } from '@dxos/client/echo';\nimport { performInvitation } from '@dxos/client/testing';\nimport { invariant } from '@dxos/invariant';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { FunctionTrigger } from '../types';\n\nexport const triggerWebhook = async (space: Space, uri: string) => {\n const trigger = (\n await space.db.query(Filter.schema(FunctionTrigger, (t: FunctionTrigger) => t.function === uri)).run()\n ).objects[0];\n invariant(trigger.spec.type === 'webhook');\n void fetch(`http://localhost:${trigger.spec.port}`);\n};\n\nexport const inviteMember = async (host: Space, guest: Client) => {\n const [{ invitation: hostInvitation }] = await Promise.all(performInvitation({ host, guest: guest.spaces }));\n if (hostInvitation?.state !== Invitation.State.SUCCESS) {\n throw new Error(`Expected ${hostInvitation?.state} to be ${Invitation.State.SUCCESS}.`);\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { FunctionManifest } from '../types';\n\nexport const testFunctionManifest: FunctionManifest = {\n functions: [\n {\n uri: 'example.com/function/test',\n route: 'test',\n handler: 'test',\n },\n ],\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_get_port_please", "import_node_path", "import_async", "import_context", "import_log", "import_echo", "import_invariant", "TestType", "TypedObject", "typename", "version", "title", "S", "String", "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", "Scheduler", "triggers", "_functionUriToCallMutex", "Map", "space", "_safeActivateTriggers", "getInactiveTriggers", "getFunctions", "open", "manifest", "mountTasks", "activate", "Promise", "all", "definition", "find", "function", "execFunction", "args", "mutex", "get", "Mutex", "set", "executeSynchronized", "loadObjectReferences", "t", "meta", "value", "entries", "Reference", "object", "db", "loadObjectById", "objectId", "_execFunction", "spaceKey", "payload", "assign", "callback", "url", "triggerType", "spec", "type", "fetch", "method", "headers", "JSON", "stringify", "error", "message", "createInitializedClients", "testBuilder", "count", "config", "clients", "range", "Client", "createLocalClientServices", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { getRandomPort } from 'get-port-please';\nimport path from 'node:path';\n\nimport { waitForCondition } from '@dxos/async';\nimport { Client, Config } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { type TestBuilder } from '@dxos/client/testing';\nimport { range } from '@dxos/util';\n\nimport { TestType } from './types';\nimport { FunctionRegistry } from '../function';\nimport { DevServer, type DevServerOptions, Scheduler } from '../runtime';\nimport { TriggerRegistry } from '../trigger';\nimport { FunctionDef, FunctionTrigger } from '../types';\n\nexport type FunctionsPluginInitializer = (client: Client) => Promise<{ close: () => Promise<void> }>;\n\n// TODO(burdon): Extend/wrap TestBuilder.\n\nexport const createInitializedClients = async (testBuilder: TestBuilder, count: number = 1, config?: Config) => {\n const clients = range(count).map(\n () =>\n new Client({\n config,\n services: testBuilder.createLocalClientServices(),\n types: [FunctionDef, FunctionTrigger, TestType],\n }),\n );\n\n testBuilder.ctx.onDispose(() => Promise.all(clients.map((client) => client.destroy())));\n return Promise.all(\n clients.map(async (client, index) => {\n await client.initialize();\n await client.halo.createIdentity({ displayName: `Peer ${index}` });\n await client.spaces.isReady.wait();\n return client;\n }),\n );\n};\n\nexport const createFunctionRuntime = async (\n testBuilder: TestBuilder,\n pluginInitializer: FunctionsPluginInitializer,\n): Promise<Client> => {\n const functionsPort = await getRandomPort('127.0.0.1');\n const config = new Config({\n runtime: {\n agent: {\n plugins: [{ id: 'dxos.org/agent/plugin/functions', config: { port: functionsPort } }],\n },\n },\n });\n\n const [client] = await createInitializedClients(testBuilder, 1, config);\n const plugin = await pluginInitializer(client);\n testBuilder.ctx.onDispose(() => plugin.close());\n return client;\n};\n\nexport const startFunctionsHost = async (\n testBuilder: TestBuilder,\n pluginInitializer: FunctionsPluginInitializer,\n options?: DevServerOptions,\n) => {\n const functionRuntime = await createFunctionRuntime(testBuilder, pluginInitializer);\n const functionsRegistry = new FunctionRegistry(functionRuntime);\n const devServer = await startDevServer(testBuilder, functionRuntime, functionsRegistry, options);\n const scheduler = await startScheduler(testBuilder, functionRuntime, devServer, functionsRegistry);\n return {\n scheduler,\n client: functionRuntime,\n waitForActiveTriggers: async (space: Space) => {\n await waitForCondition({ condition: () => scheduler.triggers.getActiveTriggers(space).length > 0 });\n },\n };\n};\n\nconst startScheduler = async (\n testBuilder: TestBuilder,\n client: Client,\n devServer: DevServer,\n functionRegistry: FunctionRegistry,\n) => {\n const triggerRegistry = new TriggerRegistry(client);\n const scheduler = new Scheduler(functionRegistry, triggerRegistry, { endpoint: devServer.endpoint });\n await scheduler.start();\n testBuilder.ctx.onDispose(() => scheduler.stop());\n return scheduler;\n};\n\nconst startDevServer = async (\n testBuilder: TestBuilder,\n client: Client,\n functionRegistry: FunctionRegistry,\n options?: { baseDir?: string },\n) => {\n const server = new DevServer(client, functionRegistry, {\n baseDir: path.join(__dirname, '../testing'),\n port: await getRandomPort('127.0.0.1'),\n ...options,\n });\n await server.start();\n testBuilder.ctx.onDispose(() => server.stop());\n return server;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { S, TypedObject } from '@dxos/echo-schema';\n\nexport class TestType extends TypedObject({ typename: 'example.com/type/Test', version: '0.1.0' })({\n title: S.String,\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 } as any;\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 TriggerCallback, 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\n await Promise.all(mountTasks).catch(log.catch);\n }\n\n /**\n * Activate trigger.\n */\n // TODO(burdon): How are triggers deactivated?\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 const execFunction: TriggerCallback = 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 await this.triggers.activate(space, trigger, execFunction);\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 type { Client } from '@dxos/client';\nimport { Filter, type Space } from '@dxos/client/echo';\nimport { performInvitation } from '@dxos/client/testing';\nimport { invariant } from '@dxos/invariant';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { FunctionTrigger } from '../types';\n\nexport const triggerWebhook = async (space: Space, uri: string) => {\n const trigger = (\n await space.db.query(Filter.schema(FunctionTrigger, (t: FunctionTrigger) => t.function === uri)).run()\n ).objects[0];\n invariant(trigger.spec.type === 'webhook');\n void fetch(`http://localhost:${trigger.spec.port}`);\n};\n\nexport const inviteMember = async (host: Space, guest: Client) => {\n const [{ invitation: hostInvitation }] = await Promise.all(performInvitation({ host, guest: guest.spaces }));\n if (hostInvitation?.state !== Invitation.State.SUCCESS) {\n throw new Error(`Expected ${hostInvitation?.state} to be ${Invitation.State.SUCCESS}.`);\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { FunctionManifest } from '../types';\n\nexport const testFunctionManifest: FunctionManifest = {\n functions: [\n {\n uri: 'example.com/function/test',\n route: 'test',\n handler: 'test',\n },\n ],\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_get_port_please", "import_node_path", "import_async", "import_context", "import_log", "import_echo", "import_invariant", "TestType", "TypedObject", "typename", "version", "title", "S", "String", "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", "Scheduler", "triggers", "_functionUriToCallMutex", "Map", "space", "_safeActivateTriggers", "getInactiveTriggers", "getFunctions", "open", "manifest", "mountTasks", "activate", "Promise", "all", "definition", "find", "function", "execFunction", "args", "mutex", "get", "Mutex", "set", "executeSynchronized", "loadObjectReferences", "t", "meta", "value", "entries", "Reference", "object", "db", "loadObjectById", "objectId", "_execFunction", "spaceKey", "payload", "assign", "callback", "url", "triggerType", "spec", "type", "fetch", "method", "headers", "JSON", "stringify", "error", "message", "createInitializedClients", "testBuilder", "count", "config", "clients", "range", "Client", "createLocalClientServices", "types", "FunctionDef", "FunctionTrigger", "ctx", "destroy", "index", "initialize", "halo", "createIdentity", "displayName", "spaces", "isReady", "createFunctionRuntime", "pluginInitializer", "functionsPort", "getRandomPort", "Config", "runtime", "agent", "plugins", "plugin", "startFunctionsHost", "options", "functionRuntime", "functionsRegistry", "FunctionRegistry", "devServer", "startDevServer", "scheduler", "startScheduler", "waitForActiveTriggers", "waitForCondition", "condition", "getActiveTriggers", "length", "functionRegistry", "triggerRegistry", "TriggerRegistry", "server", "__dirname", "triggerWebhook", "query", "Filter", "schema", "run", "objects", "inviteMember", "guest", "invitation", "hostInvitation", "performInvitation", "state", "Invitation", "State", "SUCCESS", "testFunctionManifest"]
|
|
7
7
|
}
|
package/dist/lib/node/types.cjs
CHANGED
|
@@ -18,13 +18,13 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var types_exports = {};
|
|
20
20
|
__export(types_exports, {
|
|
21
|
-
FUNCTION_SCHEMA: () =>
|
|
22
|
-
FunctionDef: () =>
|
|
23
|
-
FunctionManifestSchema: () =>
|
|
24
|
-
FunctionTrigger: () =>
|
|
21
|
+
FUNCTION_SCHEMA: () => import_chunk_O44VB3FE.FUNCTION_SCHEMA,
|
|
22
|
+
FunctionDef: () => import_chunk_O44VB3FE.FunctionDef,
|
|
23
|
+
FunctionManifestSchema: () => import_chunk_O44VB3FE.FunctionManifestSchema,
|
|
24
|
+
FunctionTrigger: () => import_chunk_O44VB3FE.FunctionTrigger
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(types_exports);
|
|
27
|
-
var
|
|
27
|
+
var import_chunk_O44VB3FE = require("./chunk-O44VB3FE.cjs");
|
|
28
28
|
// Annotate the CommonJS export names for ESM import in node:
|
|
29
29
|
0 && (module.exports = {
|
|
30
30
|
FUNCTION_SCHEMA,
|