@dxos/functions-runtime-cloudflare 0.8.4-main.7ace549 → 0.8.4-main.937b3ca

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 +628 -128
  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 +628 -128
  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/index.d.ts +1 -0
  10. package/dist/types/src/index.d.ts.map +1 -1
  11. package/dist/types/src/internal/data-service-impl.d.ts +7 -6
  12. package/dist/types/src/internal/data-service-impl.d.ts.map +1 -1
  13. package/dist/types/src/internal/query-service-impl.d.ts +1 -0
  14. package/dist/types/src/internal/query-service-impl.d.ts.map +1 -1
  15. package/dist/types/src/internal/queue-service-impl.d.ts +4 -5
  16. package/dist/types/src/internal/queue-service-impl.d.ts.map +1 -1
  17. package/dist/types/src/internal/service-container.d.ts +5 -3
  18. package/dist/types/src/internal/service-container.d.ts.map +1 -1
  19. package/dist/types/src/internal/utils.d.ts +2 -0
  20. package/dist/types/src/internal/utils.d.ts.map +1 -0
  21. package/dist/types/src/logger.d.ts +2 -0
  22. package/dist/types/src/logger.d.ts.map +1 -0
  23. package/dist/types/src/queues-api.d.ts +3 -3
  24. package/dist/types/src/queues-api.d.ts.map +1 -1
  25. package/dist/types/src/space-proxy.d.ts +3 -2
  26. package/dist/types/src/space-proxy.d.ts.map +1 -1
  27. package/dist/types/src/wrap-handler-for-cloudflare.d.ts.map +1 -1
  28. package/dist/types/tsconfig.tsbuildinfo +1 -1
  29. package/package.json +20 -15
  30. package/src/functions-client.ts +8 -1
  31. package/src/index.ts +1 -0
  32. package/src/internal/data-service-impl.ts +66 -17
  33. package/src/internal/query-service-impl.ts +24 -8
  34. package/src/internal/queue-service-impl.ts +54 -8
  35. package/src/internal/service-container.ts +25 -6
  36. package/src/internal/utils.ts +5 -0
  37. package/src/logger.ts +42 -0
  38. package/src/queues-api.ts +3 -3
  39. package/src/space-proxy.ts +4 -3
  40. package/src/wrap-handler-for-cloudflare.ts +3 -3
@@ -1,14 +1,85 @@
1
1
  // src/functions-client.ts
2
2
  import { Resource as Resource2 } from "@dxos/context";
3
3
  import { EchoClient } from "@dxos/echo-db";
4
- import { invariant as invariant5 } from "@dxos/invariant";
4
+ import { invariant as invariant6 } from "@dxos/invariant";
5
5
 
6
6
  // src/internal/data-service-impl.ts
7
7
  import { Stream } from "@dxos/codec-protobuf/stream";
8
8
  import { raise } from "@dxos/debug";
9
+ import { NotImplementedError, RuntimeServiceError } from "@dxos/errors";
9
10
  import { invariant } from "@dxos/invariant";
10
11
  import { SpaceId } from "@dxos/keys";
11
12
  import { log } from "@dxos/log";
13
+
14
+ // src/internal/utils.ts
15
+ var copyUint8Array = (value) => new Uint8Array(value);
16
+
17
+ // src/internal/data-service-impl.ts
18
+ function _ts_add_disposable_resource(env, value, async) {
19
+ if (value !== null && value !== void 0) {
20
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
21
+ var dispose, inner;
22
+ if (async) {
23
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
24
+ dispose = value[Symbol.asyncDispose];
25
+ }
26
+ if (dispose === void 0) {
27
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
28
+ dispose = value[Symbol.dispose];
29
+ if (async) inner = dispose;
30
+ }
31
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
32
+ if (inner) dispose = function() {
33
+ try {
34
+ inner.call(this);
35
+ } catch (e) {
36
+ return Promise.reject(e);
37
+ }
38
+ };
39
+ env.stack.push({
40
+ value,
41
+ dispose,
42
+ async
43
+ });
44
+ } else if (async) {
45
+ env.stack.push({
46
+ async: true
47
+ });
48
+ }
49
+ return value;
50
+ }
51
+ function _ts_dispose_resources(env) {
52
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
53
+ var e = new Error(message);
54
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
55
+ };
56
+ return (_ts_dispose_resources = function _ts_dispose_resources5(env2) {
57
+ function fail(e) {
58
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
59
+ env2.hasError = true;
60
+ }
61
+ var r, s = 0;
62
+ function next() {
63
+ while (r = env2.stack.pop()) {
64
+ try {
65
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
66
+ if (r.dispose) {
67
+ var result = r.dispose.call(r.value);
68
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
69
+ fail(e);
70
+ return next();
71
+ });
72
+ } else s |= 1;
73
+ } catch (e) {
74
+ fail(e);
75
+ }
76
+ }
77
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
78
+ if (env2.hasError) throw env2.error;
79
+ }
80
+ return next();
81
+ })(env);
82
+ }
12
83
  var __dxlog_file = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/data-service-impl.ts";
