@dxos/functions 0.5.9-main.a2de4fa → 0.5.9-main.af4882d
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-YSDC6YCF.mjs → chunk-ERWZ4JUZ.mjs} +2 -2
- package/dist/lib/browser/{chunk-YSDC6YCF.mjs.map → chunk-ERWZ4JUZ.mjs.map} +2 -2
- package/dist/lib/browser/{chunk-ROZT7SSI.mjs → chunk-YKYOGE5O.mjs} +34 -55
- package/dist/lib/browser/chunk-YKYOGE5O.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +3 -3
- package/dist/lib/browser/testing/index.mjs.map +2 -2
- package/dist/lib/browser/types.mjs +1 -1
- package/dist/lib/node/{chunk-3E6PY6JH.cjs → chunk-BLLSDTKZ.cjs} +5 -5
- package/dist/lib/node/{chunk-3E6PY6JH.cjs.map → chunk-BLLSDTKZ.cjs.map} +2 -2
- package/dist/lib/node/{chunk-H5Q2TXOA.cjs → chunk-CIFOOX2V.cjs} +54 -75
- package/dist/lib/node/chunk-CIFOOX2V.cjs.map +7 -0
- package/dist/lib/node/index.cjs +10 -10
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +10 -10
- package/dist/lib/node/testing/index.cjs.map +2 -2
- package/dist/lib/node/types.cjs +5 -5
- package/dist/lib/node/types.cjs.map +1 -1
- package/dist/types/src/runtime/dev-server.d.ts +1 -2
- package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
- package/dist/types/src/runtime/scheduler.d.ts +1 -8
- package/dist/types/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/types/src/testing/setup.d.ts +1 -1
- package/package.json +14 -15
- package/src/runtime/dev-server.test.ts +3 -3
- package/src/runtime/dev-server.ts +3 -6
- package/src/runtime/scheduler.ts +6 -29
- package/src/testing/functions-integration.test.ts +1 -1
- package/src/testing/setup.ts +1 -1
- package/src/types.ts +1 -1
- package/dist/lib/browser/chunk-ROZT7SSI.mjs.map +0 -7
- package/dist/lib/node/chunk-H5Q2TXOA.cjs.map +0 -7
|
@@ -63,7 +63,7 @@ var FunctionTrigger = class extends TypedObject({
|
|
|
63
63
|
enabled: S.optional(S.Boolean),
|
|
64
64
|
function: S.String.pipe(S.description("Function URI.")),
|
|
65
65
|
// The `meta` property is merged into the event data passed to the function.
|
|
66
|
-
meta: S.optional(S.mutable(S.
|
|
66
|
+
meta: S.optional(S.mutable(S.Any)),
|
|
67
67
|
spec: TriggerSpecSchema
|
|
68
68
|
}) {
|
|
69
69
|
};
|
|
@@ -83,4 +83,4 @@ export {
|
|
|
83
83
|
FunctionManifestSchema,
|
|
84
84
|
FUNCTION_SCHEMA
|
|
85
85
|
};
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
86
|
+
//# sourceMappingURL=chunk-ERWZ4JUZ.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/types.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { RawObject, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Type discriminator for TriggerSpec.\n * Every spec has a type field of type FunctionTriggerType that we can use to understand which\n * type we're working with.\n * https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions\n */\nexport type FunctionTriggerType = 'subscription' | 'timer' | 'webhook' | 'websocket';\n\nconst SubscriptionTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('subscription'),\n // TODO(burdon): Define query DSL (from ECHO).\n filter: S.Array(\n S.Struct({\n type: S.String,\n props: S.optional(S.Record(S.String, S.Any)),\n }),\n ),\n options: S.optional(\n S.Struct({\n // Watch changes to object (not just creation).\n deep: S.optional(S.Boolean),\n // Debounce changes (delay in ms).\n delay: S.optional(S.Number),\n }),\n ),\n }),\n);\n\nexport type SubscriptionTrigger = S.Schema.Type<typeof SubscriptionTriggerSchema>;\n\nconst TimerTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('timer'),\n cron: S.String,\n }),\n);\n\nexport type TimerTrigger = S.Schema.Type<typeof TimerTriggerSchema>;\n\nconst WebhookTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('webhook'),\n method: S.String,\n // Assigned port.\n port: S.optional(S.Number),\n }),\n);\n\nexport type WebhookTrigger = S.Schema.Type<typeof WebhookTriggerSchema>;\n\nconst WebsocketTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('websocket'),\n url: S.String,\n init: S.optional(S.Record(S.String, S.Any)),\n }),\n);\n\nexport type WebsocketTrigger = S.Schema.Type<typeof WebsocketTriggerSchema>;\n\nconst TriggerSpecSchema = S.Union(\n TimerTriggerSchema,\n WebhookTriggerSchema,\n WebsocketTriggerSchema,\n SubscriptionTriggerSchema,\n);\n\nexport type TriggerSpec = TimerTrigger | WebhookTrigger | WebsocketTrigger | SubscriptionTrigger;\n\n/**\n * Function definition.\n */\nexport class FunctionDef extends TypedObject({\n typename: 'dxos.org/type/FunctionDef',\n version: '0.1.0',\n})({\n uri: S.String,\n description: S.optional(S.String),\n route: S.String,\n handler: S.String,\n}) {}\n\n/**\n * Function trigger.\n */\nexport class FunctionTrigger extends TypedObject({\n typename: 'dxos.org/type/FunctionTrigger',\n version: '0.1.0',\n})({\n enabled: S.optional(S.Boolean),\n function: S.String.pipe(S.description('Function URI.')),\n // The `meta` property is merged into the event data passed to the function.\n meta: S.optional(S.mutable(S.
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAIA,SAASA,WAAWC,GAAGC,mBAAmB;AAU1C,IAAMC,4BAA4BC,EAAEC,QAClCD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,cAAA;;EAEhBC,QAAQL,EAAEM,MACRN,EAAEE,OAAO;IACPC,MAAMH,EAAEO;IACRC,OAAOR,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;EAC5C,CAAA,CAAA;EAEFC,SAASZ,EAAES,SACTT,EAAEE,OAAO;;IAEPW,MAAMb,EAAES,SAAST,EAAEc,OAAO;;IAE1BC,OAAOf,EAAES,SAAST,EAAEgB,MAAM;EAC5B,CAAA,CAAA;AAEJ,CAAA,CAAA;AAKF,IAAMC,qBAAqBjB,EAAEC,QAC3BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,OAAA;EAChBc,MAAMlB,EAAEO;AACV,CAAA,CAAA;AAKF,IAAMY,uBAAuBnB,EAAEC,QAC7BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,SAAA;EAChBgB,QAAQpB,EAAEO;;EAEVc,MAAMrB,EAAES,SAAST,EAAEgB,MAAM;AAC3B,CAAA,CAAA;AAKF,IAAMM,yBAAyBtB,EAAEC,QAC/BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,WAAA;EAChBmB,KAAKvB,EAAEO;EACPiB,MAAMxB,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;AAC3C,CAAA,CAAA;AAKF,IAAMc,oBAAoBzB,EAAE0B,MAC1BT,oBACAE,sBACAG,wBACAvB,yBAAAA;AAQK,IAAM4B,cAAN,cAA0BC,YAAY;EAC3CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDC,KAAK/B,EAAEO;EACPyB,aAAahC,EAAES,SAAST,EAAEO,MAAM;EAChC0B,OAAOjC,EAAEO;EACT2B,SAASlC,EAAEO;AACb,CAAA,EAAA;AAAI;AAKG,IAAM4B,kBAAN,cAA8BP,YAAY;EAC/CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDM,SAASpC,EAAES,SAAST,EAAEc,OAAO;EAC7BuB,UAAUrC,EAAEO,OAAO+B,KAAKtC,EAAEgC,YAAY,eAAA,CAAA;;EAEtCO,MAAMvC,EAAES,SAAST,EAAEC,QAAQD,
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { RawObject, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Type discriminator for TriggerSpec.\n * Every spec has a type field of type FunctionTriggerType that we can use to understand which\n * type we're working with.\n * https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions\n */\nexport type FunctionTriggerType = 'subscription' | 'timer' | 'webhook' | 'websocket';\n\nconst SubscriptionTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('subscription'),\n // TODO(burdon): Define query DSL (from ECHO).\n filter: S.Array(\n S.Struct({\n type: S.String,\n props: S.optional(S.Record(S.String, S.Any)),\n }),\n ),\n options: S.optional(\n S.Struct({\n // Watch changes to object (not just creation).\n deep: S.optional(S.Boolean),\n // Debounce changes (delay in ms).\n delay: S.optional(S.Number),\n }),\n ),\n }),\n);\n\nexport type SubscriptionTrigger = S.Schema.Type<typeof SubscriptionTriggerSchema>;\n\nconst TimerTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('timer'),\n cron: S.String,\n }),\n);\n\nexport type TimerTrigger = S.Schema.Type<typeof TimerTriggerSchema>;\n\nconst WebhookTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('webhook'),\n method: S.String,\n // Assigned port.\n port: S.optional(S.Number),\n }),\n);\n\nexport type WebhookTrigger = S.Schema.Type<typeof WebhookTriggerSchema>;\n\nconst WebsocketTriggerSchema = S.mutable(\n S.Struct({\n type: S.Literal('websocket'),\n url: S.String,\n init: S.optional(S.Record(S.String, S.Any)),\n }),\n);\n\nexport type WebsocketTrigger = S.Schema.Type<typeof WebsocketTriggerSchema>;\n\nconst TriggerSpecSchema = S.Union(\n TimerTriggerSchema,\n WebhookTriggerSchema,\n WebsocketTriggerSchema,\n SubscriptionTriggerSchema,\n);\n\nexport type TriggerSpec = TimerTrigger | WebhookTrigger | WebsocketTrigger | SubscriptionTrigger;\n\n/**\n * Function definition.\n */\nexport class FunctionDef extends TypedObject({\n typename: 'dxos.org/type/FunctionDef',\n version: '0.1.0',\n})({\n uri: S.String,\n description: S.optional(S.String),\n route: S.String,\n handler: S.String,\n}) {}\n\n/**\n * Function trigger.\n */\nexport class FunctionTrigger extends TypedObject({\n typename: 'dxos.org/type/FunctionTrigger',\n version: '0.1.0',\n})({\n enabled: S.optional(S.Boolean),\n function: S.String.pipe(S.description('Function URI.')),\n // The `meta` property is merged into the event data passed to the function.\n meta: S.optional(S.mutable(S.Any)),\n spec: TriggerSpecSchema,\n}) {}\n\n/**\n * Function manifest file.\n */\nexport const FunctionManifestSchema = S.Struct({\n functions: S.optional(S.mutable(S.Array(RawObject(FunctionDef)))),\n triggers: S.optional(S.mutable(S.Array(RawObject(FunctionTrigger)))),\n});\n\nexport type FunctionManifest = S.Schema.Type<typeof FunctionManifestSchema>;\n\n// TODO(burdon): Standards?\nexport const FUNCTION_SCHEMA = [FunctionDef, FunctionTrigger];\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAIA,SAASA,WAAWC,GAAGC,mBAAmB;AAU1C,IAAMC,4BAA4BC,EAAEC,QAClCD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,cAAA;;EAEhBC,QAAQL,EAAEM,MACRN,EAAEE,OAAO;IACPC,MAAMH,EAAEO;IACRC,OAAOR,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;EAC5C,CAAA,CAAA;EAEFC,SAASZ,EAAES,SACTT,EAAEE,OAAO;;IAEPW,MAAMb,EAAES,SAAST,EAAEc,OAAO;;IAE1BC,OAAOf,EAAES,SAAST,EAAEgB,MAAM;EAC5B,CAAA,CAAA;AAEJ,CAAA,CAAA;AAKF,IAAMC,qBAAqBjB,EAAEC,QAC3BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,OAAA;EAChBc,MAAMlB,EAAEO;AACV,CAAA,CAAA;AAKF,IAAMY,uBAAuBnB,EAAEC,QAC7BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,SAAA;EAChBgB,QAAQpB,EAAEO;;EAEVc,MAAMrB,EAAES,SAAST,EAAEgB,MAAM;AAC3B,CAAA,CAAA;AAKF,IAAMM,yBAAyBtB,EAAEC,QAC/BD,EAAEE,OAAO;EACPC,MAAMH,EAAEI,QAAQ,WAAA;EAChBmB,KAAKvB,EAAEO;EACPiB,MAAMxB,EAAES,SAAST,EAAEU,OAAOV,EAAEO,QAAQP,EAAEW,GAAG,CAAA;AAC3C,CAAA,CAAA;AAKF,IAAMc,oBAAoBzB,EAAE0B,MAC1BT,oBACAE,sBACAG,wBACAvB,yBAAAA;AAQK,IAAM4B,cAAN,cAA0BC,YAAY;EAC3CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDC,KAAK/B,EAAEO;EACPyB,aAAahC,EAAES,SAAST,EAAEO,MAAM;EAChC0B,OAAOjC,EAAEO;EACT2B,SAASlC,EAAEO;AACb,CAAA,EAAA;AAAI;AAKG,IAAM4B,kBAAN,cAA8BP,YAAY;EAC/CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDM,SAASpC,EAAES,SAAST,EAAEc,OAAO;EAC7BuB,UAAUrC,EAAEO,OAAO+B,KAAKtC,EAAEgC,YAAY,eAAA,CAAA;;EAEtCO,MAAMvC,EAAES,SAAST,EAAEC,QAAQD,EAAEW,GAAG,CAAA;EAChC6B,MAAMf;AACR,CAAA,EAAA;AAAI;AAKG,IAAMgB,yBAAyBzC,EAAEE,OAAO;EAC7CwC,WAAW1C,EAAES,SAAST,EAAEC,QAAQD,EAAEM,MAAMqC,UAAUhB,WAAAA,CAAAA,CAAAA,CAAAA;EAClDiB,UAAU5C,EAAES,SAAST,EAAEC,QAAQD,EAAEM,MAAMqC,UAAUR,eAAAA,CAAAA,CAAAA,CAAAA;AACnD,CAAA;AAKO,IAAMU,kBAAkB;EAAClB;EAAaQ;;",
|
|
6
6
|
"names": ["RawObject", "S", "TypedObject", "SubscriptionTriggerSchema", "S", "mutable", "Struct", "type", "Literal", "filter", "Array", "String", "props", "optional", "Record", "Any", "options", "deep", "Boolean", "delay", "Number", "TimerTriggerSchema", "cron", "WebhookTriggerSchema", "method", "port", "WebsocketTriggerSchema", "url", "init", "TriggerSpecSchema", "Union", "FunctionDef", "TypedObject", "typename", "version", "uri", "description", "route", "handler", "FunctionTrigger", "enabled", "function", "pipe", "meta", "spec", "FunctionManifestSchema", "functions", "RawObject", "triggers", "FUNCTION_SCHEMA"]
|
|
7
7
|
}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
FunctionDef,
|
|
4
4
|
FunctionTrigger,
|
|
5
5
|
__require
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ERWZ4JUZ.mjs";
|
|
7
7
|
|
|
8
8
|
// packages/core/functions/src/function/function-registry.ts
|
|
9
9
|
import { Event } from "@dxos/async";
|
|
@@ -112,7 +112,6 @@ import { Context } from "@dxos/context";
|
|
|
112
112
|
import { invariant } from "@dxos/invariant";
|
|
113
113
|
import { log as log2 } from "@dxos/log";
|
|
114
114
|
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/dev-server.ts";
|
|
115
|
-
var FN_TIMEOUT = 2e4;
|
|
116
115
|
var DevServer = class {
|
|
117
116
|
constructor(_client, _functionsRegistry, _options) {
|
|
118
117
|
this._client = _client;
|
|
@@ -131,7 +130,7 @@ var DevServer = class {
|
|
|
131
130
|
get endpoint() {
|
|
132
131
|
invariant(this._port, void 0, {
|
|
133
132
|
F: __dxlog_file2,
|
|
134
|
-
L:
|
|
133
|
+
L: 57,
|
|
135
134
|
S: this,
|
|
136
135
|
A: [
|
|
137
136
|
"this._port",
|
|
@@ -149,7 +148,7 @@ var DevServer = class {
|
|
|
149
148
|
async start() {
|
|
150
149
|
invariant(!this._server, void 0, {
|
|
151
150
|
F: __dxlog_file2,
|
|
152
|
-
L:
|
|
151
|
+
L: 70,
|
|
153
152
|
S: this,
|
|
154
153
|
A: [
|
|
155
154
|
"!this._server",
|
|
@@ -158,7 +157,7 @@ var DevServer = class {
|
|
|
158
157
|
});
|
|
159
158
|
log2.info("starting...", void 0, {
|
|
160
159
|
F: __dxlog_file2,
|
|
161
|
-
L:
|
|
160
|
+
L: 71,
|
|
162
161
|
S: this,
|
|
163
162
|
C: (f, a) => f(...a)
|
|
164
163
|
});
|
|
@@ -172,7 +171,7 @@ var DevServer = class {
|
|
|
172
171
|
path: path2
|
|
173
172
|
}, {
|
|
174
173
|
F: __dxlog_file2,
|
|
175
|
-
L:
|
|
174
|
+
L: 81,
|
|
176
175
|
S: this,
|
|
177
176
|
C: (f, a) => f(...a)
|
|
178
177
|
});
|
|
@@ -180,12 +179,12 @@ var DevServer = class {
|
|
|
180
179
|
const { def } = this._handlers["/" + path2];
|
|
181
180
|
await this._load(def, true);
|
|
182
181
|
}
|
|
183
|
-
res.statusCode = await asyncTimeout(this.invoke("/" + path2, req.body),
|
|
182
|
+
res.statusCode = await asyncTimeout(this.invoke("/" + path2, req.body), 2e4);
|
|
184
183
|
res.end();
|
|
185
184
|
} catch (err) {
|
|
186
185
|
log2.catch(err, void 0, {
|
|
187
186
|
F: __dxlog_file2,
|
|
188
|
-
L:
|
|
187
|
+
L: 91,
|
|
189
188
|
S: this,
|
|
190
189
|
C: (f, a) => f(...a)
|
|
191
190
|
});
|
|
@@ -210,7 +209,7 @@ var DevServer = class {
|
|
|
210
209
|
endpoint
|
|
211
210
|
}, {
|
|
212
211
|
F: __dxlog_file2,
|
|
213
|
-
L:
|
|
212
|
+
L: 106,
|
|
214
213
|
S: this,
|
|
215
214
|
C: (f, a) => f(...a)
|
|
216
215
|
});
|
|
@@ -226,7 +225,7 @@ var DevServer = class {
|
|
|
226
225
|
port: this._port
|
|
227
226
|
}, {
|
|
228
227
|
F: __dxlog_file2,
|
|
229
|
-
L:
|
|
228
|
+
L: 118,
|
|
230
229
|
S: this,
|
|
231
230
|
C: (f, a) => f(...a)
|
|
232
231
|
});
|
|
@@ -237,7 +236,7 @@ var DevServer = class {
|
|
|
237
236
|
}
|
|
238
237
|
log2.info("stopping...", void 0, {
|
|
239
238
|
F: __dxlog_file2,
|
|
240
|
-
L:
|
|
239
|
+
L: 126,
|
|
241
240
|
S: this,
|
|
242
241
|
C: (f, a) => f(...a)
|
|
243
242
|
});
|
|
@@ -246,7 +245,7 @@ var DevServer = class {
|
|
|
246
245
|
this._server.close(async () => {
|
|
247
246
|
log2.info("server stopped", void 0, {
|
|
248
247
|
F: __dxlog_file2,
|
|
249
|
-
L:
|
|
248
|
+
L: 131,
|
|
250
249
|
S: this,
|
|
251
250
|
C: (f, a) => f(...a)
|
|
252
251
|
});
|
|
@@ -254,7 +253,7 @@ var DevServer = class {
|
|
|
254
253
|
if (this._functionServiceRegistration) {
|
|
255
254
|
invariant(this._client.services.services.FunctionRegistryService, void 0, {
|
|
256
255
|
F: __dxlog_file2,
|
|
257
|
-
L:
|
|
256
|
+
L: 134,
|
|
258
257
|
S: this,
|
|
259
258
|
A: [
|
|
260
259
|
"this._client.services.services.FunctionRegistryService",
|
|
@@ -268,7 +267,7 @@ var DevServer = class {
|
|
|
268
267
|
registrationId: this._functionServiceRegistration
|
|
269
268
|
}, {
|
|
270
269
|
F: __dxlog_file2,
|
|
271
|
-
L:
|
|
270
|
+
L: 139,
|
|
272
271
|
S: this,
|
|
273
272
|
C: (f, a) => f(...a)
|
|
274
273
|
});
|
|
@@ -285,7 +284,7 @@ var DevServer = class {
|
|
|
285
284
|
this._server = void 0;
|
|
286
285
|
log2.info("stopped", void 0, {
|
|
287
286
|
F: __dxlog_file2,
|
|
288
|
-
L:
|
|
287
|
+
L: 153,
|
|
289
288
|
S: this,
|
|
290
289
|
C: (f, a) => f(...a)
|
|
291
290
|
});
|
|
@@ -297,7 +296,7 @@ var DevServer = class {
|
|
|
297
296
|
newFunctions
|
|
298
297
|
}, {
|
|
299
298
|
F: __dxlog_file2,
|
|
300
|
-
L:
|
|
299
|
+
L: 159,
|
|
301
300
|
S: this,
|
|
302
301
|
C: (f, a) => f(...a)
|
|
303
302
|
});
|
|
@@ -313,7 +312,7 @@ var DevServer = class {
|
|
|
313
312
|
force
|
|
314
313
|
}, {
|
|
315
314
|
F: __dxlog_file2,
|
|
316
|
-
L:
|
|
315
|
+
L: 168,
|
|
317
316
|
S: this,
|
|
318
317
|
C: (f, a) => f(...a)
|
|
319
318
|
});
|
|
@@ -334,7 +333,7 @@ var DevServer = class {
|
|
|
334
333
|
async _safeUpdateRegistration() {
|
|
335
334
|
invariant(this._functionServiceRegistration, void 0, {
|
|
336
335
|
F: __dxlog_file2,
|
|
337
|
-
L:
|
|
336
|
+
L: 190,
|
|
338
337
|
S: this,
|
|
339
338
|
A: [
|
|
340
339
|
"this._functionServiceRegistration",
|
|
@@ -352,7 +351,7 @@ var DevServer = class {
|
|
|
352
351
|
} catch (err) {
|
|
353
352
|
log2.catch(err, void 0, {
|
|
354
353
|
F: __dxlog_file2,
|
|
355
|
-
L:
|
|
354
|
+
L: 197,
|
|
356
355
|
S: this,
|
|
357
356
|
C: (f, a) => f(...a)
|
|
358
357
|
});
|
|
@@ -369,7 +368,7 @@ var DevServer = class {
|
|
|
369
368
|
path: path2
|
|
370
369
|
}, {
|
|
371
370
|
F: __dxlog_file2,
|
|
372
|
-
L:
|
|
371
|
+
L: 208,
|
|
373
372
|
S: this,
|
|
374
373
|
C: (f, a) => f(...a)
|
|
375
374
|
});
|
|
@@ -383,7 +382,7 @@ var DevServer = class {
|
|
|
383
382
|
duration: Date.now() - now
|
|
384
383
|
}, {
|
|
385
384
|
F: __dxlog_file2,
|
|
386
|
-
L:
|
|
385
|
+
L: 211,
|
|
387
386
|
S: this,
|
|
388
387
|
C: (f, a) => f(...a)
|
|
389
388
|
});
|
|
@@ -394,7 +393,7 @@ var DevServer = class {
|
|
|
394
393
|
const { handler } = this._handlers[path2] ?? {};
|
|
395
394
|
invariant(handler, `invalid path: ${path2}`, {
|
|
396
395
|
F: __dxlog_file2,
|
|
397
|
-
L:
|
|
396
|
+
L: 218,
|
|
398
397
|
S: this,
|
|
399
398
|
A: [
|
|
400
399
|
"handler",
|
|
@@ -427,9 +426,7 @@ var createContext = () => new Context({
|
|
|
427
426
|
// packages/core/functions/src/runtime/scheduler.ts
|
|
428
427
|
import path from "@dxos/node-std/path";
|
|
429
428
|
import { Mutex } from "@dxos/async";
|
|
430
|
-
import { loadObjectReferences } from "@dxos/client/echo";
|
|
431
429
|
import { Context as Context2 } from "@dxos/context";
|
|
432
|
-
import { Reference } from "@dxos/echo-protocol";
|
|
433
430
|
import { log as log3 } from "@dxos/log";
|
|
434
431
|
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/scheduler.ts";
|
|
435
432
|
var Scheduler = class {
|
|
@@ -457,7 +454,7 @@ var Scheduler = class {
|
|
|
457
454
|
await this.functions.close();
|
|
458
455
|
await this.triggers.close();
|
|
459
456
|
}
|
|
460
|
-
// TODO(burdon): Remove and update registries directly
|
|
457
|
+
// TODO(burdon): Remove and update registries directly.
|
|
461
458
|
async register(space, manifest) {
|
|
462
459
|
await this.functions.register(space, manifest.functions);
|
|
463
460
|
await this.triggers.register(space, manifest);
|
|
@@ -468,9 +465,6 @@ var Scheduler = class {
|
|
|
468
465
|
});
|
|
469
466
|
await Promise.all(mountTasks).catch(log3.catch);
|
|
470
467
|
}
|
|
471
|
-
/**
|
|
472
|
-
* Activate trigger.
|
|
473
|
-
*/
|
|
474
468
|
async activate(space, functions, trigger) {
|
|
475
469
|
const definition = functions.find((def) => def.uri === trigger.function);
|
|
476
470
|
if (!definition) {
|
|
@@ -478,7 +472,7 @@ var Scheduler = class {
|
|
|
478
472
|
trigger
|
|
479
473
|
}, {
|
|
480
474
|
F: __dxlog_file3,
|
|
481
|
-
L:
|
|
475
|
+
L: 78,
|
|
482
476
|
S: this,
|
|
483
477
|
C: (f, a) => f(...a)
|
|
484
478
|
});
|
|
@@ -491,33 +485,21 @@ var Scheduler = class {
|
|
|
491
485
|
uri: definition.uri
|
|
492
486
|
}, {
|
|
493
487
|
F: __dxlog_file3,
|
|
494
|
-
L:
|
|
488
|
+
L: 86,
|
|
495
489
|
S: this,
|
|
496
490
|
C: (f, a) => f(...a)
|
|
497
491
|
});
|
|
498
|
-
return mutex.executeSynchronized(
|
|
492
|
+
return mutex.executeSynchronized(() => {
|
|
499
493
|
log3.info("mutex acquired", {
|
|
500
494
|
uri: definition.uri
|
|
501
495
|
}, {
|
|
502
496
|
F: __dxlog_file3,
|
|
503
|
-
L:
|
|
497
|
+
L: 88,
|
|
504
498
|
S: this,
|
|
505
499
|
C: (f, a) => f(...a)
|
|
506
500
|
});
|
|
507
|
-
await loadObjectReferences(trigger, (t) => Object.values(t.meta ?? {}));
|
|
508
|
-
const meta = {};
|
|
509
|
-
for (const [key, value] of Object.entries(trigger.meta ?? {})) {
|
|
510
|
-
if (value instanceof Reference) {
|
|
511
|
-
const object = await space.db.loadObjectById(value.objectId);
|
|
512
|
-
if (object) {
|
|
513
|
-
meta[key] = object;
|
|
514
|
-
}
|
|
515
|
-
} else {
|
|
516
|
-
meta[key] = value;
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
501
|
return this._execFunction(definition, trigger, {
|
|
520
|
-
meta,
|
|
502
|
+
meta: trigger.meta ?? {},
|
|
521
503
|
data: {
|
|
522
504
|
...args,
|
|
523
505
|
spaceKey: space.key
|
|
@@ -530,15 +512,12 @@ var Scheduler = class {
|
|
|
530
512
|
trigger
|
|
531
513
|
}, {
|
|
532
514
|
F: __dxlog_file3,
|
|
533
|
-
L:
|
|
515
|
+
L: 96,
|
|
534
516
|
S: this,
|
|
535
517
|
C: (f, a) => f(...a)
|
|
536
518
|
});
|
|
537
519
|
}
|
|
538
|
-
|
|
539
|
-
* Invoke function RPC.
|
|
540
|
-
*/
|
|
541
|
-
async _execFunction(def, trigger, { meta, data }) {
|
|
520
|
+
async _execFunction(def, trigger, { data, meta }) {
|
|
542
521
|
let status = 0;
|
|
543
522
|
try {
|
|
544
523
|
const payload = Object.assign({}, meta && {
|
|
@@ -553,7 +532,7 @@ var Scheduler = class {
|
|
|
553
532
|
triggerType: trigger.spec.type
|
|
554
533
|
}, {
|
|
555
534
|
F: __dxlog_file3,
|
|
556
|
-
L:
|
|
535
|
+
L: 113,
|
|
557
536
|
S: this,
|
|
558
537
|
C: (f, a) => f(...a)
|
|
559
538
|
});
|
|
@@ -570,7 +549,7 @@ var Scheduler = class {
|
|
|
570
549
|
function: def.uri
|
|
571
550
|
}, {
|
|
572
551
|
F: __dxlog_file3,
|
|
573
|
-
L:
|
|
552
|
+
L: 124,
|
|
574
553
|
S: this,
|
|
575
554
|
C: (f, a) => f(...a)
|
|
576
555
|
});
|
|
@@ -584,7 +563,7 @@ var Scheduler = class {
|
|
|
584
563
|
status
|
|
585
564
|
}, {
|
|
586
565
|
F: __dxlog_file3,
|
|
587
|
-
L:
|
|
566
|
+
L: 134,
|
|
588
567
|
S: this,
|
|
589
568
|
C: (f, a) => f(...a)
|
|
590
569
|
});
|
|
@@ -594,7 +573,7 @@ var Scheduler = class {
|
|
|
594
573
|
error: err.message
|
|
595
574
|
}, {
|
|
596
575
|
F: __dxlog_file3,
|
|
597
|
-
L:
|
|
576
|
+
L: 136,
|
|
598
577
|
S: this,
|
|
599
578
|
C: (f, a) => f(...a)
|
|
600
579
|
});
|
|
@@ -1111,4 +1090,4 @@ export {
|
|
|
1111
1090
|
Scheduler,
|
|
1112
1091
|
TriggerRegistry
|
|
1113
1092
|
};
|
|
1114
|
-
//# sourceMappingURL=chunk-
|
|
1093
|
+
//# sourceMappingURL=chunk-YKYOGE5O.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/function/function-registry.ts", "../../../src/runtime/dev-server.ts", "../../../src/runtime/scheduler.ts", "../../../src/trigger/trigger-registry.ts", "../../../src/trigger/type/subscription-trigger.ts", "../../../src/trigger/type/timer-trigger.ts", "../../../src/trigger/type/webhook-trigger.ts", "../../../src/trigger/type/websocket-trigger.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, type Space } from '@dxos/client/echo';\nimport { type Context, Resource } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap, diff } from '@dxos/util';\n\nimport { FunctionDef, type FunctionManifest } from '../types';\n\nexport type FunctionsRegisteredEvent = {\n space: Space;\n added: FunctionDef[];\n};\n\nexport class FunctionRegistry extends Resource {\n private readonly _functionBySpaceKey = new ComplexMap<PublicKey, FunctionDef[]>(PublicKey.hash);\n\n public readonly registered = new Event<FunctionsRegisteredEvent>();\n\n constructor(private readonly _client: Client) {\n super();\n }\n\n public getFunctions(space: Space): FunctionDef[] {\n return this._functionBySpaceKey.get(space.key) ?? [];\n }\n\n public getUniqueByUri(): FunctionDef[] {\n const uniqueByUri = [...this._functionBySpaceKey.values()]\n .flatMap((defs) => defs)\n .reduce((acc, v) => {\n acc.set(v.uri, v);\n return acc;\n }, new Map<string, FunctionDef>());\n return [...uniqueByUri.values()];\n }\n\n /**\n * Loads function definitions from the manifest into the space.\n * We first load all the definitions from the space to deduplicate by functionId.\n */\n public async register(space: Space, functions: FunctionManifest['functions']): Promise<void> {\n log('register', { space: space.key, functions: functions?.length ?? 0 });\n if (!functions?.length) {\n return;\n }\n if (!space.db.graph.schemaRegistry.hasSchema(FunctionDef)) {\n space.db.graph.schemaRegistry.addSchema([FunctionDef]);\n }\n\n // Sync definitions.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();\n const { added } = diff(existing, functions, (a, b) => a.uri === b.uri);\n // TODO(burdon): Update existing templates.\n added.forEach((def) => space.db.add(create(FunctionDef, def)));\n }\n\n protected override async _open(): Promise<void> {\n log.info('opening...');\n const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._functionBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: FunctionDef[] = [];\n this._functionBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n\n // Subscribe to updates.\n this._ctx.onDispose(\n space.db.query(Filter.schema(FunctionDef)).subscribe(({ objects }) => {\n const { added } = diff(registered, objects, (a, b) => a.uri === b.uri);\n // TODO(burdon): Update and remove.\n if (added.length > 0) {\n registered.push(...added);\n this.registered.emit({ space, added });\n }\n }),\n );\n }\n });\n\n // TODO(burdon): API: Normalize unsubscribe methods.\n this._ctx.onDispose(() => spacesSubscription.unsubscribe());\n }\n\n protected override async _close(_: Context): Promise<void> {\n log.info('closing...');\n this._functionBySpaceKey.clear();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport express from 'express';\nimport { getPort } from 'get-port-please';\nimport type http from 'http';\nimport { join } from 'node:path';\n\nimport { asyncTimeout, Event, Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionContext, type FunctionEvent, type FunctionHandler, type FunctionResponse } from '../handler';\nimport { type FunctionDef } from '../types';\n\nexport type DevServerOptions = {\n baseDir: string;\n port?: number;\n reload?: boolean;\n dataDir?: string;\n};\n\n/**\n * Functions dev server provides a local HTTP server for testing functions.\n */\nexport class DevServer {\n private _ctx = createContext();\n\n // Function handlers indexed by name (URL path).\n private readonly _handlers: Record<string, { def: FunctionDef; handler: FunctionHandler<any> }> = {};\n\n private _server?: http.Server;\n private _port?: number;\n private _functionServiceRegistration?: string;\n private _proxy?: string;\n private _seq = 0;\n\n public readonly update = new Event<number>();\n\n constructor(\n private readonly _client: Client,\n private readonly _functionsRegistry: FunctionRegistry,\n private readonly _options: DevServerOptions,\n ) {}\n\n get stats() {\n return {\n seq: this._seq,\n };\n }\n\n get endpoint() {\n invariant(this._port);\n return `http://localhost:${this._port}`;\n }\n\n get proxy() {\n return this._proxy;\n }\n\n get functions() {\n return Object.values(this._handlers);\n }\n\n async start() {\n invariant(!this._server);\n log.info('starting...');\n this._ctx = createContext();\n\n // TODO(burdon): Move to hono.\n const app = express();\n app.use(express.json());\n\n app.post('/:path', async (req, res) => {\n const { path } = req.params;\n try {\n log.info('calling', { path });\n if (this._options.reload) {\n const { def } = this._handlers['/' + path];\n await this._load(def, true);\n }\n\n // TODO(burdon): Get function context.\n res.statusCode = await asyncTimeout(this.invoke('/' + path, req.body), 20_000);\n res.end();\n } catch (err: any) {\n log.catch(err);\n res.statusCode = 500;\n res.end();\n }\n });\n\n this._port = this._options.port ?? (await getPort({ host: 'localhost', port: 7200, portRange: [7200, 7299] }));\n this._server = app.listen(this._port);\n\n try {\n // Register functions.\n const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService!.register({\n endpoint: this.endpoint,\n });\n\n log.info('registered', { endpoint });\n this._proxy = endpoint;\n this._functionServiceRegistration = registrationId;\n\n // Open after registration, so that it can be updated with the list of function definitions.\n await this._handleNewFunctions(this._functionsRegistry.getUniqueByUri());\n this._ctx.onDispose(this._functionsRegistry.registered.on(({ added }) => this._handleNewFunctions(added)));\n } catch (err: any) {\n await this.stop();\n throw new Error('FunctionRegistryService not available (check plugin is configured).');\n }\n\n log.info('started', { port: this._port });\n }\n\n async stop() {\n if (!this._server) {\n return;\n }\n\n log.info('stopping...');\n await this._ctx.dispose();\n\n const trigger = new Trigger();\n this._server.close(async () => {\n log.info('server stopped');\n try {\n if (this._functionServiceRegistration) {\n invariant(this._client.services.services.FunctionRegistryService);\n await this._client.services.services.FunctionRegistryService.unregister({\n registrationId: this._functionServiceRegistration,\n });\n\n log.info('unregistered', { registrationId: this._functionServiceRegistration });\n this._functionServiceRegistration = undefined;\n this._proxy = undefined;\n }\n\n trigger.wake();\n } catch (err) {\n trigger.throw(err as Error);\n }\n });\n\n await trigger.wait();\n this._port = undefined;\n this._server = undefined;\n log.info('stopped');\n }\n\n private async _handleNewFunctions(newFunctions: FunctionDef[]) {\n newFunctions.forEach((def) => this._load(def));\n await this._safeUpdateRegistration();\n log('new functions loaded', { newFunctions });\n }\n\n /**\n * Load function.\n */\n private async _load(def: FunctionDef, force?: boolean | undefined) {\n const { uri, route, handler } = def;\n const filePath = join(this._options.baseDir, handler);\n log.info('loading', { uri, force });\n\n // Remove from cache.\n if (force) {\n Object.keys(require.cache)\n .filter((key) => key.startsWith(filePath))\n .forEach((key) => {\n delete require.cache[key];\n });\n }\n\n // TODO(burdon): Import types.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const module = require(filePath);\n if (typeof module.default !== 'function') {\n throw new Error(`Handler must export default function: ${uri}`);\n }\n\n this._handlers[route] = { def, handler: module.default };\n }\n\n private async _safeUpdateRegistration(): Promise<void> {\n invariant(this._functionServiceRegistration);\n try {\n await this._client.services.services.FunctionRegistryService!.updateRegistration({\n registrationId: this._functionServiceRegistration,\n functions: this.functions.map(({ def: { id, route } }) => ({ id, route })),\n });\n } catch (err) {\n log.catch(err);\n }\n }\n\n /**\n * Invoke function.\n */\n public async invoke(path: string, data: any): Promise<number> {\n const seq = ++this._seq;\n const now = Date.now();\n\n log.info('req', { seq, path });\n const statusCode = await this._invoke(path, { data });\n\n log.info('res', { seq, path, statusCode, duration: Date.now() - now });\n this.update.emit(statusCode);\n return statusCode;\n }\n\n private async _invoke(path: string, event: FunctionEvent) {\n const { handler } = this._handlers[path] ?? {};\n invariant(handler, `invalid path: ${path}`);\n const context: FunctionContext = {\n client: this._client,\n dataDir: this._options.dataDir,\n };\n\n let statusCode = 200;\n const response: FunctionResponse = {\n status: (code: number) => {\n statusCode = code;\n return response;\n },\n };\n\n await handler({ context, event, response });\n return statusCode;\n }\n}\n\nconst createContext = () => new Context({ name: 'DevServer' });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport path from 'node:path';\n\nimport { Mutex } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionEventMeta } from '../handler';\nimport { type TriggerRegistry } from '../trigger';\nimport { type FunctionDef, type FunctionManifest, type FunctionTrigger } from '../types';\n\nexport type Callback = (data: any) => Promise<void | number>;\n\nexport type SchedulerOptions = {\n endpoint?: string;\n callback?: Callback;\n};\n\n/**\n * The scheduler triggers function execution based on various triggers.\n */\nexport class Scheduler {\n private _ctx = createContext();\n\n private readonly _functionUriToCallMutex = new Map<string, Mutex>();\n\n constructor(\n public readonly functions: FunctionRegistry,\n public readonly triggers: TriggerRegistry,\n private readonly _options: SchedulerOptions = {},\n ) {\n this.functions.registered.on(async ({ space, added }) => {\n await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);\n });\n this.triggers.registered.on(async ({ space, triggers }) => {\n await this._safeActivateTriggers(space, triggers, this.functions.getFunctions(space));\n });\n }\n\n async start() {\n await this._ctx.dispose();\n this._ctx = createContext();\n await this.functions.open(this._ctx);\n await this.triggers.open(this._ctx);\n }\n\n async stop() {\n await this._ctx.dispose();\n await this.functions.close();\n await this.triggers.close();\n }\n\n // TODO(burdon): Remove and update registries directly.\n public async register(space: Space, manifest: FunctionManifest) {\n await this.functions.register(space, manifest.functions);\n await this.triggers.register(space, manifest);\n }\n\n private async _safeActivateTriggers(\n space: Space,\n triggers: FunctionTrigger[],\n functions: FunctionDef[],\n ): Promise<void> {\n const mountTasks = triggers.map((trigger) => {\n return this.activate(space, functions, trigger);\n });\n await Promise.all(mountTasks).catch(log.catch);\n }\n\n private async activate(space: Space, functions: FunctionDef[], trigger: FunctionTrigger) {\n const definition = functions.find((def) => def.uri === trigger.function);\n if (!definition) {\n log.info('function is not found for trigger', { trigger });\n return;\n }\n\n await this.triggers.activate(space, trigger, async (args) => {\n const mutex = this._functionUriToCallMutex.get(definition.uri) ?? new Mutex();\n this._functionUriToCallMutex.set(definition.uri, mutex);\n\n log.info('function triggered, waiting for mutex', { uri: definition.uri });\n return mutex.executeSynchronized(() => {\n log.info('mutex acquired', { uri: definition.uri });\n return this._execFunction(definition, trigger, {\n meta: trigger.meta ?? {},\n data: { ...args, spaceKey: space.key },\n });\n });\n });\n\n log('activated trigger', { space: space.key, trigger });\n }\n\n private async _execFunction<TData, TMeta>(\n def: FunctionDef,\n trigger: FunctionTrigger,\n { data, meta }: { data: TData; meta?: TMeta },\n ): Promise<number> {\n let status = 0;\n try {\n // TODO(burdon): Pass in Space key (common context)?\n const payload = Object.assign({}, meta && ({ meta } satisfies FunctionEventMeta<TMeta>), data);\n\n const { endpoint, callback } = this._options;\n if (endpoint) {\n // TODO(burdon): Move out of scheduler (generalize as callback).\n const url = path.join(endpoint, def.route);\n log.info('exec', { function: def.uri, url, triggerType: trigger.spec.type });\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n status = response.status;\n } else if (callback) {\n log.info('exec', { function: def.uri });\n status = (await callback(payload)) ?? 200;\n }\n\n // Check errors.\n if (status && status >= 400) {\n throw new Error(`Response: ${status}`);\n }\n\n // const result = await response.json();\n log.info('done', { function: def.uri, status });\n } catch (err: any) {\n log.error('error', { function: def.uri, error: err.message });\n status = 500;\n }\n\n return status;\n }\n}\n\nconst createContext = () => new Context({ name: 'FunctionScheduler' });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, getMeta, type Space } from '@dxos/client/echo';\nimport { Context, Resource } from '@dxos/context';\nimport { compareForeignKeys, ECHO_ATTR_META, foreignKey } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap, diff } from '@dxos/util';\n\nimport { createSubscriptionTrigger, createTimerTrigger, createWebhookTrigger, createWebsocketTrigger } from './type';\nimport { type FunctionManifest, FunctionTrigger, type FunctionTriggerType, type TriggerSpec } from '../types';\n\ntype ResponseCode = number;\n\nexport type TriggerCallback = (args: object) => Promise<ResponseCode>;\n\n// TODO(burdon): Make object?\nexport type TriggerFactory<Spec extends TriggerSpec, Options = any> = (\n ctx: Context,\n space: Space,\n spec: Spec,\n callback: TriggerCallback,\n options?: Options,\n) => Promise<void>;\n\nexport type TriggerHandlerMap = { [type in FunctionTriggerType]: TriggerFactory<any> };\n\nconst triggerHandlers: TriggerHandlerMap = {\n subscription: createSubscriptionTrigger,\n timer: createTimerTrigger,\n webhook: createWebhookTrigger,\n websocket: createWebsocketTrigger,\n};\n\nexport type TriggerEvent = {\n space: Space;\n triggers: FunctionTrigger[];\n};\n\ntype RegisteredTrigger = {\n activationCtx?: Context;\n trigger: FunctionTrigger;\n};\n\nexport class TriggerRegistry extends Resource {\n private readonly _triggersBySpaceKey = new ComplexMap<PublicKey, RegisteredTrigger[]>(PublicKey.hash);\n\n public readonly registered = new Event<TriggerEvent>();\n public readonly removed = new Event<TriggerEvent>();\n\n constructor(\n private readonly _client: Client,\n private readonly _options?: TriggerHandlerMap,\n ) {\n super();\n }\n\n public getActiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx != null);\n }\n\n public getInactiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx == null);\n }\n\n async activate(space: Space, trigger: FunctionTrigger, callback: TriggerCallback): Promise<void> {\n log('activate', { space: space.key, trigger });\n\n const activationCtx = new Context({ name: `FunctionTrigger-${trigger.function}` });\n this._ctx.onDispose(() => activationCtx.dispose());\n const registeredTrigger = this._triggersBySpaceKey.get(space.key)?.find((reg) => reg.trigger.id === trigger.id);\n invariant(registeredTrigger, `Trigger is not registered: ${trigger.function}`);\n registeredTrigger.activationCtx = activationCtx;\n\n try {\n const options = this._options?.[trigger.spec.type];\n await triggerHandlers[trigger.spec.type](activationCtx, space, trigger.spec, callback, options);\n } catch (err) {\n delete registeredTrigger.activationCtx;\n throw err;\n }\n }\n\n /**\n * Loads triggers from the manifest into the space.\n */\n public async register(space: Space, manifest: FunctionManifest): Promise<void> {\n log('register', { space: space.key });\n if (!manifest.triggers?.length) {\n return;\n }\n\n if (!space.db.graph.schemaRegistry.hasSchema(FunctionTrigger)) {\n space.db.graph.schemaRegistry.addSchema([FunctionTrigger]);\n }\n\n // Create FK to enable syncing if none are set (NOTE: Possible collision).\n const manifestTriggers = manifest.triggers.map((trigger) => {\n let keys = trigger[ECHO_ATTR_META]?.keys;\n delete trigger[ECHO_ATTR_META];\n if (!keys?.length) {\n keys = [foreignKey('manifest', [trigger.function, trigger.spec.type].join(':'))];\n }\n\n return create(FunctionTrigger, trigger, { keys });\n });\n\n // Sync triggers.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionTrigger)).run();\n const { added } = diff(existing, manifestTriggers, compareForeignKeys);\n\n // TODO(burdon): Update existing.\n added.forEach((trigger) => {\n space.db.add(trigger);\n log.info('added', { meta: getMeta(trigger) });\n });\n\n if (added.length > 0) {\n await space.db.flush();\n }\n }\n\n protected override async _open(): Promise<void> {\n log.info('open...');\n const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._triggersBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: RegisteredTrigger[] = [];\n this._triggersBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n\n // Subscribe to updates.\n this._ctx.onDispose(\n space.db.query(Filter.schema(FunctionTrigger)).subscribe(async ({ objects: current }) => {\n log.info('update', { space: space.key, registered: registered.length, current: current.length });\n await this._handleRemovedTriggers(space, current, registered);\n this._handleNewTriggers(space, current, registered);\n }),\n );\n }\n });\n\n this._ctx.onDispose(() => spaceListSubscription.unsubscribe());\n log.info('opened');\n }\n\n protected override async _close(_: Context): Promise<void> {\n log.info('close...');\n this._triggersBySpaceKey.clear();\n log.info('closed');\n }\n\n private _handleNewTriggers(space: Space, current: FunctionTrigger[], registered: RegisteredTrigger[]) {\n const added = current.filter((candidate) => {\n return candidate.enabled && registered.find((reg) => reg.trigger.id === candidate.id) == null;\n });\n\n if (added.length > 0) {\n const newRegisteredTriggers: RegisteredTrigger[] = added.map((trigger) => ({ trigger }));\n registered.push(...newRegisteredTriggers);\n log.info('added', () => ({\n spaceKey: space.key,\n triggers: added.map((trigger) => trigger.function),\n }));\n\n this.registered.emit({ space, triggers: added });\n }\n }\n\n private async _handleRemovedTriggers(\n space: Space,\n current: FunctionTrigger[],\n registered: RegisteredTrigger[],\n ): Promise<void> {\n const removed: FunctionTrigger[] = [];\n for (let i = registered.length - 1; i >= 0; i--) {\n const wasRemoved =\n current.filter((trigger) => trigger.enabled).find((trigger) => trigger.id === registered[i].trigger.id) == null;\n if (wasRemoved) {\n const unregistered = registered.splice(i, 1)[0];\n await unregistered.activationCtx?.dispose();\n removed.push(unregistered.trigger);\n }\n }\n\n if (removed.length > 0) {\n log.info('removed', () => ({\n spaceKey: space.key,\n triggers: removed.map((trigger) => trigger.function),\n }));\n\n this.removed.emit({ space, triggers: removed });\n }\n }\n\n private _getTriggers(space: Space, predicate: (trigger: RegisteredTrigger) => boolean): FunctionTrigger[] {\n const allSpaceTriggers = this._triggersBySpaceKey.get(space.key) ?? [];\n return allSpaceTriggers.filter(predicate).map((trigger) => trigger.trigger);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { TextType } from '@braneframe/types';\nimport { debounce, UpdateScheduler } from '@dxos/async';\nimport { Filter, type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { createSubscription, getObjectCore, type Query } from '@dxos/echo-db';\nimport { log } from '@dxos/log';\n\nimport type { SubscriptionTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\nexport const createSubscriptionTrigger: TriggerFactory<SubscriptionTrigger> = async (\n ctx: Context,\n space: Space,\n spec: SubscriptionTrigger,\n callback: TriggerCallback,\n) => {\n const objectIds = new Set<string>();\n const task = new UpdateScheduler(\n ctx,\n async () => {\n if (objectIds.size > 0) {\n const objects = Array.from(objectIds);\n objectIds.clear();\n await callback({ objects });\n }\n },\n { maxFrequency: 4 },\n );\n\n // TODO(burdon): Factor out diff.\n // TODO(burdon): Don't fire initially?\n // TODO(burdon): Create queue. Only allow one invocation per trigger at a time?\n const subscriptions: (() => void)[] = [];\n const subscription = createSubscription(({ added, updated }) => {\n const sizeBefore = objectIds.size;\n for (const object of added) {\n objectIds.add(object.id);\n }\n for (const object of updated) {\n objectIds.add(object.id);\n }\n if (objectIds.size > sizeBefore) {\n log.info('updated', { added: added.length, updated: updated.length });\n task.trigger();\n }\n });\n\n subscriptions.push(() => subscription.unsubscribe());\n\n // TODO(burdon): Disable trigger if keeps failing.\n const { filter, options: { deep, delay } = {} } = spec;\n const update = ({ objects }: Query) => {\n log.info('update', { objects: objects.length });\n subscription.update(objects);\n\n // TODO(burdon): Hack to monitor changes to Document's text object.\n if (deep) {\n for (const object of objects) {\n const content = object.content;\n if (content instanceof TextType) {\n subscriptions.push(getObjectCore(content).updates.on(debounce(() => subscription.update([object]), 1_000)));\n }\n }\n }\n };\n\n // TODO(burdon): OR not working.\n // TODO(burdon): [Bug]: all callbacks are fired on the first mutation.\n // TODO(burdon): [Bug]: not updated when document is deleted (either top or hierarchically).\n log.info('subscription', { filter });\n // const query = triggerCtx.space.db.query(Filter.or(filter.map(({ type, props }) => Filter.typename(type, props))));\n if (filter) {\n const query = space.db.query(Filter.typename(filter[0].type, filter[0].props));\n subscriptions.push(query.subscribe(delay ? debounce(update, delay) : update));\n }\n\n ctx.onDispose(() => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { CronJob } from 'cron';\n\nimport { DeferredTask } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { TimerTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\nexport const createTimerTrigger: TriggerFactory<TimerTrigger> = async (\n ctx: Context,\n space: Space,\n spec: TimerTrigger,\n callback: TriggerCallback,\n) => {\n const task = new DeferredTask(ctx, async () => {\n await callback({});\n });\n\n let last = 0;\n let run = 0;\n // https://www.npmjs.com/package/cron#constructor\n const job = CronJob.from({\n cronTime: spec.cron,\n runOnInit: false,\n onTick: () => {\n // TODO(burdon): Check greater than 30s (use cron-parser).\n const now = Date.now();\n const delta = last ? now - last : 0;\n last = now;\n\n run++;\n log.info('tick', { space: space.key.truncate(), count: run, delta });\n task.schedule();\n },\n });\n\n job.start();\n ctx.onDispose(() => job.stop());\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { getPort } from 'get-port-please';\nimport http from 'node:http';\n\nimport { type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { WebhookTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\nexport const createWebhookTrigger: TriggerFactory<WebhookTrigger> = async (\n ctx: Context,\n space: Space,\n spec: WebhookTrigger,\n callback: TriggerCallback,\n) => {\n // TODO(burdon): Enable POST hook with payload.\n const server = http.createServer(async (req, res) => {\n if (req.method !== spec.method) {\n res.statusCode = 405;\n return res.end();\n }\n res.statusCode = await callback({});\n res.end();\n });\n\n // TODO(burdon): Not used.\n // const DEF_PORT_RANGE = { min: 7500, max: 7599 };\n // const portRange = Object.assign({}, trigger.port, DEF_PORT_RANGE) as WebhookTrigger['port'];\n const port = await getPort({\n random: true,\n // portRange: [portRange!.min, portRange!.max],\n });\n\n // TODO(burdon): Update trigger object with actual port.\n server.listen(port, () => {\n log.info('started webhook', { port });\n spec.port = port;\n });\n\n ctx.onDispose(() => {\n server.close();\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'ws';\n\nimport { sleep, Trigger } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type WebsocketTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerFactory } from '../trigger-registry';\n\ninterface WebsocketTriggerOptions {\n retryDelay: number;\n maxAttempts: number;\n}\n\n/**\n * Websocket.\n * NOTE: The port must be unique, so the same hook cannot be used for multiple spaces.\n */\nexport const createWebsocketTrigger: TriggerFactory<WebsocketTrigger, WebsocketTriggerOptions> = async (\n ctx: Context,\n space: Space,\n spec: WebsocketTrigger,\n callback: TriggerCallback,\n options: WebsocketTriggerOptions = { retryDelay: 2, maxAttempts: 5 },\n) => {\n const { url, init } = spec;\n\n let wasOpen = false;\n let ws: WebSocket;\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\n const open = new Trigger<boolean>();\n\n ws = new WebSocket(url);\n Object.assign(ws, {\n onopen: () => {\n log.info('opened', { url });\n if (spec.init) {\n ws.send(new TextEncoder().encode(JSON.stringify(init)));\n }\n\n open.wake(true);\n },\n\n onclose: (event) => {\n log.info('closed', { url, code: event.code });\n // Reconnect if server closes (e.g., CF restart).\n // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code\n if (event.code === 1006 && wasOpen && !ctx.disposed) {\n setTimeout(async () => {\n log.info(`reconnecting in ${options.retryDelay}s...`, { url });\n await createWebsocketTrigger(ctx, space, spec, callback, options);\n }, options.retryDelay * 1_000);\n }\n open.wake(false);\n },\n\n onerror: (event) => {\n log.catch(event.error, { url });\n open.wake(false);\n },\n\n onmessage: async (event) => {\n try {\n log.info('message');\n const data = JSON.parse(new TextDecoder().decode(event.data as Uint8Array));\n await callback({ data });\n } catch (err) {\n log.catch(err, { url });\n }\n },\n } satisfies Partial<WebSocket>);\n\n const isOpen = await open.wait();\n if (ctx.disposed) {\n break;\n }\n if (isOpen) {\n wasOpen = true;\n break;\n }\n const wait = Math.pow(attempt, 2) * options.retryDelay;\n if (attempt < options.maxAttempts) {\n log.warn(`failed to connect; trying again in ${wait}s`, { attempt });\n await sleep(wait * 1_000);\n }\n }\n\n ctx.onDispose(() => {\n ws?.close();\n });\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Event", "create", "Filter", "Resource", "PublicKey", "log", "ComplexMap", "diff", "FunctionRegistry", "Resource", "constructor", "_client", "_functionBySpaceKey", "ComplexMap", "PublicKey", "hash", "registered", "Event", "getFunctions", "space", "get", "key", "getUniqueByUri", "uniqueByUri", "values", "flatMap", "defs", "reduce", "acc", "v", "set", "uri", "Map", "register", "functions", "log", "length", "db", "graph", "schemaRegistry", "hasSchema", "FunctionDef", "addSchema", "objects", "existing", "query", "Filter", "schema", "run", "added", "diff", "a", "b", "forEach", "def", "add", "create", "_open", "info", "spacesSubscription", "spaces", "subscribe", "has", "waitUntilReady", "_ctx", "disposed", "onDispose", "push", "emit", "unsubscribe", "_close", "_", "clear", "express", "getPort", "join", "asyncTimeout", "Event", "Trigger", "Context", "invariant", "log", "DevServer", "constructor", "_client", "_functionsRegistry", "_options", "_ctx", "createContext", "_handlers", "_seq", "update", "Event", "stats", "seq", "endpoint", "invariant", "_port", "proxy", "_proxy", "functions", "Object", "values", "start", "_server", "log", "info", "app", "express", "use", "json", "post", "req", "res", "path", "params", "reload", "def", "_load", "statusCode", "asyncTimeout", "invoke", "body", "end", "err", "catch", "port", "getPort", "host", "portRange", "listen", "registrationId", "services", "FunctionRegistryService", "register", "_functionServiceRegistration", "_handleNewFunctions", "getUniqueByUri", "onDispose", "registered", "on", "added", "stop", "Error", "dispose", "trigger", "Trigger", "close", "unregister", "undefined", "wake", "throw", "wait", "newFunctions", "forEach", "_safeUpdateRegistration", "force", "uri", "route", "handler", "filePath", "join", "baseDir", "keys", "require", "cache", "filter", "key", "startsWith", "module", "default", "updateRegistration", "map", "id", "data", "now", "Date", "_invoke", "duration", "emit", "event", "context", "client", "dataDir", "response", "status", "code", "Context", "name", "path", "Mutex", "Context", "log", "Scheduler", "constructor", "functions", "triggers", "_options", "_ctx", "createContext", "_functionUriToCallMutex", "Map", "registered", "on", "space", "added", "_safeActivateTriggers", "getInactiveTriggers", "getFunctions", "start", "dispose", "open", "stop", "close", "register", "manifest", "mountTasks", "map", "trigger", "activate", "Promise", "all", "catch", "definition", "find", "def", "uri", "function", "info", "args", "mutex", "get", "set", "executeSynchronized", "_execFunction", "meta", "data", "spaceKey", "key", "status", "payload", "Object", "assign", "endpoint", "callback", "url", "join", "route", "triggerType", "spec", "type", "response", "fetch", "method", "headers", "body", "JSON", "stringify", "Error", "err", "error", "message", "name", "Event", "create", "Filter", "getMeta", "Context", "Resource", "compareForeignKeys", "ECHO_ATTR_META", "foreignKey", "invariant", "PublicKey", "log", "ComplexMap", "diff", "TextType", "debounce", "UpdateScheduler", "Filter", "createSubscription", "getObjectCore", "log", "createSubscriptionTrigger", "ctx", "space", "spec", "callback", "objectIds", "Set", "task", "size", "objects", "Array", "from", "clear", "maxFrequency", "subscriptions", "subscription", "added", "updated", "sizeBefore", "object", "add", "id", "info", "length", "trigger", "push", "unsubscribe", "filter", "options", "deep", "delay", "update", "content", "updates", "on", "query", "db", "typename", "type", "props", "subscribe", "onDispose", "forEach", "CronJob", "DeferredTask", "log", "createTimerTrigger", "ctx", "space", "spec", "callback", "task", "last", "run", "job", "from", "cronTime", "cron", "runOnInit", "onTick", "now", "Date", "delta", "info", "key", "truncate", "count", "schedule", "start", "onDispose", "stop", "getPort", "http", "log", "createWebhookTrigger", "ctx", "space", "spec", "callback", "server", "createServer", "req", "res", "method", "statusCode", "end", "port", "random", "listen", "info", "onDispose", "close", "WebSocket", "sleep", "Trigger", "log", "createWebsocketTrigger", "ctx", "space", "spec", "callback", "options", "retryDelay", "maxAttempts", "url", "init", "wasOpen", "ws", "attempt", "open", "Object", "assign", "onopen", "info", "send", "TextEncoder", "encode", "JSON", "stringify", "wake", "onclose", "event", "code", "disposed", "setTimeout", "onerror", "catch", "error", "onmessage", "data", "parse", "TextDecoder", "decode", "err", "isOpen", "wait", "Math", "pow", "warn", "onDispose", "close", "triggerHandlers", "subscription", "createSubscriptionTrigger", "timer", "createTimerTrigger", "webhook", "createWebhookTrigger", "websocket", "createWebsocketTrigger", "TriggerRegistry", "Resource", "constructor", "_client", "_options", "_triggersBySpaceKey", "ComplexMap", "PublicKey", "hash", "registered", "Event", "removed", "getActiveTriggers", "space", "_getTriggers", "t", "activationCtx", "getInactiveTriggers", "activate", "trigger", "callback", "log", "key", "Context", "name", "function", "_ctx", "onDispose", "dispose", "registeredTrigger", "get", "find", "reg", "id", "invariant", "options", "spec", "type", "err", "register", "manifest", "triggers", "length", "db", "graph", "schemaRegistry", "hasSchema", "FunctionTrigger", "addSchema", "manifestTriggers", "map", "keys", "ECHO_ATTR_META", "foreignKey", "join", "create", "objects", "existing", "query", "Filter", "schema", "run", "added", "diff", "compareForeignKeys", "forEach", "add", "info", "meta", "getMeta", "flush", "_open", "spaceListSubscription", "spaces", "subscribe", "has", "set", "waitUntilReady", "disposed", "current", "_handleRemovedTriggers", "_handleNewTriggers", "unsubscribe", "_close", "_", "clear", "filter", "candidate", "enabled", "newRegisteredTriggers", "push", "spaceKey", "emit", "i", "wasRemoved", "unregistered", "splice", "predicate", "allSpaceTriggers"]
|
|
7
|
+
}
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
FunctionRegistry,
|
|
5
5
|
Scheduler,
|
|
6
6
|
TriggerRegistry
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-YKYOGE5O.mjs";
|
|
8
8
|
import {
|
|
9
9
|
FUNCTION_SCHEMA,
|
|
10
10
|
FunctionDef,
|
|
11
11
|
FunctionManifestSchema,
|
|
12
12
|
FunctionTrigger
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ERWZ4JUZ.mjs";
|
|
14
14
|
|
|
15
15
|
// packages/core/functions/src/handler.ts
|
|
16
16
|
import { PublicKey } from "@dxos/client";
|