alchemy 2.0.0-beta.21 → 2.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/bin/alchemy.js +3 -3
  2. package/bin/alchemy.js.map +1 -1
  3. package/bin/commands/logs.ts +1 -1
  4. package/bin/commands/tail.ts +1 -1
  5. package/lib/AWS/Lambda/Function.d.ts.map +1 -1
  6. package/lib/AWS/Lambda/Function.js +25 -21
  7. package/lib/AWS/Lambda/Function.js.map +1 -1
  8. package/lib/AWS/Lambda/HttpServer.d.ts.map +1 -1
  9. package/lib/AWS/Lambda/HttpServer.js +3 -1
  10. package/lib/AWS/Lambda/HttpServer.js.map +1 -1
  11. package/lib/Cloudflare/Container/Container.d.ts +55 -2
  12. package/lib/Cloudflare/Container/Container.d.ts.map +1 -1
  13. package/lib/Cloudflare/Container/Container.js +55 -2
  14. package/lib/Cloudflare/Container/Container.js.map +1 -1
  15. package/lib/Cloudflare/D1/D1Clone.d.ts +13 -0
  16. package/lib/Cloudflare/D1/D1Clone.d.ts.map +1 -0
  17. package/lib/Cloudflare/D1/D1Clone.js +31 -0
  18. package/lib/Cloudflare/D1/D1Clone.js.map +1 -0
  19. package/lib/Cloudflare/D1/D1Database.d.ts +150 -5
  20. package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
  21. package/lib/Cloudflare/D1/D1Database.js +253 -0
  22. package/lib/Cloudflare/D1/D1Database.js.map +1 -1
  23. package/lib/Cloudflare/D1/D1Export.d.ts +24 -0
  24. package/lib/Cloudflare/D1/D1Export.d.ts.map +1 -0
  25. package/lib/Cloudflare/D1/D1Export.js +34 -0
  26. package/lib/Cloudflare/D1/D1Export.js.map +1 -0
  27. package/lib/Cloudflare/D1/D1Import.d.ts +21 -0
  28. package/lib/Cloudflare/D1/D1Import.d.ts.map +1 -0
  29. package/lib/Cloudflare/D1/D1Import.js +87 -0
  30. package/lib/Cloudflare/D1/D1Import.js.map +1 -0
  31. package/lib/Cloudflare/D1/D1Migrations.d.ts +16 -0
  32. package/lib/Cloudflare/D1/D1Migrations.d.ts.map +1 -0
  33. package/lib/Cloudflare/D1/D1Migrations.js +110 -0
  34. package/lib/Cloudflare/D1/D1Migrations.js.map +1 -0
  35. package/lib/Cloudflare/D1/D1SqlFile.d.ts +20 -0
  36. package/lib/Cloudflare/D1/D1SqlFile.d.ts.map +1 -0
  37. package/lib/Cloudflare/D1/D1SqlFile.js +46 -0
  38. package/lib/Cloudflare/D1/D1SqlFile.js.map +1 -0
  39. package/lib/Cloudflare/Providers.d.ts +1 -1
  40. package/lib/Cloudflare/Providers.d.ts.map +1 -1
  41. package/lib/Cloudflare/Queue/Queue.d.ts +34 -4
  42. package/lib/Cloudflare/Queue/Queue.d.ts.map +1 -1
  43. package/lib/Cloudflare/Queue/Queue.js +34 -4
  44. package/lib/Cloudflare/Queue/Queue.js.map +1 -1
  45. package/lib/Cloudflare/Queue/QueueBinding.d.ts +33 -0
  46. package/lib/Cloudflare/Queue/QueueBinding.d.ts.map +1 -1
  47. package/lib/Cloudflare/Queue/QueueBinding.js +33 -0
  48. package/lib/Cloudflare/Queue/QueueBinding.js.map +1 -1
  49. package/lib/Cloudflare/Workers/DurableObjectNamespace.d.ts +103 -6
  50. package/lib/Cloudflare/Workers/DurableObjectNamespace.d.ts.map +1 -1
  51. package/lib/Cloudflare/Workers/DurableObjectNamespace.js +103 -6
  52. package/lib/Cloudflare/Workers/DurableObjectNamespace.js.map +1 -1
  53. package/lib/Cloudflare/Workers/Workflow.d.ts +94 -0
  54. package/lib/Cloudflare/Workers/Workflow.d.ts.map +1 -1
  55. package/lib/Cloudflare/Workers/Workflow.js +94 -0
  56. package/lib/Cloudflare/Workers/Workflow.js.map +1 -1
  57. package/lib/Platform.js +1 -1
  58. package/lib/Platform.js.map +1 -1
  59. package/package.json +1 -1
  60. package/src/AWS/Lambda/Function.ts +30 -24
  61. package/src/AWS/Lambda/HttpServer.ts +3 -1
  62. package/src/Cloudflare/Container/Container.ts +55 -2
  63. package/src/Cloudflare/D1/D1Clone.ts +42 -0
  64. package/src/Cloudflare/D1/D1Database.ts +386 -3
  65. package/src/Cloudflare/D1/D1Export.ts +66 -0
  66. package/src/Cloudflare/D1/D1Import.ts +156 -0
  67. package/src/Cloudflare/D1/D1Migrations.ts +229 -0
  68. package/src/Cloudflare/D1/D1SqlFile.ts +55 -0
  69. package/src/Cloudflare/Queue/Queue.ts +34 -4
  70. package/src/Cloudflare/Queue/QueueBinding.ts +33 -0
  71. package/src/Cloudflare/Workers/DurableObjectNamespace.ts +103 -6
  72. package/src/Cloudflare/Workers/Workflow.ts +94 -0
  73. package/src/Platform.ts +1 -1