13
84
  var DataServiceImpl = class {
14
85
  _executionContext;
@@ -22,7 +93,7 @@ var DataServiceImpl = class {
22
93
  return new Stream(({ next }) => {
23
94
  invariant(SpaceId.isValid(spaceId), void 0, {
24
95
  F: __dxlog_file,
25
- L: 34,
96
+ L: 39,
26
97
  S: this,
27
98
  A: [
28
99
  "SpaceId.isValid(spaceId)",
@@ -38,74 +109,141 @@ var DataServiceImpl = class {
38
109
  };
39
110
  });
40
111
  }
41
- async updateSubscription({ subscriptionId, addIds, removeIds }) {
42
- const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new Error("Subscription not found"));
112
+ async updateSubscription({ subscriptionId, addIds }) {
113
+ const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
114
+ message: "Subscription not found.",
115
+ context: {
116
+ subscriptionId
117
+ }
118
+ }));
43
119
  if (addIds) {
44
120
  log.info("request documents", {
45
121
  count: addIds.length
46
122
  }, {
47
123
  F: __dxlog_file,
48
- L: 47,
124
+ L: 59,
49
125
  S: this,
50
126
  C: (f, a) => f(...a)
51
127
  });
52
128
  for (const documentId of addIds) {
53
- const document = await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId);
54
- log.info("document loaded", {
55
- documentId,
56
- spaceId: sub.spaceId,
57
- found: !!document
58
- }, {
59
- F: __dxlog_file,
60
- L: 51,
61
- S: this,
62
- C: (f, a) => f(...a)
63
- });
64
- if (!document) {
65
- log.warn("not found", {
66
- documentId
129
+ const env = {
130
+ stack: [],
131
+ error: void 0,
132
+ hasError: false
133
+ };
134
+ try {
135
+ const document = _ts_add_disposable_resource(env, await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId), false);
136
+ log.info("document loaded", {
137
+ documentId,
138
+ spaceId: sub.spaceId,
139
+ found: !!document
67
140
  }, {
68
141
  F: __dxlog_file,
69
- L: 53,
142
+ L: 63,
70
143
  S: this,
71
144
  C: (f, a) => f(...a)
72
145
  });
73
- continue;
146
+ if (!document) {
147
+ log.warn("not found", {
148
+ documentId
149
+ }, {
150
+ F: __dxlog_file,
151
+ L: 65,
152
+ S: this,
153
+ C: (f, a) => f(...a)
154
+ });
155
+ continue;
156
+ }
157
+ sub.next({
158
+ updates: [
159
+ {
160
+ documentId,
161
+ // Copy returned object to avoid hanging RPC stub
162
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
163
+ mutation: copyUint8Array(document.data)
164
+ }
165
+ ]
166
+ });
167
+ } catch (e) {
168
+ env.error = e;
169
+ env.hasError = true;
170
+ } finally {
171
+ _ts_dispose_resources(env);
74
172
  }
75
- sub.next({
76
- updates: [
77
- {
78
- documentId,
79
- mutation: document.data
80
- }
81
- ]
82
- });
83
173
  }
84
174
  }
85
175
  }
176
+ async createDocument({ spaceId, initialValue }) {
177
+ const env = {
178
+ stack: [],
179
+ error: void 0,
180
+ hasError: false
181
+ };
182
+ try {
183
+ const response = _ts_add_disposable_resource(env, await this._dataService.createDocument(this._executionContext, {
184
+ spaceId,
185
+ initialValue
186
+ }), false);
187
+ return {
188
+ documentId: response.documentId
189
+ };
190
+ } catch (e) {
191
+ env.error = e;
192
+ env.hasError = true;
193
+ } finally {
194
+ _ts_dispose_resources(env);
195
+ }
196
+ }
86
197
  async update({ updates, subscriptionId }) {
87
- const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new Error("Subscription not found"));
88
- for (const update of updates ?? []) {
89
- await this._dataService.changeDocument(this._executionContext, sub.spaceId, update.documentId, update.mutation);
198
+ const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
199
+ message: "Subscription not found.",
200
+ context: {
201
+ subscriptionId
202
+ }
203
+ }));
204
+ try {
205
+ for (const update of updates ?? []) {
206
+ await this._dataService.changeDocument(this._executionContext, sub.spaceId, update.documentId, update.mutation);
207
+ }
208
+ } catch (error) {
209
+ throw RuntimeServiceError.wrap({
210
+ message: "Failed to apply document updates.",
211
+ context: {
212
+ subscriptionId
213
+ },
214
+ ifTypeDiffers: true
215
+ })(error);
90
216
  }
