@proteinjs/db 1.52.0 → 1.54.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/CHANGELOG.md +22 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.js +1 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/src/Db.d.ts +58 -5
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +83 -24
- package/dist/src/Db.js.map +1 -1
- package/dist/src/DuplicateKeyError.d.ts +20 -0
- package/dist/src/DuplicateKeyError.d.ts.map +1 -0
- package/dist/src/DuplicateKeyError.js +47 -0
- package/dist/src/DuplicateKeyError.js.map +1 -0
- package/dist/src/TransactionRetryExhaustedError.d.ts +25 -0
- package/dist/src/TransactionRetryExhaustedError.d.ts.map +1 -0
- package/dist/src/TransactionRetryExhaustedError.js +54 -0
- package/dist/src/TransactionRetryExhaustedError.js.map +1 -0
- package/dist/src/transaction/TransactionRetryPolicy.d.ts +34 -0
- package/dist/src/transaction/TransactionRetryPolicy.d.ts.map +1 -0
- package/dist/src/transaction/TransactionRetryPolicy.js +3 -0
- package/dist/src/transaction/TransactionRetryPolicy.js.map +1 -0
- package/dist/test/DuplicateKeyError.test.d.ts +2 -0
- package/dist/test/DuplicateKeyError.test.d.ts.map +1 -0
- package/dist/test/DuplicateKeyError.test.js +287 -0
- package/dist/test/DuplicateKeyError.test.js.map +1 -0
- package/dist/test/TransactionRetryOptions.test.d.ts +2 -0
- package/dist/test/TransactionRetryOptions.test.d.ts.map +1 -0
- package/dist/test/TransactionRetryOptions.test.js +293 -0
- package/dist/test/TransactionRetryOptions.test.js.map +1 -0
- package/generated/index.ts +1 -1
- package/generated/test/index.ts +1 -1
- package/index.ts +3 -0
- package/package.json +2 -2
- package/src/Db.ts +98 -12
- package/src/DuplicateKeyError.ts +26 -0
- package/src/TransactionRetryExhaustedError.ts +37 -0
- package/src/transaction/TransactionRetryPolicy.ts +31 -0
- package/test/DuplicateKeyError.test.ts +179 -0
- package/test/TransactionRetryOptions.test.ts +195 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../generated/test/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;;;;;;;;;;;;AAEpC,+BAA6B;AAC7B,6BAA2B;AAC3B,iCAA+B;AAC/B,iCAA+B;AAC/B,8BAA4B;AAC5B,gCAA8B;AAG9B,4BAA4B;AAE5B,IAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../generated/test/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export * from './src/Db';
|
|
|
2
2
|
export * from './src/DetachedDbOps';
|
|
3
3
|
export * from './src/Table';
|
|
4
4
|
export * from './src/RecordAccessError';
|
|
5
|
+
export * from './src/DuplicateKeyError';
|
|
6
|
+
export * from './src/TransactionRetryExhaustedError';
|
|
5
7
|
export * from './src/auth/TableAuth';
|
|
6
8
|
export * from './src/auth/TableServiceAuth';
|
|
7
9
|
export * from './src/Columns';
|
|
@@ -22,6 +24,7 @@ export * from './src/TableWatcher';
|
|
|
22
24
|
export * from './src/transaction/Transaction';
|
|
23
25
|
export * from './src/transaction/TransactionRunner';
|
|
24
26
|
export * from './src/transaction/TransactionContextFactory';
|
|
27
|
+
export * from './src/transaction/TransactionRetryPolicy';
|
|
25
28
|
export * from './src/schema/SchemaOperations';
|
|
26
29
|
export * from './src/schema/SchemaMetadata';
|
|
27
30
|
export * from './src/schema/TableManager';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sCAAsC,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AAEzD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAE1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AAExD,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,8 @@ __exportStar(require("./src/Db"), exports);
|
|
|
19
19
|
__exportStar(require("./src/DetachedDbOps"), exports);
|
|
20
20
|
__exportStar(require("./src/Table"), exports);
|
|
21
21
|
__exportStar(require("./src/RecordAccessError"), exports);
|
|
22
|
+
__exportStar(require("./src/DuplicateKeyError"), exports);
|
|
23
|
+
__exportStar(require("./src/TransactionRetryExhaustedError"), exports);
|
|
22
24
|
__exportStar(require("./src/auth/TableAuth"), exports);
|
|
23
25
|
__exportStar(require("./src/auth/TableServiceAuth"), exports);
|
|
24
26
|
__exportStar(require("./src/Columns"), exports);
|
|
@@ -42,6 +44,7 @@ __exportStar(require("./src/TableWatcher"), exports);
|
|
|
42
44
|
__exportStar(require("./src/transaction/Transaction"), exports);
|
|
43
45
|
__exportStar(require("./src/transaction/TransactionRunner"), exports);
|
|
44
46
|
__exportStar(require("./src/transaction/TransactionContextFactory"), exports);
|
|
47
|
+
__exportStar(require("./src/transaction/TransactionRetryPolicy"), exports);
|
|
45
48
|
__exportStar(require("./src/schema/SchemaOperations"), exports);
|
|
46
49
|
__exportStar(require("./src/schema/SchemaMetadata"), exports);
|
|
47
50
|
__exportStar(require("./src/schema/TableManager"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,sDAAoC;AACpC,8CAA4B;AAC5B,0DAAwC;AACxC,uDAAqC;AACrC,8DAA4C;AAC5C,gDAA8B;AAC9B,+CAA6B;AAC7B,iEAA+C;AAC/C,qEAAmD;AACnD,4DAA0C;AAC1C,yDAAuC;AACvC,iEAA+C;AAC/C,uDAAqC;AACrC,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,gGAAgG;AAChG,4EAA4E;AAC5E,8EAA6E;AAApE,gIAAA,sBAAsB,OAAA;AAC/B,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,gEAA8C;AAC9C,sEAAoD;AACpD,8EAA4D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,sDAAoC;AACpC,8CAA4B;AAC5B,0DAAwC;AACxC,0DAAwC;AACxC,uEAAqD;AACrD,uDAAqC;AACrC,8DAA4C;AAC5C,gDAA8B;AAC9B,+CAA6B;AAC7B,iEAA+C;AAC/C,qEAAmD;AACnD,4DAA0C;AAC1C,yDAAuC;AACvC,iEAA+C;AAC/C,uDAAqC;AACrC,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,gGAAgG;AAChG,4EAA4E;AAC5E,8EAA6E;AAApE,gIAAA,sBAAsB,OAAA;AAC/B,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,gEAA8C;AAC9C,sEAAoD;AACpD,8EAA4D;AAC5D,2EAAyD;AAEzD,gEAA8C;AAC9C,8DAA4C;AAC5C,4DAA0C;AAE1C,qEAAmD;AACnD,6EAA2D;AAC3D,sEAAoD;AACpD,0EAAwD;AACxD,gEAA8C;AAC9C,sEAAoD;AACpD,mEAAiD;AACjD,oEAAkD;AAClD,6EAA2D;AAC3D,iFAA+D;AAC/D,oEAAkD;AAClD,yEAAuD;AACvD,8EAA4D;AAC5D,6EAA2D;AAC3D,kFAAgE;AAEhE,sDAAoC;AACpC,8DAA4C;AAE5C,2DAAyC;AACzC,wEAAsD;AACtD,0EAAwD;AAExD,sDAAoC"}
|
package/dist/src/Db.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { TableManager } from './schema/TableManager';
|
|
|
8
8
|
import { DefaultTransactionContextFactory, PostCommitHook } from './transaction/TransactionContextFactory';
|
|
9
9
|
import { ArrayMembershipUpdate } from './reference/ArrayMembershipOps';
|
|
10
10
|
import { PreservedPath } from './UpdatePreserving';
|
|
11
|
+
import { TransactionOptions } from './transaction/TransactionRetryPolicy';
|
|
11
12
|
/** get `Db` if on server, and `DbService` if on browser */
|
|
12
13
|
export declare const getDb: <R extends Record = Record>() => Db<R>;
|
|
13
14
|
export declare const getDbAsSystem: <R extends Record = Record>() => Db<R>;
|
|
@@ -46,8 +47,20 @@ export interface DbDriver {
|
|
|
46
47
|
stop?(): Promise<void>;
|
|
47
48
|
getTableManager(): TableManager;
|
|
48
49
|
runQuery(generateStatement: (config: DbDriverQueryStatementConfig) => Statement, transaction?: any): Promise<SerializedRecord[]>;
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Run one write statement. On `transaction` it rides that transaction; without one it is a
|
|
52
|
+
* transaction of its own, and `options.retry` (`TransactionRetryPolicy`) is how the driver
|
|
53
|
+
* re-runs it when the database aborts it — the driver's own road when omitted, else the bound
|
|
54
|
+
* named, past which the driver throws `TransactionRetryExhaustedError`. A driver that never
|
|
55
|
+
* re-runs an aborted statement (the abort reaches the caller at once) already satisfies every
|
|
56
|
+
* policy.
|
|
57
|
+
*/
|
|
58
|
+
runDml(generateStatement: (config: DbDriverDmlStatementConfig) => Statement, transaction?: any, options?: TransactionOptions): Promise<number>;
|
|
59
|
+
/**
|
|
60
|
+
* Run `fn` as one transaction. `options.retry` (`TransactionRetryPolicy`) is how the driver
|
|
61
|
+
* re-runs the whole body when the database aborts the transaction — see `runDml`.
|
|
62
|
+
*/
|
|
63
|
+
runTransaction<T>(fn: (transaction: any) => Promise<T>, options?: TransactionOptions): Promise<T>;
|
|
51
64
|
/**
|
|
52
65
|
* The driver's per-operation deadline, in milliseconds: the longest one statement it runs may
|
|
53
66
|
* take before the driver fails it — the bound the driver enforces, as configured. Not a whole
|
|
@@ -65,6 +78,13 @@ export interface DbDriver {
|
|
|
65
78
|
* and a batch on it is always one statement.
|
|
66
79
|
*/
|
|
67
80
|
getStatementParameterLimit?(): number;
|
|
81
|
+
/**
|
|
82
|
+
* Whether `error` — what this driver's `runDml` threw — is the backend refusing a row because a
|
|
83
|
+
* row with the same key is already there (the primary key, or a unique index). `Db.insert` and
|
|
84
|
+
* `Db.insertMany` rethrow such a refusal as the typed `DuplicateKeyError`, so a caller can take
|
|
85
|
+
* it by type. A driver that declares no classifier lets the backend's error through as it came.
|
|
86
|
+
*/
|
|
87
|
+
isDuplicateKeyError?(error: unknown): boolean;
|
|
68
88
|
}
|
|
69
89
|
export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
70
90
|
private runAsSystem;
|
|
@@ -92,7 +112,14 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
92
112
|
init(): Promise<void>;
|
|
93
113
|
tableExists<T extends R>(table: Table<T>): Promise<boolean>;
|
|
94
114
|
get<T extends R>(table: Table<T>, query: Query<T>, options?: QueryOptions<T>): Promise<T>;
|
|
95
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Insert one row. Outside a transaction the insert is a transaction of its own, and
|
|
117
|
+
* `options.retry` names how it is re-run when the database aborts it (`TransactionRetryPolicy`:
|
|
118
|
+
* the driver's own road when omitted; a bounded policy for a best-effort write, past which the
|
|
119
|
+
* caller takes `TransactionRetryExhaustedError`). Inside a transaction the transaction's policy
|
|
120
|
+
* governs, and an insert naming one of its own is refused.
|
|
121
|
+
*/
|
|
122
|
+
insert<T extends R>(table: Table<T>, record: Omit<T, keyof R>, options?: TransactionOptions): Promise<T>;
|
|
96
123
|
/**
|
|
97
124
|
* Insert `records` as ONE statement (a multi-row INSERT) instead of one statement per row,
|
|
98
125
|
* each row keeping every contract {@link insert} gives a single one: the table's default field
|
|
@@ -112,7 +139,15 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
112
139
|
* empty list inserts nothing and returns [].
|
|
113
140
|
*/
|
|
114
141
|
insertMany<T extends R>(table: Table<T>, records: Omit<T, keyof R>[]): Promise<T[]>;
|
|
115
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Update the rows `query` selects (the one row `record.id` names when there is no query).
|
|
144
|
+
* Outside a transaction the update is a transaction of its own, and `options.retry` names how
|
|
145
|
+
* it is re-run when the database aborts it (`TransactionRetryPolicy`: the driver's own road when
|
|
146
|
+
* omitted; a bounded policy for a best-effort write — a live progress row the next step
|
|
147
|
+
* rewrites anyway — past which the caller takes `TransactionRetryExhaustedError`). Inside a
|
|
148
|
+
* transaction the transaction's policy governs, and an update naming one of its own is refused.
|
|
149
|
+
*/
|
|
150
|
+
update<T extends R>(table: Table<T>, record: Partial<T>, query?: Query<T>, options?: TransactionOptions): Promise<number>;
|
|
116
151
|
/**
|
|
117
152
|
* Apply commutative membership ops (add/remove/move) to a `ReferenceArrayColumn`
|
|
118
153
|
* read-modify-write against COMMITTED truth, so concurrent membership writers
|
|
@@ -219,6 +254,11 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
219
254
|
*
|
|
220
255
|
* Note: Nested transactions are not supported; will throw.
|
|
221
256
|
*
|
|
257
|
+
* `options.retry` names how the driver re-runs the whole body when the database aborts the
|
|
258
|
+
* transaction (`TransactionRetryPolicy`: the driver's own road when omitted; a bounded policy
|
|
259
|
+
* for best-effort work, past which this throws `TransactionRetryExhaustedError`). Every write
|
|
260
|
+
* inside the body rides this policy; none may name one of its own.
|
|
261
|
+
*
|
|
222
262
|
* Note: work spawned inside the body but NOT awaited by it escapes the transaction's
|
|
223
263
|
* lifetime while still holding its context — such work fails loudly on its next db
|
|
224
264
|
* operation (see TransactionContextData.ended). Await everything inside the body, or run
|
|
@@ -237,7 +277,7 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
237
277
|
* });
|
|
238
278
|
* ```
|
|
239
279
|
*/
|
|
240
|
-
runTransaction<T>(fn: () => Promise<T
|
|
280
|
+
runTransaction<T>(fn: () => Promise<T>, options?: TransactionOptions): Promise<T>;
|
|
241
281
|
/**
|
|
242
282
|
* Run `hook` once the write unit currently executing is durably committed.
|
|
243
283
|
*
|
|
@@ -260,6 +300,12 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
260
300
|
* exactly as before.
|
|
261
301
|
*/
|
|
262
302
|
private encryptionWriteContext;
|
|
303
|
+
/**
|
|
304
|
+
* What an insert statement's failure becomes for the caller: the typed `DuplicateKeyError` when
|
|
305
|
+
* the driver classifies the backend's refusal as a row already there; any other failure as it
|
|
306
|
+
* came.
|
|
307
|
+
*/
|
|
308
|
+
private insertFailure;
|
|
263
309
|
private updateTouchesEncryptedColumns;
|
|
264
310
|
/**
|
|
265
311
|
* Update path for payloads touching encrypted columns. Ciphertext is keyed per row OWNER
|
|
@@ -295,6 +341,13 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
295
341
|
* handing the driver an ended transaction would fail anyway, with a far worse error.
|
|
296
342
|
*/
|
|
297
343
|
private transactionForDriver;
|
|
344
|
+
/**
|
|
345
|
+
* A write's transaction options as the driver takes them: its own, when the write runs outside
|
|
346
|
+
* any transaction and so is a transaction of its own. Inside a transaction the write rides the
|
|
347
|
+
* transaction, whose policy was named on `runTransaction`; a policy named on the write would be
|
|
348
|
+
* one nothing honours — refused by name, never dropped.
|
|
349
|
+
*/
|
|
350
|
+
private ownTransactionOptions;
|
|
298
351
|
/**
|
|
299
352
|
* The rows of one multi-row insert split into the fewest statements the driver's statement
|
|
300
353
|
* parameter bound admits (`insertMany`): each statement binds `columns × rows` parameters,
|
package/dist/src/Db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,KAAK,EAAE,YAAY,EAAgB,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAoB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,EAKN,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,MAAM,EAAoB,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AAGnH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EACL,gCAAgC,EAChC,cAAc,EAGf,MAAM,yCAAyC,CAAC;AAKjD,OAAO,EAAE,qBAAqB,EAA2B,MAAM,gCAAgC,CAAC;AAChG,OAAO,EAAE,aAAa,EAAyB,MAAM,oBAAoB,CAAC;AAE1E,2DAA2D;AAC3D,eAAO,MAAM,KAAK,wCACqD,CAAC;AACxE,eAAO,MAAM,aAAa,wCAAoF,CAAC;AAkB/G,MAAM,MAAM,4BAA4B,GAAG,sBAAsB,GAAG;IAClE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACxE,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,KAAK,MAAM,CAAC;IACjG,gGAAgG;IAChG,mBAAmB,CAAC,EAAE,CAAC,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAC;IAC9F,kHAAkH;IAClH,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,GAAG;IAChE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACxE,kHAAkH;IAClH,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;CACpE,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,QAAQ;IACtD,WAAW,IAAI,QAAQ,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,IAAI,MAAM,CAAC;IACpB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,+BAA+B;IAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,eAAe,IAAI,YAAY,CAAC;IAChC,QAAQ,CACN,iBAAiB,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,SAAS,EACtE,WAAW,CAAC,EAAE,GAAG,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC/B,MAAM,
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Db.js
CHANGED
|
@@ -89,6 +89,7 @@ var ReferenceArray_1 = require("./reference/ReferenceArray");
|
|
|
89
89
|
var ReferenceCache_1 = require("./reference/ReferenceCache");
|
|
90
90
|
var ArrayMembershipOps_1 = require("./reference/ArrayMembershipOps");
|
|
91
91
|
var UpdatePreserving_1 = require("./UpdatePreserving");
|
|
92
|
+
var DuplicateKeyError_1 = require("./DuplicateKeyError");
|
|
92
93
|
/** get `Db` if on server, and `DbService` if on browser */
|
|
93
94
|
var getDb = function () {
|
|
94
95
|
return typeof self === 'undefined' ? new Db() : (0, DbService_1.getDbService)();
|
|
@@ -201,9 +202,16 @@ var Db = /** @class */ (function () {
|
|
|
201
202
|
});
|
|
202
203
|
});
|
|
203
204
|
};
|
|
204
|
-
|
|
205
|
+
/**
|
|
206
|
+
* Insert one row. Outside a transaction the insert is a transaction of its own, and
|
|
207
|
+
* `options.retry` names how it is re-run when the database aborts it (`TransactionRetryPolicy`:
|
|
208
|
+
* the driver's own road when omitted; a bounded policy for a best-effort write, past which the
|
|
209
|
+
* caller takes `TransactionRetryExhaustedError`). Inside a transaction the transaction's policy
|
|
210
|
+
* governs, and an insert naming one of its own is refused.
|
|
211
|
+
*/
|
|
212
|
+
Db.prototype.insert = function (table, record, options) {
|
|
205
213
|
return __awaiter(this, void 0, void 0, function () {
|
|
206
|
-
var recordCopy, encryptionContext, recordSerializer, serializedRecord, generateInsert, EncryptionTokenMaintenance;
|
|
214
|
+
var driverOptions, recordCopy, encryptionContext, recordSerializer, serializedRecord, generateInsert, error_1, EncryptionTokenMaintenance;
|
|
207
215
|
var _this = this;
|
|
208
216
|
return __generator(this, function (_a) {
|
|
209
217
|
switch (_a.label) {
|
|
@@ -211,6 +219,7 @@ var Db = /** @class */ (function () {
|
|
|
211
219
|
if (!this.runAsSystem) {
|
|
212
220
|
this.auth.canInsert(table);
|
|
213
221
|
}
|
|
222
|
+
driverOptions = this.ownTransactionOptions(options);
|
|
214
223
|
recordCopy = Object.assign({}, record);
|
|
215
224
|
return [4 /*yield*/, (0, Table_1.addDefaultFieldValues)(table, recordCopy, this.runAsSystem)];
|
|
216
225
|
case 1:
|
|
@@ -231,22 +240,30 @@ var Db = /** @class */ (function () {
|
|
|
231
240
|
generateInsert = function (config) {
|
|
232
241
|
return new db_query_1.StatementFactory().insert(table.name, serializedRecord, _this.statementConfigFactory.getStatementConfig(config));
|
|
233
242
|
};
|
|
234
|
-
|
|
243
|
+
_a.label = 6;
|
|
235
244
|
case 6:
|
|
245
|
+
_a.trys.push([6, 8, , 9]);
|
|
246
|
+
return [4 /*yield*/, this.dbDriver.runDml(generateInsert, this.transactionForDriver(), driverOptions)];
|
|
247
|
+
case 7:
|
|
236
248
|
_a.sent();
|
|
237
|
-
|
|
249
|
+
return [3 /*break*/, 9];
|
|
250
|
+
case 8:
|
|
251
|
+
error_1 = _a.sent();
|
|
252
|
+
throw this.insertFailure(table, error_1);
|
|
253
|
+
case 9:
|
|
254
|
+
if (!encryptionContext) return [3 /*break*/, 12];
|
|
238
255
|
return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('./encryption/EncryptionTokenMaintenance')); })];
|
|
239
|
-
case
|
|
256
|
+
case 10:
|
|
240
257
|
EncryptionTokenMaintenance = (_a.sent()).EncryptionTokenMaintenance;
|
|
241
258
|
return [4 /*yield*/, new EncryptionTokenMaintenance().afterInsert(table, recordCopy, encryptionContext.keyOwner, this.newSystemDb())];
|
|
242
|
-
case
|
|
259
|
+
case 11:
|
|
243
260
|
_a.sent();
|
|
244
|
-
_a.label =
|
|
245
|
-
case
|
|
246
|
-
case
|
|
261
|
+
_a.label = 12;
|
|
262
|
+
case 12: return [4 /*yield*/, this.runColumnAfterInsertHooks(table, recordCopy)];
|
|
263
|
+
case 13:
|
|
247
264
|
_a.sent();
|
|
248
265
|
return [4 /*yield*/, this.tableWatcherRunner.runAfterInsertTableWatchers(table, recordCopy)];
|
|
249
|
-
case
|
|
266
|
+
case 14:
|
|
250
267
|
_a.sent();
|
|
251
268
|
return [2 /*return*/, recordCopy];
|
|
252
269
|
}
|
|
@@ -323,17 +340,24 @@ var Db = /** @class */ (function () {
|
|
|
323
340
|
return [3 /*break*/, 3];
|
|
324
341
|
case 10:
|
|
325
342
|
_loop_1 = function (statementRows) {
|
|
326
|
-
var generateInsert;
|
|
343
|
+
var generateInsert, error_2;
|
|
327
344
|
return __generator(this, function (_f) {
|
|
328
345
|
switch (_f.label) {
|
|
329
346
|
case 0:
|
|
330
347
|
generateInsert = function (config) {
|
|
331
348
|
return new db_query_1.StatementFactory().insertMany(table.name, statementRows, _this.statementConfigFactory.getStatementConfig(config));
|
|
332
349
|
};
|
|
333
|
-
|
|
350
|
+
_f.label = 1;
|
|
334
351
|
case 1:
|
|
352
|
+
_f.trys.push([1, 3, , 4]);
|
|
353
|
+
return [4 /*yield*/, this_1.dbDriver.runDml(generateInsert, this_1.transactionForDriver())];
|
|
354
|
+
case 2:
|
|
335
355
|
_f.sent();
|
|
336
|
-
return [
|
|
356
|
+
return [3 /*break*/, 4];
|
|
357
|
+
case 3:
|
|
358
|
+
error_2 = _f.sent();
|
|
359
|
+
throw this_1.insertFailure(table, error_2);
|
|
360
|
+
case 4: return [2 /*return*/];
|
|
337
361
|
}
|
|
338
362
|
});
|
|
339
363
|
};
|
|
@@ -379,10 +403,18 @@ var Db = /** @class */ (function () {
|
|
|
379
403
|
});
|
|
380
404
|
});
|
|
381
405
|
};
|
|
382
|
-
|
|
406
|
+
/**
|
|
407
|
+
* Update the rows `query` selects (the one row `record.id` names when there is no query).
|
|
408
|
+
* Outside a transaction the update is a transaction of its own, and `options.retry` names how
|
|
409
|
+
* it is re-run when the database aborts it (`TransactionRetryPolicy`: the driver's own road when
|
|
410
|
+
* omitted; a bounded policy for a best-effort write — a live progress row the next step
|
|
411
|
+
* rewrites anyway — past which the caller takes `TransactionRetryExhaustedError`). Inside a
|
|
412
|
+
* transaction the transaction's policy governs, and an update naming one of its own is refused.
|
|
413
|
+
*/
|
|
414
|
+
Db.prototype.update = function (table, record, query, options) {
|
|
383
415
|
var _a;
|
|
384
416
|
return __awaiter(this, void 0, void 0, function () {
|
|
385
|
-
var recordCopy, columnPropertyName, column, immutable, qb, recordUpdateCount, recordSerializer, serializedRecord_1, generateUpdate, id;
|
|
417
|
+
var driverOptions, recordCopy, columnPropertyName, column, immutable, qb, recordUpdateCount, recordSerializer, serializedRecord_1, generateUpdate, id;
|
|
386
418
|
var _this = this;
|
|
387
419
|
return __generator(this, function (_b) {
|
|
388
420
|
switch (_b.label) {
|
|
@@ -393,6 +425,7 @@ var Db = /** @class */ (function () {
|
|
|
393
425
|
if (!query && !record.id) {
|
|
394
426
|
throw new Error("Update must be called with either a Query or a record with an id property");
|
|
395
427
|
}
|
|
428
|
+
driverOptions = this.ownTransactionOptions(options);
|
|
396
429
|
recordCopy = Object.assign({}, record);
|
|
397
430
|
// Immutable columns can never be rewritten through an update — strip them from the payload
|
|
398
431
|
// (e.g. a ScopedRecord's `scope`: forced on insert; a client-path update rewriting it would
|
|
@@ -420,7 +453,7 @@ var Db = /** @class */ (function () {
|
|
|
420
453
|
return [4 /*yield*/, this.updateTouchesEncryptedColumns(table, recordCopy)];
|
|
421
454
|
case 4:
|
|
422
455
|
if (!_b.sent()) return [3 /*break*/, 6];
|
|
423
|
-
return [4 /*yield*/, this.updateEncrypted(table, recordCopy, qb)];
|
|
456
|
+
return [4 /*yield*/, this.updateEncrypted(table, recordCopy, qb, driverOptions)];
|
|
424
457
|
case 5:
|
|
425
458
|
recordUpdateCount = _b.sent();
|
|
426
459
|
return [3 /*break*/, 9];
|
|
@@ -433,7 +466,7 @@ var Db = /** @class */ (function () {
|
|
|
433
466
|
generateUpdate = function (config) {
|
|
434
467
|
return new db_query_1.StatementFactory().update(table.name, serializedRecord_1, qb, _this.statementConfigFactory.getStatementConfig(config));
|
|
435
468
|
};
|
|
436
|
-
return [4 /*yield*/, this.dbDriver.runDml(generateUpdate, this.transactionForDriver())];
|
|
469
|
+
return [4 /*yield*/, this.dbDriver.runDml(generateUpdate, this.transactionForDriver(), driverOptions)];
|
|
437
470
|
case 8:
|
|
438
471
|
recordUpdateCount = _b.sent();
|
|
439
472
|
_b.label = 9;
|
|
@@ -1273,6 +1306,11 @@ var Db = /** @class */ (function () {
|
|
|
1273
1306
|
*
|
|
1274
1307
|
* Note: Nested transactions are not supported; will throw.
|
|
1275
1308
|
*
|
|
1309
|
+
* `options.retry` names how the driver re-runs the whole body when the database aborts the
|
|
1310
|
+
* transaction (`TransactionRetryPolicy`: the driver's own road when omitted; a bounded policy
|
|
1311
|
+
* for best-effort work, past which this throws `TransactionRetryExhaustedError`). Every write
|
|
1312
|
+
* inside the body rides this policy; none may name one of its own.
|
|
1313
|
+
*
|
|
1276
1314
|
* Note: work spawned inside the body but NOT awaited by it escapes the transaction's
|
|
1277
1315
|
* lifetime while still holding its context — such work fails loudly on its next db
|
|
1278
1316
|
* operation (see TransactionContextData.ended). Await everything inside the body, or run
|
|
@@ -1291,9 +1329,9 @@ var Db = /** @class */ (function () {
|
|
|
1291
1329
|
* });
|
|
1292
1330
|
* ```
|
|
1293
1331
|
*/
|
|
1294
|
-
Db.prototype.runTransaction = function (fn) {
|
|
1332
|
+
Db.prototype.runTransaction = function (fn, options) {
|
|
1295
1333
|
return __awaiter(this, void 0, void 0, function () {
|
|
1296
|
-
var postCommitHooks, result, _i, postCommitHooks_1, postCommitHook,
|
|
1334
|
+
var postCommitHooks, result, _i, postCommitHooks_1, postCommitHook, error_3;
|
|
1297
1335
|
var _this = this;
|
|
1298
1336
|
return __generator(this, function (_a) {
|
|
1299
1337
|
switch (_a.label) {
|
|
@@ -1326,7 +1364,7 @@ var Db = /** @class */ (function () {
|
|
|
1326
1364
|
case 4: return [2 /*return*/];
|
|
1327
1365
|
}
|
|
1328
1366
|
});
|
|
1329
|
-
}); })];
|
|
1367
|
+
}); }, options)];
|
|
1330
1368
|
case 1:
|
|
1331
1369
|
result = _a.sent();
|
|
1332
1370
|
_i = 0, postCommitHooks_1 = postCommitHooks;
|
|
@@ -1342,8 +1380,8 @@ var Db = /** @class */ (function () {
|
|
|
1342
1380
|
_a.sent();
|
|
1343
1381
|
return [3 /*break*/, 6];
|
|
1344
1382
|
case 5:
|
|
1345
|
-
|
|
1346
|
-
this.logger.error({ message: "Post-commit hook failed", error:
|
|
1383
|
+
error_3 = _a.sent();
|
|
1384
|
+
this.logger.error({ message: "Post-commit hook failed", error: error_3 });
|
|
1347
1385
|
return [3 /*break*/, 6];
|
|
1348
1386
|
case 6:
|
|
1349
1387
|
_i++;
|
|
@@ -1422,6 +1460,15 @@ var Db = /** @class */ (function () {
|
|
|
1422
1460
|
});
|
|
1423
1461
|
});
|
|
1424
1462
|
};
|
|
1463
|
+
/**
|
|
1464
|
+
* What an insert statement's failure becomes for the caller: the typed `DuplicateKeyError` when
|
|
1465
|
+
* the driver classifies the backend's refusal as a row already there; any other failure as it
|
|
1466
|
+
* came.
|
|
1467
|
+
*/
|
|
1468
|
+
Db.prototype.insertFailure = function (table, error) {
|
|
1469
|
+
var _a, _b;
|
|
1470
|
+
return ((_b = (_a = this.dbDriver).isDuplicateKeyError) === null || _b === void 0 ? void 0 : _b.call(_a, error)) ? new DuplicateKeyError_1.DuplicateKeyError(table.name, error) : error;
|
|
1471
|
+
};
|
|
1425
1472
|
Db.prototype.updateTouchesEncryptedColumns = function (table, record) {
|
|
1426
1473
|
return __awaiter(this, void 0, void 0, function () {
|
|
1427
1474
|
var EncryptedColumns, encryptedColumns;
|
|
@@ -1444,7 +1491,7 @@ var Db = /** @class */ (function () {
|
|
|
1444
1491
|
* same query-then-act shape `delete` uses), grouped by owner, and updated one DML per
|
|
1445
1492
|
* owner group with that owner's ciphertext, companions, and search tokens.
|
|
1446
1493
|
*/
|
|
1447
|
-
Db.prototype.updateEncrypted = function (table, recordCopy, qb) {
|
|
1494
|
+
Db.prototype.updateEncrypted = function (table, recordCopy, qb, options) {
|
|
1448
1495
|
var _a;
|
|
1449
1496
|
return __awaiter(this, void 0, void 0, function () {
|
|
1450
1497
|
var targetRows, EncryptionRecordHooks, EncryptionTokenMaintenance, hooks, idsByOwner, _i, targetRows_1, row, owner, ids, recordUpdateCount, tokenMaintenance, _loop_3, this_2, _b, _c, _d, owner, ids;
|
|
@@ -1500,7 +1547,7 @@ var Db = /** @class */ (function () {
|
|
|
1500
1547
|
return new db_query_1.StatementFactory().update(table.name, serializedRecord, groupQb, _this.statementConfigFactory.getStatementConfig(config));
|
|
1501
1548
|
};
|
|
1502
1549
|
_f = recordUpdateCount;
|
|
1503
|
-
return [4 /*yield*/, this_2.dbDriver.runDml(generateUpdate, this_2.transactionForDriver())];
|
|
1550
|
+
return [4 /*yield*/, this_2.dbDriver.runDml(generateUpdate, this_2.transactionForDriver(), options)];
|
|
1504
1551
|
case 2:
|
|
1505
1552
|
recordUpdateCount = _f + _g.sent();
|
|
1506
1553
|
return [4 /*yield*/, tokenMaintenance.afterUpdate(table, ids, recordCopy, owner, this_2.newSystemDb())];
|
|
@@ -1579,6 +1626,18 @@ var Db = /** @class */ (function () {
|
|
|
1579
1626
|
}
|
|
1580
1627
|
return context.currentTransaction;
|
|
1581
1628
|
};
|
|
1629
|
+
/**
|
|
1630
|
+
* A write's transaction options as the driver takes them: its own, when the write runs outside
|
|
1631
|
+
* any transaction and so is a transaction of its own. Inside a transaction the write rides the
|
|
1632
|
+
* transaction, whose policy was named on `runTransaction`; a policy named on the write would be
|
|
1633
|
+
* one nothing honours — refused by name, never dropped.
|
|
1634
|
+
*/
|
|
1635
|
+
Db.prototype.ownTransactionOptions = function (options) {
|
|
1636
|
+
if ((options === null || options === void 0 ? void 0 : options.retry) !== undefined && this.transactionContextFactory.getTransactionContext().currentTransaction) {
|
|
1637
|
+
throw new Error("A write inside a transaction cannot name a retry policy of its own: the transaction's policy (runTransaction's options) governs every write in it");
|
|
1638
|
+
}
|
|
1639
|
+
return options;
|
|
1640
|
+
};
|
|
1582
1641
|
/**
|
|
1583
1642
|
* The rows of one multi-row insert split into the fewest statements the driver's statement
|
|
1584
1643
|
* parameter bound admits (`insertMany`): each statement binds `columns × rows` parameters,
|