@dxos/functions-runtime-cloudflare 0.8.4-main.3c1ae3b → 0.8.4-main.3fbcb4aa9b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/lib/browser/index.mjs +529 -314
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +529 -314
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/functions-client.d.ts +1 -0
  8. package/dist/types/src/functions-client.d.ts.map +1 -1
  9. package/dist/types/src/internal/data-service-impl.d.ts +8 -7
  10. package/dist/types/src/internal/data-service-impl.d.ts.map +1 -1
  11. package/dist/types/src/internal/query-service-impl.d.ts +3 -9
  12. package/dist/types/src/internal/query-service-impl.d.ts.map +1 -1
  13. package/dist/types/src/internal/queue-service-impl.d.ts +8 -9
  14. package/dist/types/src/internal/queue-service-impl.d.ts.map +1 -1
  15. package/dist/types/src/internal/service-container.d.ts +8 -8
  16. package/dist/types/src/internal/service-container.d.ts.map +1 -1
  17. package/dist/types/src/internal/utils.d.ts +2 -0
  18. package/dist/types/src/internal/utils.d.ts.map +1 -0
  19. package/dist/types/src/logger.d.ts.map +1 -1
  20. package/dist/types/src/queues-api.d.ts +10 -6
  21. package/dist/types/src/queues-api.d.ts.map +1 -1
  22. package/dist/types/src/space-proxy.d.ts +3 -2
  23. package/dist/types/src/space-proxy.d.ts.map +1 -1
  24. package/dist/types/src/wrap-handler-for-cloudflare.d.ts +6 -0
  25. package/dist/types/src/wrap-handler-for-cloudflare.d.ts.map +1 -1
  26. package/dist/types/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +20 -16
  28. package/src/functions-client.ts +9 -2
  29. package/src/internal/data-service-impl.ts +29 -11
  30. package/src/internal/query-service-impl.ts +8 -58
  31. package/src/internal/queue-service-impl.ts +37 -22
  32. package/src/internal/service-container.ts +46 -11
  33. package/src/internal/utils.ts +5 -0
  34. package/src/logger.ts +12 -8
  35. package/src/queues-api.ts +26 -7
  36. package/src/space-proxy.ts +5 -4
  37. package/src/wrap-handler-for-cloudflare.ts +4 -4
  38. package/dist/types/src/internal/adapter.d.ts +0 -12
  39. package/dist/types/src/internal/adapter.d.ts.map +0 -1
  40. package/src/internal/adapter.ts +0 -48