@@ -0,0 +1,21 @@
1
+ import * as d1 from "@distilled.cloud/cloudflare/d1";
2
+ import * as Effect from "effect/Effect";
3
+ export interface ImportD1DatabaseOptions {
4
+ accountId: string;
5
+ databaseId: string;
6
+ sqlData: string | Uint8Array;
7
+ filename?: string;
8
+ }
9
+ export interface ImportD1DatabaseResult {
10
+ filename: string;
11
+ numQueries: number;
12
+ }
13
+ /**
14
+ * Import SQL into a D1 database via the multi-step Cloudflare flow:
15
+ * 1. POST `action: "init"` -> returns presigned `upload_url`
16
+ * 2. PUT raw SQL to `upload_url`
17
+ * 3. POST `action: "ingest"` -> returns `at_bookmark`
18
+ * 4. POST `action: "poll"` until `status === "complete"`
19
+ */
20
+ export declare const importD1Database: (options: ImportD1DatabaseOptions) => Effect.Effect<ImportD1DatabaseResult, import("@distilled.cloud/cloudflare").CredentialsError | d1.ImportDatabaseError, any>;
21
+ //# sourceMappingURL=D1Import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1Import.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAMrD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAyBD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,uBAAuB,gIAuG7D,CAAC"}
@@ -0,0 +1,87 @@
1
+ import * as d1 from "@distilled.cloud/cloudflare/d1";
2
+ import { Credentials, formatHeaders, } from "@distilled.cloud/cloudflare/Credentials";
3
+ import crypto from "node:crypto";
4
+ import * as Effect from "effect/Effect";
5
+ import * as HttpClient from "effect/unstable/http/HttpClient";
6
+ import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
7
+ const md5 = (data) => crypto.createHash("md5").update(data).digest("hex");
8
+ const importEndpoint = (apiBaseUrl, accountId, databaseId) => `${apiBaseUrl}/accounts/${accountId}/d1/database/${databaseId}/import`;
9
+ /**
10
+ * Import SQL into a D1 database via the multi-step Cloudflare flow:
11
+ * 1. POST `action: "init"` -> returns presigned `upload_url`
12
+ * 2. PUT raw SQL to `upload_url`
13
+ * 3. POST `action: "ingest"` -> returns `at_bookmark`
14
+ * 4. POST `action: "poll"` until `status === "complete"`
15
+ */
16
+ export const importD1Database = (options) => Effect.gen(function* () {
17
+ const credentialsEff = yield* Credentials;
18
+ const credentials = yield* credentialsEff;
19
+ const authHeaders = formatHeaders(credentials);
20
+ const url = importEndpoint(credentials.apiBaseUrl, options.accountId, options.databaseId);
21
+ const client = yield* HttpClient.HttpClient;
22
+ const postJson = (body) => Effect.gen(function* () {
23
+ const req = HttpClientRequest.post(url).pipe(HttpClientRequest.setHeaders(authHeaders), HttpClientRequest.bodyJsonUnsafe(body));
24
+ const res = yield* client.execute(req).pipe(Effect.orDie);
25
+ if (res.status < 200 || res.status >= 300) {
26
+ const text = yield* res.text.pipe(Effect.orElseSucceed(() => ""));
27
+ return yield* Effect.die(`D1 import request failed (${res.status}): ${text}`);
28
+ }
29
+ const text = yield* res.text.pipe(Effect.orDie);
30
+ const json = JSON.parse(text);
31
+ return json.result;
32
+ });
33
+ const etag = md5(options.sqlData);
34
+ // Step 1: init via the typed d1 client
35
+ const initDb = yield* d1.importDatabase;
36
+ const init = yield* initDb({
37
+ accountId: options.accountId,
38
+ databaseId: options.databaseId,
39
+ action: "init",
40
+ etag,
41
+ });
42
+ if (!init.uploadUrl) {
43
+ return yield* Effect.die(init.error ?? "Failed to get upload URL for D1 import");
44
+ }
45
+ const uploadFilename = options.filename ?? init.filename ?? "import.sql";
46
+ // Step 2: PUT to the presigned upload URL
47
+ const bytes = typeof options.sqlData === "string"
48
+ ? new TextEncoder().encode(options.sqlData)
49
+ : options.sqlData;
50
+ const putReq = HttpClientRequest.put(init.uploadUrl).pipe(HttpClientRequest.bodyUint8Array(bytes, "application/sql"));
51
+ const putRes = yield* client.execute(putReq).pipe(Effect.orDie);
52
+ if (putRes.status < 200 || putRes.status >= 300) {
53
+ const text = yield* putRes.text.pipe(Effect.orElseSucceed(() => ""));
54
+ return yield* Effect.die(`Failed to upload SQL file to D1 (${putRes.status}): ${text}`);
55
+ }
56
+ // Step 3: ingest
57
+ const ingest = yield* postJson({
58
+ action: "ingest",
59
+ etag,
60
+ filename: init.filename,
61
+ });
62
+ if (!ingest.at_bookmark) {
63
+ return yield* Effect.die(ingest.error ?? "Ingest response missing bookmark");
64
+ }
65
+ // Step 4: poll until complete
66
+ const poll = (bookmark) => Effect.gen(function* () {
67
+ const data = yield* postJson({
68
+ action: "poll",
69
+ current_bookmark: bookmark,
70
+ });
71
+ if (data.status === "complete" && data.result) {
72
+ return {
73
+ filename: data.filename ?? uploadFilename,
74
+ numQueries: data.result.num_queries ?? 0,
75
+ };
76
+ }
77
+ if (data.status === "error") {
78
+ return yield* Effect.die(data.error ?? "Error during D1 import");
79
+ }
80
+ if (!data.at_bookmark) {
81
+ return yield* Effect.die("D1 import poll missing bookmark");
82
+ }
83
+ return yield* poll(data.at_bookmark);
84
+ });
85
+ return yield* poll(ingest.at_bookmark);
86
+ });
87
+ //# sourceMappingURL=D1Import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1Import.js","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import * as Effect from "effect/Effect";
2
+ import type * as HttpClient from "effect/unstable/http/HttpClient";
3
+ import type { Credentials } from "@distilled.cloud/cloudflare/Credentials";
4
+ import type { D1SqlFile } from "./D1SqlFile.ts";
5
+ export interface ApplyMigrationsOptions {
6
+ accountId: string;
7
+ databaseId: string;
8
+ migrationsTable: string;
9
+ migrationsFiles: ReadonlyArray<D1SqlFile>;
10
+ }
11
+ /**
12
+ * Apply pending D1 migrations in order. Uses the wrangler-compatible
13
+ * 3-column schema `(id TEXT PK, name TEXT, applied_at TEXT)`.
14
+ */
15
+ export declare const applyMigrations: (options: ApplyMigrationsOptions) => Effect.Effect<void, import("@distilled.cloud/cloudflare").DefaultErrors, HttpClient.HttpClient | Credentials>;
16
+ //# sourceMappingURL=D1Migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1Migrations.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Migrations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CAC3C;AA2LD;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,sBAAsB,kHA0B3D,CAAC"}
@@ -0,0 +1,110 @@
1
+ import * as d1 from "@distilled.cloud/cloudflare/d1";
2
+ import * as Effect from "effect/Effect";
3
+ const executeSQL = (accountId, databaseId, sql) => Effect.gen(function* () {
4
+ const queryDb = yield* d1.queryDatabase;
5
+ return yield* queryDb({ accountId, databaseId, sql });
6
+ });
7
+ const detectSchema = (accountId, databaseId, migrationsTable) => Effect.gen(function* () {
8
+ const result = yield* executeSQL(accountId, databaseId, `PRAGMA table_info(${migrationsTable});`).pipe(Effect.option);
9
+ const columns = [];
10
+ if (result._tag === "Some") {
11
+ const rows = (result.value.result[0]?.results ?? []);
12
+ for (const row of rows) {
13
+ columns.push({ name: row.name, type: row.type, pk: row.pk });
14
+ }
15
+ }
16
+ if (columns.length === 0) {
17
+ return {
18
+ exists: false,
19
+ hasIdColumn: false,
20
+ hasNameColumn: false,
21
+ isLegacySchema: false,
22
+ columns,
23
+ };
24
+ }
25
+ const names = columns.map((c) => c.name);
26
+ const hasIdColumn = names.includes("id");
27
+ const hasNameColumn = names.includes("name");
28
+ const isLegacySchema = columns.length === 2 && !(hasIdColumn && hasNameColumn);
29
+ return {
30
+ exists: true,
31
+ hasIdColumn,
32
+ hasNameColumn,
33
+ isLegacySchema,
34
+ columns,
35
+ };
36
+ });
37
+ const migrateLegacySchema = (accountId, databaseId, migrationsTable, schema) => Effect.gen(function* () {
38
+ const primaryColumn = schema.columns.find((c) => c.pk === 1)?.name ?? schema.columns[0]?.name;
39
+ if (!primaryColumn) {
40
+ return yield* Effect.die("Cannot migrate legacy migration table: no columns found");
41
+ }
42
+ const tempTable = `${migrationsTable}_temp_migration`;
43
+ yield* executeSQL(accountId, databaseId, `CREATE TABLE ${tempTable} (
44
+ id TEXT PRIMARY KEY,
45
+ name TEXT NOT NULL,
46
+ applied_at TEXT NOT NULL
47
+ );`);
48
+ yield* executeSQL(accountId, databaseId, `INSERT INTO ${tempTable} (id, name, applied_at)
49
+ SELECT
50
+ printf('%05d', row_number() OVER (ORDER BY applied_at)) as id,
51
+ ${primaryColumn} as name,
52
+ applied_at
53
+ FROM ${migrationsTable}
54
+ ORDER BY applied_at;`);
55
+ yield* executeSQL(accountId, databaseId, `DROP TABLE ${migrationsTable};`);
56
+ yield* executeSQL(accountId, databaseId, `ALTER TABLE ${tempTable} RENAME TO ${migrationsTable};`);
57
+ });
58
+ const ensureMigrationsTable = (accountId, databaseId, migrationsTable) => Effect.gen(function* () {
59
+ const schema = yield* detectSchema(accountId, databaseId, migrationsTable);
60
+ if (!schema.exists) {
61
+ yield* executeSQL(accountId, databaseId, `CREATE TABLE ${migrationsTable} (
62
+ id TEXT PRIMARY KEY,
63
+ name TEXT NOT NULL,
64
+ applied_at TEXT NOT NULL
65
+ );`);
66
+ return;
67
+ }
68
+ if (schema.isLegacySchema || !schema.hasIdColumn || !schema.hasNameColumn) {
69
+ yield* migrateLegacySchema(accountId, databaseId, migrationsTable, schema);
70
+ }
71
+ });
72
+ const getAppliedMigrations = (accountId, databaseId, migrationsTable) => Effect.gen(function* () {
73
+ const result = yield* executeSQL(accountId, databaseId, `SELECT name FROM ${migrationsTable};`);
74
+ const rows = (result.result[0]?.results ?? []);
75
+ return new Set(rows.map((r) => r.name));
76
+ });
77
+ const getNextSeq = (accountId, databaseId, migrationsTable) => Effect.gen(function* () {
78
+ const result = yield* executeSQL(accountId, databaseId, `SELECT id FROM ${migrationsTable} ORDER BY id;`);
79
+ const rows = (result.result[0]?.results ?? []);
80
+ let max = 0;
81
+ for (const { id } of rows) {
82
+ if (/^\d+$/.test(id)) {
83
+ max = Math.max(max, Number.parseInt(id, 10));
84
+ }
85
+ }
86
+ return max + 1;
87
+ });
88
+ /**
89
+ * Apply pending D1 migrations in order. Uses the wrangler-compatible
90
+ * 3-column schema `(id TEXT PK, name TEXT, applied_at TEXT)`.
91
+ */
92
+ export const applyMigrations = (options) => Effect.gen(function* () {
93
+ const { accountId, databaseId, migrationsTable, migrationsFiles } = options;
94
+ yield* ensureMigrationsTable(accountId, databaseId, migrationsTable);
95
+ const applied = yield* getAppliedMigrations(accountId, databaseId, migrationsTable);
96
+ let nextSeq = yield* getNextSeq(accountId, databaseId, migrationsTable);
97
+ for (const migration of migrationsFiles) {
98
+ if (applied.has(migration.id))
99
+ continue;
100
+ const migrationId = nextSeq.toString().padStart(5, "0");
101
+ nextSeq += 1;
102
+ // D1 over HTTP doesn't support transactions; run migration + record
103
+ // in a single batched query.
104
+ yield* executeSQL(accountId, databaseId, [
105
+ migration.sql,
106
+ `INSERT INTO ${migrationsTable} (id, name, applied_at) VALUES ('${migrationId}', '${migration.id}', datetime('now'));`,
107
+ ].join("\n"));
108
+ }
109
+ });
110
+ //# sourceMappingURL=D1Migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1Migrations.js","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1Migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as FileSystem from "effect/FileSystem";
3
+ import * as Path from "effect/Path";
4
+ export interface D1SqlFile {
5
+ id: string;
6
+ sql: string;
7
+ hash: string;
8
+ }
9
+ /**
10
+ * Recursively list `.sql` files under `directory`, sorted by their numeric
11
+ * prefix (e.g. `0001_init.sql`) and then by name.
12
+ */
13
+ export declare const listSqlFiles: (directory: string) => Effect.Effect<D1SqlFile[], import("effect/PlatformError").PlatformError, Path.Path | FileSystem.FileSystem>;
14
+ /**
15
+ * Read a single `.sql` file relative to `directory` and compute its content
16
+ * hash. The `sql` field is marked non-enumerable so it isn't serialized into
17
+ * resource state.
18
+ */
19
+ export declare const readSqlFile: (directory: string, name: string) => Effect.Effect<D1SqlFile, import("effect/PlatformError").PlatformError, Path.Path | FileSystem.FileSystem>;
20
+ //# sourceMappingURL=D1SqlFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1SqlFile.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1SqlFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAEpC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,gHAiB1C,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,WAAW,MAAM,EAAE,MAAM,MAAM,8GASvD,CAAC"}
@@ -0,0 +1,46 @@
1
+ import crypto from "node:crypto";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FileSystem from "effect/FileSystem";
4
+ import * as Path from "effect/Path";
5
+ /**
6
+ * Recursively list `.sql` files under `directory`, sorted by their numeric
7
+ * prefix (e.g. `0001_init.sql`) and then by name.
8
+ */
9
+ export const listSqlFiles = (directory) => Effect.gen(function* () {
10
+ const fs = yield* FileSystem.FileSystem;
11
+ const entries = yield* fs.readDirectory(directory, { recursive: true });
12
+ const sqlFiles = entries
13
+ .filter((name) => name.endsWith(".sql"))
14
+ .sort((a, b) => {
15
+ const aNum = getPrefix(a);
16
+ const bNum = getPrefix(b);
17
+ if (aNum !== null && bNum !== null)
18
+ return aNum - bNum;
19
+ if (aNum !== null)
20
+ return -1;
21
+ if (bNum !== null)
22
+ return 1;
23
+ return a.localeCompare(b);
24
+ });
25
+ return yield* Effect.all(sqlFiles.map((id) => readSqlFile(directory, id)));
26
+ });
27
+ /**
28
+ * Read a single `.sql` file relative to `directory` and compute its content
29
+ * hash. The `sql` field is marked non-enumerable so it isn't serialized into
30
+ * resource state.
31
+ */
32
+ export const readSqlFile = (directory, name) => Effect.gen(function* () {
33
+ const fs = yield* FileSystem.FileSystem;
34
+ const path = yield* Path.Path;
35
+ const sql = yield* fs.readFileString(path.resolve(directory, name));
36
+ const hash = crypto.createHash("sha256").update(sql).digest("hex");
37
+ const file = { id: name, sql, hash };
38
+ Object.defineProperty(file, "sql", { enumerable: false });
39
+ return file;
40
+ });
41
+ const getPrefix = (name) => {
42
+ const prefix = name.split("_")[0];
43
+ const num = Number.parseInt(prefix, 10);
44
+ return Number.isNaN(num) ? null : num;
45
+ };
46
+ //# sourceMappingURL=D1SqlFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1SqlFile.js","sourceRoot":"","sources":["../../../src/Cloudflare/D1/D1SqlFile.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAQpC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExE,MAAM,QAAQ,GAAG,OAAO;SACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC;QACvD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEL;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,IAAY,EAAE,EAAE,CAC7D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,IAAI,GAAc,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAChD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC;AAEL,MAAM,SAAS,GAAG,CAAC,IAAY,EAAiB,EAAE;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC,CAAC"}
@@ -12,5 +12,5 @@ export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
12
12
  /**
13
13
  * Cloudflare providers, bindings, and credentials for Worker-based stacks.
14
14
  */
