better-cf 1.0.0 → 2.0.0
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/README.md +153 -77
- package/dist/cli/index.js +2864 -999
- package/dist/cli/index.js.map +1 -1
- package/dist/durable-object/index.d.ts +7 -0
- package/dist/durable-object/index.js +244 -0
- package/dist/durable-object/index.js.map +1 -0
- package/dist/durable-object/internal.d.ts +96 -0
- package/dist/durable-object/internal.js +427 -0
- package/dist/durable-object/internal.js.map +1 -0
- package/dist/testing/index.d.ts +16 -1
- package/dist/testing/index.js +342 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/types-C1mNTuC-.d.ts +239 -0
- package/package.json +24 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { B as BetterCfAutoEnv, a as BetterCfSDK } from '../types-C1mNTuC-.js';
|
|
2
|
+
export { b as BetterCfGeneratedApi, c as BetterCfGeneratedBindings, C as ConsumerBatchEntry, d as ContentType, D as DefineDurableObject, e as DefineQueue, f as DefineQueues, g as DefineWorker, h as DurableAlarmConfig, i as DurableBaseContext, j as DurableFetchConfig, k as DurableFetchRef, l as DurableFnArgs, m as DurableFnConfig, n as DurableFnKey, o as DurableFnRef, p as DurableFnReturn, q as DurableInitConfig, r as DurableInitRef, s as DurableObjectConfig, t as DurableObjectHandle, u as DurableObjectKey, v as DurableWebSocketConfig, w as DurableWebSocketConnectContext, x as DurableWebSocketEventContext, y as DurableWebSocketRef, z as Duration, M as MultiJobQueueConfig, A as MultiJobQueueHandle, P as PullConsumerConfig, Q as QueueBatchConsumerConfig, E as QueueBatchConsumerRef, F as QueueBatchContext, G as QueueCommonConfig, H as QueueConfig, I as QueueConsumerRef, J as QueueHandle, K as QueueJobConfig, L as QueueJobConsumerRef, N as QueueJobHandle, O as QueueJobPayload, R as QueueMessageConsumerConfig, S as QueueMessageContext, T as QueuePayload, U as RuntimeApi, V as RuntimeEnv, W as SendBatchEntry, X as SendOptions, Y as WorkerConfig, Z as WorkerContext, _ as WorkerEntrypoint } from '../types-C1mNTuC-.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
|
|
5
|
+
declare function createSDK<E extends Record<string, unknown> = BetterCfAutoEnv>(): BetterCfSDK<E>;
|
|
6
|
+
|
|
7
|
+
export { BetterCfAutoEnv, BetterCfSDK, createSDK };
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// src/durable-object/internal.ts
|
|
2
|
+
var kDurableObjectInternals = /* @__PURE__ */ Symbol.for("better-cf.durable-object.definition");
|
|
3
|
+
var kDurableRegistrationInternals = /* @__PURE__ */ Symbol.for("better-cf.durable-object.registration");
|
|
4
|
+
var kQueueDefinitionInternals = /* @__PURE__ */ Symbol.for("better-cf.durable-object.queue.definition");
|
|
5
|
+
var kQueueConsumerInternals = /* @__PURE__ */ Symbol.for("better-cf.durable-object.queue.consumer");
|
|
6
|
+
var kWorkerInternals = /* @__PURE__ */ Symbol.for("better-cf.durable-object.worker");
|
|
7
|
+
function createRuntimeContext(env, executionCtx) {
|
|
8
|
+
return {
|
|
9
|
+
env,
|
|
10
|
+
executionCtx,
|
|
11
|
+
api: {}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function normalizeKey(value) {
|
|
15
|
+
if (typeof value === "string") {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === "number" || typeof value === "boolean" || value === null) {
|
|
19
|
+
return String(value);
|
|
20
|
+
}
|
|
21
|
+
return JSON.stringify(value);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// src/durable-object/define-durable-object.ts
|
|
25
|
+
function defineDurableObjectFactory() {
|
|
26
|
+
return function defineDurableObject(config) {
|
|
27
|
+
const handle = {
|
|
28
|
+
fn(fnConfig) {
|
|
29
|
+
return createTypedFunctionRegistration("public", fnConfig);
|
|
30
|
+
},
|
|
31
|
+
internal(fnConfig) {
|
|
32
|
+
return createTypedFunctionRegistration("internal", fnConfig);
|
|
33
|
+
},
|
|
34
|
+
fetch(fetchConfig) {
|
|
35
|
+
return createRegistration({ kind: "fetch", config: fetchConfig });
|
|
36
|
+
},
|
|
37
|
+
alarm(alarmConfig) {
|
|
38
|
+
return createRegistration({ kind: "alarm", config: alarmConfig });
|
|
39
|
+
},
|
|
40
|
+
init(initConfig) {
|
|
41
|
+
return createRegistration({ kind: "init", config: initConfig });
|
|
42
|
+
},
|
|
43
|
+
websocket(websocketConfig) {
|
|
44
|
+
return createRegistration({ kind: "websocket", config: websocketConfig });
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(handle, kDurableObjectInternals, {
|
|
48
|
+
enumerable: false,
|
|
49
|
+
configurable: false,
|
|
50
|
+
writable: false,
|
|
51
|
+
value: {
|
|
52
|
+
config,
|
|
53
|
+
keySchema: config.key,
|
|
54
|
+
serializeKey(value) {
|
|
55
|
+
const parsed = config.key.safeParse(value);
|
|
56
|
+
if (!parsed.success) {
|
|
57
|
+
throw new Error(`Invalid durable object key for ${config.name}: ${parsed.error.message}`);
|
|
58
|
+
}
|
|
59
|
+
return normalizeKey(parsed.data);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return handle;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function createFunctionRegistration(visibility, config) {
|
|
67
|
+
return createRegistration({
|
|
68
|
+
kind: "function",
|
|
69
|
+
visibility,
|
|
70
|
+
config
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function createTypedFunctionRegistration(visibility, config) {
|
|
74
|
+
return createFunctionRegistration(visibility, config);
|
|
75
|
+
}
|
|
76
|
+
function createRegistration(value) {
|
|
77
|
+
const registration = {};
|
|
78
|
+
Object.defineProperty(registration, kDurableRegistrationInternals, {
|
|
79
|
+
enumerable: false,
|
|
80
|
+
configurable: false,
|
|
81
|
+
writable: false,
|
|
82
|
+
value: value && typeof value === "object" && "kind" in value ? mapRegistration(value) : value
|
|
83
|
+
});
|
|
84
|
+
return registration;
|
|
85
|
+
}
|
|
86
|
+
function mapRegistration(value) {
|
|
87
|
+
if (value.kind === "function") {
|
|
88
|
+
return {
|
|
89
|
+
visibility: value.visibility,
|
|
90
|
+
config: value.config
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
config: value.config
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/durable-object/define-queue.ts
|
|
99
|
+
var RESERVED_MULTI_JOB_KEYS = /* @__PURE__ */ new Set([
|
|
100
|
+
"retry",
|
|
101
|
+
"retryDelay",
|
|
102
|
+
"deadLetter",
|
|
103
|
+
"deliveryDelay",
|
|
104
|
+
"visibilityTimeout",
|
|
105
|
+
"batch",
|
|
106
|
+
"consumer",
|
|
107
|
+
"args",
|
|
108
|
+
"description"
|
|
109
|
+
]);
|
|
110
|
+
function defineQueueFactory() {
|
|
111
|
+
return function defineQueue(config) {
|
|
112
|
+
assertNoInlineHandlers(config);
|
|
113
|
+
let bindingName = null;
|
|
114
|
+
const handle = {
|
|
115
|
+
message(consumerConfig) {
|
|
116
|
+
return createConsumerRegistration("message", handle, consumerConfig);
|
|
117
|
+
},
|
|
118
|
+
batch(consumerConfig) {
|
|
119
|
+
return createConsumerRegistration("batch", handle, consumerConfig);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
Object.defineProperty(handle, kQueueDefinitionInternals, {
|
|
123
|
+
enumerable: false,
|
|
124
|
+
configurable: false,
|
|
125
|
+
writable: false,
|
|
126
|
+
value: {
|
|
127
|
+
kind: "single",
|
|
128
|
+
config,
|
|
129
|
+
bindingName,
|
|
130
|
+
setBinding(name) {
|
|
131
|
+
bindingName = name;
|
|
132
|
+
},
|
|
133
|
+
getBinding() {
|
|
134
|
+
return bindingName;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
return handle;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function defineQueuesFactory() {
|
|
142
|
+
return function defineQueues(config) {
|
|
143
|
+
const jobs = Object.entries(config).filter(([key, value]) => {
|
|
144
|
+
if (RESERVED_MULTI_JOB_KEYS.has(key)) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return isQueueJobConfig(value);
|
|
148
|
+
});
|
|
149
|
+
if (jobs.length === 0) {
|
|
150
|
+
throw new Error("Multi-job queue config must define at least one job.");
|
|
151
|
+
}
|
|
152
|
+
let bindingName = null;
|
|
153
|
+
const parent = {};
|
|
154
|
+
Object.defineProperty(parent, kQueueDefinitionInternals, {
|
|
155
|
+
enumerable: false,
|
|
156
|
+
configurable: false,
|
|
157
|
+
writable: false,
|
|
158
|
+
value: {
|
|
159
|
+
kind: "multi",
|
|
160
|
+
config,
|
|
161
|
+
bindingName,
|
|
162
|
+
setBinding(name) {
|
|
163
|
+
bindingName = name;
|
|
164
|
+
},
|
|
165
|
+
getBinding() {
|
|
166
|
+
return bindingName;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
for (const [jobName] of jobs) {
|
|
171
|
+
parent[jobName] = createJobHandle(parent, jobName);
|
|
172
|
+
}
|
|
173
|
+
return parent;
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function createJobHandle(parent, jobName) {
|
|
177
|
+
return {
|
|
178
|
+
message(consumerConfig) {
|
|
179
|
+
return createConsumerRegistration("job-message", parent, consumerConfig, jobName);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function createConsumerRegistration(type, queue, config, jobName) {
|
|
184
|
+
const registration = {};
|
|
185
|
+
Object.defineProperty(registration, kQueueConsumerInternals, {
|
|
186
|
+
enumerable: false,
|
|
187
|
+
configurable: false,
|
|
188
|
+
writable: false,
|
|
189
|
+
value: {
|
|
190
|
+
type,
|
|
191
|
+
queue,
|
|
192
|
+
jobName,
|
|
193
|
+
config
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
return registration;
|
|
197
|
+
}
|
|
198
|
+
function isQueueJobConfig(value) {
|
|
199
|
+
return typeof value === "object" && value !== null && "args" in value;
|
|
200
|
+
}
|
|
201
|
+
function assertNoInlineHandlers(config) {
|
|
202
|
+
if ("handler" in config || "batchHandler" in config || "onFailure" in config) {
|
|
203
|
+
throw new Error(
|
|
204
|
+
"Inline queue handlers are not supported in better-cf/durable-object. Use queue.message(...) or queue.batch(...)."
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/durable-object/define-worker.ts
|
|
210
|
+
function defineWorkerFactory() {
|
|
211
|
+
return function defineWorker(config) {
|
|
212
|
+
const entrypoint = {
|
|
213
|
+
async fetch(request, env, executionCtx) {
|
|
214
|
+
return config.fetch(request, createRuntimeContext(env, executionCtx));
|
|
215
|
+
},
|
|
216
|
+
...config.scheduled ? {
|
|
217
|
+
async scheduled(event, env, executionCtx) {
|
|
218
|
+
await config.scheduled?.(event, createRuntimeContext(env, executionCtx));
|
|
219
|
+
}
|
|
220
|
+
} : {}
|
|
221
|
+
};
|
|
222
|
+
Object.defineProperty(entrypoint, kWorkerInternals, {
|
|
223
|
+
enumerable: false,
|
|
224
|
+
configurable: false,
|
|
225
|
+
writable: false,
|
|
226
|
+
value: { config }
|
|
227
|
+
});
|
|
228
|
+
return entrypoint;
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// src/durable-object/create-sdk.ts
|
|
233
|
+
function createSDK() {
|
|
234
|
+
return {
|
|
235
|
+
defineDurableObject: defineDurableObjectFactory(),
|
|
236
|
+
defineQueue: defineQueueFactory(),
|
|
237
|
+
defineQueues: defineQueuesFactory(),
|
|
238
|
+
defineWorker: defineWorkerFactory()
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export { createSDK };
|
|
243
|
+
//# sourceMappingURL=index.js.map
|
|
244
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/durable-object/internal.ts","../../src/durable-object/define-durable-object.ts","../../src/durable-object/define-queue.ts","../../src/durable-object/define-worker.ts","../../src/durable-object/create-sdk.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { parseDurationSeconds, toCloudflareSendOptions } from '../queue/utils.js';\nimport type {\n BetterCfGeneratedApi,\n BetterCfGeneratedBindings,\n BetterCfSDK,\n DurableAlarmConfig,\n DurableBaseContext,\n DurableFetchConfig,\n DurableFnConfig,\n DurableObjectConfig,\n DurableWebSocketConfig,\n MultiJobQueueConfig,\n PullConsumerConfig,\n QueueBatchConsumerConfig,\n QueueConfig,\n QueueJobConfig,\n QueueMessageConsumerConfig,\n RuntimeEnv,\n WorkerConfig,\n WorkerContext\n} from './types.js';\nimport type { z } from 'zod';\n\nexport const kDurableObjectInternals = Symbol.for('better-cf.durable-object.definition');\nexport const kDurableRegistrationInternals = Symbol.for('better-cf.durable-object.registration');\nexport const kQueueDefinitionInternals = Symbol.for('better-cf.durable-object.queue.definition');\nexport const kQueueConsumerInternals = Symbol.for('better-cf.durable-object.queue.consumer');\nexport const kWorkerInternals = Symbol.for('better-cf.durable-object.worker');\n\ntype ApiFactory = (env: unknown, executionCtx: ExecutionContext) => BetterCfGeneratedApi;\n\nlet apiFactory: ApiFactory | null = null;\n\nexport function setGeneratedApiFactory(factory: ApiFactory): void {\n apiFactory = factory;\n}\n\nexport function createRuntimeContext<E>(env: E, executionCtx: ExecutionContext): WorkerContext<E> {\n return {\n env: env as RuntimeEnv<E>,\n executionCtx,\n api: (apiFactory?.(env, executionCtx) ?? {}) as BetterCfGeneratedApi\n };\n}\n\nexport interface DurableObjectInternal<TKey> {\n config: DurableObjectConfig<z.ZodType<TKey>>;\n keySchema: z.ZodType<TKey>;\n serializeKey: (value: TKey) => string;\n}\n\nexport interface DurableFunctionInternal<E, TKey, TArgs, TReturn> {\n visibility: 'public' | 'internal';\n config: DurableFnConfig<E, z.ZodType<TArgs>, TReturn>;\n}\n\nexport interface DurableFetchInternal<E> {\n config: DurableFetchConfig<E>;\n}\n\nexport interface DurableAlarmInternal<E> {\n config: DurableAlarmConfig<E>;\n}\n\nexport interface DurableInitInternal<E> {\n config: { description?: string; handler: (ctx: DurableBaseContext<E>) => Promise<void> | void };\n}\n\nexport interface DurableWebSocketInternal<E, TAttachment> {\n config: DurableWebSocketConfig<E, TAttachment>;\n}\n\ntype PushQueueConsumerType = 'message' | 'batch' | 'job-message';\n\nexport interface QueueDefinitionInternal {\n kind: 'single' | 'multi';\n config: QueueConfig<z.ZodTypeAny> | MultiJobQueueConfig<Record<string, unknown>>;\n bindingName: string | null;\n setBinding: (bindingName: string) => void;\n getBinding: () => string | null;\n}\n\nexport interface QueueConsumerInternal<E> {\n type: PushQueueConsumerType;\n queue: unknown;\n jobName?: string;\n config: QueueMessageConsumerConfig<E, unknown> | QueueBatchConsumerConfig<E, unknown>;\n}\n\nexport interface WorkerInternal<E> {\n config: WorkerConfig<E>;\n}\n\nexport function normalizeKey(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n return String(value);\n }\n\n return JSON.stringify(value);\n}\n\nexport function makeDurableBaseContext<E>(\n env: E,\n executionCtx: ExecutionContext,\n state: DurableObjectState\n): DurableBaseContext<E> {\n const runtime = createRuntimeContext(env, executionCtx);\n return {\n ...runtime,\n state,\n storage: state.storage,\n sql: state.storage.sql\n };\n}\n\nexport function getDurableObjectInternals<TKey>(value: unknown): DurableObjectInternal<TKey> {\n if (!value || typeof value !== 'object') {\n throw new Error('Value is not a durable object definition.');\n }\n\n const internals = (value as Record<PropertyKey, unknown>)[kDurableObjectInternals];\n if (!internals) {\n throw new Error('Object is not a better-cf durable object handle.');\n }\n\n return internals as DurableObjectInternal<TKey>;\n}\n\nexport function getDurableRegistrationInternals(value: unknown):\n | DurableFunctionInternal<unknown, unknown, unknown, unknown>\n | DurableFetchInternal<unknown>\n | DurableAlarmInternal<unknown>\n | DurableInitInternal<unknown>\n | DurableWebSocketInternal<unknown, unknown> {\n if (!value || typeof value !== 'object') {\n throw new Error('Value is not a durable object registration.');\n }\n\n const internals = (value as Record<PropertyKey, unknown>)[kDurableRegistrationInternals];\n if (!internals) {\n throw new Error('Object is not a better-cf durable object registration.');\n }\n\n return internals as\n | DurableFunctionInternal<unknown, unknown, unknown, unknown>\n | DurableFetchInternal<unknown>\n | DurableAlarmInternal<unknown>\n | DurableInitInternal<unknown>\n | DurableWebSocketInternal<unknown, unknown>;\n}\n\nexport function getQueueDefinitionInternals(value: unknown): QueueDefinitionInternal {\n if (!value || typeof value !== 'object') {\n throw new Error('Value is not a queue definition.');\n }\n\n const internals = (value as Record<PropertyKey, unknown>)[kQueueDefinitionInternals];\n if (!internals) {\n throw new Error('Object is not a better-cf durable-object queue handle.');\n }\n\n return internals as QueueDefinitionInternal;\n}\n\nexport function getQueueConsumerInternals<E>(value: unknown): QueueConsumerInternal<E> {\n if (!value || typeof value !== 'object') {\n throw new Error('Value is not a queue consumer registration.');\n }\n\n const internals = (value as Record<PropertyKey, unknown>)[kQueueConsumerInternals];\n if (!internals) {\n throw new Error('Object is not a better-cf durable-object queue consumer registration.');\n }\n\n return internals as QueueConsumerInternal<E>;\n}\n\nexport function getWorkerInternals<E>(value: unknown): WorkerInternal<E> | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const internals = (value as Record<PropertyKey, unknown>)[kWorkerInternals];\n return internals as WorkerInternal<E> | undefined;\n}\n\nexport function createQueueProducerApi(\n binding: unknown,\n payload: unknown,\n options?: { delay?: number; contentType?: string }\n): Promise<void> {\n const queueBinding = binding as\n | {\n send: (value: unknown, opts?: { delaySeconds?: number; contentType?: string }) => Promise<void>;\n }\n | undefined;\n\n if (!queueBinding || typeof queueBinding.send !== 'function') {\n throw new Error('Queue binding is not available in env.');\n }\n\n return queueBinding.send(payload, options);\n}\n\nexport function createQueueProducerBatchApi(\n binding: unknown,\n payload: Array<{ body: unknown; delaySeconds?: number; contentType?: string }>\n): Promise<void> {\n const queueBinding = binding as\n | {\n sendBatch: (entries: Array<{ body: unknown; delaySeconds?: number; contentType?: string }>) => Promise<void>;\n }\n | undefined;\n\n if (!queueBinding || typeof queueBinding.sendBatch !== 'function') {\n throw new Error('Queue binding is not available in env.');\n }\n\n return queueBinding.sendBatch(payload);\n}\n\nexport async function consumeQueueRegistration<E>(\n definitionHandle: unknown,\n consumerRegistration: unknown,\n batch: MessageBatch<unknown>,\n env: E,\n executionCtx: ExecutionContext\n): Promise<void> {\n const definition = getQueueDefinitionInternals(definitionHandle);\n const consumer = getQueueConsumerInternals<E>(consumerRegistration);\n const runtime = createRuntimeContext(env, executionCtx);\n\n if (definition.config.consumer && (definition.config.consumer as PullConsumerConfig).type === 'http_pull') {\n batch.ackAll();\n return;\n }\n\n if (consumer.type === 'batch') {\n let ackOrRetryHandled = false;\n const batchCtx = {\n ...runtime,\n batch: {\n queue: batch.queue,\n receivedAt: new Date(),\n firstMessageTimestamp: batch.messages[0]?.timestamp,\n ackAll: () => {\n ackOrRetryHandled = true;\n batch.ackAll();\n },\n retryAll: (options?: { delaySeconds?: number }) => {\n ackOrRetryHandled = true;\n batch.retryAll(options);\n }\n }\n };\n\n try {\n const schema = (definition.config as QueueConfig<z.ZodTypeAny>).args;\n const entries = batch.messages.map((message) => {\n const parsed = schema.safeParse(message.body);\n if (!parsed.success) {\n throw new Error(`Queue batch validation failed for ${message.id}: ${parsed.error.message}`);\n }\n\n return {\n data: parsed.data,\n id: message.id,\n timestamp: message.timestamp,\n attempts: message.attempts\n };\n });\n\n await (consumer.config as QueueBatchConsumerConfig<E, unknown>).handler(batchCtx, entries);\n if (!ackOrRetryHandled) {\n batch.ackAll();\n }\n } catch (error) {\n const failure = (consumer.config as QueueBatchConsumerConfig<E, unknown>).failure;\n if (failure) {\n await failure(batchCtx, null, toError(error));\n }\n if (!ackOrRetryHandled) {\n batch.retryAll(withRetryDelay(definition.config.retryDelay));\n }\n }\n return;\n }\n\n if (consumer.type === 'job-message') {\n const jobConfig = (definition.config as MultiJobQueueConfig<Record<string, unknown>>)[\n consumer.jobName as string\n ] as QueueJobConfig<z.ZodTypeAny>;\n\n for (const message of batch.messages) {\n const envelope = message.body as { _job?: string; data?: unknown };\n if (envelope?._job !== consumer.jobName) {\n if (!envelope?._job) {\n message.ack();\n }\n continue;\n }\n\n const messageCtx = {\n ...runtime,\n message: {\n id: message.id,\n timestamp: message.timestamp,\n attempts: message.attempts,\n queue: batch.queue\n }\n };\n\n try {\n const parsed = jobConfig.args.safeParse(envelope.data);\n if (!parsed.success) {\n throw new Error(`Queue job validation failed for ${consumer.jobName}: ${parsed.error.message}`);\n }\n\n await (consumer.config as QueueMessageConsumerConfig<E, unknown>).handler(messageCtx, parsed.data);\n message.ack();\n } catch (error) {\n const failure = (consumer.config as QueueMessageConsumerConfig<E, unknown>).failure;\n if (failure) {\n await failure(messageCtx, envelope.data ?? null, toError(error));\n }\n message.retry(withRetryDelay(definition.config.retryDelay));\n }\n }\n return;\n }\n\n for (const message of batch.messages) {\n const messageCtx = {\n ...runtime,\n message: {\n id: message.id,\n timestamp: message.timestamp,\n attempts: message.attempts,\n queue: batch.queue\n }\n };\n\n try {\n const schema = (definition.config as QueueConfig<z.ZodTypeAny>).args;\n const parsed = schema.safeParse(message.body);\n if (!parsed.success) {\n throw new Error(`Queue args validation failed: ${parsed.error.message}`);\n }\n\n await (consumer.config as QueueMessageConsumerConfig<E, unknown>).handler(messageCtx, parsed.data);\n message.ack();\n } catch (error) {\n const failure = (consumer.config as QueueMessageConsumerConfig<E, unknown>).failure;\n if (failure) {\n await failure(messageCtx, message.body as unknown, toError(error));\n }\n message.retry(withRetryDelay(definition.config.retryDelay));\n }\n }\n}\n\nexport async function invokeDurableFunction<E, TArgs, TReturn>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown,\n args: TArgs\n): Promise<TReturn> {\n const internals = getDurableRegistrationInternals(registration) as DurableFunctionInternal<E, unknown, TArgs, TReturn>;\n const parsed = internals.config.args.safeParse(args);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n const result = await internals.config.handler(ctx, parsed.data);\n if (internals.config.returns) {\n return internals.config.returns.parse(result);\n }\n return result;\n}\n\nexport async function invokeDurableFetch<E>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown,\n request: Request\n): Promise<Response> {\n const internals = getDurableRegistrationInternals(registration) as DurableFetchInternal<E>;\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n return internals.config.handler({\n ...ctx,\n request\n });\n}\n\nexport async function invokeDurableAlarm<E>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown,\n alarmInfo: AlarmInvocationInfo\n): Promise<void> {\n const internals = getDurableRegistrationInternals(registration) as DurableAlarmInternal<E>;\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n await internals.config.handler({\n ...ctx,\n alarmInfo\n });\n}\n\nexport async function invokeDurableInit<E>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown\n): Promise<void> {\n const internals = getDurableRegistrationInternals(registration) as DurableInitInternal<E>;\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n await internals.config.handler(ctx);\n}\n\nexport async function invokeDurableWebSocketConnect<E, TAttachment>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown,\n request: Request\n): Promise<Response> {\n const internals = getDurableRegistrationInternals(registration) as DurableWebSocketInternal<E, TAttachment>;\n const pair = new WebSocketPair();\n const client = pair[0];\n const server = pair[1];\n let accepted = false;\n\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n const response = await internals.config.connect?.({\n ...ctx,\n request,\n client,\n server,\n accept(options) {\n accepted = true;\n state.acceptWebSocket(server, options?.tags);\n if (options?.attachment !== undefined) {\n const attachment = internals.config.serializeAttachment\n ? internals.config.serializeAttachment(options.attachment)\n : options.attachment;\n server.serializeAttachment(attachment);\n }\n }\n });\n\n if (response) {\n return response;\n }\n\n if (!accepted) {\n state.acceptWebSocket(server);\n }\n\n return new Response(null, {\n status: 101,\n webSocket: client\n });\n}\n\nexport async function invokeDurableWebSocketMessage<E, TAttachment>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown,\n socket: WebSocket,\n message: string | ArrayBuffer\n): Promise<void> {\n const internals = getDurableRegistrationInternals(registration) as DurableWebSocketInternal<E, TAttachment>;\n if (!internals.config.message) {\n return;\n }\n\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n await internals.config.message({\n ...ctx,\n socket,\n attachment: hydrateAttachment(socket, internals)\n }, message);\n}\n\nexport async function invokeDurableWebSocketClose<E, TAttachment>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown,\n socket: WebSocket,\n code: number,\n reason: string,\n wasClean: boolean\n): Promise<void> {\n const internals = getDurableRegistrationInternals(registration) as DurableWebSocketInternal<E, TAttachment>;\n if (!internals.config.close) {\n return;\n }\n\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n await internals.config.close({\n ...ctx,\n socket,\n attachment: hydrateAttachment(socket, internals)\n }, code, reason, wasClean);\n}\n\nexport async function invokeDurableWebSocketError<E, TAttachment>(\n env: E,\n state: DurableObjectState,\n executionCtx: ExecutionContext,\n registration: unknown,\n socket: WebSocket,\n error: unknown\n): Promise<void> {\n const internals = getDurableRegistrationInternals(registration) as DurableWebSocketInternal<E, TAttachment>;\n if (!internals.config.error) {\n return;\n }\n\n const ctx = makeDurableBaseContext(env, executionCtx, state);\n await internals.config.error({\n ...ctx,\n socket,\n attachment: hydrateAttachment(socket, internals)\n }, error);\n}\n\nfunction hydrateAttachment<E, TAttachment>(\n socket: WebSocket,\n internals: DurableWebSocketInternal<E, TAttachment>\n): TAttachment | undefined {\n const value = socket.deserializeAttachment();\n if (value === undefined) {\n return undefined;\n }\n return internals.config.hydrateAttachment ? internals.config.hydrateAttachment(value) : (value as TAttachment);\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction withRetryDelay(value: unknown): { delaySeconds?: number } | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return { delaySeconds: parseDurationSeconds(value as never) };\n}\n\nexport function createGeneratedQueueApi(binding: unknown, payload: unknown, options?: { delay?: unknown; contentType?: unknown }) {\n return createQueueProducerApi(binding, payload, toCloudflareSendOptions(options as never));\n}\n\nexport function createGeneratedQueueBatchApi(\n binding: unknown,\n messages: Array<{ data: unknown; delay?: unknown; contentType?: unknown }>\n) {\n return createQueueProducerBatchApi(\n binding,\n messages.map((message) => ({\n body: message.data,\n ...toCloudflareSendOptions(message as never)\n }))\n );\n}\n\nexport function resolveWorkerHandlers(moduleLike: {\n default?: unknown;\n fetch?: (request: Request, env: unknown, ctx: ExecutionContext) => Promise<Response>;\n scheduled?: (event: ScheduledEvent, env: unknown, ctx: ExecutionContext) => Promise<void>;\n}) {\n const root = moduleLike.default ?? moduleLike;\n const worker = getWorkerInternals(root);\n if (worker) {\n return {\n async fetch(request: Request, env: unknown, ctx: ExecutionContext): Promise<Response> {\n return worker.config.fetch(request, createRuntimeContext(env, ctx));\n },\n ...(worker.config.scheduled\n ? {\n async scheduled(event: ScheduledEvent, env: unknown, ctx: ExecutionContext): Promise<void> {\n await worker.config.scheduled?.(event, createRuntimeContext(env, ctx));\n }\n }\n : {})\n };\n }\n\n let fetchHandler: ((request: Request, env: unknown, ctx: ExecutionContext) => Promise<Response>) | undefined;\n if (root && typeof root === 'object' && 'fetch' in root) {\n const maybeFetch = (root as { fetch?: unknown }).fetch;\n if (typeof maybeFetch === 'function') {\n fetchHandler = maybeFetch.bind(root) as (request: Request, env: unknown, ctx: ExecutionContext) => Promise<Response>;\n }\n }\n\n if (!fetchHandler && typeof moduleLike.fetch === 'function') {\n fetchHandler = moduleLike.fetch;\n }\n\n if (!fetchHandler) {\n throw new Error('Could not resolve worker fetch handler.');\n }\n\n let scheduledHandler: ((event: ScheduledEvent, env: unknown, ctx: ExecutionContext) => Promise<void>) | undefined;\n if (root && typeof root === 'object' && 'scheduled' in root) {\n const maybeScheduled = (root as { scheduled?: unknown }).scheduled;\n if (typeof maybeScheduled === 'function') {\n scheduledHandler = maybeScheduled.bind(root) as (\n event: ScheduledEvent,\n env: unknown,\n ctx: ExecutionContext\n ) => Promise<void>;\n }\n }\n\n if (!scheduledHandler && typeof moduleLike.scheduled === 'function') {\n scheduledHandler = moduleLike.scheduled;\n }\n\n return {\n fetch: fetchHandler,\n scheduled: scheduledHandler\n };\n}\n","import { kDurableObjectInternals, kDurableRegistrationInternals, normalizeKey } from './internal.js';\nimport type {\n DefineDurableObject,\n DurableAlarmConfig,\n DurableFetchConfig,\n DurableFnConfig,\n DurableObjectConfig,\n DurableObjectHandle,\n DurableWebSocketConfig\n} from './types.js';\nimport type { z } from 'zod';\n\nexport function defineDurableObjectFactory<E>(): DefineDurableObject<E> {\n return function defineDurableObject<TKeySchema extends z.ZodTypeAny>(\n config: DurableObjectConfig<TKeySchema>\n ): DurableObjectHandle<E, z.infer<TKeySchema>> {\n const handle: Record<string | symbol, unknown> = {\n fn(fnConfig: DurableFnConfig<E, z.ZodTypeAny, unknown>) {\n return createTypedFunctionRegistration<E>('public', fnConfig);\n },\n internal(fnConfig: DurableFnConfig<E, z.ZodTypeAny, unknown>) {\n return createTypedFunctionRegistration<E>('internal', fnConfig);\n },\n fetch(fetchConfig: DurableFetchConfig<E>) {\n return createRegistration({ kind: 'fetch', config: fetchConfig });\n },\n alarm(alarmConfig: DurableAlarmConfig<E>) {\n return createRegistration({ kind: 'alarm', config: alarmConfig });\n },\n init(initConfig: { description?: string; handler: DurableFnConfig<E, z.ZodTypeAny, void>['handler'] }) {\n return createRegistration({ kind: 'init', config: initConfig });\n },\n websocket(websocketConfig: DurableWebSocketConfig<E, unknown>) {\n return createRegistration({ kind: 'websocket', config: websocketConfig });\n }\n };\n\n Object.defineProperty(handle, kDurableObjectInternals, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: {\n config,\n keySchema: config.key,\n serializeKey(value: unknown) {\n const parsed = config.key.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid durable object key for ${config.name}: ${parsed.error.message}`);\n }\n return normalizeKey(parsed.data);\n }\n }\n });\n\n return handle as unknown as DurableObjectHandle<E, z.infer<TKeySchema>>;\n };\n}\n\nfunction createFunctionRegistration(\n visibility: 'public' | 'internal',\n config: DurableFnConfig<unknown, z.ZodTypeAny, unknown>\n) {\n return createRegistration({\n kind: 'function',\n visibility,\n config\n });\n}\n\nfunction createTypedFunctionRegistration<E>(\n visibility: 'public' | 'internal',\n config: DurableFnConfig<E, z.ZodTypeAny, unknown>\n) {\n return createFunctionRegistration(visibility, config as DurableFnConfig<unknown, z.ZodTypeAny, unknown>);\n}\n\nfunction createRegistration(value: unknown) {\n const registration: Record<string | symbol, unknown> = {};\n Object.defineProperty(registration, kDurableRegistrationInternals, {\n enumerable: false,\n configurable: false,\n writable: false,\n value:\n value && typeof value === 'object' && 'kind' in (value as Record<string, unknown>)\n ? mapRegistration(value as Record<string, unknown>)\n : value\n });\n return registration;\n}\n\nfunction mapRegistration(value: Record<string, unknown>) {\n if (value.kind === 'function') {\n return {\n visibility: value.visibility,\n config: value.config\n };\n }\n\n return {\n config: value.config\n };\n}\n","import { kQueueConsumerInternals, kQueueDefinitionInternals } from './internal.js';\nimport type {\n DefineQueue,\n DefineQueues,\n ExtractQueueJobs,\n MultiJobQueueConfig,\n MultiJobQueueHandle,\n QueueConfig,\n QueueHandle,\n QueueJobConfig,\n QueueJobHandle\n} from './types.js';\nimport type { z } from 'zod';\n\nconst RESERVED_MULTI_JOB_KEYS = new Set([\n 'retry',\n 'retryDelay',\n 'deadLetter',\n 'deliveryDelay',\n 'visibilityTimeout',\n 'batch',\n 'consumer',\n 'args',\n 'description'\n]);\n\nexport function defineQueueFactory<E>(): DefineQueue<E> {\n return function defineQueue<TSchema extends z.ZodTypeAny>(\n config: QueueConfig<TSchema>\n ): QueueHandle<E, z.infer<TSchema>> {\n assertNoInlineHandlers(config as unknown as Record<string, unknown>);\n\n let bindingName: string | null = null;\n const handle: Record<string | symbol, unknown> = {\n message(consumerConfig: unknown) {\n return createConsumerRegistration('message', handle, consumerConfig);\n },\n batch(consumerConfig: unknown) {\n return createConsumerRegistration('batch', handle, consumerConfig);\n }\n };\n\n Object.defineProperty(handle, kQueueDefinitionInternals, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: {\n kind: 'single',\n config,\n bindingName,\n setBinding(name: string) {\n bindingName = name;\n },\n getBinding() {\n return bindingName;\n }\n }\n });\n\n return handle as unknown as QueueHandle<E, z.infer<TSchema>>;\n };\n}\n\nexport function defineQueuesFactory<E>(): DefineQueues<E> {\n return function defineQueues<const TConfig extends Record<string, unknown>>(\n config: MultiJobQueueConfig<TConfig>\n ): MultiJobQueueHandle<E, ExtractQueueJobs<TConfig>> {\n const jobs = Object.entries(config).filter(([key, value]) => {\n if (RESERVED_MULTI_JOB_KEYS.has(key)) {\n return false;\n }\n return isQueueJobConfig(value);\n });\n\n if (jobs.length === 0) {\n throw new Error('Multi-job queue config must define at least one job.');\n }\n\n let bindingName: string | null = null;\n const parent: Record<string | symbol, unknown> = {};\n Object.defineProperty(parent, kQueueDefinitionInternals, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: {\n kind: 'multi',\n config,\n bindingName,\n setBinding(name: string) {\n bindingName = name;\n },\n getBinding() {\n return bindingName;\n }\n }\n });\n\n for (const [jobName] of jobs) {\n parent[jobName] = createJobHandle(parent, jobName);\n }\n\n return parent as MultiJobQueueHandle<E, ExtractQueueJobs<TConfig>>;\n };\n}\n\nfunction createJobHandle(parent: object, jobName: string): QueueJobHandle<unknown, unknown> {\n return {\n message(consumerConfig: unknown) {\n return createConsumerRegistration('job-message', parent, consumerConfig, jobName);\n }\n };\n}\n\nfunction createConsumerRegistration(type: 'message' | 'batch' | 'job-message', queue: object, config: unknown, jobName?: string) {\n const registration: Record<string | symbol, unknown> = {};\n Object.defineProperty(registration, kQueueConsumerInternals, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: {\n type,\n queue,\n jobName,\n config\n }\n });\n return registration;\n}\n\nfunction isQueueJobConfig(value: unknown): value is QueueJobConfig<z.ZodTypeAny> {\n return typeof value === 'object' && value !== null && 'args' in value;\n}\n\nfunction assertNoInlineHandlers(config: Record<string, unknown>) {\n if ('handler' in config || 'batchHandler' in config || 'onFailure' in config) {\n throw new Error(\n 'Inline queue handlers are not supported in better-cf/durable-object. Use queue.message(...) or queue.batch(...).'\n );\n }\n}\n","import { createRuntimeContext, kWorkerInternals } from './internal.js';\nimport type { DefineWorker, WorkerConfig, WorkerEntrypoint } from './types.js';\n\nexport function defineWorkerFactory<E>(): DefineWorker<E> {\n return function defineWorker(config: WorkerConfig<E>): WorkerEntrypoint<E> {\n const entrypoint: Record<string | symbol, unknown> = {\n async fetch(request: Request, env: E, executionCtx: ExecutionContext): Promise<Response> {\n return config.fetch(request, createRuntimeContext(env, executionCtx));\n },\n ...(config.scheduled\n ? {\n async scheduled(event: ScheduledEvent, env: E, executionCtx: ExecutionContext): Promise<void> {\n await config.scheduled?.(event, createRuntimeContext(env, executionCtx));\n }\n }\n : {})\n };\n\n Object.defineProperty(entrypoint, kWorkerInternals, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: { config }\n });\n\n return entrypoint as unknown as WorkerEntrypoint<E>;\n };\n}\n","import { defineDurableObjectFactory } from './define-durable-object.js';\nimport { defineQueueFactory, defineQueuesFactory } from './define-queue.js';\nimport { defineWorkerFactory } from './define-worker.js';\nimport type { BetterCfAutoEnv, BetterCfSDK } from './types.js';\n\nexport function createSDK<E extends Record<string, unknown> = BetterCfAutoEnv>(): BetterCfSDK<E> {\n return {\n defineDurableObject: defineDurableObjectFactory<E>(),\n defineQueue: defineQueueFactory<E>(),\n defineQueues: defineQueuesFactory<E>(),\n defineWorker: defineWorkerFactory<E>()\n };\n}\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { h as DurableAlarmConfig, j as DurableFetchConfig, m as DurableFnConfig, i as DurableBaseContext, s as DurableObjectConfig, v as DurableWebSocketConfig, R as QueueMessageConsumerConfig, Q as QueueBatchConsumerConfig, H as QueueConfig, M as MultiJobQueueConfig, Y as WorkerConfig, Z as WorkerContext, b as BetterCfGeneratedApi } from '../types-C1mNTuC-.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
declare const kDurableObjectInternals: unique symbol;
|
|
5
|
+
declare const kDurableRegistrationInternals: unique symbol;
|
|
6
|
+
declare const kQueueDefinitionInternals: unique symbol;
|
|
7
|
+
declare const kQueueConsumerInternals: unique symbol;
|
|
8
|
+
declare const kWorkerInternals: unique symbol;
|
|
9
|
+
type ApiFactory = (env: unknown, executionCtx: ExecutionContext) => BetterCfGeneratedApi;
|
|
10
|
+
declare function setGeneratedApiFactory(factory: ApiFactory): void;
|
|
11
|
+
declare function createRuntimeContext<E>(env: E, executionCtx: ExecutionContext): WorkerContext<E>;
|
|
12
|
+
interface DurableObjectInternal<TKey> {
|
|
13
|
+
config: DurableObjectConfig<z.ZodType<TKey>>;
|
|
14
|
+
keySchema: z.ZodType<TKey>;
|
|
15
|
+
serializeKey: (value: TKey) => string;
|
|
16
|
+
}
|
|
17
|
+
interface DurableFunctionInternal<E, TKey, TArgs, TReturn> {
|
|
18
|
+
visibility: 'public' | 'internal';
|
|
19
|
+
config: DurableFnConfig<E, z.ZodType<TArgs>, TReturn>;
|
|
20
|
+
}
|
|
21
|
+
interface DurableFetchInternal<E> {
|
|
22
|
+
config: DurableFetchConfig<E>;
|
|
23
|
+
}
|
|
24
|
+
interface DurableAlarmInternal<E> {
|
|
25
|
+
config: DurableAlarmConfig<E>;
|
|
26
|
+
}
|
|
27
|
+
interface DurableInitInternal<E> {
|
|
28
|
+
config: {
|
|
29
|
+
description?: string;
|
|
30
|
+
handler: (ctx: DurableBaseContext<E>) => Promise<void> | void;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
interface DurableWebSocketInternal<E, TAttachment> {
|
|
34
|
+
config: DurableWebSocketConfig<E, TAttachment>;
|
|
35
|
+
}
|
|
36
|
+
type PushQueueConsumerType = 'message' | 'batch' | 'job-message';
|
|
37
|
+
interface QueueDefinitionInternal {
|
|
38
|
+
kind: 'single' | 'multi';
|
|
39
|
+
config: QueueConfig<z.ZodTypeAny> | MultiJobQueueConfig<Record<string, unknown>>;
|
|
40
|
+
bindingName: string | null;
|
|
41
|
+
setBinding: (bindingName: string) => void;
|
|
42
|
+
getBinding: () => string | null;
|
|
43
|
+
}
|
|
44
|
+
interface QueueConsumerInternal<E> {
|
|
45
|
+
type: PushQueueConsumerType;
|
|
46
|
+
queue: unknown;
|
|
47
|
+
jobName?: string;
|
|
48
|
+
config: QueueMessageConsumerConfig<E, unknown> | QueueBatchConsumerConfig<E, unknown>;
|
|
49
|
+
}
|
|
50
|
+
interface WorkerInternal<E> {
|
|
51
|
+
config: WorkerConfig<E>;
|
|
52
|
+
}
|
|
53
|
+
declare function normalizeKey(value: unknown): string;
|
|
54
|
+
declare function makeDurableBaseContext<E>(env: E, executionCtx: ExecutionContext, state: DurableObjectState): DurableBaseContext<E>;
|
|
55
|
+
declare function getDurableObjectInternals<TKey>(value: unknown): DurableObjectInternal<TKey>;
|
|
56
|
+
declare function getDurableRegistrationInternals(value: unknown): DurableFunctionInternal<unknown, unknown, unknown, unknown> | DurableFetchInternal<unknown> | DurableAlarmInternal<unknown> | DurableInitInternal<unknown> | DurableWebSocketInternal<unknown, unknown>;
|
|
57
|
+
declare function getQueueDefinitionInternals(value: unknown): QueueDefinitionInternal;
|
|
58
|
+
declare function getQueueConsumerInternals<E>(value: unknown): QueueConsumerInternal<E>;
|
|
59
|
+
declare function getWorkerInternals<E>(value: unknown): WorkerInternal<E> | undefined;
|
|
60
|
+
declare function createQueueProducerApi(binding: unknown, payload: unknown, options?: {
|
|
61
|
+
delay?: number;
|
|
62
|
+
contentType?: string;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
declare function createQueueProducerBatchApi(binding: unknown, payload: Array<{
|
|
65
|
+
body: unknown;
|
|
66
|
+
delaySeconds?: number;
|
|
67
|
+
contentType?: string;
|
|
68
|
+
}>): Promise<void>;
|
|
69
|
+
declare function consumeQueueRegistration<E>(definitionHandle: unknown, consumerRegistration: unknown, batch: MessageBatch<unknown>, env: E, executionCtx: ExecutionContext): Promise<void>;
|
|
70
|
+
declare function invokeDurableFunction<E, TArgs, TReturn>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown, args: TArgs): Promise<TReturn>;
|
|
71
|
+
declare function invokeDurableFetch<E>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown, request: Request): Promise<Response>;
|
|
72
|
+
declare function invokeDurableAlarm<E>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown, alarmInfo: AlarmInvocationInfo): Promise<void>;
|
|
73
|
+
declare function invokeDurableInit<E>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown): Promise<void>;
|
|
74
|
+
declare function invokeDurableWebSocketConnect<E, TAttachment>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown, request: Request): Promise<Response>;
|
|
75
|
+
declare function invokeDurableWebSocketMessage<E, TAttachment>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown, socket: WebSocket, message: string | ArrayBuffer): Promise<void>;
|
|
76
|
+
declare function invokeDurableWebSocketClose<E, TAttachment>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown, socket: WebSocket, code: number, reason: string, wasClean: boolean): Promise<void>;
|
|
77
|
+
declare function invokeDurableWebSocketError<E, TAttachment>(env: E, state: DurableObjectState, executionCtx: ExecutionContext, registration: unknown, socket: WebSocket, error: unknown): Promise<void>;
|
|
78
|
+
declare function createGeneratedQueueApi(binding: unknown, payload: unknown, options?: {
|
|
79
|
+
delay?: unknown;
|
|
80
|
+
contentType?: unknown;
|
|
81
|
+
}): Promise<void>;
|
|
82
|
+
declare function createGeneratedQueueBatchApi(binding: unknown, messages: Array<{
|
|
83
|
+
data: unknown;
|
|
84
|
+
delay?: unknown;
|
|
85
|
+
contentType?: unknown;
|
|
86
|
+
}>): Promise<void>;
|
|
87
|
+
declare function resolveWorkerHandlers(moduleLike: {
|
|
88
|
+
default?: unknown;
|
|
89
|
+
fetch?: (request: Request, env: unknown, ctx: ExecutionContext) => Promise<Response>;
|
|
90
|
+
scheduled?: (event: ScheduledEvent, env: unknown, ctx: ExecutionContext) => Promise<void>;
|
|
91
|
+
}): {
|
|
92
|
+
scheduled?: ((event: ScheduledEvent, env: unknown, ctx: ExecutionContext) => Promise<void>) | undefined;
|
|
93
|
+
fetch(request: Request, env: unknown, ctx: ExecutionContext): Promise<Response>;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export { type DurableAlarmInternal, type DurableFetchInternal, type DurableFunctionInternal, type DurableInitInternal, type DurableObjectInternal, type DurableWebSocketInternal, type QueueConsumerInternal, type QueueDefinitionInternal, type WorkerInternal, consumeQueueRegistration, createGeneratedQueueApi, createGeneratedQueueBatchApi, createQueueProducerApi, createQueueProducerBatchApi, createRuntimeContext, getDurableObjectInternals, getDurableRegistrationInternals, getQueueConsumerInternals, getQueueDefinitionInternals, getWorkerInternals, invokeDurableAlarm, invokeDurableFetch, invokeDurableFunction, invokeDurableInit, invokeDurableWebSocketClose, invokeDurableWebSocketConnect, invokeDurableWebSocketError, invokeDurableWebSocketMessage, kDurableObjectInternals, kDurableRegistrationInternals, kQueueConsumerInternals, kQueueDefinitionInternals, kWorkerInternals, makeDurableBaseContext, normalizeKey, resolveWorkerHandlers, setGeneratedApiFactory };
|