@@ -3,7 +3,7 @@ import { createRequire } from 'node:module';const require = createRequire(import
3
3
  // src/functions-client.ts
4
4
  import { Resource as Resource2 } from "@dxos/context";
5
5
  import { EchoClient } from "@dxos/echo-db";
6
- import { invariant as invariant5 } from "@dxos/invariant";
6
+ import { invariant as invariant3 } from "@dxos/invariant";
7
7
 
8
8
  // src/internal/data-service-impl.ts
9
9
  import { Stream } from "@dxos/codec-protobuf/stream";
@@ -12,7 +12,77 @@ import { NotImplementedError, RuntimeServiceError } from "@dxos/errors";
12
12
  import { invariant } from "@dxos/invariant";
13
13
  import { SpaceId } from "@dxos/keys";
14
14
  import { log } from "@dxos/log";
15
- var __dxlog_file = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/data-service-impl.ts";
15
+
16
+ // src/internal/utils.ts
17
+ var copyUint8Array = (value) => new Uint8Array(value);
18
+
19
+ // src/internal/data-service-impl.ts
20
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/compute/functions-runtime-cloudflare/src/internal/data-service-impl.ts";
21
+ function _ts_add_disposable_resource(env, value, async) {
22
+ if (value !== null && value !== void 0) {
23
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
24
+ var dispose, inner;
25
+ if (async) {
26
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
27
+ dispose = value[Symbol.asyncDispose];
28
+ }
29
+ if (dispose === void 0) {
30
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
31
+ dispose = value[Symbol.dispose];
32
+ if (async) inner = dispose;
33
+ }
34
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
35
+ if (inner) dispose = function() {
36
+ try {
37
+ inner.call(this);
38
+ } catch (e) {
39
+ return Promise.reject(e);
40
+ }
41
+ };
42
+ env.stack.push({
43
+ value,
44
+ dispose,
45
+ async
46
+ });
47
+ } else if (async) {
48
+ env.stack.push({
49
+ async: true
50
+ });
51
+ }
52
+ return value;
53
+ }
54
+ function _ts_dispose_resources(env) {
55
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
56
+ var e = new Error(message);
57
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
58
+ };
59
+ return (_ts_dispose_resources = function _ts_dispose_resources5(env2) {
60
+ function fail(e) {
61
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
62
+ env2.hasError = true;
63
+ }
64
+ var r, s = 0;
65
+ function next() {
66
+ while (r = env2.stack.pop()) {
67
+ try {
68
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
69
+ if (r.dispose) {
70
+ var result = r.dispose.call(r.value);
71
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
72
+ fail(e);
73
+ return next();
74
+ });
75
+ } else s |= 1;
76
+ } catch (e) {
77
+ fail(e);
78
+ }
79
+ }
80
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
81
+ if (env2.hasError) throw env2.error;
82
+ }
83
+ return next();
84
+ })(env);
85
+ }
16
86
  var DataServiceImpl = class {
17
87
  _executionContext;
18
88
  _dataService;
@@ -23,15 +93,7 @@ var DataServiceImpl = class {
23
93
  }
24
94
  subscribe({ subscriptionId, spaceId }) {
25
95
  return new Stream(({ next }) => {
26
- invariant(SpaceId.isValid(spaceId), void 0, {
27
- F: __dxlog_file,
28
- L: 35,
29
- S: this,
30
- A: [
31
- "SpaceId.isValid(spaceId)",
32
- ""
33
- ]
34
- });
96
+ invariant(SpaceId.isValid(spaceId), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 86, S: this, A: ["SpaceId.isValid(spaceId)", ""] });
35
97
  this.dataSubscriptions.set(subscriptionId, {
36
98
  spaceId,
37
99
  next
@@ -41,7 +103,7 @@ var DataServiceImpl = class {
41
103
  };
42
104
  });
43
105
  }
44
- async updateSubscription({ subscriptionId, addIds, removeIds }) {
106
+ async updateSubscription({ subscriptionId, addIds }) {
45
107
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
46
108
  message: "Subscription not found.",
47
109
  context: {
@@ -51,46 +113,64 @@ var DataServiceImpl = class {
51
113
  if (addIds) {
52
114
  log.info("request documents", {
53
115
  count: addIds.length
54
- }, {
55
- F: __dxlog_file,
56
- L: 55,
57
- S: this,
58
- C: (f, a) => f(...a)
59
- });
116
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 104, S: this });
60
117
  for (const documentId of addIds) {
61
- const document = await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId);
62
- log.info("document loaded", {
63
- documentId,
64
- spaceId: sub.spaceId,
65
- found: !!document
66
- }, {
67
- F: __dxlog_file,
68
- L: 59,
69
- S: this,
70
- C: (f, a) => f(...a)
71
- });
72
- if (!document) {
73
- log.warn("not found", {
74
- documentId
75
- }, {
76
- F: __dxlog_file,
77
- L: 61,
78
- S: this,
79
- C: (f, a) => f(...a)
118
+ const env = {
119
+ stack: [],
120
+ error: void 0,
121
+ hasError: false
122
+ };
123
+ try {
124
+ const document = _ts_add_disposable_resource(env, await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId), false);
125
+ log.info("document loaded", {
126
+ documentId,
127
+ spaceId: sub.spaceId,
128
+ found: !!document
129
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 116, S: this });
130
+ if (!document) {
131
+ log.warn("not found", {
132
+ documentId
133
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 122, S: this });
134
+ continue;
135
+ }
136
+ sub.next({
137
+ updates: [
138
+ {
139
+ documentId,
140
+ // Copy returned object to avoid hanging RPC stub
141
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
142
+ mutation: copyUint8Array(document.data)
143
+ }
144
+ ]
80
145
  });
81
- continue;
146
+ } catch (e) {
147
+ env.error = e;
148
+ env.hasError = true;
149
+ } finally {
150
+ _ts_dispose_resources(env);
82
151
  }
83
- sub.next({
84
- updates: [
85
- {
86
- documentId,
87
- mutation: document.data
88
- }
89
- ]
90
- });
91
152
  }
92
153
  }
93
154
  }
155
+ async createDocument({ spaceId, initialValue }) {
156
+ const env = {
157
+ stack: [],
158
+ error: void 0,
159
+ hasError: false
160
+ };
161
+ try {
162
+ invariant(SpaceId.isValid(spaceId), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 153, S: this, A: ["SpaceId.isValid(spaceId)", ""] });
163
+ const response = _ts_add_disposable_resource(env, await this._dataService.createDocument(this._executionContext, spaceId, initialValue), false);
164
+ return {
165
+ documentId: response.documentId
166
+ };
167
+ } catch (e) {
168
+ env.error = e;
169
+ env.hasError = true;
170
+ } finally {
171
+ _ts_dispose_resources(env);
172
+ }
173
+ }
94
174
  async update({ updates, subscriptionId }) {
95
175
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
96
176
  message: "Subscription not found.",
@@ -114,27 +194,25 @@ var DataServiceImpl = class {
114
194
  }
115
195
  async flush() {
116
196
  }
117
- subscribeSpaceSyncState(request, options) {
197
+ subscribeSpaceSyncState(_request, _options) {
118
198
  throw new NotImplementedError({
119
199
  message: "subscribeSpaceSyncState is not implemented."
120
200
  });
121
201
  }
122
- async getDocumentHeads({ documentIds }) {
202
+ async getDocumentHeads({ documentIds: _documentIds }) {
123
203
  throw new NotImplementedError({
124
204
  message: "getDocumentHeads is not implemented."
125
205
  });
126
206
  }
127
- async reIndexHeads({ documentIds }) {
207
+ async reIndexHeads({ documentIds: _documentIds }) {
128
208
  throw new NotImplementedError({
129
209
  message: "reIndexHeads is not implemented."
130
210
  });
131
211
  }
132
212
  async updateIndexes() {
133
- throw new NotImplementedError({
134
- message: "updateIndexes is not implemented."
135
- });
213
+ log.error("updateIndexes is not available in EDGE env.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 206, S: this });
136
214
  }
137
- async waitUntilHeadsReplicated({ heads }) {
215
+ async waitUntilHeadsReplicated({ heads: _heads }) {
138
216
  throw new NotImplementedError({
139
217
  message: "waitUntilHeadsReplicated is not implemented."
140
218
  });
@@ -142,84 +220,75 @@ var DataServiceImpl = class {
142
220
  };
143
221
 
144
222
  // src/internal/query-service-impl.ts
145
- import * as Schema from "effect/Schema";
146
223
  import { Stream as Stream2 } from "@dxos/codec-protobuf/stream";
147
- import { QueryAST } from "@dxos/echo-protocol";
148
224
  import { NotImplementedError as NotImplementedError2, RuntimeServiceError as RuntimeServiceError2 } from "@dxos/errors";
149
- import { invariant as invariant3 } from "@dxos/invariant";
150
- import { PublicKey } from "@dxos/keys";
151
- import { SpaceId as SpaceId3 } from "@dxos/keys";
152
225
  import { log as log2 } from "@dxos/log";
153
-
154
- // src/internal/adapter.ts
155
- import { failUndefined } from "@dxos/debug";
156
- import { invariant as invariant2 } from "@dxos/invariant";
157
- import { SpaceId as SpaceId2 } from "@dxos/keys";
158
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/adapter.ts";
159
- var queryToDataServiceRequest = (query) => {
160
- const { filter, options } = isSimpleSelectionQuery(query) ?? failUndefined();
161
- invariant2(options?.spaceIds?.length === 1, "Only one space is supported", {
162
- F: __dxlog_file2,
163
- L: 13,
164
- S: void 0,
165
- A: [
166
- "options?.spaceIds?.length === 1",
167
- "'Only one space is supported'"
168
- ]
169
- });
170
- invariant2(filter.type === "object", "Only object filters are supported", {
171
- F: __dxlog_file2,
172
- L: 14,
173
- S: void 0,
174
- A: [
175
- "filter.type === 'object'",
176
- "'Only object filters are supported'"
177
- ]
178
- });
179
- const spaceId = options.spaceIds[0];
180
- invariant2(SpaceId2.isValid(spaceId), void 0, {
181
- F: __dxlog_file2,
182
- L: 17,
183
- S: void 0,
184
- A: [
185
- "SpaceId.isValid(spaceId)",
186
- ""
187
- ]
188
- });
189
- return {
190
- spaceId,
191
- type: filter.typename ?? void 0,
192
- objectIds: [
193
- ...filter.id ?? []
194
- ]
195
- };
196
- };
197
- var isSimpleSelectionQuery = (query) => {
198
- switch (query.type) {
199
- case "options": {
200
- const maybeFilter = isSimpleSelectionQuery(query.query);
201
- if (!maybeFilter) {
202
- return null;
203
- }
204
- return {
205
- filter: maybeFilter.filter,
206
- options: query.options
207
- };
226
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/compute/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
227
+ function _ts_add_disposable_resource2(env, value, async) {
228
+ if (value !== null && value !== void 0) {
229
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
230
+ var dispose, inner;
231
+ if (async) {
232
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
233
+ dispose = value[Symbol.asyncDispose];
208
234
  }
209
- case "select": {
210
- return {
211
- filter: query.filter,
212
- options: void 0
213
- };
214
- }
215
- default: {
216
- return null;
235
+ if (dispose === void 0) {
236
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
237
+ dispose = value[Symbol.dispose];
238
+ if (async) inner = dispose;
217
239
  }
240
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
241
+ if (inner) dispose = function() {
242
+ try {
243
+ inner.call(this);
244
+ } catch (e) {
245
+ return Promise.reject(e);
246
+ }
247
+ };
248
+ env.stack.push({
249
+ value,
250
+ dispose,
251
+ async
252
+ });
253
+ } else if (async) {
254
+ env.stack.push({
255
+ async: true
256
+ });
218
257
  }
219
- };
220
-
221
- // src/internal/query-service-impl.ts
222
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
258
+ return value;
259
+ }
260
+ function _ts_dispose_resources2(env) {
261
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
262
+ var e = new Error(message);
263
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
264
+ };
265
+ return (_ts_dispose_resources2 = function _ts_dispose_resources5(env2) {
266
+ function fail(e) {
267
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
268
+ env2.hasError = true;
269
+ }
270
+ var r, s = 0;
271
+ function next() {
272
+ while (r = env2.stack.pop()) {
273
+ try {
274
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
275
+ if (r.dispose) {
276
+ var result = r.dispose.call(r.value);
277
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
278
+ fail(e);
279
+ return next();
280
+ });
281
+ } else s |= 1;
282
+ } catch (e) {
283
+ fail(e);
284
+ }
285
+ }
286
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
287
+ if (env2.hasError) throw env2.error;
288
+ }
289
+ return next();
290
+ })(env);
291
+ }
223
292
  var QueryServiceImpl = class {
224
293
  _executionContext;
225
294
  _dataService;
@@ -231,70 +300,37 @@ var QueryServiceImpl = class {
231
300
  execQuery(request) {
232
301
  log2.info("execQuery", {
233
302
  request
234
- }, {
235
- F: __dxlog_file3,
236
- L: 33,
237
- S: this,
238
- C: (f, a) => f(...a)
239
- });
240
- const query = QueryAST.Query.pipe(Schema.decodeUnknownSync)(JSON.parse(request.query));
241
- const requestedSpaceIds = getTargetSpacesForQuery(query);
242
- invariant3(requestedSpaceIds.length === 1, "Only one space is supported", {
243
- F: __dxlog_file3,
244
- L: 36,
245
- S: this,
246
- A: [
247
- "requestedSpaceIds.length === 1",
248
- "'Only one space is supported'"
249
- ]
250
- });
251
- const spaceId = requestedSpaceIds[0];
303
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 81, S: this });
252
304
  return Stream2.fromPromise((async () => {
253
305
  try {
254
- this._queryCount++;
255
- log2.info("begin query", {
256
- spaceId
257
- }, {
258
- F: __dxlog_file3,
259
- L: 43,
260
- S: this,
261
- C: (f, a) => f(...a)
262
- });
263
- const queryResponse = await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query));
264
- log2.info("query response", {
265
- spaceId,
266
- filter: request.filter,
267
- resultCount: queryResponse.results.length
268
- }, {
269
- F: __dxlog_file3,
270
- L: 48,
271
- S: this,
272
- C: (f, a) => f(...a)
273
- });
274
- return {
275
- results: queryResponse.results.map((object) => ({
276
- id: object.objectId,
277
- spaceId,
278
- spaceKey: PublicKey.ZERO,
279
- documentId: object.document.documentId,
280
- rank: 0,
281
- documentAutomerge: object.document.data
282
- }))
306
+ const env = {
307
+ stack: [],
308
+ error: void 0,
309
+ hasError: false
283
310
  };
311
+ try {
312
+ this._queryCount++;
313
+ log2.info("begin query", {
314
+ request
315
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 93, S: this });
316
+ const queryResponse = _ts_add_disposable_resource2(env, await this._dataService.execQuery(this._executionContext, request), false);
317
+ log2.info("query response", {
318
+ resultCount: queryResponse.results?.length
319
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 97, S: this });
320
+ return structuredClone(queryResponse);
321
+ } catch (e) {
322
+ env.error = e;
323
+ env.hasError = true;
324
+ } finally {
325
+ _ts_dispose_resources2(env);
326
+ }
284
327
  } catch (error) {
285
328
  log2.error("query failed", {
286
329
  err: error
287
- }, {
288
- F: __dxlog_file3,
289
- L: 62,
290
- S: this,
291
- C: (f, a) => f(...a)
292
- });
330
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 108, S: this });
293
331
  throw new RuntimeServiceError2({
294
332
  message: `Query execution failed (queryCount=${this._queryCount})`,
295
333
  context: {
296
- spaceId,
297
- filter: request.filter,
298
334
  queryCount: this._queryCount
299
335
  },
300
336
  cause: error
@@ -313,25 +349,74 @@ var QueryServiceImpl = class {
313
349
  });
314
350
  }
315
351
  };
316
- var getTargetSpacesForQuery = (query) => {
317
- const spaces = /* @__PURE__ */ new Set();
318
- const visitor = (node) => {
319
- if (node.type === "options") {
320
- if (node.options.spaceIds) {
321
- for (const spaceId of node.options.spaceIds) {
322
- spaces.add(SpaceId3.make(spaceId));
352
+
353
+ // src/internal/queue-service-impl.ts
354
+ import { RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
355
+ function _ts_add_disposable_resource3(env, value, async) {
356
+ if (value !== null && value !== void 0) {
357
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
358
+ var dispose, inner;
359
+ if (async) {
360
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
361
+ dispose = value[Symbol.asyncDispose];
362
+ }
363
+ if (dispose === void 0) {
364
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
365
+ dispose = value[Symbol.dispose];
366
+ if (async) inner = dispose;
367
+ }
368
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
369
+ if (inner) dispose = function() {
370
+ try {
371
+ inner.call(this);
372
+ } catch (e) {
373
+ return Promise.reject(e);
374
+ }
375
+ };
376
+ env.stack.push({
377
+ value,
378
+ dispose,
379
+ async
380
+ });
381
+ } else if (async) {
382
+ env.stack.push({
383
+ async: true
384
+ });
385
+ }
386
+ return value;
387
+ }
388
+ function _ts_dispose_resources3(env) {
389
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
390
+ var e = new Error(message);
391
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
392
+ };
393
+ return (_ts_dispose_resources3 = function _ts_dispose_resources5(env2) {
394
+ function fail(e) {
395
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
396
+ env2.hasError = true;
397
+ }
398
+ var r, s = 0;
399
+ function next() {
400
+ while (r = env2.stack.pop()) {
401
+ try {
402
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
403
+ if (r.dispose) {
404
+ var result = r.dispose.call(r.value);
405
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
406
+ fail(e);
407
+ return next();
408
+ });
409
+ } else s |= 1;
410
+ } catch (e) {
411
+ fail(e);
323
412
  }
324
413
  }
414
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
415
+ if (env2.hasError) throw env2.error;
325
416
  }
326
- };
327
- QueryAST.visit(query, visitor);
328
- return [
329
- ...spaces
330
- ];
331
- };
332
-
333
- // src/internal/queue-service-impl.ts
334
- import { NotImplementedError as NotImplementedError3, RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
417
+ return next();
418
+ })(env);
419
+ }
335
420
  var QueueServiceImpl = class {
336
421
  _ctx;
337
422
  _queueService;
@@ -339,13 +424,58 @@ var QueueServiceImpl = class {
339
424
  this._ctx = _ctx;
340
425
  this._queueService = _queueService;
341
426
  }
342
- async queryQueue(subspaceTag, spaceId, { queueId, ...query }) {
427
+ async queryQueue(request) {
343
428
  try {
344
- const result = await this._queueService.query(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, query);
345
- return result;
429
+ const env = {
430
+ stack: [],
431
+ error: void 0,
432
+ hasError: false
433
+ };
434
+ try {
435
+ const result = _ts_add_disposable_resource3(env, await this._queueService.queryQueue(this._ctx, request), false);
436
+ return {
437
+ objects: structuredClone(result.objects),
438
+ nextCursor: result.nextCursor,
439
+ prevCursor: result.prevCursor
440
+ };
441
+ } catch (e) {
442
+ env.error = e;
443
+ env.hasError = true;
444
+ } finally {
445
+ _ts_dispose_resources3(env);
446
+ }
346
447
  } catch (error) {
448
+ const { query } = request;
347
449
  throw RuntimeServiceError3.wrap({
348
450
  message: "Queue query failed.",
451
+ context: {
452
+ subspaceTag: query?.queuesNamespace,
453
+ spaceId: query?.spaceId,
454
+ queueId: query?.queueIds?.[0]
455
+ },
456
+ ifTypeDiffers: true
457
+ })(error);
458
+ }
459
+ }
460
+ async insertIntoQueue(request) {
461
+ try {
462
+ const env = {
463
+ stack: [],
464
+ error: void 0,
465
+ hasError: false
466
+ };
467
+ try {
468
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.insertIntoQueue(this._ctx, request), false);
469
+ } catch (e) {
470
+ env.error = e;
471
+ env.hasError = true;
472
+ } finally {
473
+ _ts_dispose_resources3(env);
474
+ }
475
+ } catch (error) {
476
+ const { subspaceTag, spaceId, queueId } = request;
477
+ throw RuntimeServiceError3.wrap({
478
+ message: "Queue append failed.",
349
479
  context: {
350
480
  subspaceTag,
351
481
  spaceId,
@@ -355,13 +485,25 @@ var QueueServiceImpl = class {
355
485
  })(error);
356
486
  }
357
487
  }
358
- async insertIntoQueue(subspaceTag, spaceId, queueId, objects) {
488
+ async deleteFromQueue(request) {
359
489
  try {
360
- const result = await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects);
361
- return result;
490
+ const env = {
491
+ stack: [],
492
+ error: void 0,
493
+ hasError: false
494
+ };
495
+ try {
496
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.deleteFromQueue(this._ctx, request), false);
497
+ } catch (e) {
498
+ env.error = e;
499
+ env.hasError = true;
500
+ } finally {
501
+ _ts_dispose_resources3(env);
502
+ }
362
503
  } catch (error) {
504
+ const { subspaceTag, spaceId, queueId } = request;
363
505
  throw RuntimeServiceError3.wrap({
364
- message: "Queue append failed.",
506
+ message: "Queue delete failed.",
365
507
  context: {
366
508
  subspaceTag,
367
509
  spaceId,
@@ -371,30 +513,105 @@ var QueueServiceImpl = class {
371
513
  })(error);
372
514
  }
373
515
  }
374
- deleteFromQueue(subspaceTag, spaceId, queueId, _objectIds) {
375
- throw new NotImplementedError3({
376
- message: "Deleting from queue is not supported.",
377
- context: {
378
- subspaceTag,
379
- spaceId,
380
- queueId
381
- }
382
- });
516
+ async syncQueue(_) {
383
517
  }
384
518
  };
385
519
 
386
520
  // src/internal/service-container.ts
521
+ function _ts_add_disposable_resource4(env, value, async) {
522
+ if (value !== null && value !== void 0) {
523
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
524
+ var dispose, inner;
525
+ if (async) {
526
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
527
+ dispose = value[Symbol.asyncDispose];
528
+ }
529
+ if (dispose === void 0) {
530
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
531
+ dispose = value[Symbol.dispose];
532
+ if (async) inner = dispose;
533
+ }
534
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
535
+ if (inner) dispose = function() {
536
+ try {
537
+ inner.call(this);
538
+ } catch (e) {
539
+ return Promise.reject(e);
540
+ }
541
+ };
542
+ env.stack.push({
543
+ value,
544
+ dispose,
545
+ async
546
+ });
547
+ } else if (async) {
548
+ env.stack.push({
549
+ async: true
550
+ });
551
+ }
552
+ return value;
553
+ }
554
+ function _ts_dispose_resources4(env) {
555
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
556
+ var e = new Error(message);
557
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
558
+ };
559
+ return (_ts_dispose_resources4 = function _ts_dispose_resources5(env2) {
560
+ function fail(e) {
561
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
562
+ env2.hasError = true;
563
+ }
564
+ var r, s = 0;
565
+ function next() {
566
+ while (r = env2.stack.pop()) {
567
+ try {
568
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
569
+ if (r.dispose) {
570
+ var result = r.dispose.call(r.value);
571
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
572
+ fail(e);
573
+ return next();
574
+ });
575
+ } else s |= 1;
576
+ } catch (e) {
577
+ fail(e);
578
+ }
579
+ }
580
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
581
+ if (env2.hasError) throw env2.error;
582
+ }
583
+ return next();
584
+ })(env);
585
+ }
387
586
  var ServiceContainer = class {
388
587
  _executionContext;
389
588
  _dataService;
390
589
  _queueService;
391
- constructor(_executionContext, _dataService, _queueService) {
590
+ _functionsService;
591
+ constructor(_executionContext, _dataService, _queueService, _functionsService) {
392
592
  this._executionContext = _executionContext;
393
593
  this._dataService = _dataService;
394
594
  this._queueService = _queueService;
595
+ this._functionsService = _functionsService;
395
596
  }
396
597
  async getSpaceMeta(spaceId) {
397
- return this._dataService.getSpaceMeta(this._executionContext, spaceId);
598
+ const env = {
599
+ stack: [],
600
+ error: void 0,
601
+ hasError: false
602
+ };
603
+ try {
604
+ const result = _ts_add_disposable_resource4(env, await this._dataService.getSpaceMeta(this._executionContext, spaceId), false);
605
+ return result ? {
606
+ spaceKey: result.spaceKey,
607
+ rootDocumentId: result.rootDocumentId
608
+ } : void 0;
609
+ } catch (e) {
610
+ env.error = e;
611
+ env.hasError = true;
612
+ } finally {
613
+ _ts_dispose_resources4(env);
614
+ }
398
615
  }
399
616
  async createServices() {
400
617
  const dataService = new DataServiceImpl(this._executionContext, this._dataService);
@@ -403,23 +620,54 @@ var ServiceContainer = class {
403
620
  return {
404
621
  dataService,
405
622
  queryService,
406
- queueService
623
+ queueService,
624
+ functionsAiService: this._functionsService
407
625
  };
408
626
  }
409
- queryQueue(queue) {
410
- return this._queueService.query({}, queue.toString(), {});
627
+ async queryQueue(queue) {
628
+ const parts = queue.asQueueDXN();
629
+ if (!parts) {
630
+ throw new Error("Invalid queue DXN");
631
+ }
632
+ const { subspaceTag, spaceId, queueId } = parts;
633
+ const result = await this._queueService.queryQueue(this._executionContext, {
634
+ query: {
635
+ spaceId,
636
+ queuesNamespace: subspaceTag,
637
+ queueIds: [
638
+ queueId
639
+ ]
640
+ }
641
+ });
642
+ return {
643
+ objects: structuredClone(result.objects),
644
+ nextCursor: result.nextCursor ?? null,
645
+ prevCursor: result.prevCursor ?? null
646
+ };
411
647
  }
412
- insertIntoQueue(queue, objects) {
413
- return this._queueService.append({}, queue.toString(), objects);
648
+ async insertIntoQueue(queue, objects) {
649
+ const parts = queue.asQueueDXN();
650
+ if (!parts) {
651
+ throw new Error("Invalid queue DXN");
652
+ }
653
+ const { subspaceTag, spaceId, queueId } = parts;
654
+ await this._queueService.insertIntoQueue(this._executionContext, {
655
+ subspaceTag,
656
+ spaceId,
657
+ queueId,
658
+ objects: objects.map((obj) => JSON.stringify(obj))
659
+ });
414
660
  }
415
661
  };
416
662
 
417
663
  // src/space-proxy.ts
418
664
  import { Resource } from "@dxos/context";
419
- import { invariant as invariant4 } from "@dxos/invariant";
420
- import { PublicKey as PublicKey2 } from "@dxos/keys";
665
+ import { invariant as invariant2 } from "@dxos/invariant";
666
+ import { PublicKey } from "@dxos/keys";
421
667
 
422
668
  // src/queues-api.ts
669
+ import { log as log3 } from "@dxos/log";
670
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/compute/functions-runtime-cloudflare/src/queues-api.ts";
423
671
  var QueuesAPIImpl = class {
424
672
  _serviceContainer;
425
673
  _spaceId;
@@ -427,8 +675,26 @@ var QueuesAPIImpl = class {
427
675
  this._serviceContainer = _serviceContainer;
428
676
  this._spaceId = _spaceId;
429
677
  }
430
- queryQueue(queue, options) {
431
- return this._serviceContainer.queryQueue(queue);
678
+ async queryQueue(queue, options) {
679
+ const result = await this._serviceContainer.queryQueue(queue);
680
+ const objects = (result.objects ?? []).flatMap((encoded) => {
681
+ try {
682
+ return [
683
+ JSON.parse(encoded)
684
+ ];
685
+ } catch (err) {
686
+ log3.verbose("queue object JSON parse failed; object ignored", {
687
+ encoded,
688
+ error: err
689
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 22, S: this });
690
+ return [];
691
+ }
692
+ });
693
+ return {
694
+ objects,
695
+ nextCursor: result.nextCursor ?? null,
696
+ prevCursor: result.prevCursor ?? null
697
+ };
432
698
  }
433
699
  insertIntoQueue(queue, objects) {
434
700
  return this._serviceContainer.insertIntoQueue(queue, JSON.parse(JSON.stringify(objects)));
@@ -436,7 +702,7 @@ var QueuesAPIImpl = class {
436
702
  };
437
703
 
438
704
  // src/space-proxy.ts
439
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
705
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/compute/functions-runtime-cloudflare/src/space-proxy.ts";
440
706
  var SpaceProxy = class extends Resource {
441
707
  _serviceContainer;
442
708
  _echoClient;
@@ -451,30 +717,14 @@ var SpaceProxy = class extends Resource {
451
717
  return this._id;
452
718
  }
453
719
  get db() {
454
- invariant4(this._db, void 0, {
455
- F: __dxlog_file4,
456
- L: 34,
457
- S: this,
458
- A: [
459
- "this._db",
460
- ""
461
- ]
462
- });
720
+ invariant2(this._db, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 24, S: this, A: ["this._db", ""] });
463
721
  return this._db;
464
722
  }
465
723
  /**
466
724
  * @deprecated Use db API.
467
725
  */
468
726
  get crud() {
469
- invariant4(this._db, void 0, {
470
- F: __dxlog_file4,
471
- L: 42,
472
- S: this,
473
- A: [
474
- "this._db",
475
- ""
476
- ]
477
- });
727
+ invariant2(this._db, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 30, S: this, A: ["this._db", ""] });
478
728
  return this._db.coreDatabase;
479
729
  }
480
730
  get queues() {
@@ -487,18 +737,18 @@ var SpaceProxy = class extends Resource {
487
737
  }
488
738
  this._db = this._echoClient.constructDatabase({
489
739
  spaceId: this._id,
490
- spaceKey: PublicKey2.from(meta.spaceKey),
740
+ spaceKey: PublicKey.from(meta.spaceKey),
491
741
  reactiveSchemaQuery: false,
492
742
  owningObject: this
493
743
  });
494
- await this._db.coreDatabase.open({
744
+ await this._db.coreDatabase.open(this._ctx, {
495
745
  rootUrl: meta.rootDocumentId
496
746
  });
497
747
  }
498
748
  };
499
749
 
500
750
  // src/functions-client.ts
501
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
751
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/compute/functions-runtime-cloudflare/src/functions-client.ts";
502
752
  var FunctionsClient = class extends Resource2 {
503
753
  _serviceContainer;
504
754
  _echoClient;
@@ -506,25 +756,9 @@ var FunctionsClient = class extends Resource2 {
506
756
  _spaces = /* @__PURE__ */ new Map();
507
757
  constructor(services) {
508
758
  super();
509
- invariant5(typeof services.dataService !== "undefined", "DataService is required", {
510
- F: __dxlog_file5,
511
- L: 32,
512
- S: this,
513
- A: [
514
- "typeof services.dataService !== 'undefined'",
515
- "'DataService is required'"
516
- ]
517
- });
518
- invariant5(typeof services.queueService !== "undefined", "QueueService is required", {
519
- F: __dxlog_file5,
520
- L: 33,
521
- S: this,
522
- A: [
523
- "typeof services.queueService !== 'undefined'",
524
- "'QueueService is required'"
525
- ]
526
- });
527
- this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService);
759
+ invariant3(typeof services.dataService !== "undefined", "DataService is required", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 19, S: this, A: ["typeof services.dataService !== 'undefined'", "'DataService is required'"] });
760
+ invariant3(typeof services.queueService !== "undefined", "QueueService is required", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 20, S: this, A: ["typeof services.queueService !== 'undefined'", "'QueueService is required'"] });
761
+ this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService, services.functionsAiService);
528
762
  this._echoClient = new EchoClient({});
529
763
  }
530
764
  get echo() {
@@ -558,7 +792,8 @@ var FunctionsClient = class extends Resource2 {
558
792
  var createClientFromEnv = async (env) => {
559
793
  const client = new FunctionsClient({
560
794
  dataService: env.DATA_SERVICE,
561
- queueService: env.QUEUE_SERVICE
795
+ queueService: env.QUEUE_SERVICE,
796
+ functionsAiService: env.FUNCTIONS_AI_SERVICE
562
797
  });
563
798
  await client.open();
564
799
  return client;
@@ -572,49 +807,36 @@ var FunctionRouteValue = /* @__PURE__ */ (function(FunctionRouteValue2) {
572
807
  })({});
573
808
 
574
809
  // src/wrap-handler-for-cloudflare.ts
575
- import { invariant as invariant6 } from "@dxos/invariant";
576
- import { SpaceId as SpaceId4 } from "@dxos/keys";
577
- import { log as log3 } from "@dxos/log";
810
+ import { invariant as invariant4 } from "@dxos/invariant";
811
+ import { SpaceId as SpaceId2 } from "@dxos/keys";
812
+ import { log as log4 } from "@dxos/log";
578
813
  import { EdgeResponse } from "@dxos/protocols";
579
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
814
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/compute/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
580
815
  var wrapHandlerForCloudflare = (func) => {
581
816
  return async (request, env) => {
582
817
  if (request.headers.get(FUNCTION_ROUTE_HEADER) === FunctionRouteValue.Meta) {
583
- log3.info(">>> meta", {
584
- func
585
- }, {
586
- F: __dxlog_file6,
587
- L: 25,
588
- S: void 0,
589
- C: (f, a) => f(...a)
590
- });
591
818
  return handleFunctionMetaCall(func, request);
592
819
  }
593
820
  try {
594
821
  const spaceId = new URL(request.url).searchParams.get("spaceId");
595
822
  if (spaceId) {
596
- if (!SpaceId4.isValid(spaceId)) {
823
+ if (!SpaceId2.isValid(spaceId)) {
597
824
  return new Response("Invalid spaceId", {
598
825
  status: 400
599
826
  });
600
827
  }
601
828
  }
602
- const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE);
829
+ const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE, env.FUNCTIONS_AI_SERVICE);
603
830
  const context = await createFunctionContext({
604
831
  serviceContainer,
605
832
  contextSpaceId: spaceId
606
833
  });
607
834
  return EdgeResponse.success(await invokeFunction(func, context, request));
608
835
  } catch (error) {
609
- log3.error("error invoking function", {
836
+ log4.error("error invoking function", {
610
837
  error,
611
838
  stack: error.stack
612
- }, {
613
- F: __dxlog_file6,
614
- L: 45,
615
- S: void 0,
616
- C: (f, a) => f(...a)
617
- });
839
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 37, S: void 0 });
618
840
  return EdgeResponse.failure({
619
841
  message: error?.message ?? "Internal error",
620
842
  error
@@ -647,12 +869,7 @@ var decodeRequest = async (request) => {
647
869
  }
648
870
  };
649
871
  } catch (err) {
650
- log3.catch(err, void 0, {
651
- F: __dxlog_file6,
652
- L: 80,
653
- S: void 0,
654
- C: (f, a) => f(...a)
655
- });
872
+ log4.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 76, S: void 0 });
656
873
  return {
657
874
  data: {
658
875
  bodyText,
@@ -676,7 +893,7 @@ var handleFunctionMetaCall = (functionDefinition, request) => {
676
893
  });
677
894
  };
678
895
  var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
679
- const { dataService, queryService, queueService } = await serviceContainer.createServices();
896
+ const { dataService, queryService, queueService, functionsAiService } = await serviceContainer.createServices();
680
897
  let spaceKey;
681
898
  let rootUrl;
682
899
  if (contextSpaceId) {
@@ -685,22 +902,15 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
685
902
  throw new Error(`Space not found: ${contextSpaceId}`);
686
903
  }
687
904
  spaceKey = meta.spaceKey;
688
- invariant6(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
689
- F: __dxlog_file6,
690
- L: 118,
691
- S: void 0,
692
- A: [
693
- "!meta.rootDocumentId.startsWith('automerge:')",
694
- ""
695
- ]
696
- });
905
+ invariant4(!meta.rootDocumentId.startsWith("automerge:"), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 109, S: void 0, A: ["!meta.rootDocumentId.startsWith('automerge:')", ""] });
697
906
  rootUrl = `automerge:${meta.rootDocumentId}`;
698
907
  }
699
908
  return {
700
909
  services: {
701
910
  dataService,
702
911
  queryService,
703
- queueService
912
+ queueService,
913
+ functionsAiService
704
914
  },
705
915
  spaceId: contextSpaceId,
706
916
  spaceKey,
@@ -709,36 +919,40 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
709
919
  };
710
920
 
711
921
  // src/logger.ts
712
- import { LogLevel, log as log4, shouldLog } from "@dxos/log";
922
+ import { LogLevel, log as log5, shouldLog } from "@dxos/log";
713
923
  var setupFunctionsLogger = () => {
714
- log4.runtimeConfig.processors.length = 0;
715
- log4.runtimeConfig.processors.push(functionLogProcessor);
924
+ log5.runtimeConfig.processors.length = 0;
925
+ log5.runtimeConfig.processors.push(functionLogProcessor);
716
926
  };
717
927
  var functionLogProcessor = (config, entry) => {
718
928
  if (!shouldLog(entry, config.filters)) {
719
929
  return;
720
930
  }
931
+ const context = entry.computedContext;
932
+ const error = entry.computedError;
933
+ const extras = [
934
+ Object.keys(context).length > 0 ? context : void 0,
935
+ error
936
+ ].filter((value) => value !== void 0);
721
937
  switch (entry.level) {
722
938
  case LogLevel.DEBUG:
723
- console.debug(entry.message, entry.context);
724
- break;
725
939
  case LogLevel.TRACE:
726
- console.debug(entry.message, entry.context);
940
+ console.debug(entry.message, ...extras);
727
941
  break;
728
942
  case LogLevel.VERBOSE:
729
- console.log(entry.message, entry.context);
943
+ console.log(entry.message, ...extras);
730
944
  break;
731
945
  case LogLevel.INFO:
732
- console.info(entry.message, entry.context);
946
+ console.info(entry.message, ...extras);
733
947
  break;
734
948
  case LogLevel.WARN:
735
- console.warn(entry.message, entry.context);
949
+ console.warn(entry.message, ...extras);
736
950
  break;
737
951
  case LogLevel.ERROR:
738
- console.error(entry.message, entry.context);
952
+ console.error(entry.message, ...extras);
739
953
  break;
740
954
  default:
741
- console.log(entry.message, entry.context);
955
+ console.log(entry.message, ...extras);
742
956
  break;
743
957
  }
744
958
  };
@@ -748,6 +962,7 @@ export {
748
962
  FunctionsClient,
749
963
  ServiceContainer,
750
964
  createClientFromEnv,
965
+ createFunctionContext,
751
966
  setupFunctionsLogger,
752
967
  wrapHandlerForCloudflare
753
968
  };