15
- export declare const providers: () => Layer.Layer<Provider.Provider<Random> | Provider.Provider<Command> | Containers.Credentials | CloudflareEnvironment.CloudflareEnvironment | Providers, never, import("../AlchemyContext.ts").AlchemyContext | import("effect/Path").Path | import("effect/FileSystem").FileSystem | import("effect/Scope").Scope | import("effect/unstable/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/unstable/http/HttpClient").HttpClient | import("../Auth/AuthProvider.ts").AuthProviders | import("../Stage.ts").Stage | import("../Stack.ts").Stack>;
15
+ export declare const providers: () => Layer.Layer<Provider.Provider<Random> | Provider.Provider<Command> | Containers.Credentials | CloudflareEnvironment.CloudflareEnvironment | Providers, never, any>;
16
16
  //# sourceMappingURL=Providers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Providers.d.ts","sourceRoot":"","sources":["../../src/Cloudflare/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAItD,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,UAAU,MAAM,sBAAsB,CAAC;AAUnD,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;;AAEtE,qBAAa,SAAU,SAAQ,cAE9B;CAAG;AAEJ,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,SAAS,0iBA2DnB,CAAC"}
1
+ {"version":3,"file":"Providers.d.ts","sourceRoot":"","sources":["../../src/Cloudflare/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAItD,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,UAAU,MAAM,sBAAsB,CAAC;AAUnD,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;;AAEtE,qBAAa,SAAU,SAAQ,cAE9B;CAAG;AAEJ,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,SAAS,0KA2DnB,CAAC"}
@@ -37,12 +37,42 @@ export type Queue = Resource<"Cloudflare.Queue", QueueProps, {
37
37
  * ```
38
38
  *
39
39
  * @section Binding to a Worker
40
+ * In an Effect-style Worker, use `Cloudflare.QueueBinding.bind` in
41
+ * the init phase and provide `Cloudflare.QueueBindingLive` in the
42
+ * runtime layer. The returned `QueueSender` exposes `send` and
43
+ * `sendBatch`.
44
+ *
40
45
  * @example Sending messages from a Worker
41
46
  * ```typescript
42
- * // In your Worker definition, add the queue to bindings:
43
- * const Worker = Cloudflare.Worker("Worker", {
44
- * bindings: { MY_QUEUE: queue },
45
- * });
47
+ * import * as Cloudflare from "alchemy/Cloudflare";
48
+ * import * as Effect from "effect/Effect";
49
+ * import { HttpServerRequest } from "effect/unstable/http/HttpServerRequest";
50
+ * import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse";
51
+ *
52
+ * export const Queue = Cloudflare.Queue("Queue");
53
+ *
54
+ * export default Cloudflare.Worker(
55
+ * "Worker",
56
+ * { main: import.meta.path },
57
+ * Effect.gen(function* () {
58
+ * const queue = yield* Cloudflare.QueueBinding.bind(Queue);
59
+ *
60
+ * return {
61
+ * fetch: Effect.gen(function* () {
62
+ * const request = yield* HttpServerRequest;
63
+ * if (request.url === "/queue/send" && request.method === "POST") {
64
+ * const text = yield* request.text;
65
+ * yield* queue.send({ text, sentAt: Date.now() }).pipe(Effect.orDie);
66
+ * return yield* HttpServerResponse.json(
67
+ * { sent: { text } },
68
+ * { status: 202 },
69
+ * );
70
+ * }
71
+ * return HttpServerResponse.text("Not Found", { status: 404 });
72
+ * }),
73
+ * };
74
+ * }).pipe(Effect.provide(Cloudflare.QueueBindingLive)),
75
+ * );
46
76
  * ```
47
77
  */
48
78
  export declare const Queue: import("../../Resource.ts").ResourceClassWithMethods<Queue, {
@@ -1 +1 @@
1
- {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/Queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,QAAQ,CAC1B,kBAAkB,EAClB,UAAU,EACV;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,KAAK;;EAEhB,CAAC;AAEH,eAAO,MAAM,aAAa,yQA8GvB,CAAC"}
1
+ {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/Queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,QAAQ,CAC1B,kBAAkB,EAClB,UAAU,EACV;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,eAAO,MAAM,KAAK;;EAEhB,CAAC;AAEH,eAAO,MAAM,aAAa,yQA8GvB,CAAC"}
@@ -27,12 +27,42 @@ import { QueueBinding } from "./QueueBinding.js";
27
27
  * ```
28
28
  *
29
29
  * @section Binding to a Worker
30
+ * In an Effect-style Worker, use `Cloudflare.QueueBinding.bind` in
31
+ * the init phase and provide `Cloudflare.QueueBindingLive` in the
32
+ * runtime layer. The returned `QueueSender` exposes `send` and
33
+ * `sendBatch`.
34
+ *
30
35
  * @example Sending messages from a Worker
31
36
  * ```typescript
32
- * // In your Worker definition, add the queue to bindings:
33
- * const Worker = Cloudflare.Worker("Worker", {
34
- * bindings: { MY_QUEUE: queue },
35
- * });
37
+ * import * as Cloudflare from "alchemy/Cloudflare";
38
+ * import * as Effect from "effect/Effect";
39
+ * import { HttpServerRequest } from "effect/unstable/http/HttpServerRequest";
40
+ * import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse";
41
+ *
42
+ * export const Queue = Cloudflare.Queue("Queue");
43
+ *
44
+ * export default Cloudflare.Worker(
45
+ * "Worker",
46
+ * { main: import.meta.path },
47
+ * Effect.gen(function* () {
48
+ * const queue = yield* Cloudflare.QueueBinding.bind(Queue);
49
+ *
50
+ * return {
51
+ * fetch: Effect.gen(function* () {
52
+ * const request = yield* HttpServerRequest;
53
+ * if (request.url === "/queue/send" && request.method === "POST") {
54
+ * const text = yield* request.text;
55
+ * yield* queue.send({ text, sentAt: Date.now() }).pipe(Effect.orDie);
56
+ * return yield* HttpServerResponse.json(
57
+ * { sent: { text } },
58
+ * { status: 202 },
59
+ * );
60
+ * }
61
+ * return HttpServerResponse.text("Not Found", { status: 404 });
62
+ * }),
63
+ * };
64
+ * }).pipe(Effect.provide(Cloudflare.QueueBindingLive)),
65
+ * );
36
66
  * ```
37
67
  */
38
68
  export const Queue = Resource("Cloudflare.Queue")({
@@ -1 +1 @@
1
- {"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/Queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/Queue.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,39 @@ export declare class QueueSendError extends QueueSendError_base<{
24
24
  declare const QueueBinding_base: Binding.Service<QueueBinding, "Cloudflare.Queue", (queue: Queue) => Effect.Effect<QueueSender>> & {
25
25
  bind: (queue: Queue) => Effect.Effect<any, any, any>;
26
26
  };
27
+ /**
28
+ * Binding service that turns a {@link Queue} resource into a typed
29
+ * {@link QueueSender} you can call from a Worker's runtime Effect.
30
+ *
31
+ * @section Sending Messages
32
+ * Bind the queue in the Worker's init phase, then use `send` for
33
+ * single messages or `sendBatch` for many messages in one call.
34
+ * Messages can be any JSON-serializable value.
35
+ *
36
+ * @example Producer route
37
+ * ```typescript
38
+ * const queue = yield* Cloudflare.QueueBinding.bind(Queue);
39
+ *
40
+ * return {
41
+ * fetch: Effect.gen(function* () {
42
+ * yield* queue.send({ text: "hi", sentAt: Date.now() });
43
+ * return HttpServerResponse.empty({ status: 202 });
44
+ * }),
45
+ * };
46
+ * ```
47
+ *
48
+ * @example Sending a batch
49
+ * ```typescript
50
+ * yield* queue.sendBatch([
51
+ * { body: { event: "click", id: 1 } },
52
+ * { body: { event: "click", id: 2 } },
53
+ * { body: "raw text", contentType: "text" },
54
+ * ]);
55
+ * ```
56
+ *
57
+ * Provide {@link QueueBindingLive} in the worker's runtime layer to
58
+ * resolve the underlying Cloudflare queue at request time.
59
+ */
27
60
  export declare class QueueBinding extends QueueBinding_base {
28
61
  }
29
62
  export declare const QueueBindingLive: Layer.Layer<QueueBinding, never, import("../../ExecutionContext.ts").ExecutionContext<import("../../ExecutionContext.ts").BaseExecutionContext> | QueueBindingPolicy>;
@@ -1 +1 @@
1
- {"version":3,"file":"QueueBinding.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/QueueBinding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAY,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAClD,IAAI,CACF,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAC1D,SAAS,CACP,QAAQ,EAAE,aAAa,CAAC;QACtB,IAAI,EAAE,OAAO,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KAC/B,CAAC,GACD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;CAC3D;;;;AAID,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;CAAG;2FAIK,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;;;AAF9C,qBAAa,YAAa,SAAQ,iBAGX;CAAG;AAE1B,eAAO,MAAM,gBAAgB,uKAmD5B,CAAC;8GAIQ,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AAFvC,qBAAa,kBAAmB,SAAQ,uBAGjB;CAAG;AAE1B,eAAO,MAAM,sBAAsB,+CAkBlC,CAAC"}
1
+ {"version":3,"file":"QueueBinding.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/QueueBinding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAY,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAClD,IAAI,CACF,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAC1D,SAAS,CACP,QAAQ,EAAE,aAAa,CAAC;QACtB,IAAI,EAAE,OAAO,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KAC/B,CAAC,GACD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;CAC3D;;;;AAID,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;CAAG;2FAqCK,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;;;AAnC9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,YAAa,SAAQ,iBAGX;CAAG;AAE1B,eAAO,MAAM,gBAAgB,uKAmD5B,CAAC;8GAIQ,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AAFvC,qBAAa,kBAAmB,SAAQ,uBAGjB;CAAG;AAE1B,eAAO,MAAM,sBAAsB,+CAkBlC,CAAC"}
@@ -5,6 +5,39 @@ import { isWorker, WorkerEnvironment } from "../Workers/Worker.js";
5
5
  import * as Data from "effect/Data";
6
6
  export class QueueSendError extends Data.TaggedError("QueueSendError") {
7
7
  }
8
+ /**
9
+ * Binding service that turns a {@link Queue} resource into a typed
10
+ * {@link QueueSender} you can call from a Worker's runtime Effect.
11
+ *
12
+ * @section Sending Messages
13
+ * Bind the queue in the Worker's init phase, then use `send` for
14
+ * single messages or `sendBatch` for many messages in one call.
15
+ * Messages can be any JSON-serializable value.
16
+ *
17
+ * @example Producer route
18
+ * ```typescript
19
+ * const queue = yield* Cloudflare.QueueBinding.bind(Queue);
20
+ *
21
+ * return {
22
+ * fetch: Effect.gen(function* () {
23
+ * yield* queue.send({ text: "hi", sentAt: Date.now() });
24
+ * return HttpServerResponse.empty({ status: 202 });
25
+ * }),
26
+ * };
27
+ * ```
28
+ *
29
+ * @example Sending a batch
30
+ * ```typescript
31
+ * yield* queue.sendBatch([
32
+ * { body: { event: "click", id: 1 } },
33
+ * { body: { event: "click", id: 2 } },
34
+ * { body: "raw text", contentType: "text" },
35
+ * ]);
36
+ * ```
37
+ *
38
+ * Provide {@link QueueBindingLive} in the worker's runtime layer to
39
+ * resolve the underlying Cloudflare queue at request time.
40
+ */
8
41
  export class QueueBinding extends Binding.Service()("Cloudflare.Queue") {
9
42
  }
10
43
  export const QueueBindingLive = Layer.effect(QueueBinding, Effect.gen(function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"QueueBinding.js","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/QueueBinding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QueueBinding.js","sourceRoot":"","sources":["../../../src/Cloudflare/Queue/QueueBinding.ts"],"names":[],"mappings":"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"}