@effect-agent/platform-cloudflare 0.1.0-beta.49 → 0.1.0-beta.51
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/CloudflareBindings.d.mts +1 -0
- package/dist/CloudflareBindings.mjs.map +1 -1
- package/dist/CloudflareCodeMode.mjs +0 -7
- package/dist/CloudflareCodeMode.mjs.map +1 -1
- package/dist/CloudflareScheduling.mjs +36 -3
- package/dist/CloudflareScheduling.mjs.map +1 -1
- package/dist/CloudflareSubscriptions.d.mts +31 -4
- package/dist/CloudflareSubscriptions.mjs +170 -11
- package/dist/CloudflareSubscriptions.mjs.map +1 -1
- package/dist/CloudflareThreadClient.d.mts +150 -74
- package/dist/CloudflareThreadClient.mjs +18 -2
- package/dist/CloudflareThreadClient.mjs.map +1 -1
- package/dist/InteractiveBrowser.mjs +2 -1
- package/dist/InteractiveBrowser.mjs.map +1 -1
- package/dist/{ThreadObject-IrGuIO4a.mjs → ThreadObject-BY8axaWT.mjs} +11 -3
- package/dist/ThreadObject-BY8axaWT.mjs.map +1 -0
- package/dist/{ThreadObject-D-NmQZC0.d.mts → ThreadObject-sDr1JBCj.d.mts} +37 -32
- package/dist/ThreadObject.d.mts +1 -1
- package/dist/ThreadObject.mjs +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/prepared-admission-9rvlHI0y.mjs +71 -0
- package/dist/prepared-admission-9rvlHI0y.mjs.map +1 -0
- package/package.json +1 -1
- package/src/CloudflareBindings.ts +1 -0
- package/src/CloudflareCodeMode.ts +0 -12
- package/src/CloudflareScheduling.ts +52 -0
- package/src/CloudflareSubscriptions.ts +321 -8
- package/src/CloudflareThreadClient.ts +40 -0
- package/src/InteractiveBrowser.ts +3 -1
- package/src/ThreadObject.ts +27 -0
- package/src/internal/prepared-admission.ts +19 -0
- package/dist/ThreadObject-IrGuIO4a.mjs.map +0 -1
- package/dist/prepared-admission-DRBhl2Sp.mjs +0 -63
- package/dist/prepared-admission-DRBhl2Sp.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ThreadObjectNamespace } from "./CloudflareBindings.mjs";
|
|
2
|
-
import { Cause, Context, Effect, Layer, Schema } from "effect";
|
|
2
|
+
import { Cause, Context, Effect, Layer, Schema, Scope } from "effect";
|
|
3
3
|
import { DurableObject, DurableObjectAlarm, DurableObjectState as DurableObjectState$1, WorkerEnvironment } from "effect-cf";
|
|
4
4
|
import { SourcePartition, SubscriptionAuthorizer, SubscriptionLimits } from "@effect-agent/thread/Subscription";
|
|
5
5
|
import { DoSubscriptionAlarmControl } from "@effect-agent/storage-cloudflare/DoSubscriptionStore";
|
|
@@ -7,12 +7,37 @@ import { EventSources } from "@effect-agent/thread/EventSource";
|
|
|
7
7
|
import { SubscriptionInputBindings } from "@effect-agent/thread/SubscriptionInput";
|
|
8
8
|
import { SubscriptionDriver, SubscriptionIntake, Subscriptions } from "@effect-agent/thread/Subscriptions";
|
|
9
9
|
declare namespace CloudflareSubscriptions_d_exports {
|
|
10
|
-
export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmProtocolError, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionObjectClass, SubscriptionPartitionObjectInstance, SubscriptionPartitionObjectRpc, SubscriptionPartitionProtocolError, makeSubscriptionPartitionObjectClass, sourcePartitionName, validateCloudflareSubscriptionLimits };
|
|
10
|
+
export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmExtensionError, SubscriptionAlarmProtocolError, SubscriptionPartitionAlarmExtension, SubscriptionPartitionAlarmHandler, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionObjectClass, SubscriptionPartitionObjectInstance, SubscriptionPartitionObjectRpc, SubscriptionPartitionProtocolError, makeSubscriptionPartitionAlarmHandler, makeSubscriptionPartitionObjectClass, sourcePartitionName, validateCloudflareSubscriptionLimits };
|
|
11
11
|
}
|
|
12
12
|
declare const SubscriptionAlarmProtocolError_base: Schema.Class<SubscriptionAlarmProtocolError, Schema.TaggedStruct<"SubscriptionAlarmProtocolError", {
|
|
13
13
|
readonly message: Schema.String;
|
|
14
14
|
}>, Cause.YieldableError>;
|
|
15
15
|
declare class SubscriptionAlarmProtocolError extends SubscriptionAlarmProtocolError_base {}
|
|
16
|
+
declare const SubscriptionAlarmExtensionError_base: Schema.Class<SubscriptionAlarmExtensionError, Schema.TaggedStruct<"SubscriptionAlarmExtensionError", {
|
|
17
|
+
readonly code: Schema.NonEmptyString;
|
|
18
|
+
}>, Cause.YieldableError>;
|
|
19
|
+
/** Bounded host diagnostic; credentials and provider responses do not belong in alarm failures. */
|
|
20
|
+
declare class SubscriptionAlarmExtensionError extends SubscriptionAlarmExtensionError_base {}
|
|
21
|
+
interface SubscriptionPartitionAlarmHandler {
|
|
22
|
+
readonly tag: string;
|
|
23
|
+
readonly handle: (event: DurableObjectAlarm.DurableObjectAlarmEvent) => Effect.Effect<void, SubscriptionAlarmProtocolError | SubscriptionAlarmExtensionError>;
|
|
24
|
+
}
|
|
25
|
+
/** Host-only handlers; the framework reserves its namespace and rejects every unknown tag. */
|
|
26
|
+
declare const SubscriptionPartitionAlarmExtension: Context.Reference<{
|
|
27
|
+
readonly handlers: ReadonlyArray<SubscriptionPartitionAlarmHandler>;
|
|
28
|
+
}>;
|
|
29
|
+
/** Capture host services once; each invocation owns its codec/handler Scope and timeout.
|
|
30
|
+
* Callback failures stay typed. Defects and interruption reach the native alarm multiplexer.
|
|
31
|
+
* The host owns durable idempotency, prearming and external-effect uncertainty.
|
|
32
|
+
*/
|
|
33
|
+
declare const makeSubscriptionPartitionAlarmHandler: <Payload extends Schema.Top, R>(options: {
|
|
34
|
+
readonly tag: string;
|
|
35
|
+
readonly payload: Payload;
|
|
36
|
+
readonly timeoutMillis: number;
|
|
37
|
+
readonly handle: (event: Omit<DurableObjectAlarm.DurableObjectAlarmEvent, "payload"> & {
|
|
38
|
+
readonly payload: Payload["Type"];
|
|
39
|
+
}) => Effect.Effect<void, SubscriptionAlarmExtensionError, R>;
|
|
40
|
+
}) => Effect.Effect<SubscriptionPartitionAlarmHandler, SubscriptionAlarmProtocolError, Exclude<R, Scope.Scope> | Exclude<Payload["DecodingServices"], Scope.Scope>>;
|
|
16
41
|
declare const SubscriptionPartitionProtocolError_base: Schema.Class<SubscriptionPartitionProtocolError, Schema.TaggedStruct<"SubscriptionPartitionProtocolError", {
|
|
17
42
|
readonly message: Schema.String;
|
|
18
43
|
}>, Cause.YieldableError>;
|
|
@@ -22,7 +47,9 @@ declare const CloudflareSubscriptionConfigError_base: Schema.Class<CloudflareSub
|
|
|
22
47
|
}>, Cause.YieldableError>;
|
|
23
48
|
declare class CloudflareSubscriptionConfigError extends CloudflareSubscriptionConfigError_base {}
|
|
24
49
|
/** Reject limits whose four bounded phases could exceed the safe Durable Object alarm budget. */
|
|
25
|
-
declare const validateCloudflareSubscriptionLimits: (limits: SubscriptionLimits
|
|
50
|
+
declare const validateCloudflareSubscriptionLimits: (limits: SubscriptionLimits, options?: {
|
|
51
|
+
readonly ancillaryAlarms?: boolean;
|
|
52
|
+
}) => Effect.Effect<void, CloudflareSubscriptionConfigError>;
|
|
26
53
|
declare const sourcePartitionName: (partition: SourcePartition) => string;
|
|
27
54
|
interface SubscriptionPartitionObjectRpc extends Rpc.DurableObjectBranded {
|
|
28
55
|
subscription(encoded: unknown): Promise<unknown>;
|
|
@@ -53,5 +80,5 @@ interface SubscriptionPartitionObjectClass {
|
|
|
53
80
|
*/
|
|
54
81
|
declare const makeSubscriptionPartitionObjectClass: <E>(host: Layer.Layer<SubscriptionAuthorizer | EventSources | SubscriptionInputBindings | ThreadObjectNamespace, E, DurableObjectState$1.DurableObjectState | WorkerEnvironment | SubscriptionPartitionIdentity>, limits?: SubscriptionLimits) => SubscriptionPartitionObjectClass;
|
|
55
82
|
//#endregion
|
|
56
|
-
export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmProtocolError, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionObjectClass, SubscriptionPartitionObjectInstance, SubscriptionPartitionObjectRpc, SubscriptionPartitionProtocolError, makeSubscriptionPartitionObjectClass, sourcePartitionName, CloudflareSubscriptions_d_exports as t, validateCloudflareSubscriptionLimits };
|
|
83
|
+
export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmExtensionError, SubscriptionAlarmProtocolError, SubscriptionPartitionAlarmExtension, SubscriptionPartitionAlarmHandler, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionObjectClass, SubscriptionPartitionObjectInstance, SubscriptionPartitionObjectRpc, SubscriptionPartitionProtocolError, makeSubscriptionPartitionAlarmHandler, makeSubscriptionPartitionObjectClass, sourcePartitionName, CloudflareSubscriptions_d_exports as t, validateCloudflareSubscriptionLimits };
|
|
57
84
|
//# sourceMappingURL=CloudflareSubscriptions.d.mts.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
2
|
import { CloudflareThreadClient } from "./CloudflareThreadClient.mjs";
|
|
3
|
-
import { t as cloudflarePreparedInputAdmissionLayer } from "./prepared-admission-
|
|
3
|
+
import { t as cloudflarePreparedInputAdmissionLayer } from "./prepared-admission-9rvlHI0y.mjs";
|
|
4
4
|
import { Principal } from "@effect-agent/thread/SubmissionLedger";
|
|
5
5
|
import { Cause, Clock, Context, DateTime, Effect, Layer, Schema } from "effect";
|
|
6
6
|
import { PersistedJson } from "@effect-agent/thread/Records";
|
|
7
7
|
import { DurableObject, DurableObjectAlarm, DurableObjectState } from "effect-cf";
|
|
8
8
|
import { BrowserCrypto } from "@effect/platform-browser";
|
|
9
9
|
import { SqliteClient } from "@effect/sql-sqlite-do";
|
|
10
|
-
import { EventAcknowledgement, EventSourceVersion, SourcePartition, SubscriptionConfiguration, SubscriptionDeliverySnapshot, SubscriptionError, SubscriptionFailpointError, SubscriptionKey, SubscriptionScope, SubscriptionSnapshot, SubscriptionSourceError, defaultSubscriptionLimits } from "@effect-agent/thread/Subscription";
|
|
10
|
+
import { EventAcknowledgement, EventSourceVersion, SourcePartition, SubscriptionConfiguration, SubscriptionDeliveryKey, SubscriptionDeliverySnapshot, SubscriptionError, SubscriptionFailpointError, SubscriptionKey, SubscriptionScope, SubscriptionSnapshot, SubscriptionSourceError, defaultSubscriptionLimits } from "@effect-agent/thread/Subscription";
|
|
11
11
|
import { DoSubscriptionAlarmControl, DoSubscriptionTransaction, doSubscriptionStoreLayer } from "@effect-agent/storage-cloudflare/DoSubscriptionStore";
|
|
12
12
|
import "@effect-agent/thread/EventSource";
|
|
13
13
|
import "@effect-agent/thread/SubscriptionInput";
|
|
@@ -16,10 +16,13 @@ import { SubscriptionDriver, SubscriptionIntake, Subscriptions } from "@effect-a
|
|
|
16
16
|
var CloudflareSubscriptions_exports = /* @__PURE__ */ __exportAll({
|
|
17
17
|
CloudflareSubscriptionConfigError: () => CloudflareSubscriptionConfigError,
|
|
18
18
|
CloudflareSubscriptionsClient: () => CloudflareSubscriptionsClient,
|
|
19
|
+
SubscriptionAlarmExtensionError: () => SubscriptionAlarmExtensionError,
|
|
19
20
|
SubscriptionAlarmProtocolError: () => SubscriptionAlarmProtocolError,
|
|
21
|
+
SubscriptionPartitionAlarmExtension: () => SubscriptionPartitionAlarmExtension,
|
|
20
22
|
SubscriptionPartitionIdentity: () => SubscriptionPartitionIdentity,
|
|
21
23
|
SubscriptionPartitionNamespace: () => SubscriptionPartitionNamespace,
|
|
22
24
|
SubscriptionPartitionProtocolError: () => SubscriptionPartitionProtocolError,
|
|
25
|
+
makeSubscriptionPartitionAlarmHandler: () => makeSubscriptionPartitionAlarmHandler,
|
|
23
26
|
makeSubscriptionPartitionObjectClass: () => makeSubscriptionPartitionObjectClass,
|
|
24
27
|
sourcePartitionName: () => sourcePartitionName,
|
|
25
28
|
validateCloudflareSubscriptionLimits: () => validateCloudflareSubscriptionLimits
|
|
@@ -27,16 +30,41 @@ var CloudflareSubscriptions_exports = /* @__PURE__ */ __exportAll({
|
|
|
27
30
|
const SUBSCRIPTION_ALARM_TAG = "effect-agent/SubscriptionPartitionWake";
|
|
28
31
|
const SUBSCRIPTION_ALARM_ID = "driver";
|
|
29
32
|
const MAX_ALARM_WALL_MILLIS = 72e4;
|
|
33
|
+
const MAX_ALARMS_PER_INVOCATION = 16;
|
|
34
|
+
const MAX_ANCILLARY_ALARM_MILLIS = 3e4;
|
|
30
35
|
const SubscriptionAlarmPayload = Schema.Struct({
|
|
31
36
|
schemaVersion: Schema.Literal(1),
|
|
32
37
|
generation: Schema.Int.check(Schema.isGreaterThan(0))
|
|
33
38
|
});
|
|
34
39
|
var SubscriptionAlarmProtocolError = class extends Schema.TaggedError()("SubscriptionAlarmProtocolError", { message: Schema.String }) {};
|
|
40
|
+
/** Bounded host diagnostic; credentials and provider responses do not belong in alarm failures. */
|
|
41
|
+
var SubscriptionAlarmExtensionError = class extends Schema.TaggedError()("SubscriptionAlarmExtensionError", { code: Schema.NonEmptyString.check(Schema.isMaxLength(128)) }) {};
|
|
42
|
+
/** Host-only handlers; the framework reserves its namespace and rejects every unknown tag. */
|
|
43
|
+
const SubscriptionPartitionAlarmExtension = Context.Reference("@effect-agent/platform-cloudflare/SubscriptionPartitionAlarmExtension", { defaultValue: () => ({ handlers: [] }) });
|
|
44
|
+
/** Capture host services once; each invocation owns its codec/handler Scope and timeout.
|
|
45
|
+
* Callback failures stay typed. Defects and interruption reach the native alarm multiplexer.
|
|
46
|
+
* The host owns durable idempotency, prearming and external-effect uncertainty.
|
|
47
|
+
*/
|
|
48
|
+
const makeSubscriptionPartitionAlarmHandler = Effect.fn("makeSubscriptionPartitionAlarmHandler")(function* (options) {
|
|
49
|
+
if (options.tag.length === 0 || options.tag.length > 128 || options.tag.startsWith("effect-agent/") || !Number.isSafeInteger(options.timeoutMillis) || options.timeoutMillis < 1 || options.timeoutMillis > MAX_ANCILLARY_ALARM_MILLIS) return yield* SubscriptionAlarmProtocolError.make({ message: "Invalid ancillary alarm tag or timeout" });
|
|
50
|
+
const services = yield* Effect.context();
|
|
51
|
+
return {
|
|
52
|
+
tag: options.tag,
|
|
53
|
+
handle: (event) => Effect.gen(function* () {
|
|
54
|
+
if (event.tag !== options.tag) return yield* SubscriptionAlarmProtocolError.make({ message: "Ancillary alarm tag mismatch" });
|
|
55
|
+
const payload = yield* Schema.decodeUnknownEffect(options.payload)(event.payload).pipe(Effect.mapError(() => SubscriptionAlarmProtocolError.make({ message: "Invalid ancillary alarm payload" })));
|
|
56
|
+
yield* options.handle({
|
|
57
|
+
...event,
|
|
58
|
+
payload
|
|
59
|
+
});
|
|
60
|
+
}).pipe(Effect.scoped, Effect.timeout(options.timeoutMillis), Effect.catchTag("TimeoutError", () => SubscriptionAlarmExtensionError.make({ code: "timeout" })), Effect.provideContext(services))
|
|
61
|
+
};
|
|
62
|
+
});
|
|
35
63
|
var SubscriptionPartitionProtocolError = class extends Schema.TaggedError()("SubscriptionPartitionProtocolError", { message: Schema.String.check(Schema.isMaxLength(4096)) }) {};
|
|
36
64
|
var CloudflareSubscriptionConfigError = class extends Schema.TaggedError()("CloudflareSubscriptionConfigError", { message: Schema.String }) {};
|
|
37
65
|
/** Reject limits whose four bounded phases could exceed the safe Durable Object alarm budget. */
|
|
38
|
-
const validateCloudflareSubscriptionLimits = (limits) => {
|
|
39
|
-
return 4 * Math.ceil(limits.batchSize / limits.concurrency) * limits.operationTimeoutMillis <= MAX_ALARM_WALL_MILLIS ? Effect.void : Effect.fail(CloudflareSubscriptionConfigError.make({ message: "Subscription limits can exceed the bounded Durable Object alarm wall budget" }));
|
|
66
|
+
const validateCloudflareSubscriptionLimits = (limits, options = {}) => {
|
|
67
|
+
return 4 * Math.ceil(limits.batchSize / limits.concurrency) * limits.operationTimeoutMillis + (options.ancillaryAlarms === true ? MAX_ALARMS_PER_INVOCATION * MAX_ANCILLARY_ALARM_MILLIS : 0) <= MAX_ALARM_WALL_MILLIS ? Effect.void : Effect.fail(CloudflareSubscriptionConfigError.make({ message: "Subscription limits can exceed the bounded Durable Object alarm wall budget" }));
|
|
40
68
|
};
|
|
41
69
|
const protocolMessage = (message) => message.length <= 4096 ? message : `${message.slice(0, 4093)}...`;
|
|
42
70
|
const SubscribeRequest = Schema.TaggedStruct("Subscribe", {
|
|
@@ -48,13 +76,33 @@ const SubscribeRequest = Schema.TaggedStruct("Subscribe", {
|
|
|
48
76
|
parameters: PersistedJson,
|
|
49
77
|
context: PersistedJson,
|
|
50
78
|
mode: Schema.Literals(["once", "continuous"]),
|
|
51
|
-
expiresAtMillis: Schema.Number,
|
|
79
|
+
expiresAtMillis: Schema.NullOr(Schema.Number),
|
|
52
80
|
destination: SubscriptionConfiguration.fields.destination,
|
|
53
81
|
deliveryPrincipal: SubscriptionConfiguration.fields.deliveryPrincipal,
|
|
82
|
+
admissionGroup: SubscriptionConfiguration.fields.admissionGroup,
|
|
83
|
+
admissionFence: SubscriptionConfiguration.fields.admissionFence,
|
|
54
84
|
agentId: SubscriptionConfiguration.fields.agentId,
|
|
55
85
|
definitions: SubscriptionConfiguration.fields.definitions
|
|
56
86
|
})
|
|
57
87
|
});
|
|
88
|
+
const UpdateSubscriptionRequest = Schema.TaggedStruct("UpdateSubscription", {
|
|
89
|
+
schemaVersion: Schema.Literal(1),
|
|
90
|
+
scope: SubscribeRequest.fields.scope,
|
|
91
|
+
key: SubscriptionKey,
|
|
92
|
+
expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),
|
|
93
|
+
options: SubscribeRequest.fields.options.mapFields(({ subscriptionId: _, ...fields }) => fields)
|
|
94
|
+
});
|
|
95
|
+
const SubscriptionStateRequest = Schema.Struct({
|
|
96
|
+
_tag: Schema.Literals([
|
|
97
|
+
"PauseSubscription",
|
|
98
|
+
"ResumeSubscription",
|
|
99
|
+
"RecoverSubscription"
|
|
100
|
+
]),
|
|
101
|
+
schemaVersion: Schema.Literal(1),
|
|
102
|
+
scope: SubscribeRequest.fields.scope,
|
|
103
|
+
key: SubscriptionKey,
|
|
104
|
+
expectedRevision: Schema.Int.check(Schema.isGreaterThan(0))
|
|
105
|
+
});
|
|
58
106
|
const ListSubscriptionsRequest = Schema.TaggedStruct("ListSubscriptions", {
|
|
59
107
|
schemaVersion: Schema.Literal(1),
|
|
60
108
|
scope: SubscribeRequest.fields.scope,
|
|
@@ -62,10 +110,22 @@ const ListSubscriptionsRequest = Schema.TaggedStruct("ListSubscriptions", {
|
|
|
62
110
|
limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0)))
|
|
63
111
|
});
|
|
64
112
|
const CancelSubscriptionRequest = Schema.TaggedStruct("CancelSubscription", {
|
|
113
|
+
expectedRevision: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),
|
|
65
114
|
schemaVersion: Schema.Literal(1),
|
|
66
115
|
scope: SubscribeRequest.fields.scope,
|
|
67
116
|
key: SubscriptionKey
|
|
68
117
|
});
|
|
118
|
+
const GetSubscriptionRequest = Schema.TaggedStruct("GetSubscription", {
|
|
119
|
+
schemaVersion: Schema.Literal(1),
|
|
120
|
+
scope: SubscriptionScope,
|
|
121
|
+
key: SubscriptionKey
|
|
122
|
+
});
|
|
123
|
+
const RecoverDeliveryRequest = Schema.TaggedStruct("RecoverDelivery", {
|
|
124
|
+
expectedGeneration: Schema.Natural,
|
|
125
|
+
schemaVersion: Schema.Literal(1),
|
|
126
|
+
scope: SubscribeRequest.fields.scope,
|
|
127
|
+
key: SubscriptionDeliveryKey
|
|
128
|
+
});
|
|
69
129
|
const ListDeliveriesRequest = Schema.TaggedStruct("ListDeliveries", {
|
|
70
130
|
schemaVersion: Schema.Literal(1),
|
|
71
131
|
scope: SubscribeRequest.fields.scope,
|
|
@@ -89,9 +149,13 @@ const StatusRequest = Schema.TaggedStruct("Status", {
|
|
|
89
149
|
});
|
|
90
150
|
const SubscriptionPartitionRequest = Schema.Union([
|
|
91
151
|
SubscribeRequest,
|
|
152
|
+
GetSubscriptionRequest,
|
|
153
|
+
UpdateSubscriptionRequest,
|
|
154
|
+
SubscriptionStateRequest,
|
|
92
155
|
ListSubscriptionsRequest,
|
|
93
156
|
CancelSubscriptionRequest,
|
|
94
157
|
ListDeliveriesRequest,
|
|
158
|
+
RecoverDeliveryRequest,
|
|
95
159
|
AcceptRequest,
|
|
96
160
|
StatusRequest
|
|
97
161
|
]);
|
|
@@ -119,6 +183,7 @@ const SubscriptionPartitionResponse = Schema.Union([
|
|
|
119
183
|
Schema.TaggedStruct("Snapshot", { value: SubscriptionSnapshot }),
|
|
120
184
|
Schema.TaggedStruct("SubscriptionPage", { value: SubscriptionPage }),
|
|
121
185
|
Schema.TaggedStruct("DeliveryPage", { value: DeliveryPage }),
|
|
186
|
+
Schema.TaggedStruct("DeliverySnapshot", { value: SubscriptionDeliverySnapshot }),
|
|
122
187
|
Schema.TaggedStruct("Acknowledgement", { value: EventAcknowledgement }),
|
|
123
188
|
Schema.TaggedStruct("Status", { value: IntakeStatus }),
|
|
124
189
|
Schema.TaggedStruct("Failed", { failure: SubscriptionPartitionFailure })
|
|
@@ -160,7 +225,58 @@ var CloudflareSubscriptionsClient = class {
|
|
|
160
225
|
});
|
|
161
226
|
const failed = (response) => response._tag === "Failed" ? response.failure : SubscriptionPartitionProtocolError.make({ message: "Unexpected subscription response" });
|
|
162
227
|
const asProtocolError = () => corruptFailure("subscription-partition-protocol");
|
|
228
|
+
const changeState = Effect.fn("CloudflareSubscriptions.changeState")(function* (scope, key, expectedRevision, _tag) {
|
|
229
|
+
const response = yield* call(scope.partition, {
|
|
230
|
+
_tag,
|
|
231
|
+
schemaVersion: 1,
|
|
232
|
+
scope,
|
|
233
|
+
key,
|
|
234
|
+
expectedRevision
|
|
235
|
+
});
|
|
236
|
+
if (response._tag === "Snapshot") return response.value;
|
|
237
|
+
const failure = failed(response);
|
|
238
|
+
return yield* failure._tag === "SubscriptionError" || failure._tag === "SubscriptionFailpointError" ? failure : asProtocolError();
|
|
239
|
+
});
|
|
163
240
|
const subscriptions = Subscriptions.of({
|
|
241
|
+
recoverSubscription: (scope, key, revision) => changeState(scope, key, revision, "RecoverSubscription"),
|
|
242
|
+
getSubscription: (scope, key) => Effect.gen(function* () {
|
|
243
|
+
const response = yield* call(scope.partition, {
|
|
244
|
+
_tag: "GetSubscription",
|
|
245
|
+
schemaVersion: 1,
|
|
246
|
+
scope,
|
|
247
|
+
key
|
|
248
|
+
});
|
|
249
|
+
if (response._tag === "Snapshot") return response.value;
|
|
250
|
+
const failure = failed(response);
|
|
251
|
+
return yield* failure._tag === "SubscriptionError" ? failure : asProtocolError();
|
|
252
|
+
}),
|
|
253
|
+
recoverDelivery: (scope, key, expectedGeneration) => Effect.gen(function* () {
|
|
254
|
+
const response = yield* call(scope.partition, {
|
|
255
|
+
_tag: "RecoverDelivery",
|
|
256
|
+
expectedGeneration,
|
|
257
|
+
schemaVersion: 1,
|
|
258
|
+
scope,
|
|
259
|
+
key
|
|
260
|
+
});
|
|
261
|
+
if (response._tag === "DeliverySnapshot") return response.value;
|
|
262
|
+
const failure = failed(response);
|
|
263
|
+
return yield* failure._tag === "SubscriptionError" || failure._tag === "SubscriptionFailpointError" ? failure : asProtocolError();
|
|
264
|
+
}),
|
|
265
|
+
updateSubscription: (scope, key, expectedRevision, options) => Effect.gen(function* () {
|
|
266
|
+
const response = yield* call(scope.partition, {
|
|
267
|
+
_tag: "UpdateSubscription",
|
|
268
|
+
schemaVersion: 1,
|
|
269
|
+
scope,
|
|
270
|
+
key,
|
|
271
|
+
expectedRevision,
|
|
272
|
+
options
|
|
273
|
+
});
|
|
274
|
+
if (response._tag === "Snapshot") return response.value;
|
|
275
|
+
const failure = failed(response);
|
|
276
|
+
return yield* failure._tag === "SubscriptionError" || failure._tag === "SubscriptionFailpointError" || failure._tag === "SubscriptionSourceError" ? failure : asProtocolError();
|
|
277
|
+
}),
|
|
278
|
+
pauseSubscription: (scope, key, revision) => changeState(scope, key, revision, "PauseSubscription"),
|
|
279
|
+
resumeSubscription: (scope, key, revision) => changeState(scope, key, revision, "ResumeSubscription"),
|
|
164
280
|
subscribe: (scope, options) => Effect.gen(function* () {
|
|
165
281
|
const response = yield* call(scope.partition, {
|
|
166
282
|
_tag: "Subscribe",
|
|
@@ -185,9 +301,10 @@ var CloudflareSubscriptionsClient = class {
|
|
|
185
301
|
const failure = failed(response);
|
|
186
302
|
return yield* failure._tag === "SubscriptionError" ? failure : asProtocolError();
|
|
187
303
|
}),
|
|
188
|
-
cancelSubscription: (scope, key) => Effect.gen(function* () {
|
|
304
|
+
cancelSubscription: (scope, key, expectedRevision) => Effect.gen(function* () {
|
|
189
305
|
const response = yield* call(scope.partition, {
|
|
190
306
|
_tag: "CancelSubscription",
|
|
307
|
+
...expectedRevision === void 0 ? {} : { expectedRevision },
|
|
191
308
|
schemaVersion: 1,
|
|
192
309
|
scope,
|
|
193
310
|
key
|
|
@@ -269,17 +386,41 @@ const handleRequest = Effect.fn("SubscriptionPartition.handleRequest")(function*
|
|
|
269
386
|
const intake = yield* SubscriptionIntake;
|
|
270
387
|
const response = yield* Effect.gen(function* () {
|
|
271
388
|
switch (request._tag) {
|
|
389
|
+
case "GetSubscription": return {
|
|
390
|
+
_tag: "Snapshot",
|
|
391
|
+
value: yield* subscriptions.getSubscription(request.scope, request.key)
|
|
392
|
+
};
|
|
272
393
|
case "Subscribe": return {
|
|
273
394
|
_tag: "Snapshot",
|
|
274
395
|
value: yield* subscriptions.subscribe(request.scope, request.options)
|
|
275
396
|
};
|
|
397
|
+
case "UpdateSubscription": return {
|
|
398
|
+
_tag: "Snapshot",
|
|
399
|
+
value: yield* subscriptions.updateSubscription(request.scope, request.key, request.expectedRevision, request.options)
|
|
400
|
+
};
|
|
401
|
+
case "RecoverSubscription": return {
|
|
402
|
+
_tag: "Snapshot",
|
|
403
|
+
value: yield* subscriptions.recoverSubscription(request.scope, request.key, request.expectedRevision)
|
|
404
|
+
};
|
|
405
|
+
case "PauseSubscription": return {
|
|
406
|
+
_tag: "Snapshot",
|
|
407
|
+
value: yield* subscriptions.pauseSubscription(request.scope, request.key, request.expectedRevision)
|
|
408
|
+
};
|
|
409
|
+
case "ResumeSubscription": return {
|
|
410
|
+
_tag: "Snapshot",
|
|
411
|
+
value: yield* subscriptions.resumeSubscription(request.scope, request.key, request.expectedRevision)
|
|
412
|
+
};
|
|
276
413
|
case "ListSubscriptions": return {
|
|
277
414
|
_tag: "SubscriptionPage",
|
|
278
415
|
value: yield* subscriptions.listSubscriptions(request.scope, request.after, request.limit)
|
|
279
416
|
};
|
|
280
417
|
case "CancelSubscription": return {
|
|
281
418
|
_tag: "Snapshot",
|
|
282
|
-
value: yield* subscriptions.cancelSubscription(request.scope, request.key)
|
|
419
|
+
value: yield* subscriptions.cancelSubscription(request.scope, request.key, request.expectedRevision)
|
|
420
|
+
};
|
|
421
|
+
case "RecoverDelivery": return {
|
|
422
|
+
_tag: "DeliverySnapshot",
|
|
423
|
+
value: yield* subscriptions.recoverDelivery(request.scope, request.key, request.expectedGeneration)
|
|
283
424
|
};
|
|
284
425
|
case "ListDeliveries": return {
|
|
285
426
|
_tag: "DeliveryPage",
|
|
@@ -320,14 +461,26 @@ const transactionLayer = Layer.effect(DoSubscriptionTransaction, Effect.gen(func
|
|
|
320
461
|
}) });
|
|
321
462
|
}));
|
|
322
463
|
const alarmHandler = (limits) => DurableObjectAlarm.processDue((event) => Effect.gen(function* () {
|
|
323
|
-
if (event.tag !== SUBSCRIPTION_ALARM_TAG
|
|
464
|
+
if (event.tag !== SUBSCRIPTION_ALARM_TAG) {
|
|
465
|
+
const { handlers } = yield* SubscriptionPartitionAlarmExtension;
|
|
466
|
+
const matches = handlers.filter((handler) => handler.tag === event.tag);
|
|
467
|
+
const handler = matches[0];
|
|
468
|
+
if (event.tag.startsWith("effect-agent/") || matches.length !== 1 || handler === void 0) return yield* SubscriptionAlarmProtocolError.make({ message: "Unknown or ambiguous ancillary alarm tag" });
|
|
469
|
+
return yield* handler.handle(event).pipe(Effect.scoped, Effect.timeout(MAX_ANCILLARY_ALARM_MILLIS), Effect.catchTag("TimeoutError", () => SubscriptionAlarmExtensionError.make({ code: "timeout" })));
|
|
470
|
+
}
|
|
471
|
+
if (event.id !== SUBSCRIPTION_ALARM_ID) return yield* SubscriptionAlarmProtocolError.make({ message: `Unsupported Subscription Partition alarm ${event.tag}/${event.id}` });
|
|
324
472
|
yield* Schema.decodeUnknownEffect(SubscriptionAlarmPayload)(event.payload).pipe(Effect.mapError(() => SubscriptionAlarmProtocolError.make({ message: "Unsupported subscription alarm payload" })));
|
|
325
473
|
const driver = yield* SubscriptionDriver;
|
|
326
474
|
const alarmControl = yield* DoSubscriptionAlarmControl;
|
|
327
475
|
yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);
|
|
328
476
|
if ((yield* driver.runDue.pipe(Effect.catchCause((cause) => Cause.hasInterrupts(cause) ? Effect.failCause(cause) : Clock.currentTimeMillis.pipe(Effect.flatMap((time) => alarmControl.prearm(time + limits.retryMillis)), Effect.andThen(Effect.failCause(cause)))))).failed > 0) yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);
|
|
329
477
|
else yield* alarmControl.reconcile;
|
|
330
|
-
}), {
|
|
478
|
+
}), {
|
|
479
|
+
mode: "isolated",
|
|
480
|
+
limit: MAX_ALARMS_PER_INVOCATION,
|
|
481
|
+
retryFailedAfter: limits.retryMillis,
|
|
482
|
+
onFailure: () => Effect.logWarning("Subscription partition alarm retained for retry")
|
|
483
|
+
}).pipe(Effect.asVoid);
|
|
331
484
|
/**
|
|
332
485
|
* Build one source-addressed SQLite Durable Object. The host Layer binds the permitted source
|
|
333
486
|
* catalog and authority. It must not retain cleanup-scoped resources across RPC events.
|
|
@@ -340,7 +493,13 @@ const makeSubscriptionPartitionObjectClass = (host, limits = defaultSubscription
|
|
|
340
493
|
}));
|
|
341
494
|
const sqlLayer = Layer.unwrap(Effect.map(DurableObjectState.DurableObjectState, (state) => SqliteClient.layer({ storage: state.raw.storage })));
|
|
342
495
|
const partitionStore = Layer.unwrap(Effect.map(SubscriptionPartitionIdentity, ({ partition }) => doSubscriptionStoreLayer(partition).pipe(Layer.provide(transactionLayer), Layer.provide(sqlLayer))));
|
|
343
|
-
const application = Layer.mergeAll(Subscriptions.layer(limits), SubscriptionIntake.layer(limits), SubscriptionDriver.layer(limits), cloudflareLimitsLayer
|
|
496
|
+
const application = Layer.mergeAll(Subscriptions.layer(limits), SubscriptionIntake.layer(limits), SubscriptionDriver.layer(limits), cloudflareLimitsLayer, Layer.effect(SubscriptionPartitionAlarmExtension, Effect.gen(function* () {
|
|
497
|
+
const extension = yield* SubscriptionPartitionAlarmExtension;
|
|
498
|
+
const tags = extension.handlers.map((handler) => handler.tag);
|
|
499
|
+
if (tags.length > MAX_ALARMS_PER_INVOCATION || new Set(tags).size !== tags.length || tags.some((tag) => tag.length === 0 || tag.length > 128 || tag.startsWith("effect-agent/"))) return yield* SubscriptionAlarmProtocolError.make({ message: "Invalid ancillary alarm handler registry" });
|
|
500
|
+
yield* validateCloudflareSubscriptionLimits(limits, { ancillaryAlarms: tags.length > 0 });
|
|
501
|
+
return extension;
|
|
502
|
+
}))).pipe(Layer.provideMerge(partitionStore), Layer.provide(cloudflarePreparedInputAdmissionLayer.pipe(Layer.provide(CloudflareThreadClient.layer))), Layer.provide(BrowserCrypto.layer), Layer.provideMerge(DurableObjectAlarm.DurableObjectAlarm.layer), Layer.provide(host), Layer.provideMerge(identityLayer));
|
|
344
503
|
const runtime = Layer.effectContext(Effect.gen(function* () {
|
|
345
504
|
const state = yield* DurableObjectState.DurableObjectState;
|
|
346
505
|
const scope = yield* Effect.scope;
|
|
@@ -359,6 +518,6 @@ const makeSubscriptionPartitionObjectClass = (host, limits = defaultSubscription
|
|
|
359
518
|
return SubscriptionPartitionObject;
|
|
360
519
|
};
|
|
361
520
|
//#endregion
|
|
362
|
-
export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmProtocolError, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionProtocolError, makeSubscriptionPartitionObjectClass, sourcePartitionName, CloudflareSubscriptions_exports as t, validateCloudflareSubscriptionLimits };
|
|
521
|
+
export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmExtensionError, SubscriptionAlarmProtocolError, SubscriptionPartitionAlarmExtension, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionProtocolError, makeSubscriptionPartitionAlarmHandler, makeSubscriptionPartitionObjectClass, sourcePartitionName, CloudflareSubscriptions_exports as t, validateCloudflareSubscriptionLimits };
|
|
363
522
|
|
|
364
523
|
//# sourceMappingURL=CloudflareSubscriptions.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareSubscriptions.mjs","names":["EffectCfDurableObjectState","EffectCfDurableObject"],"sources":["../src/CloudflareSubscriptions.ts"],"sourcesContent":["import {\n DoSubscriptionAlarmControl,\n DoSubscriptionTransaction,\n doSubscriptionStoreLayer,\n} from \"@effect-agent/storage-cloudflare/DoSubscriptionStore\";\nimport { type EventSources } from \"@effect-agent/thread/EventSource\";\nimport { PersistedJson } from \"@effect-agent/thread/Records\";\nimport { Principal } from \"@effect-agent/thread/SubmissionLedger\";\nimport {\n EventAcknowledgement,\n EventSourceVersion,\n SourcePartition,\n type SubscriptionAuthorizer,\n SubscriptionConfiguration,\n SubscriptionDeliverySnapshot,\n SubscriptionError,\n SubscriptionFailpointError,\n SubscriptionKey,\n SubscriptionScope,\n type SubscriptionLimits,\n SubscriptionSnapshot,\n SubscriptionSourceError,\n defaultSubscriptionLimits,\n} from \"@effect-agent/thread/Subscription\";\nimport { type SubscriptionInputBindings } from \"@effect-agent/thread/SubscriptionInput\";\nimport {\n SubscriptionDriver,\n SubscriptionIntake,\n Subscriptions,\n} from \"@effect-agent/thread/Subscriptions\";\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport { Cause, Clock, Context, DateTime, Effect, Layer, Schema } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectAlarm,\n DurableObjectState as EffectCfDurableObjectState,\n type WorkerEnvironment,\n} from \"effect-cf\";\n\nimport { type ThreadObjectNamespace } from \"./CloudflareBindings.ts\";\nimport { CloudflareThreadClient } from \"./CloudflareThreadClient.ts\";\nimport { cloudflarePreparedInputAdmissionLayer } from \"./internal/prepared-admission.ts\";\n\nconst SUBSCRIPTION_ALARM_TAG = \"effect-agent/SubscriptionPartitionWake\";\nconst SUBSCRIPTION_ALARM_ID = \"driver\";\nconst MAX_ALARM_WALL_MILLIS = 12 * 60_000;\n\nconst SubscriptionAlarmPayload = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n generation: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nexport class SubscriptionAlarmProtocolError extends Schema.TaggedError<SubscriptionAlarmProtocolError>()(\n \"SubscriptionAlarmProtocolError\",\n { message: Schema.String },\n) {}\n\nexport class SubscriptionPartitionProtocolError extends Schema.TaggedError<SubscriptionPartitionProtocolError>()(\n \"SubscriptionPartitionProtocolError\",\n { message: Schema.String.check(Schema.isMaxLength(4_096)) },\n) {}\n\nexport class CloudflareSubscriptionConfigError extends Schema.TaggedError<CloudflareSubscriptionConfigError>()(\n \"CloudflareSubscriptionConfigError\",\n { message: Schema.String },\n) {}\n\n/** Reject limits whose four bounded phases could exceed the safe Durable Object alarm budget. */\nexport const validateCloudflareSubscriptionLimits = (\n limits: SubscriptionLimits,\n): Effect.Effect<void, CloudflareSubscriptionConfigError> => {\n const worstCaseMillis =\n 4 * Math.ceil(limits.batchSize / limits.concurrency) * limits.operationTimeoutMillis;\n\n return worstCaseMillis <= MAX_ALARM_WALL_MILLIS\n ? Effect.void\n : Effect.fail(\n CloudflareSubscriptionConfigError.make({\n message: \"Subscription limits can exceed the bounded Durable Object alarm wall budget\",\n }),\n );\n};\n\nconst protocolMessage = (message: string): string =>\n message.length <= 4_096 ? message : `${message.slice(0, 4_093)}...`;\n\nconst SubscribeRequest = Schema.TaggedStruct(\"Subscribe\", {\n schemaVersion: Schema.Literal(1),\n scope: Schema.Struct({\n ...SubscriptionScope.fields,\n }),\n options: Schema.Struct({\n subscriptionId: SubscriptionKey.fields.subscriptionId,\n source: EventSourceVersion,\n parameters: PersistedJson,\n context: PersistedJson,\n mode: Schema.Literals([\"once\", \"continuous\"]),\n expiresAtMillis: Schema.Number,\n destination: SubscriptionConfiguration.fields.destination,\n deliveryPrincipal: SubscriptionConfiguration.fields.deliveryPrincipal,\n agentId: SubscriptionConfiguration.fields.agentId,\n definitions: SubscriptionConfiguration.fields.definitions,\n }),\n});\n\nconst ListSubscriptionsRequest = Schema.TaggedStruct(\"ListSubscriptions\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n after: Schema.optionalKey(Schema.Natural),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst CancelSubscriptionRequest = Schema.TaggedStruct(\"CancelSubscription\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n});\n\nconst ListDeliveriesRequest = Schema.TaggedStruct(\"ListDeliveries\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n after: Schema.optionalKey(Schema.String),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst AcceptRequest = Schema.TaggedStruct(\"Accept\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n payload: PersistedJson,\n});\n\nconst StatusRequest = Schema.TaggedStruct(\"Status\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n eventId: Schema.String,\n});\n\nconst SubscriptionPartitionRequest = Schema.Union([\n SubscribeRequest,\n ListSubscriptionsRequest,\n CancelSubscriptionRequest,\n ListDeliveriesRequest,\n AcceptRequest,\n StatusRequest,\n]);\n\ntype SubscriptionPartitionRequest = typeof SubscriptionPartitionRequest.Type;\n\nconst SubscriptionPage = Schema.Struct({\n items: Schema.Array(SubscriptionSnapshot),\n next: Schema.NullOr(Schema.Natural),\n});\n\nconst DeliveryPage = Schema.Struct({\n items: Schema.Array(SubscriptionDeliverySnapshot),\n next: Schema.NullOr(Schema.String),\n});\n\nconst IntakeStatus = Schema.Struct({\n ...EventAcknowledgement.fields,\n routingComplete: Schema.Boolean,\n routingFailure: Schema.NullOr(Schema.String),\n nextAttemptAtMillis: Schema.Number,\n});\n\nconst SubscriptionPartitionFailure = Schema.Union([\n SubscriptionError,\n SubscriptionSourceError,\n SubscriptionFailpointError,\n SubscriptionPartitionProtocolError,\n]);\n\ntype SubscriptionPartitionFailure = typeof SubscriptionPartitionFailure.Type;\n\nconst SubscriptionPartitionResponse = Schema.Union([\n Schema.TaggedStruct(\"Snapshot\", { value: SubscriptionSnapshot }),\n Schema.TaggedStruct(\"SubscriptionPage\", { value: SubscriptionPage }),\n Schema.TaggedStruct(\"DeliveryPage\", { value: DeliveryPage }),\n Schema.TaggedStruct(\"Acknowledgement\", { value: EventAcknowledgement }),\n Schema.TaggedStruct(\"Status\", { value: IntakeStatus }),\n Schema.TaggedStruct(\"Failed\", { failure: SubscriptionPartitionFailure }),\n]);\n\ntype SubscriptionPartitionResponse = typeof SubscriptionPartitionResponse.Type;\n\nconst decodeRequest = Schema.decodeUnknownEffect(SubscriptionPartitionRequest);\nconst encodeRequest = Schema.encodeEffect(SubscriptionPartitionRequest);\nconst decodeResponse = Schema.decodeUnknownEffect(SubscriptionPartitionResponse);\nconst encodeResponse = Schema.encodeEffect(SubscriptionPartitionResponse);\n\nconst protocolFailure = (message: string): SubscriptionPartitionResponse => ({\n _tag: \"Failed\",\n failure: SubscriptionPartitionProtocolError.make({ message: protocolMessage(message) }),\n});\n\nexport const sourcePartitionName = (partition: SourcePartition): string =>\n JSON.stringify([partition.tenantId, partition.address]);\n\nexport interface SubscriptionPartitionObjectRpc extends Rpc.DurableObjectBranded {\n subscription(encoded: unknown): Promise<unknown>;\n}\n\nexport class SubscriptionPartitionNamespace extends Context.Service<\n SubscriptionPartitionNamespace,\n { readonly namespace: DurableObjectNamespace<SubscriptionPartitionObjectRpc> }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionNamespace\") {}\n\nconst storageFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"storage\", code });\n\nconst corruptFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"corrupt\", code });\n\n/** Worker-side management and trusted intake, routed to one fresh partition stub per call. */\nexport class CloudflareSubscriptionsClient {\n static layer(\n partition: SourcePartition,\n ): Layer.Layer<Subscriptions | SubscriptionIntake, never, SubscriptionPartitionNamespace> {\n return Layer.effectContext(\n Effect.gen(function* () {\n const { namespace } = yield* SubscriptionPartitionNamespace;\n\n const call = Effect.fn(\"CloudflareSubscriptionsClient.call\")(function* (\n addressedPartition: SourcePartition,\n request: SubscriptionPartitionRequest,\n ) {\n if (!samePartition(partition, addressedPartition)) {\n return yield* SubscriptionError.make({ reason: \"unauthorized\", code: \"partition\" });\n }\n\n const encoded = yield* encodeRequest(request).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n\n const raw = yield* Effect.tryPromise({\n try: () =>\n namespace\n .get(namespace.idFromName(sourcePartitionName(partition)))\n .subscription(encoded),\n catch: () => storageFailure(\"call-subscription-partition\"),\n });\n\n return yield* decodeResponse(raw).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n });\n\n const failed = (response: SubscriptionPartitionResponse): SubscriptionPartitionFailure =>\n response._tag === \"Failed\"\n ? response.failure\n : SubscriptionPartitionProtocolError.make({\n message: \"Unexpected subscription response\",\n });\n\n const asProtocolError = (): SubscriptionError =>\n corruptFailure(\"subscription-partition-protocol\");\n\n const subscriptions = Subscriptions.of({\n subscribe: (scope, options) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"Subscribe\",\n schemaVersion: 1,\n scope,\n options,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listSubscriptions: (scope, after, limit) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"ListSubscriptions\",\n schemaVersion: 1,\n scope,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"SubscriptionPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n cancelSubscription: (scope, key) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"CancelSubscription\",\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listDeliveries: (scope, key, after, limit) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"ListDeliveries\",\n schemaVersion: 1,\n scope,\n key,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"DeliveryPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n const intake = SubscriptionIntake.of({\n accept: (principal, source, payload) =>\n Effect.gen(function* () {\n const request = yield* Schema.decodeUnknownEffect(AcceptRequest)({\n _tag: \"Accept\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n payload,\n }).pipe(\n Effect.mapError(() =>\n SubscriptionError.make({ reason: \"validation\", code: \"event-payload\" }),\n ),\n );\n\n const response = yield* call(request.partition, request);\n\n if (response._tag === \"Acknowledgement\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n status: (principal, source, eventId) =>\n Effect.gen(function* () {\n const response = yield* call(partition, {\n _tag: \"Status\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n eventId,\n });\n\n if (response._tag === \"Status\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n return Context.make(Subscriptions, subscriptions).pipe(\n Context.add(SubscriptionIntake, intake),\n );\n }),\n );\n }\n}\n\nexport class SubscriptionPartitionIdentity extends Context.Service<\n SubscriptionPartitionIdentity,\n { readonly partition: SourcePartition }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionIdentity\") {}\n\nconst decodePartitionName = Effect.fn(\"decodeSubscriptionPartitionName\")(function* (\n name: string | null | undefined,\n) {\n if (name === null || name === undefined) {\n return yield* SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition objects require an idFromName identity\",\n });\n }\n\n const tuple = yield* Schema.decodeUnknownEffect(\n Schema.fromJsonString(Schema.Tuple([Schema.String, Schema.String])),\n )(name).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition name is malformed\",\n }),\n ),\n );\n\n return yield* Schema.decodeUnknownEffect(SourcePartition)({\n tenantId: tuple[0],\n address: tuple[1],\n }).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition identity is invalid\",\n }),\n ),\n );\n});\n\nconst samePartition = Schema.toEquivalence(SourcePartition);\n\nconst requestPartition = (request: SubscriptionPartitionRequest): SourcePartition =>\n request._tag === \"Accept\" || request._tag === \"Status\"\n ? request.partition\n : request.scope.partition;\n\nconst handleRequest = Effect.fn(\"SubscriptionPartition.handleRequest\")(function* (\n encoded: unknown,\n) {\n const decoded = yield* decodeRequest(encoded).pipe(Effect.result);\n\n if (decoded._tag === \"Failure\") {\n return yield* encodeResponse(\n protocolFailure(\"The subscription request could not be decoded\"),\n ).pipe(Effect.orDie);\n }\n const request = decoded.success;\n const { partition } = yield* SubscriptionPartitionIdentity;\n\n if (!samePartition(partition, requestPartition(request))) {\n return yield* encodeResponse(\n protocolFailure(\"The request partition does not match the addressed object\"),\n ).pipe(Effect.orDie);\n }\n const subscriptions = yield* Subscriptions;\n const intake = yield* SubscriptionIntake;\n\n const response = yield* Effect.gen(function* (): Effect.fn.Return<\n SubscriptionPartitionResponse,\n SubscriptionPartitionFailure\n > {\n switch (request._tag) {\n case \"Subscribe\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.subscribe(request.scope, request.options),\n };\n case \"ListSubscriptions\":\n return {\n _tag: \"SubscriptionPage\",\n value: yield* subscriptions.listSubscriptions(\n request.scope,\n request.after,\n request.limit,\n ),\n };\n case \"CancelSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.cancelSubscription(request.scope, request.key),\n };\n case \"ListDeliveries\":\n return {\n _tag: \"DeliveryPage\",\n value: yield* subscriptions.listDeliveries(\n request.scope,\n request.key,\n request.after,\n request.limit,\n ),\n };\n case \"Accept\":\n return {\n _tag: \"Acknowledgement\",\n value: yield* intake.accept(request.principal, request.source, request.payload),\n };\n case \"Status\":\n return {\n _tag: \"Status\",\n value: yield* intake.status(request.principal, request.source, request.eventId),\n };\n }\n }).pipe(\n Effect.catch((failure) =>\n Schema.is(SubscriptionPartitionFailure)(failure)\n ? Effect.succeed({ _tag: \"Failed\" as const, failure })\n : Effect.succeed(protocolFailure(\"The subscription operation failed outside its contract\")),\n ),\n );\n\n return yield* encodeResponse(response).pipe(Effect.orDie);\n});\n\nconst alarmStorageError = (code: string) => () => storageFailure(code);\n\nconst transactionLayer: Layer.Layer<\n DoSubscriptionTransaction,\n never,\n DurableObjectAlarm.DurableObjectAlarm\n> = Layer.effect(\n DoSubscriptionTransaction,\n Effect.gen(function* () {\n const alarms = yield* DurableObjectAlarm.DurableObjectAlarm;\n\n return DoSubscriptionTransaction.of({\n run: (body) =>\n Effect.gen(function* () {\n const nowMillis = yield* Clock.currentTimeMillis;\n\n return yield* alarms\n .transaction((transaction) =>\n body((replacement) =>\n replacement.deadlineAtMillis === null\n ? transaction\n .cancelAlarm({ id: SUBSCRIPTION_ALARM_ID, tag: SUBSCRIPTION_ALARM_TAG })\n .pipe(Effect.mapError(alarmStorageError(\"cancel-subscription-alarm\")))\n : Effect.fromOption(\n DateTime.make(Math.max(replacement.deadlineAtMillis, nowMillis + 1)),\n ).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-alarm-deadline\")),\n Effect.flatMap((runAt) =>\n transaction\n .scheduleAlarm({\n id: SUBSCRIPTION_ALARM_ID,\n tag: SUBSCRIPTION_ALARM_TAG,\n runAt,\n payload: { schemaVersion: 1, generation: replacement.generation },\n })\n .pipe(Effect.mapError(alarmStorageError(\"schedule-subscription-alarm\"))),\n ),\n ),\n ),\n )\n .pipe(\n Effect.catchTag(\"StorageOperationError\", () =>\n storageFailure(\"commit-subscription-transaction\"),\n ),\n );\n }),\n });\n }),\n);\n\nconst alarmHandler = (limits: SubscriptionLimits) =>\n DurableObjectAlarm.processDue(\n (event) =>\n Effect.gen(function* () {\n if (event.tag !== SUBSCRIPTION_ALARM_TAG || event.id !== SUBSCRIPTION_ALARM_ID) {\n return yield* SubscriptionAlarmProtocolError.make({\n message: `Unsupported Subscription Partition alarm ${event.tag}/${event.id}`,\n });\n }\n yield* Schema.decodeUnknownEffect(SubscriptionAlarmPayload)(event.payload).pipe(\n Effect.mapError(() =>\n SubscriptionAlarmProtocolError.make({\n message: \"Unsupported subscription alarm payload\",\n }),\n ),\n );\n const driver = yield* SubscriptionDriver;\n const alarmControl = yield* DoSubscriptionAlarmControl;\n\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n\n const pass = yield* driver.runDue.pipe(\n Effect.catchCause((cause) =>\n Cause.hasInterrupts(cause)\n ? Effect.failCause(cause)\n : Clock.currentTimeMillis.pipe(\n Effect.flatMap((time) => alarmControl.prearm(time + limits.retryMillis)),\n Effect.andThen(Effect.failCause(cause)),\n ),\n ),\n );\n\n if (pass.failed > 0) {\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n } else {\n yield* alarmControl.reconcile;\n }\n }),\n { mode: \"ordered\" },\n ).pipe(Effect.asVoid);\n\ntype SubscriptionRuntimeServices =\n | Subscriptions\n | SubscriptionIntake\n | SubscriptionDriver\n | DoSubscriptionAlarmControl\n | SubscriptionPartitionIdentity\n | DurableObjectAlarm.DurableObjectAlarm;\n\nexport interface SubscriptionPartitionObjectInstance extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, SubscriptionRuntimeServices>\n> {\n subscription(encoded: unknown): Promise<unknown>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\nexport interface SubscriptionPartitionObjectClass {\n new (ctx: DurableObjectState, env: Cloudflare.Env): SubscriptionPartitionObjectInstance;\n}\n\n/**\n * Build one source-addressed SQLite Durable Object. The host Layer binds the permitted source\n * catalog and authority. It must not retain cleanup-scoped resources across RPC events.\n */\nexport const makeSubscriptionPartitionObjectClass = <E>(\n host: Layer.Layer<\n SubscriptionAuthorizer | EventSources | SubscriptionInputBindings | ThreadObjectNamespace,\n E,\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n | SubscriptionPartitionIdentity\n >,\n limits: SubscriptionLimits = defaultSubscriptionLimits,\n): SubscriptionPartitionObjectClass => {\n const cloudflareLimitsLayer = Layer.effectDiscard(validateCloudflareSubscriptionLimits(limits));\n\n const identityLayer = Layer.effect(\n SubscriptionPartitionIdentity,\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n\n return SubscriptionPartitionIdentity.of({\n partition: yield* decodePartitionName(state.raw.id.name),\n });\n }),\n );\n\n const sqlLayer = Layer.unwrap(\n Effect.map(EffectCfDurableObjectState.DurableObjectState, (state) =>\n SqliteClient.layer({ storage: state.raw.storage }),\n ),\n );\n\n const partitionStore = Layer.unwrap(\n Effect.map(SubscriptionPartitionIdentity, ({ partition }) =>\n doSubscriptionStoreLayer(partition).pipe(\n Layer.provide(transactionLayer),\n Layer.provide(sqlLayer),\n ),\n ),\n );\n\n const application = Layer.mergeAll(\n Subscriptions.layer(limits),\n SubscriptionIntake.layer(limits),\n SubscriptionDriver.layer(limits),\n cloudflareLimitsLayer,\n ).pipe(\n Layer.provideMerge(partitionStore),\n Layer.provide(\n cloudflarePreparedInputAdmissionLayer.pipe(Layer.provide(CloudflareThreadClient.layer)),\n ),\n Layer.provide(BrowserCrypto.layer),\n Layer.provideMerge(DurableObjectAlarm.DurableObjectAlarm.layer),\n Layer.provide(host),\n Layer.provideMerge(identityLayer),\n );\n\n const runtime: Layer.Layer<\n SubscriptionRuntimeServices,\n E | SubscriptionError | SubscriptionPartitionProtocolError | CloudflareSubscriptionConfigError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));\n }),\n );\n\n const rpc = {\n subscription: (encoded: unknown) => handleRequest(encoded),\n } satisfies EffectCfDurableObject.DurableObjectRpc<SubscriptionRuntimeServices>;\n\n const Base = EffectCfDurableObject.make(runtime, {\n initialize: Effect.void,\n rpc,\n alarms: alarmHandler(limits),\n });\n\n class SubscriptionPartitionObject extends Base {\n override alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void {\n return super.alarm?.(alarmInfo);\n }\n }\n\n return SubscriptionPartitionObject;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CloudflareSubscriptions.mjs","names":["EffectCfDurableObjectState","EffectCfDurableObject"],"sources":["../src/CloudflareSubscriptions.ts"],"sourcesContent":["import {\n DoSubscriptionAlarmControl,\n DoSubscriptionTransaction,\n doSubscriptionStoreLayer,\n} from \"@effect-agent/storage-cloudflare/DoSubscriptionStore\";\nimport { type EventSources } from \"@effect-agent/thread/EventSource\";\nimport { PersistedJson } from \"@effect-agent/thread/Records\";\nimport { Principal } from \"@effect-agent/thread/SubmissionLedger\";\nimport {\n EventAcknowledgement,\n EventSourceVersion,\n SourcePartition,\n type SubscriptionAuthorizer,\n SubscriptionConfiguration,\n SubscriptionDeliverySnapshot,\n SubscriptionDeliveryKey,\n SubscriptionError,\n SubscriptionFailpointError,\n SubscriptionKey,\n SubscriptionScope,\n type SubscriptionLimits,\n SubscriptionSnapshot,\n SubscriptionSourceError,\n defaultSubscriptionLimits,\n} from \"@effect-agent/thread/Subscription\";\nimport { type SubscriptionInputBindings } from \"@effect-agent/thread/SubscriptionInput\";\nimport {\n SubscriptionDriver,\n SubscriptionIntake,\n Subscriptions,\n} from \"@effect-agent/thread/Subscriptions\";\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport { Cause, Clock, Context, DateTime, Effect, Layer, Schema, type Scope } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectAlarm,\n DurableObjectState as EffectCfDurableObjectState,\n type WorkerEnvironment,\n} from \"effect-cf\";\n\nimport { type ThreadObjectNamespace } from \"./CloudflareBindings.ts\";\nimport { CloudflareThreadClient } from \"./CloudflareThreadClient.ts\";\nimport { cloudflarePreparedInputAdmissionLayer } from \"./internal/prepared-admission.ts\";\n\nconst SUBSCRIPTION_ALARM_TAG = \"effect-agent/SubscriptionPartitionWake\";\nconst SUBSCRIPTION_ALARM_ID = \"driver\";\nconst MAX_ALARM_WALL_MILLIS = 12 * 60_000;\nconst MAX_ALARMS_PER_INVOCATION = 16;\nconst MAX_ANCILLARY_ALARM_MILLIS = 30_000;\n\nconst SubscriptionAlarmPayload = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n generation: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nexport class SubscriptionAlarmProtocolError extends Schema.TaggedError<SubscriptionAlarmProtocolError>()(\n \"SubscriptionAlarmProtocolError\",\n { message: Schema.String },\n) {}\n\n/** Bounded host diagnostic; credentials and provider responses do not belong in alarm failures. */\nexport class SubscriptionAlarmExtensionError extends Schema.TaggedError<SubscriptionAlarmExtensionError>()(\n \"SubscriptionAlarmExtensionError\",\n { code: Schema.NonEmptyString.check(Schema.isMaxLength(128)) },\n) {}\n\nexport interface SubscriptionPartitionAlarmHandler {\n readonly tag: string;\n readonly handle: (\n event: DurableObjectAlarm.DurableObjectAlarmEvent,\n ) => Effect.Effect<void, SubscriptionAlarmProtocolError | SubscriptionAlarmExtensionError>;\n}\n\n/** Host-only handlers; the framework reserves its namespace and rejects every unknown tag. */\nexport const SubscriptionPartitionAlarmExtension = Context.Reference<{\n readonly handlers: ReadonlyArray<SubscriptionPartitionAlarmHandler>;\n}>(\"@effect-agent/platform-cloudflare/SubscriptionPartitionAlarmExtension\", {\n defaultValue: () => ({ handlers: [] }),\n});\n\n/** Capture host services once; each invocation owns its codec/handler Scope and timeout.\n * Callback failures stay typed. Defects and interruption reach the native alarm multiplexer.\n * The host owns durable idempotency, prearming and external-effect uncertainty.\n */\nexport const makeSubscriptionPartitionAlarmHandler = Effect.fn(\n \"makeSubscriptionPartitionAlarmHandler\",\n)(function* <Payload extends Schema.Top, R>(options: {\n readonly tag: string;\n readonly payload: Payload;\n readonly timeoutMillis: number;\n readonly handle: (\n event: Omit<DurableObjectAlarm.DurableObjectAlarmEvent, \"payload\"> & {\n readonly payload: Payload[\"Type\"];\n },\n ) => Effect.Effect<void, SubscriptionAlarmExtensionError, R>;\n}): Effect.fn.Return<\n SubscriptionPartitionAlarmHandler,\n SubscriptionAlarmProtocolError,\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope>\n> {\n if (\n options.tag.length === 0 ||\n options.tag.length > 128 ||\n options.tag.startsWith(\"effect-agent/\") ||\n !Number.isSafeInteger(options.timeoutMillis) ||\n options.timeoutMillis < 1 ||\n options.timeoutMillis > MAX_ANCILLARY_ALARM_MILLIS\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Invalid ancillary alarm tag or timeout\",\n });\n const services = yield* Effect.context<Exclude<R | Payload[\"DecodingServices\"], Scope.Scope>>();\n\n return {\n tag: options.tag,\n handle: (event) =>\n Effect.gen(function* () {\n if (event.tag !== options.tag)\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Ancillary alarm tag mismatch\",\n });\n\n const payload = yield* Schema.decodeUnknownEffect(options.payload)(event.payload).pipe(\n Effect.mapError(() =>\n SubscriptionAlarmProtocolError.make({ message: \"Invalid ancillary alarm payload\" }),\n ),\n );\n\n yield* options.handle({ ...event, payload });\n }).pipe(\n Effect.scoped,\n Effect.timeout(options.timeoutMillis),\n Effect.catchTag(\"TimeoutError\", () =>\n SubscriptionAlarmExtensionError.make({ code: \"timeout\" }),\n ),\n Effect.provideContext(services),\n ),\n };\n});\n\nexport class SubscriptionPartitionProtocolError extends Schema.TaggedError<SubscriptionPartitionProtocolError>()(\n \"SubscriptionPartitionProtocolError\",\n { message: Schema.String.check(Schema.isMaxLength(4_096)) },\n) {}\n\nexport class CloudflareSubscriptionConfigError extends Schema.TaggedError<CloudflareSubscriptionConfigError>()(\n \"CloudflareSubscriptionConfigError\",\n { message: Schema.String },\n) {}\n\n/** Reject limits whose four bounded phases could exceed the safe Durable Object alarm budget. */\nexport const validateCloudflareSubscriptionLimits = (\n limits: SubscriptionLimits,\n options: { readonly ancillaryAlarms?: boolean } = {},\n): Effect.Effect<void, CloudflareSubscriptionConfigError> => {\n const worstCaseMillis =\n 4 * Math.ceil(limits.batchSize / limits.concurrency) * limits.operationTimeoutMillis +\n (options.ancillaryAlarms === true ? MAX_ALARMS_PER_INVOCATION * MAX_ANCILLARY_ALARM_MILLIS : 0);\n\n return worstCaseMillis <= MAX_ALARM_WALL_MILLIS\n ? Effect.void\n : Effect.fail(\n CloudflareSubscriptionConfigError.make({\n message: \"Subscription limits can exceed the bounded Durable Object alarm wall budget\",\n }),\n );\n};\n\nconst protocolMessage = (message: string): string =>\n message.length <= 4_096 ? message : `${message.slice(0, 4_093)}...`;\n\nconst SubscribeRequest = Schema.TaggedStruct(\"Subscribe\", {\n schemaVersion: Schema.Literal(1),\n scope: Schema.Struct({\n ...SubscriptionScope.fields,\n }),\n options: Schema.Struct({\n subscriptionId: SubscriptionKey.fields.subscriptionId,\n source: EventSourceVersion,\n parameters: PersistedJson,\n context: PersistedJson,\n mode: Schema.Literals([\"once\", \"continuous\"]),\n expiresAtMillis: Schema.NullOr(Schema.Number),\n destination: SubscriptionConfiguration.fields.destination,\n deliveryPrincipal: SubscriptionConfiguration.fields.deliveryPrincipal,\n admissionGroup: SubscriptionConfiguration.fields.admissionGroup,\n admissionFence: SubscriptionConfiguration.fields.admissionFence,\n agentId: SubscriptionConfiguration.fields.agentId,\n definitions: SubscriptionConfiguration.fields.definitions,\n }),\n});\n\nconst UpdateSubscriptionRequest = Schema.TaggedStruct(\"UpdateSubscription\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n options: SubscribeRequest.fields.options.mapFields(({ subscriptionId: _, ...fields }) => fields),\n});\n\nconst SubscriptionStateRequest = Schema.Struct({\n _tag: Schema.Literals([\"PauseSubscription\", \"ResumeSubscription\", \"RecoverSubscription\"]),\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nconst ListSubscriptionsRequest = Schema.TaggedStruct(\"ListSubscriptions\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n after: Schema.optionalKey(Schema.Natural),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst CancelSubscriptionRequest = Schema.TaggedStruct(\"CancelSubscription\", {\n expectedRevision: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n});\n\nconst GetSubscriptionRequest = Schema.TaggedStruct(\"GetSubscription\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscriptionScope,\n key: SubscriptionKey,\n});\n\nconst RecoverDeliveryRequest = Schema.TaggedStruct(\"RecoverDelivery\", {\n expectedGeneration: Schema.Natural,\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionDeliveryKey,\n});\n\nconst ListDeliveriesRequest = Schema.TaggedStruct(\"ListDeliveries\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n after: Schema.optionalKey(Schema.String),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst AcceptRequest = Schema.TaggedStruct(\"Accept\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n payload: PersistedJson,\n});\n\nconst StatusRequest = Schema.TaggedStruct(\"Status\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n eventId: Schema.String,\n});\n\nconst SubscriptionPartitionRequest = Schema.Union([\n SubscribeRequest,\n GetSubscriptionRequest,\n UpdateSubscriptionRequest,\n SubscriptionStateRequest,\n ListSubscriptionsRequest,\n CancelSubscriptionRequest,\n ListDeliveriesRequest,\n RecoverDeliveryRequest,\n AcceptRequest,\n StatusRequest,\n]);\n\ntype SubscriptionPartitionRequest = typeof SubscriptionPartitionRequest.Type;\n\nconst SubscriptionPage = Schema.Struct({\n items: Schema.Array(SubscriptionSnapshot),\n next: Schema.NullOr(Schema.Natural),\n});\n\nconst DeliveryPage = Schema.Struct({\n items: Schema.Array(SubscriptionDeliverySnapshot),\n next: Schema.NullOr(Schema.String),\n});\n\nconst IntakeStatus = Schema.Struct({\n ...EventAcknowledgement.fields,\n routingComplete: Schema.Boolean,\n routingFailure: Schema.NullOr(Schema.String),\n nextAttemptAtMillis: Schema.Number,\n});\n\nconst SubscriptionPartitionFailure = Schema.Union([\n SubscriptionError,\n SubscriptionSourceError,\n SubscriptionFailpointError,\n SubscriptionPartitionProtocolError,\n]);\n\ntype SubscriptionPartitionFailure = typeof SubscriptionPartitionFailure.Type;\n\nconst SubscriptionPartitionResponse = Schema.Union([\n Schema.TaggedStruct(\"Snapshot\", { value: SubscriptionSnapshot }),\n Schema.TaggedStruct(\"SubscriptionPage\", { value: SubscriptionPage }),\n Schema.TaggedStruct(\"DeliveryPage\", { value: DeliveryPage }),\n Schema.TaggedStruct(\"DeliverySnapshot\", { value: SubscriptionDeliverySnapshot }),\n Schema.TaggedStruct(\"Acknowledgement\", { value: EventAcknowledgement }),\n Schema.TaggedStruct(\"Status\", { value: IntakeStatus }),\n Schema.TaggedStruct(\"Failed\", { failure: SubscriptionPartitionFailure }),\n]);\n\ntype SubscriptionPartitionResponse = typeof SubscriptionPartitionResponse.Type;\n\nconst decodeRequest = Schema.decodeUnknownEffect(SubscriptionPartitionRequest);\nconst encodeRequest = Schema.encodeEffect(SubscriptionPartitionRequest);\nconst decodeResponse = Schema.decodeUnknownEffect(SubscriptionPartitionResponse);\nconst encodeResponse = Schema.encodeEffect(SubscriptionPartitionResponse);\n\nconst protocolFailure = (message: string): SubscriptionPartitionResponse => ({\n _tag: \"Failed\",\n failure: SubscriptionPartitionProtocolError.make({ message: protocolMessage(message) }),\n});\n\nexport const sourcePartitionName = (partition: SourcePartition): string =>\n JSON.stringify([partition.tenantId, partition.address]);\n\nexport interface SubscriptionPartitionObjectRpc extends Rpc.DurableObjectBranded {\n subscription(encoded: unknown): Promise<unknown>;\n}\n\nexport class SubscriptionPartitionNamespace extends Context.Service<\n SubscriptionPartitionNamespace,\n { readonly namespace: DurableObjectNamespace<SubscriptionPartitionObjectRpc> }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionNamespace\") {}\n\nconst storageFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"storage\", code });\n\nconst corruptFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"corrupt\", code });\n\n/** Worker-side management and trusted intake, routed to one fresh partition stub per call. */\nexport class CloudflareSubscriptionsClient {\n static layer(\n partition: SourcePartition,\n ): Layer.Layer<Subscriptions | SubscriptionIntake, never, SubscriptionPartitionNamespace> {\n return Layer.effectContext(\n Effect.gen(function* () {\n const { namespace } = yield* SubscriptionPartitionNamespace;\n\n const call = Effect.fn(\"CloudflareSubscriptionsClient.call\")(function* (\n addressedPartition: SourcePartition,\n request: SubscriptionPartitionRequest,\n ) {\n if (!samePartition(partition, addressedPartition)) {\n return yield* SubscriptionError.make({ reason: \"unauthorized\", code: \"partition\" });\n }\n\n const encoded = yield* encodeRequest(request).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n\n const raw = yield* Effect.tryPromise({\n try: () =>\n namespace\n .get(namespace.idFromName(sourcePartitionName(partition)))\n .subscription(encoded),\n catch: () => storageFailure(\"call-subscription-partition\"),\n });\n\n return yield* decodeResponse(raw).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n });\n\n const failed = (response: SubscriptionPartitionResponse): SubscriptionPartitionFailure =>\n response._tag === \"Failed\"\n ? response.failure\n : SubscriptionPartitionProtocolError.make({\n message: \"Unexpected subscription response\",\n });\n\n const asProtocolError = (): SubscriptionError =>\n corruptFailure(\"subscription-partition-protocol\");\n\n const changeState = Effect.fn(\"CloudflareSubscriptions.changeState\")(function* (\n scope: typeof SubscriptionScope.Type,\n key: typeof SubscriptionKey.Type,\n expectedRevision: number,\n _tag: \"PauseSubscription\" | \"ResumeSubscription\" | \"RecoverSubscription\",\n ) {\n const response = yield* call(scope.partition, {\n _tag,\n schemaVersion: 1,\n scope,\n key,\n expectedRevision,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n ? failure\n : asProtocolError();\n });\n\n const subscriptions = Subscriptions.of({\n recoverSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"RecoverSubscription\"),\n getSubscription: (scope, key) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"GetSubscription\",\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n recoverDelivery: (scope, key, expectedGeneration) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"RecoverDelivery\",\n expectedGeneration,\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"DeliverySnapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n ? failure\n : asProtocolError();\n }),\n updateSubscription: (scope, key, expectedRevision, options) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"UpdateSubscription\",\n schemaVersion: 1,\n scope,\n key,\n expectedRevision,\n options,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\" ||\n failure._tag === \"SubscriptionSourceError\"\n ? failure\n : asProtocolError();\n }),\n pauseSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"PauseSubscription\"),\n resumeSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"ResumeSubscription\"),\n subscribe: (scope, options) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"Subscribe\",\n schemaVersion: 1,\n scope,\n options,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listSubscriptions: (scope, after, limit) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"ListSubscriptions\",\n schemaVersion: 1,\n scope,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"SubscriptionPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n cancelSubscription: (scope, key, expectedRevision) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"CancelSubscription\",\n ...(expectedRevision === undefined ? {} : { expectedRevision }),\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listDeliveries: (scope, key, after, limit) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"ListDeliveries\",\n schemaVersion: 1,\n scope,\n key,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"DeliveryPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n const intake = SubscriptionIntake.of({\n accept: (principal, source, payload) =>\n Effect.gen(function* () {\n const request = yield* Schema.decodeUnknownEffect(AcceptRequest)({\n _tag: \"Accept\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n payload,\n }).pipe(\n Effect.mapError(() =>\n SubscriptionError.make({ reason: \"validation\", code: \"event-payload\" }),\n ),\n );\n\n const response = yield* call(request.partition, request);\n\n if (response._tag === \"Acknowledgement\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n status: (principal, source, eventId) =>\n Effect.gen(function* () {\n const response = yield* call(partition, {\n _tag: \"Status\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n eventId,\n });\n\n if (response._tag === \"Status\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n return Context.make(Subscriptions, subscriptions).pipe(\n Context.add(SubscriptionIntake, intake),\n );\n }),\n );\n }\n}\n\nexport class SubscriptionPartitionIdentity extends Context.Service<\n SubscriptionPartitionIdentity,\n { readonly partition: SourcePartition }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionIdentity\") {}\n\nconst decodePartitionName = Effect.fn(\"decodeSubscriptionPartitionName\")(function* (\n name: string | null | undefined,\n) {\n if (name === null || name === undefined) {\n return yield* SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition objects require an idFromName identity\",\n });\n }\n\n const tuple = yield* Schema.decodeUnknownEffect(\n Schema.fromJsonString(Schema.Tuple([Schema.String, Schema.String])),\n )(name).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition name is malformed\",\n }),\n ),\n );\n\n return yield* Schema.decodeUnknownEffect(SourcePartition)({\n tenantId: tuple[0],\n address: tuple[1],\n }).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition identity is invalid\",\n }),\n ),\n );\n});\n\nconst samePartition = Schema.toEquivalence(SourcePartition);\n\nconst requestPartition = (request: SubscriptionPartitionRequest): SourcePartition =>\n request._tag === \"Accept\" || request._tag === \"Status\"\n ? request.partition\n : request.scope.partition;\n\nconst handleRequest = Effect.fn(\"SubscriptionPartition.handleRequest\")(function* (\n encoded: unknown,\n) {\n const decoded = yield* decodeRequest(encoded).pipe(Effect.result);\n\n if (decoded._tag === \"Failure\") {\n return yield* encodeResponse(\n protocolFailure(\"The subscription request could not be decoded\"),\n ).pipe(Effect.orDie);\n }\n const request = decoded.success;\n const { partition } = yield* SubscriptionPartitionIdentity;\n\n if (!samePartition(partition, requestPartition(request))) {\n return yield* encodeResponse(\n protocolFailure(\"The request partition does not match the addressed object\"),\n ).pipe(Effect.orDie);\n }\n const subscriptions = yield* Subscriptions;\n const intake = yield* SubscriptionIntake;\n\n const response = yield* Effect.gen(function* (): Effect.fn.Return<\n SubscriptionPartitionResponse,\n SubscriptionPartitionFailure\n > {\n switch (request._tag) {\n case \"GetSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.getSubscription(request.scope, request.key),\n };\n case \"Subscribe\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.subscribe(request.scope, request.options),\n };\n case \"UpdateSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.updateSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n request.options,\n ),\n };\n case \"RecoverSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.recoverSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"PauseSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.pauseSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"ResumeSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.resumeSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"ListSubscriptions\":\n return {\n _tag: \"SubscriptionPage\",\n value: yield* subscriptions.listSubscriptions(\n request.scope,\n request.after,\n request.limit,\n ),\n };\n case \"CancelSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.cancelSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"RecoverDelivery\":\n return {\n _tag: \"DeliverySnapshot\",\n value: yield* subscriptions.recoverDelivery(\n request.scope,\n request.key,\n request.expectedGeneration,\n ),\n };\n case \"ListDeliveries\":\n return {\n _tag: \"DeliveryPage\",\n value: yield* subscriptions.listDeliveries(\n request.scope,\n request.key,\n request.after,\n request.limit,\n ),\n };\n case \"Accept\":\n return {\n _tag: \"Acknowledgement\",\n value: yield* intake.accept(request.principal, request.source, request.payload),\n };\n case \"Status\":\n return {\n _tag: \"Status\",\n value: yield* intake.status(request.principal, request.source, request.eventId),\n };\n }\n }).pipe(\n Effect.catch((failure) =>\n Schema.is(SubscriptionPartitionFailure)(failure)\n ? Effect.succeed({ _tag: \"Failed\" as const, failure })\n : Effect.succeed(protocolFailure(\"The subscription operation failed outside its contract\")),\n ),\n );\n\n return yield* encodeResponse(response).pipe(Effect.orDie);\n});\n\nconst alarmStorageError = (code: string) => () => storageFailure(code);\n\nconst transactionLayer: Layer.Layer<\n DoSubscriptionTransaction,\n never,\n DurableObjectAlarm.DurableObjectAlarm\n> = Layer.effect(\n DoSubscriptionTransaction,\n Effect.gen(function* () {\n const alarms = yield* DurableObjectAlarm.DurableObjectAlarm;\n\n return DoSubscriptionTransaction.of({\n run: (body) =>\n Effect.gen(function* () {\n const nowMillis = yield* Clock.currentTimeMillis;\n\n return yield* alarms\n .transaction((transaction) =>\n body((replacement) =>\n replacement.deadlineAtMillis === null\n ? transaction\n .cancelAlarm({ id: SUBSCRIPTION_ALARM_ID, tag: SUBSCRIPTION_ALARM_TAG })\n .pipe(Effect.mapError(alarmStorageError(\"cancel-subscription-alarm\")))\n : Effect.fromOption(\n DateTime.make(Math.max(replacement.deadlineAtMillis, nowMillis + 1)),\n ).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-alarm-deadline\")),\n Effect.flatMap((runAt) =>\n transaction\n .scheduleAlarm({\n id: SUBSCRIPTION_ALARM_ID,\n tag: SUBSCRIPTION_ALARM_TAG,\n runAt,\n payload: { schemaVersion: 1, generation: replacement.generation },\n })\n .pipe(Effect.mapError(alarmStorageError(\"schedule-subscription-alarm\"))),\n ),\n ),\n ),\n )\n .pipe(\n Effect.catchTag(\"StorageOperationError\", () =>\n storageFailure(\"commit-subscription-transaction\"),\n ),\n );\n }),\n });\n }),\n);\n\nconst alarmHandler = (limits: SubscriptionLimits) =>\n DurableObjectAlarm.processDue(\n (event) =>\n Effect.gen(function* () {\n if (event.tag !== SUBSCRIPTION_ALARM_TAG) {\n const { handlers } = yield* SubscriptionPartitionAlarmExtension;\n const matches = handlers.filter((handler) => handler.tag === event.tag);\n const handler = matches[0];\n\n if (\n event.tag.startsWith(\"effect-agent/\") ||\n matches.length !== 1 ||\n handler === undefined\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Unknown or ambiguous ancillary alarm tag\",\n });\n\n return yield* handler.handle(event).pipe(\n Effect.scoped,\n Effect.timeout(MAX_ANCILLARY_ALARM_MILLIS),\n Effect.catchTag(\"TimeoutError\", () =>\n SubscriptionAlarmExtensionError.make({ code: \"timeout\" }),\n ),\n );\n }\n if (event.id !== SUBSCRIPTION_ALARM_ID) {\n return yield* SubscriptionAlarmProtocolError.make({\n message: `Unsupported Subscription Partition alarm ${event.tag}/${event.id}`,\n });\n }\n yield* Schema.decodeUnknownEffect(SubscriptionAlarmPayload)(event.payload).pipe(\n Effect.mapError(() =>\n SubscriptionAlarmProtocolError.make({\n message: \"Unsupported subscription alarm payload\",\n }),\n ),\n );\n const driver = yield* SubscriptionDriver;\n const alarmControl = yield* DoSubscriptionAlarmControl;\n\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n\n const pass = yield* driver.runDue.pipe(\n Effect.catchCause((cause) =>\n Cause.hasInterrupts(cause)\n ? Effect.failCause(cause)\n : Clock.currentTimeMillis.pipe(\n Effect.flatMap((time) => alarmControl.prearm(time + limits.retryMillis)),\n Effect.andThen(Effect.failCause(cause)),\n ),\n ),\n );\n\n if (pass.failed > 0) {\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n } else {\n yield* alarmControl.reconcile;\n }\n }),\n {\n mode: \"isolated\",\n limit: MAX_ALARMS_PER_INVOCATION,\n retryFailedAfter: limits.retryMillis,\n onFailure: () => Effect.logWarning(\"Subscription partition alarm retained for retry\"),\n },\n ).pipe(Effect.asVoid);\n\ntype SubscriptionRuntimeServices =\n | Subscriptions\n | SubscriptionIntake\n | SubscriptionDriver\n | DoSubscriptionAlarmControl\n | SubscriptionPartitionIdentity\n | DurableObjectAlarm.DurableObjectAlarm;\n\nexport interface SubscriptionPartitionObjectInstance extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, SubscriptionRuntimeServices>\n> {\n subscription(encoded: unknown): Promise<unknown>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\nexport interface SubscriptionPartitionObjectClass {\n new (ctx: DurableObjectState, env: Cloudflare.Env): SubscriptionPartitionObjectInstance;\n}\n\n/**\n * Build one source-addressed SQLite Durable Object. The host Layer binds the permitted source\n * catalog and authority. It must not retain cleanup-scoped resources across RPC events.\n */\nexport const makeSubscriptionPartitionObjectClass = <E>(\n host: Layer.Layer<\n SubscriptionAuthorizer | EventSources | SubscriptionInputBindings | ThreadObjectNamespace,\n E,\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n | SubscriptionPartitionIdentity\n >,\n limits: SubscriptionLimits = defaultSubscriptionLimits,\n): SubscriptionPartitionObjectClass => {\n const cloudflareLimitsLayer = Layer.effectDiscard(validateCloudflareSubscriptionLimits(limits));\n\n const identityLayer = Layer.effect(\n SubscriptionPartitionIdentity,\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n\n return SubscriptionPartitionIdentity.of({\n partition: yield* decodePartitionName(state.raw.id.name),\n });\n }),\n );\n\n const sqlLayer = Layer.unwrap(\n Effect.map(EffectCfDurableObjectState.DurableObjectState, (state) =>\n SqliteClient.layer({ storage: state.raw.storage }),\n ),\n );\n\n const partitionStore = Layer.unwrap(\n Effect.map(SubscriptionPartitionIdentity, ({ partition }) =>\n doSubscriptionStoreLayer(partition).pipe(\n Layer.provide(transactionLayer),\n Layer.provide(sqlLayer),\n ),\n ),\n );\n\n const application = Layer.mergeAll(\n Subscriptions.layer(limits),\n SubscriptionIntake.layer(limits),\n SubscriptionDriver.layer(limits),\n cloudflareLimitsLayer,\n // Capture the host reference before its scoped input Layer is hidden from the runtime.\n Layer.effect(\n SubscriptionPartitionAlarmExtension,\n Effect.gen(function* () {\n const extension = yield* SubscriptionPartitionAlarmExtension;\n const tags = extension.handlers.map((handler) => handler.tag);\n\n if (\n tags.length > MAX_ALARMS_PER_INVOCATION ||\n new Set(tags).size !== tags.length ||\n tags.some(\n (tag) => tag.length === 0 || tag.length > 128 || tag.startsWith(\"effect-agent/\"),\n )\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Invalid ancillary alarm handler registry\",\n });\n\n yield* validateCloudflareSubscriptionLimits(limits, { ancillaryAlarms: tags.length > 0 });\n\n return extension;\n }),\n ),\n ).pipe(\n Layer.provideMerge(partitionStore),\n Layer.provide(\n cloudflarePreparedInputAdmissionLayer.pipe(Layer.provide(CloudflareThreadClient.layer)),\n ),\n Layer.provide(BrowserCrypto.layer),\n Layer.provideMerge(DurableObjectAlarm.DurableObjectAlarm.layer),\n Layer.provide(host),\n Layer.provideMerge(identityLayer),\n );\n\n const runtime: Layer.Layer<\n SubscriptionRuntimeServices,\n | E\n | SubscriptionError\n | SubscriptionPartitionProtocolError\n | CloudflareSubscriptionConfigError\n | SubscriptionAlarmProtocolError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));\n }),\n );\n\n const rpc = {\n subscription: (encoded: unknown) => handleRequest(encoded),\n } satisfies EffectCfDurableObject.DurableObjectRpc<SubscriptionRuntimeServices>;\n\n const Base = EffectCfDurableObject.make(runtime, {\n initialize: Effect.void,\n rpc,\n alarms: alarmHandler(limits),\n });\n\n class SubscriptionPartitionObject extends Base {\n override alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void {\n return super.alarm?.(alarmInfo);\n }\n }\n\n return SubscriptionPartitionObject;\n};\n"],"mappings":"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"}
|