@effect-agent/platform-cloudflare 0.1.0-beta.46 → 0.1.0-beta.48
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/Alarm.d.mts +5 -4
- package/dist/Alarm.mjs +20 -10
- package/dist/Alarm.mjs.map +1 -1
- package/dist/CloudflareScheduling.d.mts +6 -4
- package/dist/CloudflareScheduling.mjs +5 -3
- package/dist/CloudflareScheduling.mjs.map +1 -1
- package/dist/CloudflareSubscriptions.mjs +0 -1
- package/dist/CloudflareSubscriptions.mjs.map +1 -1
- package/dist/CloudflareThreadClient.d.mts +34 -34
- package/dist/{ThreadObject-Ia94R_B1.d.mts → ThreadObject-DH1RYqyz.d.mts} +14 -14
- package/dist/ThreadObject-IrGuIO4a.mjs.map +1 -1
- package/dist/ThreadObject.d.mts +1 -1
- package/dist/index.d.mts +1 -1
- package/package.json +1 -1
- package/src/Alarm.ts +34 -13
- package/src/CloudflareScheduling.ts +8 -2
- package/src/ThreadObject.ts +1 -1
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAM,yBAAyB;AAC/B,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;AAE9B,MAAM,2BAA2B,OAAO,OAAO;CAC7C,eAAe,OAAO,QAAQ,CAAC;CAC/B,YAAY,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;AACtD,CAAC;AAED,IAAa,iCAAb,cAAoD,OAAO,YAA4C,CAAC,CACtG,kCACA,EAAE,SAAS,OAAO,OAAO,CAC3B,CAAC,CAAC,CAAC;AAEH,IAAa,qCAAb,cAAwD,OAAO,YAAgD,CAAC,CAC9G,sCACA,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO,YAAY,IAAK,CAAC,EAAE,CAC5D,CAAC,CAAC,CAAC;AAEH,IAAa,oCAAb,cAAuD,OAAO,YAA+C,CAAC,CAC5G,qCACA,EAAE,SAAS,OAAO,OAAO,CAC3B,CAAC,CAAC,CAAC;;AAGH,MAAa,wCACX,WAC2D;CAI3D,OAFE,IAAI,KAAK,KAAK,OAAO,YAAY,OAAO,WAAW,IAAI,OAAO,0BAEtC,wBACtB,OAAO,OACP,OAAO,KACL,kCAAkC,KAAK,EACrC,SAAS,8EACX,CAAC,CACH;AACN;AAEA,MAAM,mBAAmB,YACvB,QAAQ,UAAU,OAAQ,UAAU,GAAG,QAAQ,MAAM,GAAG,IAAK,EAAE;AAEjE,MAAM,mBAAmB,OAAO,aAAa,aAAa;CACxD,eAAe,OAAO,QAAQ,CAAC;CAC/B,OAAO,OAAO,OAAO,EACnB,GAAG,kBAAkB,OACvB,CAAC;CACD,SAAS,OAAO,OAAO;EACrB,gBAAgB,gBAAgB,OAAO;EACvC,QAAQ;EACR,YAAY;EACZ,SAAS;EACT,MAAM,OAAO,SAAS,CAAC,QAAQ,YAAY,CAAC;EAC5C,iBAAiB,OAAO;EACxB,aAAa,0BAA0B,OAAO;EAC9C,mBAAmB,0BAA0B,OAAO;EACpD,SAAS,0BAA0B,OAAO;EAC1C,aAAa,0BAA0B,OAAO;CAChD,CAAC;AACH,CAAC;AAED,MAAM,2BAA2B,OAAO,aAAa,qBAAqB;CACxE,eAAe,OAAO,QAAQ,CAAC;CAC/B,OAAO,iBAAiB,OAAO;CAC/B,OAAO,OAAO,YAAY,OAAO,OAAO;CACxC,OAAO,OAAO,YAAY,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,4BAA4B,OAAO,aAAa,sBAAsB;CAC1E,eAAe,OAAO,QAAQ,CAAC;CAC/B,OAAO,iBAAiB,OAAO;CAC/B,KAAK;AACP,CAAC;AAED,MAAM,wBAAwB,OAAO,aAAa,kBAAkB;CAClE,eAAe,OAAO,QAAQ,CAAC;CAC/B,OAAO,iBAAiB,OAAO;CAC/B,KAAK;CACL,OAAO,OAAO,YAAY,OAAO,MAAM;CACvC,OAAO,OAAO,YAAY,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,gBAAgB,OAAO,aAAa,UAAU;CAClD,eAAe,OAAO,QAAQ,CAAC;CAC/B,WAAW;CACX,WAAW;CACX,QAAQ;CACR,SAAS;AACX,CAAC;AAED,MAAM,gBAAgB,OAAO,aAAa,UAAU;CAClD,eAAe,OAAO,QAAQ,CAAC;CAC/B,WAAW;CACX,WAAW;CACX,QAAQ;CACR,SAAS,OAAO;AAClB,CAAC;AAED,MAAM,+BAA+B,OAAO,MAAM;CAChD;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAID,MAAM,mBAAmB,OAAO,OAAO;CACrC,OAAO,OAAO,MAAM,oBAAoB;CACxC,MAAM,OAAO,OAAO,OAAO,OAAO;AACpC,CAAC;AAED,MAAM,eAAe,OAAO,OAAO;CACjC,OAAO,OAAO,MAAM,4BAA4B;CAChD,MAAM,OAAO,OAAO,OAAO,MAAM;AACnC,CAAC;AAED,MAAM,eAAe,OAAO,OAAO;CACjC,GAAG,qBAAqB;CACxB,iBAAiB,OAAO;CACxB,gBAAgB,OAAO,OAAO,OAAO,MAAM;CAC3C,qBAAqB,OAAO;AAC9B,CAAC;AAED,MAAM,+BAA+B,OAAO,MAAM;CAChD;CACA;CACA;CACA;AACF,CAAC;AAID,MAAM,gCAAgC,OAAO,MAAM;CACjD,OAAO,aAAa,YAAY,EAAE,OAAO,qBAAqB,CAAC;CAC/D,OAAO,aAAa,oBAAoB,EAAE,OAAO,iBAAiB,CAAC;CACnE,OAAO,aAAa,gBAAgB,EAAE,OAAO,aAAa,CAAC;CAC3D,OAAO,aAAa,mBAAmB,EAAE,OAAO,qBAAqB,CAAC;CACtE,OAAO,aAAa,UAAU,EAAE,OAAO,aAAa,CAAC;CACrD,OAAO,aAAa,UAAU,EAAE,SAAS,6BAA6B,CAAC;AACzE,CAAC;AAID,MAAM,gBAAgB,OAAO,oBAAoB,4BAA4B;AAC7E,MAAM,gBAAgB,OAAO,aAAa,4BAA4B;AACtE,MAAM,iBAAiB,OAAO,oBAAoB,6BAA6B;AAC/E,MAAM,iBAAiB,OAAO,aAAa,6BAA6B;AAExE,MAAM,mBAAmB,aAAoD;CAC3E,MAAM;CACN,SAAS,mCAAmC,KAAK,EAAE,SAAS,gBAAgB,OAAO,EAAE,CAAC;AACxF;AAEA,MAAa,uBAAuB,cAClC,KAAK,UAAU,CAAC,UAAU,UAAU,UAAU,OAAO,CAAC;AAMxD,IAAa,iCAAb,cAAoD,QAAQ,QAG1D,CAAC,CAAC,kEAAkE,CAAC,CAAC,CAAC;AAEzE,MAAM,kBAAkB,SACtB,kBAAkB,KAAK;CAAE,QAAQ;CAAW;AAAK,CAAC;AAEpD,MAAM,kBAAkB,SACtB,kBAAkB,KAAK;CAAE,QAAQ;CAAW;AAAK,CAAC;;AAGpD,IAAa,gCAAb,MAA2C;CACzC,OAAO,MACL,WACwF;EACxF,OAAO,MAAM,cACX,OAAO,IAAI,aAAa;GACtB,MAAM,EAAE,cAAc,OAAO;GAE7B,MAAM,OAAO,OAAO,GAAG,oCAAoC,CAAC,CAAC,WAC3D,oBACA,SACA;IACA,IAAI,CAAC,cAAc,WAAW,kBAAkB,GAC9C,OAAO,OAAO,kBAAkB,KAAK;KAAE,QAAQ;KAAgB,MAAM;IAAY,CAAC;IAGpF,MAAM,UAAU,OAAO,cAAc,OAAO,CAAC,CAAC,KAC5C,OAAO,eAAe,eAAe,iCAAiC,CAAC,CACzE;IAEA,MAAM,MAAM,OAAO,OAAO,WAAW;KACnC,WACE,UACG,IAAI,UAAU,WAAW,oBAAoB,SAAS,CAAC,CAAC,CAAC,CACzD,aAAa,OAAO;KACzB,aAAa,eAAe,6BAA6B;IAC3D,CAAC;IAED,OAAO,OAAO,eAAe,GAAG,CAAC,CAAC,KAChC,OAAO,eAAe,eAAe,iCAAiC,CAAC,CACzE;GACF,CAAC;GAED,MAAM,UAAU,aACd,SAAS,SAAS,WACd,SAAS,UACT,mCAAmC,KAAK,EACtC,SAAS,mCACX,CAAC;GAEP,MAAM,wBACJ,eAAe,iCAAiC;GAElD,MAAM,gBAAgB,cAAc,GAAG;IACrC,YAAY,OAAO,YACjB,OAAO,IAAI,aAAa;KACtB,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW;MAC5C,MAAM;MACN,eAAe;MACf;MACA;KACF,CAAC;KAED,IAAI,SAAS,SAAS,YAAY,OAAO,SAAS;KAClD,MAAM,UAAU,OAAO,QAAQ;KAE/B,IACE,QAAQ,SAAS,uBACjB,QAAQ,SAAS,6BACjB,QAAQ,SAAS,8BAEjB,OAAO,OAAO;KAEhB,OAAO,OAAO,gBAAgB;IAChC,CAAC;IACH,oBAAoB,OAAO,OAAO,UAChC,OAAO,IAAI,aAAa;KACtB,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW;MAC5C,MAAM;MACN,eAAe;MACf;MACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;MACvC,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;KACzC,CAAC;KAED,IAAI,SAAS,SAAS,oBAAoB,OAAO,SAAS;KAC1D,MAAM,UAAU,OAAO,QAAQ;KAE/B,OAAO,OAAO,QAAQ,SAAS,sBAAsB,UAAU,gBAAgB;IACjF,CAAC;IACH,qBAAqB,OAAO,QAC1B,OAAO,IAAI,aAAa;KACtB,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW;MAC5C,MAAM;MACN,eAAe;MACf;MACA;KACF,CAAC;KAED,IAAI,SAAS,SAAS,YAAY,OAAO,SAAS;KAClD,MAAM,UAAU,OAAO,QAAQ;KAE/B,IACE,QAAQ,SAAS,uBACjB,QAAQ,SAAS,8BAEjB,OAAO,OAAO;KAEhB,OAAO,OAAO,gBAAgB;IAChC,CAAC;IACH,iBAAiB,OAAO,KAAK,OAAO,UAClC,OAAO,IAAI,aAAa;KACtB,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW;MAC5C,MAAM;MACN,eAAe;MACf;MACA;MACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;MACvC,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;KACzC,CAAC;KAED,IAAI,SAAS,SAAS,gBAAgB,OAAO,SAAS;KACtD,MAAM,UAAU,OAAO,QAAQ;KAE/B,OAAO,OAAO,QAAQ,SAAS,sBAAsB,UAAU,gBAAgB;IACjF,CAAC;GACL,CAAC;GAED,MAAM,SAAS,mBAAmB,GAAG;IACnC,SAAS,WAAW,QAAQ,YAC1B,OAAO,IAAI,aAAa;KACtB,MAAM,UAAU,OAAO,OAAO,oBAAoB,aAAa,CAAC,CAAC;MAC/D,MAAM;MACN,eAAe;MACf;MACA;MACA;MACA;KACF,CAAC,CAAC,CAAC,KACD,OAAO,eACL,kBAAkB,KAAK;MAAE,QAAQ;MAAc,MAAM;KAAgB,CAAC,CACxE,CACF;KAEA,MAAM,WAAW,OAAO,KAAK,QAAQ,WAAW,OAAO;KAEvD,IAAI,SAAS,SAAS,mBAAmB,OAAO,SAAS;KACzD,MAAM,UAAU,OAAO,QAAQ;KAE/B,IACE,QAAQ,SAAS,uBACjB,QAAQ,SAAS,6BACjB,QAAQ,SAAS,8BAEjB,OAAO,OAAO;KAEhB,OAAO,OAAO,gBAAgB;IAChC,CAAC;IACH,SAAS,WAAW,QAAQ,YAC1B,OAAO,IAAI,aAAa;KACtB,MAAM,WAAW,OAAO,KAAK,WAAW;MACtC,MAAM;MACN,eAAe;MACf;MACA;MACA;MACA;KACF,CAAC;KAED,IAAI,SAAS,SAAS,UAAU,OAAO,SAAS;KAChD,MAAM,UAAU,OAAO,QAAQ;KAE/B,OAAO,OAAO,QAAQ,SAAS,sBAAsB,UAAU,gBAAgB;IACjF,CAAC;GACL,CAAC;GAED,OAAO,QAAQ,KAAK,eAAe,aAAa,CAAC,CAAC,KAChD,QAAQ,IAAI,oBAAoB,MAAM,CACxC;EACF,CAAC,CACH;CACF;AACF;AAEA,IAAa,gCAAb,cAAmD,QAAQ,QAGzD,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC;AAExE,MAAM,sBAAsB,OAAO,GAAG,iCAAiC,CAAC,CAAC,WACvE,MACA;CACA,IAAI,SAAS,QAAQ,SAAS,KAAA,GAC5B,OAAO,OAAO,mCAAmC,KAAK,EACpD,SAAS,gEACX,CAAC;CAGH,MAAM,QAAQ,OAAO,OAAO,oBAC1B,OAAO,eAAe,OAAO,MAAM,CAAC,OAAO,QAAQ,OAAO,MAAM,CAAC,CAAC,CACpE,CAAC,CAAC,IAAI,CAAC,CAAC,KACN,OAAO,eACL,mCAAmC,KAAK,EACtC,SAAS,2CACX,CAAC,CACH,CACF;CAEA,OAAO,OAAO,OAAO,oBAAoB,eAAe,CAAC,CAAC;EACxD,UAAU,MAAM;EAChB,SAAS,MAAM;CACjB,CAAC,CAAC,CAAC,KACD,OAAO,eACL,mCAAmC,KAAK,EACtC,SAAS,6CACX,CAAC,CACH,CACF;AACF,CAAC;AAED,MAAM,gBAAgB,OAAO,cAAc,eAAe;AAE1D,MAAM,oBAAoB,YACxB,QAAQ,SAAS,YAAY,QAAQ,SAAS,WAC1C,QAAQ,YACR,QAAQ,MAAM;AAEpB,MAAM,gBAAgB,OAAO,GAAG,qCAAqC,CAAC,CAAC,WACrE,SACA;CACA,MAAM,UAAU,OAAO,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO,MAAM;CAEhE,IAAI,QAAQ,SAAS,WACnB,OAAO,OAAO,eACZ,gBAAgB,+CAA+C,CACjE,CAAC,CAAC,KAAK,OAAO,KAAK;CAErB,MAAM,UAAU,QAAQ;CACxB,MAAM,EAAE,cAAc,OAAO;CAE7B,IAAI,CAAC,cAAc,WAAW,iBAAiB,OAAO,CAAC,GACrD,OAAO,OAAO,eACZ,gBAAgB,2DAA2D,CAC7E,CAAC,CAAC,KAAK,OAAO,KAAK;CAErB,MAAM,gBAAgB,OAAO;CAC7B,MAAM,SAAS,OAAO;CAEtB,MAAM,WAAW,OAAO,OAAO,IAAI,aAGjC;EACA,QAAQ,QAAQ,MAAhB;GACE,KAAK,aACH,OAAO;IACL,MAAM;IACN,OAAO,OAAO,cAAc,UAAU,QAAQ,OAAO,QAAQ,OAAO;GACtE;GACF,KAAK,qBACH,OAAO;IACL,MAAM;IACN,OAAO,OAAO,cAAc,kBAC1B,QAAQ,OACR,QAAQ,OACR,QAAQ,KACV;GACF;GACF,KAAK,sBACH,OAAO;IACL,MAAM;IACN,OAAO,OAAO,cAAc,mBAAmB,QAAQ,OAAO,QAAQ,GAAG;GAC3E;GACF,KAAK,kBACH,OAAO;IACL,MAAM;IACN,OAAO,OAAO,cAAc,eAC1B,QAAQ,OACR,QAAQ,KACR,QAAQ,OACR,QAAQ,KACV;GACF;GACF,KAAK,UACH,OAAO;IACL,MAAM;IACN,OAAO,OAAO,OAAO,OAAO,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,OAAO;GAChF;GACF,KAAK,UACH,OAAO;IACL,MAAM;IACN,OAAO,OAAO,OAAO,OAAO,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,OAAO;GAChF;EACJ;CACF,CAAC,CAAC,CAAC,KACD,OAAO,OAAO,YACZ,OAAO,GAAG,4BAA4B,CAAC,CAAC,OAAO,IAC3C,OAAO,QAAQ;EAAE,MAAM;EAAmB;CAAQ,CAAC,IACnD,OAAO,QAAQ,gBAAgB,wDAAwD,CAAC,CAC9F,CACF;CAEA,OAAO,OAAO,eAAe,QAAQ,CAAC,CAAC,KAAK,OAAO,KAAK;AAC1D,CAAC;AAED,MAAM,qBAAqB,eAAuB,eAAe,IAAI;AAErE,MAAM,mBAIF,MAAM,OACR,2BACA,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO,mBAAmB;CAEzC,OAAO,0BAA0B,GAAG,EAClC,MAAM,SACJ,OAAO,IAAI,aAAa;EACtB,MAAM,YAAY,OAAO,MAAM;EAE/B,OAAO,OAAO,OACX,aAAa,gBACZ,MAAM,gBACJ,YAAY,qBAAqB,OAC7B,YACG,YAAY;GAAE,IAAI;GAAuB,KAAK;EAAuB,CAAC,CAAC,CACvE,KAAK,OAAO,SAAS,kBAAkB,2BAA2B,CAAC,CAAC,IACvE,OAAO,WACL,SAAS,KAAK,KAAK,IAAI,YAAY,kBAAkB,YAAY,CAAC,CAAC,CACrE,CAAC,CAAC,KACA,OAAO,eAAe,eAAe,6BAA6B,CAAC,GACnE,OAAO,SAAS,UACd,YACG,cAAc;GACb,IAAI;GACJ,KAAK;GACL;GACA,SAAS;IAAE,eAAe;IAAG,YAAY,YAAY;GAAW;EAClE,CAAC,CAAC,CACD,KAAK,OAAO,SAAS,kBAAkB,6BAA6B,CAAC,CAAC,CAC3E,CACF,CACN,CACF,CAAC,CACA,KACC,OAAO,SAAS,+BACd,eAAe,iCAAiC,CAClD,CACF;CACJ,CAAC,EACL,CAAC;AACH,CAAC,CACH;AAEA,MAAM,gBAAgB,WACpB,mBAAmB,YAChB,UACC,OAAO,IAAI,aAAa;CACtB,IAAI,MAAM,QAAQ,0BAA0B,MAAM,OAAO,uBACvD,OAAO,OAAO,+BAA+B,KAAK,EAChD,SAAS,4CAA4C,MAAM,IAAI,GAAG,MAAM,KAC1E,CAAC;CAEH,OAAO,OAAO,oBAAoB,wBAAwB,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,KACzE,OAAO,eACL,+BAA+B,KAAK,EAClC,SAAS,yCACX,CAAC,CACH,CACF;CACA,MAAM,SAAS,OAAO;CACtB,MAAM,eAAe,OAAO;CAE5B,OAAO,aAAa,QAAQ,OAAO,MAAM,qBAAqB,OAAO,WAAW;CAahF,KAAI,OAXgB,OAAO,OAAO,KAChC,OAAO,YAAY,UACjB,MAAM,cAAc,KAAK,IACrB,OAAO,UAAU,KAAK,IACtB,MAAM,kBAAkB,KACtB,OAAO,SAAS,SAAS,aAAa,OAAO,OAAO,OAAO,WAAW,CAAC,GACvE,OAAO,QAAQ,OAAO,UAAU,KAAK,CAAC,CACxC,CACN,CACF,EAAA,CAES,SAAS,GAChB,OAAO,aAAa,QAAQ,OAAO,MAAM,qBAAqB,OAAO,WAAW;MAEhF,OAAO,aAAa;AAExB,CAAC,GACH,EAAE,MAAM,UAAU,CACpB,CAAC,CAAC,KAAK,OAAO,MAAM;;;;;AAyBtB,MAAa,wCACX,MAOA,SAA6B,8BACQ;CACrC,MAAM,wBAAwB,MAAM,cAAc,qCAAqC,MAAM,CAAC;CAE9F,MAAM,gBAAgB,MAAM,OAC1B,+BACA,OAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,OAAOA,mBAA2B;EAEhD,OAAO,8BAA8B,GAAG,EACtC,WAAW,OAAO,oBAAoB,MAAM,IAAI,GAAG,IAAI,EACzD,CAAC;CACH,CAAC,CACH;CAEA,MAAM,WAAW,MAAM,OACrB,OAAO,IAAIA,mBAA2B,qBAAqB,UACzD,aAAa,MAAM,EAAE,SAAS,MAAM,IAAI,QAAQ,CAAC,CACnD,CACF;CAEA,MAAM,iBAAiB,MAAM,OAC3B,OAAO,IAAI,gCAAgC,EAAE,gBAC3C,yBAAyB,SAAS,CAAC,CAAC,KAClC,MAAM,QAAQ,gBAAgB,GAC9B,MAAM,QAAQ,QAAQ,CACxB,CACF,CACF;CAEA,MAAM,cAAc,MAAM,SACxB,cAAc,MAAM,MAAM,GAC1B,mBAAmB,MAAM,MAAM,GAC/B,mBAAmB,MAAM,MAAM,GAC/B,qBACF,CAAC,CAAC,KACA,MAAM,aAAa,cAAc,GACjC,MAAM,QACJ,sCAAsC,KAAK,MAAM,QAAQ,uBAAuB,KAAK,CAAC,CACxF,GACA,MAAM,QAAQ,cAAc,KAAK,GACjC,MAAM,aAAa,mBAAmB,mBAAmB,KAAK,GAC9D,MAAM,QAAQ,IAAI,GAClB,MAAM,aAAa,aAAa,CAClC;CAEA,MAAM,UAIF,MAAM,cACR,OAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,OAAOA,mBAA2B;EAChD,MAAM,QAAQ,OAAO,OAAO;EAE5B,OAAO,OAAO,MAAM,sBAAsB,MAAM,eAAe,aAAa,KAAK,CAAC;CACpF,CAAC,CACH;CAMA,MAAM,OAAOC,cAAsB,KAAK,SAAS;EAC/C,YAAY,OAAO;EACnB,KAAA,EALA,eAAe,YAAqB,cAAc,OAAO,EAKvD;EACF,QAAQ,aAAa,MAAM;CAC7B,CAAC;CAED,MAAM,oCAAoC,KAAK;EAC7C,MAAe,WAAuD;GACpE,OAAO,MAAM,QAAQ,SAAS;EAChC;CACF;CAEA,OAAO;AACT"}
|
|
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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"}
|
|
@@ -165,13 +165,13 @@ declare const encodeUnknownResolutionCommand: (input: UnknownResolutionCommand,
|
|
|
165
165
|
readonly author: string;
|
|
166
166
|
readonly reason: string;
|
|
167
167
|
readonly resolution: {
|
|
168
|
-
readonly _tag: "SafeToRetry";
|
|
169
|
-
} | {
|
|
170
168
|
readonly _tag: "CompletedWithResult";
|
|
171
169
|
readonly result: Schema.Json;
|
|
172
170
|
readonly isFailure: boolean;
|
|
173
171
|
} | {
|
|
174
172
|
readonly _tag: "NeverHappened";
|
|
173
|
+
} | {
|
|
174
|
+
readonly _tag: "SafeToRetry";
|
|
175
175
|
} | {
|
|
176
176
|
readonly _tag: "AbortSubmission";
|
|
177
177
|
};
|
|
@@ -246,11 +246,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
246
246
|
readonly createdAt: string;
|
|
247
247
|
readonly deploymentId: string;
|
|
248
248
|
readonly payload: {
|
|
249
|
-
readonly _tag: "AbortRequested";
|
|
250
|
-
readonly submissionId: string;
|
|
251
|
-
readonly author: string;
|
|
252
|
-
readonly reason: string;
|
|
253
|
-
} | {
|
|
254
249
|
readonly _tag: "ThreadCreated";
|
|
255
250
|
readonly agentId: string;
|
|
256
251
|
readonly definitions: {
|
|
@@ -387,6 +382,11 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
387
382
|
readonly runDisposition?: Schema.Json | undefined;
|
|
388
383
|
readonly finishReason?: "budget-exhausted" | undefined;
|
|
389
384
|
readonly exhausted?: "tokens" | "tool-calls" | "turns" | undefined;
|
|
385
|
+
} | {
|
|
386
|
+
readonly _tag: "AbortRequested";
|
|
387
|
+
readonly submissionId: string;
|
|
388
|
+
readonly author: string;
|
|
389
|
+
readonly reason: string;
|
|
390
390
|
} | {
|
|
391
391
|
readonly _tag: "SubmissionSettled";
|
|
392
392
|
readonly submissionId: string;
|
|
@@ -557,13 +557,13 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
557
557
|
readonly author: string;
|
|
558
558
|
readonly reason: string;
|
|
559
559
|
readonly resolution: {
|
|
560
|
-
readonly _tag: "SafeToRetry";
|
|
561
|
-
} | {
|
|
562
560
|
readonly _tag: "CompletedWithResult";
|
|
563
561
|
readonly result: Schema.Json;
|
|
564
562
|
readonly isFailure: boolean;
|
|
565
563
|
} | {
|
|
566
564
|
readonly _tag: "NeverHappened";
|
|
565
|
+
} | {
|
|
566
|
+
readonly _tag: "SafeToRetry";
|
|
567
567
|
} | {
|
|
568
568
|
readonly _tag: "AbortSubmission";
|
|
569
569
|
};
|
|
@@ -577,6 +577,16 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
577
577
|
readonly operation: string;
|
|
578
578
|
readonly message: string;
|
|
579
579
|
readonly cause?: Schema.Json | undefined;
|
|
580
|
+
} | {
|
|
581
|
+
readonly _tag: "HostProtocolError";
|
|
582
|
+
readonly message: string;
|
|
583
|
+
} | {
|
|
584
|
+
readonly _tag: "AgentInputError";
|
|
585
|
+
readonly message: string;
|
|
586
|
+
} | {
|
|
587
|
+
readonly _tag: "DigestError";
|
|
588
|
+
readonly message: string;
|
|
589
|
+
readonly cause?: Schema.Json | undefined;
|
|
580
590
|
} | {
|
|
581
591
|
readonly _tag: "AdmissionConflict";
|
|
582
592
|
readonly threadId: string;
|
|
@@ -588,6 +598,15 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
588
598
|
readonly _tag: "SettlementConflict";
|
|
589
599
|
readonly submissionId: string;
|
|
590
600
|
readonly existingOutcome: "aborted" | "completed" | "failed";
|
|
601
|
+
} | {
|
|
602
|
+
readonly _tag: "ApprovalConflict";
|
|
603
|
+
readonly submissionId: string;
|
|
604
|
+
readonly toolCallId: string;
|
|
605
|
+
readonly existingDecision: "approved" | "denied";
|
|
606
|
+
} | {
|
|
607
|
+
readonly _tag: "UnknownResolutionConflict";
|
|
608
|
+
readonly submissionId: string;
|
|
609
|
+
readonly toolCallId: string;
|
|
591
610
|
} | {
|
|
592
611
|
readonly _tag: "JoinedToHost";
|
|
593
612
|
readonly submissionId: string;
|
|
@@ -617,39 +636,20 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
617
636
|
readonly threadId: string;
|
|
618
637
|
readonly actualEpoch: number;
|
|
619
638
|
readonly attemptedEpoch: number;
|
|
620
|
-
} | {
|
|
621
|
-
readonly _tag: "OperationDenied";
|
|
622
|
-
readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
|
|
623
|
-
readonly reason: string;
|
|
624
|
-
readonly threadId?: string | undefined;
|
|
625
|
-
readonly submissionId?: string | undefined;
|
|
626
|
-
} | {
|
|
627
|
-
readonly _tag: "DigestError";
|
|
628
|
-
readonly message: string;
|
|
629
|
-
readonly cause?: Schema.Json | undefined;
|
|
630
639
|
} | {
|
|
631
640
|
readonly _tag: "DurableRuntimeFailpointError";
|
|
632
641
|
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "claim:after-claim" | "compaction:after-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-start-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:before-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append";
|
|
633
|
-
} | {
|
|
634
|
-
readonly _tag: "HostProtocolError";
|
|
635
|
-
readonly message: string;
|
|
636
|
-
} | {
|
|
637
|
-
readonly _tag: "AgentInputError";
|
|
638
|
-
readonly message: string;
|
|
639
|
-
} | {
|
|
640
|
-
readonly _tag: "ApprovalConflict";
|
|
641
|
-
readonly submissionId: string;
|
|
642
|
-
readonly toolCallId: string;
|
|
643
|
-
readonly existingDecision: "approved" | "denied";
|
|
644
|
-
} | {
|
|
645
|
-
readonly _tag: "UnknownResolutionConflict";
|
|
646
|
-
readonly submissionId: string;
|
|
647
|
-
readonly toolCallId: string;
|
|
648
642
|
} | {
|
|
649
643
|
readonly _tag: "AdmissionLimitExceeded";
|
|
650
644
|
readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
|
|
651
645
|
readonly actual: number;
|
|
652
646
|
readonly maximum: number;
|
|
647
|
+
} | {
|
|
648
|
+
readonly _tag: "OperationDenied";
|
|
649
|
+
readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
|
|
650
|
+
readonly reason: string;
|
|
651
|
+
readonly threadId?: string | undefined;
|
|
652
|
+
readonly submissionId?: string | undefined;
|
|
653
653
|
};
|
|
654
654
|
}, Schema.SchemaError, never>;
|
|
655
655
|
declare const decodeHostResponse: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Effect.Effect<AbortRecorded | ApprovalRecorded | HostFailed | ObservedPage | ProgressCancelled | ProgressObserved | SettlementReached | SubmitSucceeded | UnknownResolutionRecorded, Schema.SchemaError, never>;
|
|
@@ -157,7 +157,7 @@ declare namespace ThreadObject_d_exports {
|
|
|
157
157
|
* D-P6-1): a factory returning a class that applications export from their Worker entry.
|
|
158
158
|
* One SQLite-backed Object per Thread is the serialized owner (durability §6); the
|
|
159
159
|
* Object never runs `runResolvedWorker`'s infinite loop — each ingress event or alarm runs
|
|
160
|
-
* ONE bounded `runRecovery` + `
|
|
160
|
+
* ONE bounded `runRecovery` + `processThreadHead` pass, and the persisted alarm
|
|
161
161
|
* (the single multiplexed slot, D-P6-2) finishes accepted work across evictions WITHOUT any
|
|
162
162
|
* incoming request.
|
|
163
163
|
*
|
|
@@ -286,13 +286,13 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
286
286
|
readonly author: string;
|
|
287
287
|
readonly reason: string;
|
|
288
288
|
readonly resolution: {
|
|
289
|
-
readonly _tag: "SafeToRetry";
|
|
290
|
-
} | {
|
|
291
289
|
readonly _tag: "CompletedWithResult";
|
|
292
290
|
readonly result: Schema.Json;
|
|
293
291
|
readonly isFailure: boolean;
|
|
294
292
|
} | {
|
|
295
293
|
readonly _tag: "NeverHappened";
|
|
294
|
+
} | {
|
|
295
|
+
readonly _tag: "SafeToRetry";
|
|
296
296
|
} | {
|
|
297
297
|
readonly _tag: "AbortSubmission";
|
|
298
298
|
};
|
|
@@ -636,6 +636,13 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
636
636
|
readonly operation: string;
|
|
637
637
|
readonly message: string;
|
|
638
638
|
readonly cause?: Schema.Json | undefined;
|
|
639
|
+
} | {
|
|
640
|
+
readonly _tag: "HostProtocolError";
|
|
641
|
+
readonly message: string;
|
|
642
|
+
} | {
|
|
643
|
+
readonly _tag: "DigestError";
|
|
644
|
+
readonly message: string;
|
|
645
|
+
readonly cause?: Schema.Json | undefined;
|
|
639
646
|
} | {
|
|
640
647
|
readonly _tag: "SettlementConflict";
|
|
641
648
|
readonly submissionId: string;
|
|
@@ -665,6 +672,9 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
665
672
|
readonly threadId: string;
|
|
666
673
|
readonly actualEpoch: number;
|
|
667
674
|
readonly attemptedEpoch: number;
|
|
675
|
+
} | {
|
|
676
|
+
readonly _tag: "DurableRuntimeFailpointError";
|
|
677
|
+
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "claim:after-claim" | "compaction:after-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-start-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:before-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append";
|
|
668
678
|
} | {
|
|
669
679
|
readonly _tag: "OperationDenied";
|
|
670
680
|
readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
|
|
@@ -681,20 +691,10 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
681
691
|
readonly _tag: "RunJournalError";
|
|
682
692
|
readonly message: string;
|
|
683
693
|
readonly cause?: Schema.Json | undefined;
|
|
684
|
-
} | {
|
|
685
|
-
readonly _tag: "DigestError";
|
|
686
|
-
readonly message: string;
|
|
687
|
-
readonly cause?: Schema.Json | undefined;
|
|
688
694
|
} | {
|
|
689
695
|
readonly _tag: "OwnershipLost";
|
|
690
696
|
readonly submissionId: string;
|
|
691
697
|
readonly actualEpoch: number;
|
|
692
|
-
} | {
|
|
693
|
-
readonly _tag: "DurableRuntimeFailpointError";
|
|
694
|
-
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "claim:after-claim" | "compaction:after-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-start-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:before-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append";
|
|
695
|
-
} | {
|
|
696
|
-
readonly _tag: "HostProtocolError";
|
|
697
|
-
readonly message: string;
|
|
698
698
|
};
|
|
699
699
|
}, Schema.SchemaError, never>;
|
|
700
700
|
declare const decodeAdminResponse: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Effect.Effect<AdminFailed | ExplainedRecovery | ObligationsScanned | RetryExecuted | VerifiedIntegrity, Schema.SchemaError, never>;
|
|
@@ -732,4 +732,4 @@ interface Class<EventServices = never> {
|
|
|
732
732
|
declare const make: <ApplicationServices, ApplicationError, EventServices = never, EventLayerError = never>(applicationLayer: Layer.Layer<CloudflareDurableRuntimeServices | ApplicationServices, ApplicationError, CloudflareBootstrapServices | DurableObjectState$1.DurableObjectState | WorkerEnvironment | DurableObjectContext | ThreadObjectNamespace>, options: Options<ApplicationServices, EventServices, EventLayerError>) => Class<ApplicationServices | EventServices>;
|
|
733
733
|
//#endregion
|
|
734
734
|
export { CloudflareDurableRuntimeOptions as C, layerConfig as E, CloudflareDurableRuntimeInitializationError as S, layer as T, decodeObligationThresholds as _, AdminVerifyRequest as a, make as b, Instance as c, RetryExecuted as d, ThreadObject_d_exports as f, decodeAdminVerifyRequest as g, decodeAdminResponse as h, AdminResponse as i, ObligationsScanned as l, decodeAdminExplainRequest as m, AdminFailed as n, Class as o, VerifiedIntegrity as p, AdminFailure as r, ExplainedRecovery as s, AdminExplainRequest as t, Options as u, decodeRetryCommand as v, CloudflareDurableRuntimeServices as w, CloudflareBootstrapServices as x, encodeAdminResponse as y };
|
|
735
|
-
//# sourceMappingURL=ThreadObject-
|
|
735
|
+
//# sourceMappingURL=ThreadObject-DH1RYqyz.d.mts.map
|