@effect-agent/storage-cloudflare 0.1.0-beta.42 → 0.1.0-beta.45
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/index.mjs.map +1 -1
- package/dist/testing.mjs.map +1 -1
- package/package.json +1 -52
- package/src/do-journal.ts +42 -0
- package/src/do-ledger.ts +309 -0
- package/src/do-schedule-store.ts +49 -0
- package/src/do-storage-failpoint-testing.ts +1 -0
- package/src/do-subscription-store.ts +153 -0
- package/src/do-thread-store.ts +74 -0
- package/src/errors.ts +1 -0
- package/src/memory-protocol.ts +24 -0
- package/src/port-protocol.ts +3 -0
- package/src/routing.ts +41 -0
package/src/routing.ts
CHANGED
|
@@ -94,6 +94,7 @@ export class PortTransportError extends Schema.TaggedError<PortTransportError>()
|
|
|
94
94
|
const safeTransportDiagnostic = (cause: unknown): string => {
|
|
95
95
|
try {
|
|
96
96
|
const message = cause instanceof Error ? cause.message : cause;
|
|
97
|
+
|
|
97
98
|
return boundPortDiagnostic(typeof message === "string" ? message : String(message));
|
|
98
99
|
} catch {
|
|
99
100
|
return "[unavailable transport diagnostic]";
|
|
@@ -104,6 +105,7 @@ const transportRetryableSignal = (cause: unknown): boolean | undefined => {
|
|
|
104
105
|
if (!Predicate.isObjectKeyword(cause)) return undefined;
|
|
105
106
|
try {
|
|
106
107
|
const signal = Reflect.get(cause, "retryable");
|
|
108
|
+
|
|
107
109
|
return typeof signal === "boolean" ? signal : undefined;
|
|
108
110
|
} catch {
|
|
109
111
|
return undefined;
|
|
@@ -116,6 +118,7 @@ const transportRetryableSignal = (cause: unknown): boolean | undefined => {
|
|
|
116
118
|
*/
|
|
117
119
|
export const portTransportFailure = (target: string, cause: unknown): PortTransportError => {
|
|
118
120
|
const retryable = transportRetryableSignal(cause);
|
|
121
|
+
|
|
119
122
|
return PortTransportError.make({
|
|
120
123
|
target,
|
|
121
124
|
message: safeTransportDiagnostic(cause),
|
|
@@ -185,10 +188,13 @@ const routableSubmissionTarget = (
|
|
|
185
188
|
});
|
|
186
189
|
}
|
|
187
190
|
const separator = submissionId.indexOf(":");
|
|
191
|
+
|
|
188
192
|
if (separator === -1) return LOCAL;
|
|
189
193
|
if (!UUID_HEAD_PATTERN.test(submissionId.slice(0, separator))) return LOCAL;
|
|
190
194
|
const tail = submissionId.slice(separator + 1);
|
|
195
|
+
|
|
191
196
|
if (tail === localThreadId) return LOCAL;
|
|
197
|
+
|
|
192
198
|
return yield* decodeThreadId(tail).pipe(
|
|
193
199
|
Effect.map((threadId): RouteTarget => ({ _tag: "foreign", threadId })),
|
|
194
200
|
Effect.orElseSucceed(() => LOCAL),
|
|
@@ -232,7 +238,9 @@ const makeTransportCall = (transport: ThreadPortTransport["Service"]) =>
|
|
|
232
238
|
}),
|
|
233
239
|
),
|
|
234
240
|
);
|
|
241
|
+
|
|
235
242
|
const raw = yield* transport.call(target, encoded);
|
|
243
|
+
|
|
236
244
|
return yield* decodePortResponse(raw).pipe(
|
|
237
245
|
Effect.mapError((error) =>
|
|
238
246
|
PortProtocolError.make({
|
|
@@ -278,14 +286,17 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
|
|
|
278
286
|
): Effect.Effect<ResultSchema["Type"], FailureSchema["Type"] | LedgerError> => {
|
|
279
287
|
const isExpectedResult = Schema.is(resultSchema);
|
|
280
288
|
const isExpectedFailure = Schema.is(failureSchema);
|
|
289
|
+
|
|
281
290
|
return transportCall(target, call).pipe(
|
|
282
291
|
Effect.mapError(routeFailure(operation, target)),
|
|
283
292
|
Effect.flatMap(
|
|
284
293
|
(response): Effect.Effect<ResultSchema["Type"], FailureSchema["Type"] | LedgerError> => {
|
|
285
294
|
if (response._tag === "PortFailed") {
|
|
286
295
|
const failure = response.failure;
|
|
296
|
+
|
|
287
297
|
if (isExpectedFailure(failure)) return Effect.fail(failure);
|
|
288
298
|
if (failure._tag === "LedgerError") return Effect.fail(failure);
|
|
299
|
+
|
|
289
300
|
return Effect.fail(
|
|
290
301
|
LedgerError.make({
|
|
291
302
|
operation,
|
|
@@ -298,6 +309,7 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
|
|
|
298
309
|
);
|
|
299
310
|
}
|
|
300
311
|
const result = response.result;
|
|
312
|
+
|
|
301
313
|
if (!isExpectedResult(result)) {
|
|
302
314
|
return Effect.fail(
|
|
303
315
|
LedgerError.make({
|
|
@@ -308,6 +320,7 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
|
|
|
308
320
|
}),
|
|
309
321
|
);
|
|
310
322
|
}
|
|
323
|
+
|
|
311
324
|
return Effect.succeed(result);
|
|
312
325
|
},
|
|
313
326
|
),
|
|
@@ -337,6 +350,7 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
|
|
|
337
350
|
Effect.flatMap((response) => {
|
|
338
351
|
if (response._tag === "PortFailed") {
|
|
339
352
|
if (response.failure._tag === "LedgerError") return Effect.fail(response.failure);
|
|
353
|
+
|
|
340
354
|
return Effect.succeed(
|
|
341
355
|
AdmissionIndeterminate.make({
|
|
342
356
|
reason: boundPortDiagnostic(
|
|
@@ -356,6 +370,7 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
|
|
|
356
370
|
}),
|
|
357
371
|
);
|
|
358
372
|
}
|
|
373
|
+
|
|
359
374
|
return Effect.succeed(response.result.resolution);
|
|
360
375
|
}),
|
|
361
376
|
Effect.catchTags({
|
|
@@ -408,18 +423,24 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
|
|
|
408
423
|
snapshot: RecoverySnapshot,
|
|
409
424
|
): Effect.fn.Return<RecoverySnapshot, LedgerError> {
|
|
410
425
|
const operation = "ledger load recovery snapshot";
|
|
426
|
+
|
|
411
427
|
const attachments = new Map(
|
|
412
428
|
snapshot.childAttachments.map((attachment) => [attachment.childSubmissionId, attachment]),
|
|
413
429
|
);
|
|
430
|
+
|
|
414
431
|
let enriched = false;
|
|
432
|
+
|
|
415
433
|
for (const reservation of snapshot.childReservations) {
|
|
416
434
|
const childSubmissionId = reservation.childSubmissionId;
|
|
435
|
+
|
|
417
436
|
if (childSubmissionId === undefined || attachments.has(childSubmissionId)) continue;
|
|
418
437
|
const target = yield* submissionTarget(operation, childSubmissionId);
|
|
438
|
+
|
|
419
439
|
// A local or opaque child identity was already answered authoritatively by the local
|
|
420
440
|
// facet; absence there means the child admission never committed.
|
|
421
441
|
if (target._tag !== "foreign") continue;
|
|
422
442
|
const child = yield* foreignLookupById(operation, target.threadId, childSubmissionId);
|
|
443
|
+
|
|
423
444
|
if (Option.isNone(child)) continue;
|
|
424
445
|
attachments.set(
|
|
425
446
|
childSubmissionId,
|
|
@@ -437,11 +458,14 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
|
|
|
437
458
|
if (!enriched) return snapshot;
|
|
438
459
|
// Rebuild in reservation (parent Tool Call) order, the order the local facet documents.
|
|
439
460
|
const ordered: Array<ChildAttachmentSnapshot> = [];
|
|
461
|
+
|
|
440
462
|
for (const reservation of snapshot.childReservations) {
|
|
441
463
|
if (reservation.childSubmissionId === undefined) continue;
|
|
442
464
|
const attachment = attachments.get(reservation.childSubmissionId);
|
|
465
|
+
|
|
443
466
|
if (attachment !== undefined) ordered.push(attachment);
|
|
444
467
|
}
|
|
468
|
+
|
|
445
469
|
return RecoverySnapshot.make({ ...snapshot, childAttachments: ordered });
|
|
446
470
|
});
|
|
447
471
|
|
|
@@ -708,6 +732,7 @@ const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices
|
|
|
708
732
|
): Effect.Effect<ResultSchema["Type"], FailureSchema["Type"] | ThreadStoreError> => {
|
|
709
733
|
const isExpectedResult = Schema.is(resultSchema);
|
|
710
734
|
const isExpectedFailure = Schema.is(failureSchema);
|
|
735
|
+
|
|
711
736
|
return transportCall(target, call).pipe(
|
|
712
737
|
Effect.mapError(routeFailure(operation, target)),
|
|
713
738
|
Effect.flatMap(
|
|
@@ -716,8 +741,10 @@ const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices
|
|
|
716
741
|
): Effect.Effect<ResultSchema["Type"], FailureSchema["Type"] | ThreadStoreError> => {
|
|
717
742
|
if (response._tag === "PortFailed") {
|
|
718
743
|
const failure = response.failure;
|
|
744
|
+
|
|
719
745
|
if (isExpectedFailure(failure)) return Effect.fail(failure);
|
|
720
746
|
if (failure._tag === "ThreadStoreError") return Effect.fail(failure);
|
|
747
|
+
|
|
721
748
|
return Effect.fail(
|
|
722
749
|
ThreadStoreError.make({
|
|
723
750
|
operation,
|
|
@@ -730,6 +757,7 @@ const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices
|
|
|
730
757
|
);
|
|
731
758
|
}
|
|
732
759
|
const result = response.result;
|
|
760
|
+
|
|
733
761
|
if (!isExpectedResult(result)) {
|
|
734
762
|
return Effect.fail(
|
|
735
763
|
ThreadStoreError.make({
|
|
@@ -740,6 +768,7 @@ const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices
|
|
|
740
768
|
}),
|
|
741
769
|
);
|
|
742
770
|
}
|
|
771
|
+
|
|
743
772
|
return Effect.succeed(result);
|
|
744
773
|
},
|
|
745
774
|
),
|
|
@@ -885,6 +914,7 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
885
914
|
switch (request._tag) {
|
|
886
915
|
case "LedgerAdmit": {
|
|
887
916
|
const ledger = yield* SubmissionLedger;
|
|
917
|
+
|
|
888
918
|
return yield* capture(
|
|
889
919
|
ledger
|
|
890
920
|
.admit(request.request)
|
|
@@ -893,12 +923,14 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
893
923
|
}
|
|
894
924
|
case "LedgerMarkReady": {
|
|
895
925
|
const ledger = yield* SubmissionLedger;
|
|
926
|
+
|
|
896
927
|
return yield* capture(
|
|
897
928
|
ledger.markReady(request.request).pipe(Effect.map(() => LedgerMarkReadyResult.make({}))),
|
|
898
929
|
);
|
|
899
930
|
}
|
|
900
931
|
case "LedgerLookup": {
|
|
901
932
|
const ledger = yield* SubmissionLedger;
|
|
933
|
+
|
|
902
934
|
return yield* capture(
|
|
903
935
|
ledger
|
|
904
936
|
.lookup(request.request)
|
|
@@ -913,6 +945,7 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
913
945
|
}
|
|
914
946
|
case "LedgerResolveAdmission": {
|
|
915
947
|
const ledger = yield* SubmissionLedger;
|
|
948
|
+
|
|
916
949
|
return yield* capture(
|
|
917
950
|
ledger
|
|
918
951
|
.resolveAdmission(request.request)
|
|
@@ -921,6 +954,7 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
921
954
|
}
|
|
922
955
|
case "LedgerRequestAbort": {
|
|
923
956
|
const ledger = yield* SubmissionLedger;
|
|
957
|
+
|
|
924
958
|
return yield* capture(
|
|
925
959
|
ledger
|
|
926
960
|
.requestAbort(request.request)
|
|
@@ -929,6 +963,7 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
929
963
|
}
|
|
930
964
|
case "LedgerRecordChildSettled": {
|
|
931
965
|
const ledger = yield* SubmissionLedger;
|
|
966
|
+
|
|
932
967
|
return yield* capture(
|
|
933
968
|
ledger
|
|
934
969
|
.recordChildSettled(request.request)
|
|
@@ -937,12 +972,14 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
937
972
|
}
|
|
938
973
|
case "StoreMaterialize": {
|
|
939
974
|
const store = yield* ThreadStore;
|
|
975
|
+
|
|
940
976
|
return yield* capture(
|
|
941
977
|
store.materialize(request.request).pipe(Effect.map(() => StoreMaterializeResult.make({}))),
|
|
942
978
|
);
|
|
943
979
|
}
|
|
944
980
|
case "StoreAppend": {
|
|
945
981
|
const store = yield* ThreadStore;
|
|
982
|
+
|
|
946
983
|
return yield* capture(
|
|
947
984
|
store
|
|
948
985
|
.append(request.request)
|
|
@@ -951,6 +988,7 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
951
988
|
}
|
|
952
989
|
case "StoreReadPage": {
|
|
953
990
|
const store = yield* ThreadStore;
|
|
991
|
+
|
|
954
992
|
return yield* capture(
|
|
955
993
|
store.read(request.request).pipe(
|
|
956
994
|
Stream.runCollect,
|
|
@@ -960,6 +998,7 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
960
998
|
}
|
|
961
999
|
case "StoreInspectTail": {
|
|
962
1000
|
const store = yield* ThreadStore;
|
|
1001
|
+
|
|
963
1002
|
return yield* capture(
|
|
964
1003
|
store
|
|
965
1004
|
.inspectTail(request.request)
|
|
@@ -968,6 +1007,7 @@ export const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(
|
|
|
968
1007
|
}
|
|
969
1008
|
case "StoreExport": {
|
|
970
1009
|
const store = yield* ThreadStore;
|
|
1010
|
+
|
|
971
1011
|
return yield* capture(
|
|
972
1012
|
store
|
|
973
1013
|
.export(request.request)
|
|
@@ -1010,6 +1050,7 @@ export const handleEncodedPortRequest = Effect.fn("DoPortRouting.handleEncodedPo
|
|
|
1010
1050
|
),
|
|
1011
1051
|
),
|
|
1012
1052
|
);
|
|
1053
|
+
|
|
1013
1054
|
return yield* encodePortResponse(response).pipe(
|
|
1014
1055
|
Effect.catch((error) =>
|
|
1015
1056
|
Effect.succeed(
|