@beignet/provider-db-drizzle 0.0.43 → 0.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +3 -0
- package/dist/shared/idempotency-core.d.ts +3 -2
- package/dist/shared/idempotency-core.d.ts.map +1 -1
- package/dist/shared/idempotency-core.js +19 -8
- package/dist/shared/idempotency-core.js.map +1 -1
- package/package.json +1 -1
- package/src/shared/idempotency-core.ts +23 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @beignet/provider-db-drizzle
|
|
2
2
|
|
|
3
|
+
## 0.0.45
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- b9df150: Keep response validation, request parsing, client error classification, workflow transforms, idempotency mutations, webhook signatures, and ownership tokens correct at their edge cases.
|
|
8
|
+
|
|
9
|
+
## 0.0.44
|
|
10
|
+
|
|
3
11
|
## 0.0.43
|
|
4
12
|
|
|
5
13
|
## 0.0.42
|
package/README.md
CHANGED
|
@@ -720,6 +720,9 @@ The default table is `idempotency_records`; pass `tableName` to both setup and
|
|
|
720
720
|
port creation if your app uses a different table name. Expired records are
|
|
721
721
|
removed during reservation, failed in-progress reservations are released, and
|
|
722
722
|
completed matching records replay their stored result.
|
|
723
|
+
Reservation tokens use Web Crypto `randomUUID()` or `getRandomValues()` when
|
|
724
|
+
available and securely fall back to `node:crypto` on supported Node runtimes;
|
|
725
|
+
the adapter fails before writing when neither secure source is available.
|
|
723
726
|
|
|
724
727
|
Unfinished reservations use a 300-second TTL by default, independently from
|
|
725
728
|
the completed replay `ttlSec`. `complete(...)` and `fail(...)` must match an
|
|
@@ -26,8 +26,9 @@ export interface IdempotencySqlExecutor extends SqlExecutorBase<IdempotencySqlEx
|
|
|
26
26
|
/**
|
|
27
27
|
* Insert statement suffix for conflict-tolerant reservation inserts.
|
|
28
28
|
*
|
|
29
|
-
* SQLite: empty. Postgres:
|
|
30
|
-
*
|
|
29
|
+
* SQLite/MySQL: empty. Postgres:
|
|
30
|
+
* `on conflict (storage_key) do nothing`. MySQL reports duplicate inserts
|
|
31
|
+
* as `ER_DUP_ENTRY`, which its executor classifies as a reservation conflict.
|
|
31
32
|
*/
|
|
32
33
|
insertConflictSuffix: SQL;
|
|
33
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-core.d.ts","sourceRoot":"","sources":["../../src/shared/idempotency-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAKL,KAAK,eAAe,EAIrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,GAAG,EAAO,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOxD;;GAEG;AACH,MAAM,WAAW,sBACf,SAAQ,eAAe,CAAC,sBAAsB,CAAC;IAC/C;;;;OAIG;IACH,YAAY,EAAE,GAAG,CAAC;IAElB
|
|
1
|
+
{"version":3,"file":"idempotency-core.d.ts","sourceRoot":"","sources":["../../src/shared/idempotency-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAKL,KAAK,eAAe,EAIrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,GAAG,EAAO,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOxD;;GAEG;AACH,MAAM,WAAW,sBACf,SAAQ,eAAe,CAAC,sBAAsB,CAAC;IAC/C;;;;OAIG;IACH,YAAY,EAAE,GAAG,CAAC;IAElB;;;;;;OAMG;IACH,oBAAoB,EAAE,GAAG,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,kDAAkD;IAClD,sBAAsB,CAAC,EAAE,MAAM,MAAM,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,mCAAmC,GAAG,KAChD,IAAI,EAAE,4BAA4B,KAC/B,KAAK,CAAC;AAEX;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,4BAA4B,GACjC,MAAM,CAER;AAgHD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,0BAA0B,EACnC,kBAAkB,EAAE,mCAAmC,GACtD,eAAe,CAgLjB"}
|
|
@@ -78,16 +78,26 @@ function decodeReservationState(value) {
|
|
|
78
78
|
return undefined;
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
function createRandomReservationToken() {
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
async function createRandomReservationToken() {
|
|
82
|
+
const crypto = globalThis.crypto;
|
|
83
|
+
if (typeof crypto?.randomUUID === "function") {
|
|
84
|
+
return crypto.randomUUID();
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
if (typeof crypto?.getRandomValues === "function") {
|
|
87
|
+
const bytes = new Uint8Array(16);
|
|
88
|
+
crypto.getRandomValues(bytes);
|
|
88
89
|
return Array.from(bytes, (value) => value.toString(16).padStart(2, "0")).join("");
|
|
89
90
|
}
|
|
90
|
-
|
|
91
|
+
try {
|
|
92
|
+
const nodeCrypto = await import("node:crypto");
|
|
93
|
+
if (typeof nodeCrypto.randomUUID === "function") {
|
|
94
|
+
return nodeCrypto.randomUUID();
|
|
95
|
+
}
|
|
96
|
+
return nodeCrypto.randomBytes(16).toString("hex");
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
throw new Error("Idempotency reservations require Web Crypto or Node.js crypto.");
|
|
100
|
+
}
|
|
91
101
|
}
|
|
92
102
|
/**
|
|
93
103
|
* Create the dialect-independent idempotency port orchestration on top of a
|
|
@@ -121,7 +131,8 @@ export function createIdempotencyPortCore(executor, options, MutationErrorClass)
|
|
|
121
131
|
const now = nowFrom(options);
|
|
122
132
|
const nowIso = encodeTimestamp(now);
|
|
123
133
|
const expiresAt = resolveIdempotencyExpiresAt(input.reservationTtlSec ?? DEFAULT_IDEMPOTENCY_RESERVATION_TTL_SEC, now);
|
|
124
|
-
const reservationToken = encodeReservationState(
|
|
134
|
+
const reservationToken = encodeReservationState(options.createReservationToken?.() ??
|
|
135
|
+
(await createRandomReservationToken()), input.ttlSec);
|
|
125
136
|
const reservationJson = reservationToken;
|
|
126
137
|
const storageKey = createIdempotencyStorageKey(input);
|
|
127
138
|
const scopeKey = normalizeIdempotencyScope(input.scope);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-core.js","sourceRoot":"","sources":["../../src/shared/idempotency-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,EAMvC,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAY,GAAG,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EACL,eAAe,EAEf,6BAA6B,GAC9B,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"idempotency-core.js","sourceRoot":"","sources":["../../src/shared/idempotency-core.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beignet/provider-db-drizzle",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.45",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Drizzle ORM database providers for Beignet — typed DbPort, unit of work, audit logs, outbox, and idempotency for SQLite (libSQL/Turso), Postgres, and MySQL.",
|
|
6
6
|
"exports": {
|
|
@@ -44,8 +44,9 @@ export interface IdempotencySqlExecutor
|
|
|
44
44
|
/**
|
|
45
45
|
* Insert statement suffix for conflict-tolerant reservation inserts.
|
|
46
46
|
*
|
|
47
|
-
* SQLite: empty. Postgres:
|
|
48
|
-
*
|
|
47
|
+
* SQLite/MySQL: empty. Postgres:
|
|
48
|
+
* `on conflict (storage_key) do nothing`. MySQL reports duplicate inserts
|
|
49
|
+
* as `ER_DUP_ENTRY`, which its executor classifies as a reservation conflict.
|
|
49
50
|
*/
|
|
50
51
|
insertConflictSuffix: SQL;
|
|
51
52
|
}
|
|
@@ -174,20 +175,30 @@ function decodeReservationState(
|
|
|
174
175
|
}
|
|
175
176
|
}
|
|
176
177
|
|
|
177
|
-
function createRandomReservationToken(): string {
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
async function createRandomReservationToken(): Promise<string> {
|
|
179
|
+
const crypto = globalThis.crypto;
|
|
180
|
+
if (typeof crypto?.randomUUID === "function") {
|
|
181
|
+
return crypto.randomUUID();
|
|
180
182
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
if (bytes.some((value) => value !== 0)) {
|
|
183
|
+
if (typeof crypto?.getRandomValues === "function") {
|
|
184
|
+
const bytes = new Uint8Array(16);
|
|
185
|
+
crypto.getRandomValues(bytes);
|
|
185
186
|
return Array.from(bytes, (value) =>
|
|
186
187
|
value.toString(16).padStart(2, "0"),
|
|
187
188
|
).join("");
|
|
188
189
|
}
|
|
189
190
|
|
|
190
|
-
|
|
191
|
+
try {
|
|
192
|
+
const nodeCrypto = await import("node:crypto");
|
|
193
|
+
if (typeof nodeCrypto.randomUUID === "function") {
|
|
194
|
+
return nodeCrypto.randomUUID();
|
|
195
|
+
}
|
|
196
|
+
return nodeCrypto.randomBytes(16).toString("hex");
|
|
197
|
+
} catch {
|
|
198
|
+
throw new Error(
|
|
199
|
+
"Idempotency reservations require Web Crypto or Node.js crypto.",
|
|
200
|
+
);
|
|
201
|
+
}
|
|
191
202
|
}
|
|
192
203
|
|
|
193
204
|
/**
|
|
@@ -240,7 +251,8 @@ export function createIdempotencyPortCore(
|
|
|
240
251
|
now,
|
|
241
252
|
);
|
|
242
253
|
const reservationToken = encodeReservationState(
|
|
243
|
-
|
|
254
|
+
options.createReservationToken?.() ??
|
|
255
|
+
(await createRandomReservationToken()),
|
|
244
256
|
input.ttlSec,
|
|
245
257
|
);
|
|
246
258
|
const reservationJson = reservationToken;
|