91
- throw new Error("Method not implemented.");
92
217
  }
93
218
  async flush() {
94
219
  }
95
- subscribeSpaceSyncState(request, options) {
96
- throw new Error("Method not implemented.");
220
+ subscribeSpaceSyncState(_request, _options) {
221
+ throw new NotImplementedError({
222
+ message: "subscribeSpaceSyncState is not implemented."
223
+ });
97
224
  }
98
- async getDocumentHeads({ documentIds }) {
99
- throw new Error("Method not implemented.");
225
+ async getDocumentHeads({ documentIds: _documentIds }) {
226
+ throw new NotImplementedError({
227
+ message: "getDocumentHeads is not implemented."
228
+ });
100
229
  }
101
- async reIndexHeads({ documentIds }) {
102
- throw new Error("Method not implemented.");
230
+ async reIndexHeads({ documentIds: _documentIds }) {
231
+ throw new NotImplementedError({
232
+ message: "reIndexHeads is not implemented."
233
+ });
103
234
  }
104
235
  async updateIndexes() {
105
- throw new Error("Method not implemented.");
236
+ log.error("updateIndexes is not available in EDGE env.", void 0, {
237
+ F: __dxlog_file,
238
+ L: 133,
239
+ S: this,
240
+ C: (f, a) => f(...a)
241
+ });
106
242
  }
107
- async waitUntilHeadsReplicated({ heads }) {
108
- throw new Error("Method not implemented.");
243
+ async waitUntilHeadsReplicated({ heads: _heads }) {
244
+ throw new NotImplementedError({
245
+ message: "waitUntilHeadsReplicated is not implemented."
246
+ });
109
247
  }
110
248
  };
111
249
 
@@ -113,6 +251,7 @@ var DataServiceImpl = class {
113
251
  import * as Schema from "effect/Schema";
114
252
  import { Stream as Stream2 } from "@dxos/codec-protobuf/stream";
115
253
  import { QueryAST } from "@dxos/echo-protocol";
254
+ import { NotImplementedError as NotImplementedError2, RuntimeServiceError as RuntimeServiceError2 } from "@dxos/errors";
116
255
  import { invariant as invariant3 } from "@dxos/invariant";
117
256
  import { PublicKey } from "@dxos/keys";
118
257
  import { SpaceId as SpaceId3 } from "@dxos/keys";
@@ -186,10 +325,76 @@ var isSimpleSelectionQuery = (query) => {
186
325
  };
187
326
 
188
327
  // src/internal/query-service-impl.ts
328
+ function _ts_add_disposable_resource2(env, value, async) {
329
+ if (value !== null && value !== void 0) {
330
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
331
+ var dispose, inner;
332
+ if (async) {
333
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
334
+ dispose = value[Symbol.asyncDispose];
335
+ }
336
+ if (dispose === void 0) {
337
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
338
+ dispose = value[Symbol.dispose];
339
+ if (async) inner = dispose;
340
+ }
341
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
342
+ if (inner) dispose = function() {
343
+ try {
344
+ inner.call(this);
345
+ } catch (e) {
346
+ return Promise.reject(e);
347
+ }
348
+ };
349
+ env.stack.push({
350
+ value,
351
+ dispose,
352
+ async
353
+ });
354
+ } else if (async) {
355
+ env.stack.push({
356
+ async: true
357
+ });
358
+ }
359
+ return value;
360
+ }
361
+ function _ts_dispose_resources2(env) {
362
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
363
+ var e = new Error(message);
364
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
365
+ };
366
+ return (_ts_dispose_resources2 = function _ts_dispose_resources5(env2) {
367
+ function fail(e) {
368
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
369
+ env2.hasError = true;
370
+ }
371
+ var r, s = 0;
372
+ function next() {
373
+ while (r = env2.stack.pop()) {
374
+ try {
375
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
376
+ if (r.dispose) {
377
+ var result = r.dispose.call(r.value);
378
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
379
+ fail(e);
380
+ return next();
381
+ });
382
+ } else s |= 1;
383
+ } catch (e) {
384
+ fail(e);
385
+ }
386
+ }
387
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
388
+ if (env2.hasError) throw env2.error;
389
+ }
390
+ return next();
391
+ })(env);
392
+ }
189
393
  var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
190
394
  var QueryServiceImpl = class {
191
395
  _executionContext;
192
396
  _dataService;
397
+ _queryCount = 0;
193
398
  constructor(_executionContext, _dataService) {
194
399
  this._executionContext = _executionContext;
195
400
  this._dataService = _dataService;
@@ -199,7 +404,7 @@ var QueryServiceImpl = class {
199
404
  request
200
405
  }, {
201
406
  F: __dxlog_file3,
202
- L: 30,
407
+ L: 34,
203
408
  S: this,
204
409
  C: (f, a) => f(...a)
205
410
  });
@@ -207,7 +412,7 @@ var QueryServiceImpl = class {
207
412
  const requestedSpaceIds = getTargetSpacesForQuery(query);
208
413
  invariant3(requestedSpaceIds.length === 1, "Only one space is supported", {
209
414
  F: __dxlog_file3,
210
- L: 33,
415
+ L: 37,
211
416
  S: this,
212
417
  A: [
213
418
  "requestedSpaceIds.length === 1",
@@ -217,53 +422,81 @@ var QueryServiceImpl = class {
217
422
  const spaceId = requestedSpaceIds[0];
218
423
  return Stream2.fromPromise((async () => {
219
424
  try {
220
- log2.info("begin query", {
221
- spaceId
222
- }, {
223
- F: __dxlog_file3,
224
- L: 39,
225
- S: this,
226
- C: (f, a) => f(...a)
227
- });
228
- const queryResponse = await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query));
229
- log2.info("query response", {
230
- spaceId,
231
- filter: request.filter,
232
- resultCount: queryResponse.results.length
233
- }, {
234
- F: __dxlog_file3,
235
- L: 44,
236
- S: this,
237
- C: (f, a) => f(...a)
238
- });
239
- return {
240
- results: queryResponse.results.map((object) => ({
241
- id: object.objectId,
242
- spaceId,
243
- spaceKey: PublicKey.ZERO,
244
- documentId: object.document.documentId,
245
- rank: 0,
246
- documentAutomerge: object.document.data
247
- }))
425
+ const env = {
426
+ stack: [],
427
+ error: void 0,
428
+ hasError: false
248
429
  };
249
- } catch (err) {
430
+ try {
431
+ this._queryCount++;
432
+ log2.info("begin query", {
433
+ spaceId
434
+ }, {
435
+ F: __dxlog_file3,
436
+ L: 44,
437
+ S: this,
438
+ C: (f, a) => f(...a)
439
+ });
440
+ const queryResponse = _ts_add_disposable_resource2(env, await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query)), false);
441
+ log2.info("query response", {
442
+ spaceId,
443
+ filter: request.filter,
444
+ resultCount: queryResponse.results.length
445
+ }, {
446
+ F: __dxlog_file3,
447
+ L: 49,
448
+ S: this,
449
+ C: (f, a) => f(...a)
450
+ });
451
+ return {
452
+ results: queryResponse.results.map((object) => ({
453
+ id: object.objectId,
454
+ spaceId,
455
+ spaceKey: PublicKey.ZERO,
456
+ documentId: object.document.documentId,
457
+ // Rank 1 for predicate matches where ranking is not determined.
458
+ rank: 1,
459
+ // Copy returned object to avoid hanging RPC stub.
460
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
461
+ documentAutomerge: copyUint8Array(object.document.data)
462
+ }))
463
+ };
464
+ } catch (e) {
465
+ env.error = e;
466
+ env.hasError = true;
467
+ } finally {
468
+ _ts_dispose_resources2(env);
469
+ }
470
+ } catch (error) {
250
471
  log2.error("query failed", {
251
- err
472
+ err: error
252
473
  }, {
253
474
  F: __dxlog_file3,
254
- L: 58,
475
+ L: 66,
255
476
  S: this,
256
477
  C: (f, a) => f(...a)
257
478
  });
258
- throw err;
479
+ throw new RuntimeServiceError2({
480
+ message: `Query execution failed (queryCount=${this._queryCount})`,
481
+ context: {
482
+ spaceId,
483
+ filter: request.filter,
484
+ queryCount: this._queryCount
485
+ },
486
+ cause: error
487
+ });
259
488
  }
260
489
  })());
261
490
  }
262
491
  async reindex() {
263
- throw new Error("Method not implemented.");
492
+ throw new NotImplementedError2({
493
+ message: "Reindex is not implemented."
494
+ });
264
495
  }
265
496
  async setConfig() {
266
- throw new Error("Method not implemented.");
497
+ throw new NotImplementedError2({
498
+ message: "SetConfig is not implemented."
499
+ });
267
500
  }
268
501
  };
269
502
  var getTargetSpacesForQuery = (query) => {
@@ -284,6 +517,74 @@ var getTargetSpacesForQuery = (query) => {
284
517
  };
285
518
 
286
519
  // src/internal/queue-service-impl.ts
520
+ import { NotImplementedError as NotImplementedError3, RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
521
+ import { invariant as invariant4 } from "@dxos/invariant";
522
+ function _ts_add_disposable_resource3(env, value, async) {
523
+ if (value !== null && value !== void 0) {
524
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
525
+ var dispose, inner;
526
+ if (async) {
527
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
528
+ dispose = value[Symbol.asyncDispose];
529
+ }
530
+ if (dispose === void 0) {
531
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
532
+ dispose = value[Symbol.dispose];
533
+ if (async) inner = dispose;
534
+ }
535
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
536
+ if (inner) dispose = function() {
537
+ try {
538
+ inner.call(this);
539
+ } catch (e) {
540
+ return Promise.reject(e);
541
+ }
542
+ };
543
+ env.stack.push({
544
+ value,
545
+ dispose,
546
+ async
547
+ });
548
+ } else if (async) {
549
+ env.stack.push({
550
+ async: true
551
+ });
552
+ }
553
+ return value;
554
+ }
555
+ function _ts_dispose_resources3(env) {
556
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
557
+ var e = new Error(message);
558
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
559
+ };
560
+ return (_ts_dispose_resources3 = function _ts_dispose_resources5(env2) {
561
+ function fail(e) {
562
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
563
+ env2.hasError = true;
564
+ }
565
+ var r, s = 0;
566
+ function next() {
567
+ while (r = env2.stack.pop()) {
568
+ try {
569
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
570
+ if (r.dispose) {
571
+ var result = r.dispose.call(r.value);
572
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
573
+ fail(e);
574
+ return next();
575
+ });
576
+ } else s |= 1;
577
+ } catch (e) {
578
+ fail(e);
579
+ }
580
+ }
581
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
582
+ if (env2.hasError) throw env2.error;
583
+ }
584
+ return next();
585
+ })(env);
586
+ }
587
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/queue-service-impl.ts";
287
588
  var QueueServiceImpl = class {
288
589
  _ctx;
289
590
  _queueService;
@@ -291,29 +592,177 @@ var QueueServiceImpl = class {
291
592
  this._ctx = _ctx;
292
593
  this._queueService = _queueService;
293
594
  }
294
- queryQueue(subspaceTag, spaceId, { queueId, ...query }) {
295
- return this._queueService.query(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, query);
595
+ async queryQueue(request) {
596
+ const { query } = request;
597
+ const { queueIds, ...filter } = query;
598
+ const spaceId = query.spaceId;
599
+ const queueId = queueIds?.[0];
600
+ invariant4(request.query.queuesNamespace, void 0, {
601
+ F: __dxlog_file4,
602
+ L: 26,
603
+ S: this,
604
+ A: [
605
+ "request.query.queuesNamespace",
606
+ ""
607
+ ]
608
+ });
609
+ try {
610
+ const env = {
611
+ stack: [],
612
+ error: void 0,
613
+ hasError: false
614
+ };
615
+ try {
616
+ const result = _ts_add_disposable_resource3(env, await this._queueService.query(this._ctx, `dxn:queue:${request.query.queuesNamespace}:${spaceId}:${queueId}`, filter), false);
617
+ return {
618
+ // Copy returned object to avoid hanging RPC stub
619
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
620
+ objects: structuredClone(result.objects),
621
+ nextCursor: result.nextCursor,
622
+ prevCursor: result.prevCursor
623
+ };
624
+ } catch (e) {
625
+ env.error = e;
626
+ env.hasError = true;
627
+ } finally {
628
+ _ts_dispose_resources3(env);
629
+ }
630
+ } catch (error) {
631
+ throw RuntimeServiceError3.wrap({
632
+ message: "Queue query failed.",
633
+ context: {
634
+ subspaceTag: request.query.queuesNamespace,
635
+ spaceId,
636
+ queueId
637
+ },
638
+ ifTypeDiffers: true
639
+ })(error);
640
+ }
296
641
  }
297
- insertIntoQueue(subspaceTag, spaceId, queueId, objects) {
298
- return this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects);
642
+ async insertIntoQueue(request) {
643
+ const { subspaceTag, spaceId, queueId, objects } = request;
644
+ try {
645
+ await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects ?? []);
646
+ } catch (error) {
647
+ throw RuntimeServiceError3.wrap({
648
+ message: "Queue append failed.",
649
+ context: {
650
+ subspaceTag,
651
+ spaceId,
652
+ queueId
653
+ },
654
+ ifTypeDiffers: true
655
+ })(error);
656
+ }
299
657
  }
300
- deleteFromQueue(subspaceTag, spaceId, queueId, objectIds) {
301
- throw new Error("Deleting from queue is not supported.");
658
+ deleteFromQueue(request) {
659
+ const { subspaceTag, spaceId, queueId } = request;
660
+ throw new NotImplementedError3({
661
+ message: "Deleting from queue is not supported.",
662
+ context: {
663
+ subspaceTag,
664
+ spaceId,
665
+ queueId
666
+ }
667
+ });
302
668
  }
303
669
  };
304
670
 
305
671
  // src/internal/service-container.ts
672
+ function _ts_add_disposable_resource4(env, value, async) {
673
+ if (value !== null && value !== void 0) {
674
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
675
+ var dispose, inner;
676
+ if (async) {
677
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
678
+ dispose = value[Symbol.asyncDispose];
679
+ }
680
+ if (dispose === void 0) {
681
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
682
+ dispose = value[Symbol.dispose];
683
+ if (async) inner = dispose;
684
+ }
685
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
686
+ if (inner) dispose = function() {
687
+ try {
688
+ inner.call(this);
689
+ } catch (e) {
690
+ return Promise.reject(e);
691
+ }
692
+ };
693
+ env.stack.push({
694
+ value,
695
+ dispose,
696
+ async
697
+ });
698
+ } else if (async) {
699
+ env.stack.push({
700
+ async: true
701
+ });
702
+ }
703
+ return value;
704
+ }
705
+ function _ts_dispose_resources4(env) {
706
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
707
+ var e = new Error(message);
708
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
709
+ };
710
+ return (_ts_dispose_resources4 = function _ts_dispose_resources5(env2) {
711
+ function fail(e) {
712
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
713
+ env2.hasError = true;
714
+ }
715
+ var r, s = 0;
716
+ function next() {
717
+ while (r = env2.stack.pop()) {
718
+ try {
719
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
720
+ if (r.dispose) {
721
+ var result = r.dispose.call(r.value);
722
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
723
+ fail(e);
724
+ return next();
725
+ });
726
+ } else s |= 1;
727
+ } catch (e) {
728
+ fail(e);
729
+ }
730
+ }
731
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
732
+ if (env2.hasError) throw env2.error;
733
+ }
734
+ return next();
735
+ })(env);
736
+ }
306
737
  var ServiceContainer = class {
307
738
  _executionContext;
308
739
  _dataService;
309
740
  _queueService;
310
- constructor(_executionContext, _dataService, _queueService) {
741
+ _functionsService;
742
+ constructor(_executionContext, _dataService, _queueService, _functionsService) {
311
743
  this._executionContext = _executionContext;
312
744
  this._dataService = _dataService;
313
745
  this._queueService = _queueService;
746
+ this._functionsService = _functionsService;
314
747
  }
315
748
  async getSpaceMeta(spaceId) {
316
- return this._dataService.getSpaceMeta(this._executionContext, spaceId);
749
+ const env = {
750
+ stack: [],
751
+ error: void 0,
752
+ hasError: false
753
+ };
754
+ try {
755
+ const result = _ts_add_disposable_resource4(env, await this._dataService.getSpaceMeta(this._executionContext, spaceId), false);
756
+ return result ? {
757
+ spaceKey: result.spaceKey,
758
+ rootDocumentId: result.rootDocumentId
759
+ } : void 0;
760
+ } catch (e) {
761
+ env.error = e;
762
+ env.hasError = true;
763
+ } finally {
764
+ _ts_dispose_resources4(env);
765
+ }
317
766
  }
318
767
  async createServices() {
319
768
  const dataService = new DataServiceImpl(this._executionContext, this._dataService);
@@ -322,20 +771,41 @@ var ServiceContainer = class {
322
771
  return {
323
772
  dataService,
324
773
  queryService,
325
- queueService
774
+ queueService,
775
+ functionsAiService: this._functionsService
326
776
  };
327
777
  }
328
- queryQueue(queue) {
329
- return this._queueService.query({}, queue.toString(), {});
778
+ async queryQueue(queue) {
779
+ const env = {
780
+ stack: [],
781
+ error: void 0,
782
+ hasError: false
783
+ };
784
+ try {
785
+ const { spaceId } = queue.asQueueDXN() ?? {};
786
+ const result = _ts_add_disposable_resource4(env, await this._queueService.query({}, queue.toString(), {
787
+ spaceId
788
+ }), false);
789
+ return {
790
+ objects: structuredClone(result.objects),
791
+ nextCursor: result.nextCursor ?? null,
792
+ prevCursor: result.prevCursor ?? null
793
+ };
794
+ } catch (e) {
795
+ env.error = e;
796
+ env.hasError = true;
797
+ } finally {
798
+ _ts_dispose_resources4(env);
799
+ }
330
800
  }
331
- insertIntoQueue(queue, objects) {
332
- return this._queueService.append({}, queue.toString(), objects);
801
+ async insertIntoQueue(queue, objects) {
802
+ await this._queueService.append({}, queue.toString(), objects);
333
803
  }
334
804
  };
335
805
 
336
806
  // src/space-proxy.ts
337
807
  import { Resource } from "@dxos/context";
338
- import { invariant as invariant4 } from "@dxos/invariant";
808
+ import { invariant as invariant5 } from "@dxos/invariant";
339
809
  import { PublicKey as PublicKey2 } from "@dxos/keys";
340
810
 
341
811
  // src/queues-api.ts
@@ -355,7 +825,7 @@ var QueuesAPIImpl = class {
355
825
  };
356
826
 
357
827
  // src/space-proxy.ts
358
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
828
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
359
829
  var SpaceProxy = class extends Resource {
360
830
  _serviceContainer;
361
831
  _echoClient;
@@ -370,9 +840,9 @@ var SpaceProxy = class extends Resource {
370
840
  return this._id;
371
841
  }
372
842
  get db() {
373
- invariant4(this._db, void 0, {
374
- F: __dxlog_file4,
375
- L: 34,
843
+ invariant5(this._db, void 0, {
844
+ F: __dxlog_file5,
845
+ L: 35,
376
846
  S: this,
377
847
  A: [
378
848
  "this._db",
@@ -385,9 +855,9 @@ var SpaceProxy = class extends Resource {
385
855
  * @deprecated Use db API.
386
856
  */
387
857
  get crud() {
388
- invariant4(this._db, void 0, {
389
- F: __dxlog_file4,
390
- L: 42,
858
+ invariant5(this._db, void 0, {
859
+ F: __dxlog_file5,
860
+ L: 43,
391
861
  S: this,
392
862
  A: [
393
863
  "this._db",
@@ -417,7 +887,7 @@ var SpaceProxy = class extends Resource {
417
887
  };
418
888
 
419
889
  // src/functions-client.ts
420
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
890
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
421
891
  var FunctionsClient = class extends Resource2 {
422
892
  _serviceContainer;
423
893
  _echoClient;
@@ -425,25 +895,25 @@ var FunctionsClient = class extends Resource2 {
425
895
  _spaces = /* @__PURE__ */ new Map();
426
896
  constructor(services) {
427
897
  super();
428
- invariant5(typeof services.dataService !== "undefined", "DataService is required", {
429
- F: __dxlog_file5,
430
- L: 32,
898
+ invariant6(typeof services.dataService !== "undefined", "DataService is required", {
899
+ F: __dxlog_file6,
900
+ L: 33,
431
901
  S: this,
432
902
  A: [
433
903
  "typeof services.dataService !== 'undefined'",
434
904
  "'DataService is required'"
435
905
  ]
436
906
  });
437
- invariant5(typeof services.queueService !== "undefined", "QueueService is required", {
438
- F: __dxlog_file5,
439
- L: 33,
907
+ invariant6(typeof services.queueService !== "undefined", "QueueService is required", {
908
+ F: __dxlog_file6,
909
+ L: 34,
440
910
  S: this,
441
911
  A: [
442
912
  "typeof services.queueService !== 'undefined'",
443
913
  "'QueueService is required'"
444
914
  ]
445
915
  });
446
- this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService);
916
+ this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService, services.functionsAiService);
447
917
  this._echoClient = new EchoClient({});
448
918
  }
449
919
  get echo() {
@@ -477,7 +947,8 @@ var FunctionsClient = class extends Resource2 {
477
947
  var createClientFromEnv = async (env) => {
478
948
  const client = new FunctionsClient({
479
949
  dataService: env.DATA_SERVICE,
480
- queueService: env.QUEUE_SERVICE
950
+ queueService: env.QUEUE_SERVICE,
951
+ functionsAiService: env.FUNCTIONS_AI_SERVICE
481
952
  });
482
953
  await client.open();
483
954
  return client;
@@ -491,22 +962,14 @@ var FunctionRouteValue = /* @__PURE__ */ (function(FunctionRouteValue2) {
491
962
  })({});
492
963
 
493
964
  // src/wrap-handler-for-cloudflare.ts
494
- import { invariant as invariant6 } from "@dxos/invariant";
965
+ import { invariant as invariant7 } from "@dxos/invariant";
495
966
  import { SpaceId as SpaceId4 } from "@dxos/keys";
496
967
  import { log as log3 } from "@dxos/log";
497
968
  import { EdgeResponse } from "@dxos/protocols";
498
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
969
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
499
970
  var wrapHandlerForCloudflare = (func) => {
500
971
  return async (request, env) => {
501
972
  if (request.headers.get(FUNCTION_ROUTE_HEADER) === FunctionRouteValue.Meta) {
502
- log3.info(">>> meta", {
503
- func
504
- }, {
505
- F: __dxlog_file6,
506
- L: 25,
507
- S: void 0,
508
- C: (f, a) => f(...a)
509
- });
510
973
  return handleFunctionMetaCall(func, request);
511
974
  }
512
975
  try {
@@ -518,7 +981,7 @@ var wrapHandlerForCloudflare = (func) => {
518
981
  });
519
982
  }
520
983
  }
521
- const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE);
984
+ const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE, env.FUNCTIONS_AI_SERVICE);
522
985
  const context = await createFunctionContext({
523
986
  serviceContainer,
524
987
  contextSpaceId: spaceId
@@ -529,8 +992,8 @@ var wrapHandlerForCloudflare = (func) => {
529
992
  error,
530
993
  stack: error.stack
531
994
  }, {
532
- F: __dxlog_file6,
533
- L: 45,
995
+ F: __dxlog_file7,
996
+ L: 44,
534
997
  S: void 0,
535
998
  C: (f, a) => f(...a)
536
999
  });
@@ -567,8 +1030,8 @@ var decodeRequest = async (request) => {
567
1030
  };
568
1031
  } catch (err) {
569
1032
  log3.catch(err, void 0, {
570
- F: __dxlog_file6,
571
- L: 80,
1033
+ F: __dxlog_file7,
1034
+ L: 79,
572
1035
  S: void 0,
573
1036
  C: (f, a) => f(...a)
574
1037
  });
@@ -595,7 +1058,7 @@ var handleFunctionMetaCall = (functionDefinition, request) => {
595
1058
  });
596
1059
  };
597
1060
  var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
598
- const { dataService, queryService, queueService } = await serviceContainer.createServices();
1061
+ const { dataService, queryService, queueService, functionsAiService } = await serviceContainer.createServices();
599
1062
  let spaceKey;
600
1063
  let rootUrl;
601
1064
  if (contextSpaceId) {
@@ -604,9 +1067,9 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
604
1067
  throw new Error(`Space not found: ${contextSpaceId}`);
605
1068
  }
606
1069
  spaceKey = meta.spaceKey;
607
- invariant6(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
608
- F: __dxlog_file6,
609
- L: 118,
1070
+ invariant7(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
1071
+ F: __dxlog_file7,
1072
+ L: 117,
610
1073
  S: void 0,
611
1074
  A: [
612
1075
  "!meta.rootDocumentId.startsWith('automerge:')",
@@ -619,19 +1082,56 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
619
1082
  services: {
620
1083
  dataService,
621
1084
  queryService,
622
- queueService
1085
+ queueService,
1086
+ functionsAiService
623
1087
  },
624
1088
  spaceId: contextSpaceId,
625
1089
  spaceKey,
626
1090
  spaceRootUrl: rootUrl
627
1091
  };
628
1092
  };
1093
+
1094
+ // src/logger.ts
1095
+ import { LogLevel, log as log4, shouldLog } from "@dxos/log";
1096
+ var setupFunctionsLogger = () => {
1097
+ log4.runtimeConfig.processors.length = 0;
1098
+ log4.runtimeConfig.processors.push(functionLogProcessor);
1099
+ };
1100
+ var functionLogProcessor = (config, entry) => {
1101
+ if (!shouldLog(entry, config.filters)) {
1102
+ return;
1103
+ }
1104
+ switch (entry.level) {
1105
+ case LogLevel.DEBUG:
1106
+ console.debug(entry.message, entry.context);
1107
+ break;
1108
+ case LogLevel.TRACE:
1109
+ console.debug(entry.message, entry.context);
1110
+ break;
1111
+ case LogLevel.VERBOSE:
1112
+ console.log(entry.message, entry.context);
1113
+ break;
1114
+ case LogLevel.INFO:
1115
+ console.info(entry.message, entry.context);
1116
+ break;
1117
+ case LogLevel.WARN:
1118
+ console.warn(entry.message, entry.context);
1119
+ break;
1120
+ case LogLevel.ERROR:
1121
+ console.error(entry.message, entry.context);
1122
+ break;
1123
+ default:
1124
+ console.log(entry.message, entry.context);
1125
+ break;
1126
+ }
1127
+ };
629
1128
  export {
630
1129
  FUNCTION_ROUTE_HEADER,
631
1130
  FunctionRouteValue,
632
1131
  FunctionsClient,
633
1132
  ServiceContainer,
634
1133
  createClientFromEnv,
1134
+ setupFunctionsLogger,
635
1135
  wrapHandlerForCloudflare
636
1136
  };
637
1137
  //# sourceMappingURL=index.mjs.map