camusdb 0.1.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/LICENSE +21 -0
- package/README.md +950 -0
- package/dist/auth/credentials.d.ts +30 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +23 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/login-client.d.ts +37 -0
- package/dist/auth/login-client.d.ts.map +1 -0
- package/dist/auth/login-client.js +8 -0
- package/dist/auth/login-client.js.map +1 -0
- package/dist/auth/rest-login-client.d.ts +17 -0
- package/dist/auth/rest-login-client.d.ts.map +1 -0
- package/dist/auth/rest-login-client.js +71 -0
- package/dist/auth/rest-login-client.js.map +1 -0
- package/dist/auth/token-provider.d.ts +123 -0
- package/dist/auth/token-provider.d.ts.map +1 -0
- package/dist/auth/token-provider.js +209 -0
- package/dist/auth/token-provider.js.map +1 -0
- package/dist/backup.d.ts +98 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +153 -0
- package/dist/backup.js.map +1 -0
- package/dist/cache.d.ts +90 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +121 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +406 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +724 -0
- package/dist/client.js.map +1 -0
- package/dist/column-type.d.ts +33 -0
- package/dist/column-type.d.ts.map +1 -0
- package/dist/column-type.js +50 -0
- package/dist/column-type.js.map +1 -0
- package/dist/column-value.d.ts +77 -0
- package/dist/column-value.d.ts.map +1 -0
- package/dist/column-value.js +60 -0
- package/dist/column-value.js.map +1 -0
- package/dist/config.d.ts +181 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +315 -0
- package/dist/config.js.map +1 -0
- package/dist/connection-string.d.ts +45 -0
- package/dist/connection-string.d.ts.map +1 -0
- package/dist/connection-string.js +170 -0
- package/dist/connection-string.js.map +1 -0
- package/dist/endpoint-pool.d.ts +70 -0
- package/dist/endpoint-pool.d.ts.map +1 -0
- package/dist/endpoint-pool.js +120 -0
- package/dist/endpoint-pool.js.map +1 -0
- package/dist/error-codes.d.ts +44 -0
- package/dist/error-codes.d.ts.map +1 -0
- package/dist/error-codes.js +43 -0
- package/dist/error-codes.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +33 -0
- package/dist/errors.js.map +1 -0
- package/dist/hlc.d.ts +19 -0
- package/dist/hlc.d.ts.map +1 -0
- package/dist/hlc.js +11 -0
- package/dist/hlc.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +41 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +345 -0
- package/dist/json.js.map +1 -0
- package/dist/object-id.d.ts +39 -0
- package/dist/object-id.d.ts.map +1 -0
- package/dist/object-id.js +99 -0
- package/dist/object-id.js.map +1 -0
- package/dist/options.d.ts +77 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +68 -0
- package/dist/options.js.map +1 -0
- package/dist/prepared/binder.d.ts +20 -0
- package/dist/prepared/binder.d.ts.map +1 -0
- package/dist/prepared/binder.js +32 -0
- package/dist/prepared/binder.js.map +1 -0
- package/dist/prepared/policy.d.ts +81 -0
- package/dist/prepared/policy.d.ts.map +1 -0
- package/dist/prepared/policy.js +164 -0
- package/dist/prepared/policy.js.map +1 -0
- package/dist/query-stream.d.ts +55 -0
- package/dist/query-stream.d.ts.map +1 -0
- package/dist/query-stream.js +94 -0
- package/dist/query-stream.js.map +1 -0
- package/dist/result-set.d.ts +62 -0
- package/dist/result-set.d.ts.map +1 -0
- package/dist/result-set.js +100 -0
- package/dist/result-set.js.map +1 -0
- package/dist/retry.d.ts +38 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +93 -0
- package/dist/retry.js.map +1 -0
- package/dist/routing/advice.d.ts +63 -0
- package/dist/routing/advice.d.ts.map +1 -0
- package/dist/routing/advice.js +61 -0
- package/dist/routing/advice.js.map +1 -0
- package/dist/routing/route-cache.d.ts +53 -0
- package/dist/routing/route-cache.d.ts.map +1 -0
- package/dist/routing/route-cache.js +123 -0
- package/dist/routing/route-cache.js.map +1 -0
- package/dist/routing/router.d.ts +53 -0
- package/dist/routing/router.d.ts.map +1 -0
- package/dist/routing/router.js +89 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/row-source.d.ts +48 -0
- package/dist/row-source.d.ts.map +1 -0
- package/dist/row-source.js +35 -0
- package/dist/row-source.js.map +1 -0
- package/dist/runtime.d.ts +58 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +137 -0
- package/dist/runtime.js.map +1 -0
- package/dist/shared-registry.d.ts +32 -0
- package/dist/shared-registry.d.ts.map +1 -0
- package/dist/shared-registry.js +48 -0
- package/dist/shared-registry.js.map +1 -0
- package/dist/sql-syntax.d.ts +44 -0
- package/dist/sql-syntax.d.ts.map +1 -0
- package/dist/sql-syntax.js +83 -0
- package/dist/sql-syntax.js.map +1 -0
- package/dist/statements.d.ts +15 -0
- package/dist/statements.d.ts.map +1 -0
- package/dist/statements.js +90 -0
- package/dist/statements.js.map +1 -0
- package/dist/transaction.d.ts +117 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +204 -0
- package/dist/transaction.js.map +1 -0
- package/dist/transport/authenticating-transport.d.ts +63 -0
- package/dist/transport/authenticating-transport.d.ts.map +1 -0
- package/dist/transport/authenticating-transport.js +119 -0
- package/dist/transport/authenticating-transport.js.map +1 -0
- package/dist/transport/branch-statements.d.ts +39 -0
- package/dist/transport/branch-statements.d.ts.map +1 -0
- package/dist/transport/branch-statements.js +74 -0
- package/dist/transport/branch-statements.js.map +1 -0
- package/dist/transport/error-text.d.ts +26 -0
- package/dist/transport/error-text.d.ts.map +1 -0
- package/dist/transport/error-text.js +75 -0
- package/dist/transport/error-text.js.map +1 -0
- package/dist/transport/grpc/batcher.d.ts +127 -0
- package/dist/transport/grpc/batcher.d.ts.map +1 -0
- package/dist/transport/grpc/batcher.js +399 -0
- package/dist/transport/grpc/batcher.js.map +1 -0
- package/dist/transport/grpc/codec.d.ts +40 -0
- package/dist/transport/grpc/codec.d.ts.map +1 -0
- package/dist/transport/grpc/codec.js +231 -0
- package/dist/transport/grpc/codec.js.map +1 -0
- package/dist/transport/grpc/grpc-transport.d.ts +115 -0
- package/dist/transport/grpc/grpc-transport.d.ts.map +1 -0
- package/dist/transport/grpc/grpc-transport.js +577 -0
- package/dist/transport/grpc/grpc-transport.js.map +1 -0
- package/dist/transport/grpc/messages.d.ts +221 -0
- package/dist/transport/grpc/messages.d.ts.map +1 -0
- package/dist/transport/grpc/messages.js +56 -0
- package/dist/transport/grpc/messages.js.map +1 -0
- package/dist/transport/grpc/proto.d.ts +71 -0
- package/dist/transport/grpc/proto.d.ts.map +1 -0
- package/dist/transport/grpc/proto.js +67 -0
- package/dist/transport/grpc/proto.js.map +1 -0
- package/dist/transport/http.d.ts +62 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +169 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/ndjson-row-source.d.ts +38 -0
- package/dist/transport/ndjson-row-source.d.ts.map +1 -0
- package/dist/transport/ndjson-row-source.js +197 -0
- package/dist/transport/ndjson-row-source.js.map +1 -0
- package/dist/transport/rest-decode.d.ts +33 -0
- package/dist/transport/rest-decode.d.ts.map +1 -0
- package/dist/transport/rest-decode.js +162 -0
- package/dist/transport/rest-decode.js.map +1 -0
- package/dist/transport/rest-prepared-cache.d.ts +50 -0
- package/dist/transport/rest-prepared-cache.d.ts.map +1 -0
- package/dist/transport/rest-prepared-cache.js +101 -0
- package/dist/transport/rest-prepared-cache.js.map +1 -0
- package/dist/transport/rest-transport.d.ts +88 -0
- package/dist/transport/rest-transport.d.ts.map +1 -0
- package/dist/transport/rest-transport.js +388 -0
- package/dist/transport/rest-transport.js.map +1 -0
- package/dist/transport/transport-pool.d.ts +40 -0
- package/dist/transport/transport-pool.d.ts.map +1 -0
- package/dist/transport/transport-pool.js +48 -0
- package/dist/transport/transport-pool.js.map +1 -0
- package/dist/transport/transport.d.ts +199 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +11 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/values/decode.d.ts +39 -0
- package/dist/values/decode.d.ts.map +1 -0
- package/dist/values/decode.js +75 -0
- package/dist/values/decode.js.map +1 -0
- package/dist/values/encode.d.ts +45 -0
- package/dist/values/encode.d.ts.map +1 -0
- package/dist/values/encode.js +271 -0
- package/dist/values/encode.js.map +1 -0
- package/dist/values/ticks.d.ts +31 -0
- package/dist/values/ticks.d.ts.map +1 -0
- package/dist/values/ticks.js +52 -0
- package/dist/values/ticks.js.map +1 -0
- package/dist/values/typed.d.ts +67 -0
- package/dist/values/typed.d.ts.map +1 -0
- package/dist/values/typed.js +134 -0
- package/dist/values/typed.js.map +1 -0
- package/dist/values/uuid.d.ts +27 -0
- package/dist/values/uuid.d.ts.map +1 -0
- package/dist/values/uuid.js +76 -0
- package/dist/values/uuid.js.map +1 -0
- package/dist/vector.d.ts +26 -0
- package/dist/vector.d.ts.map +1 -0
- package/dist/vector.js +48 -0
- package/dist/vector.js.map +1 -0
- package/package.json +86 -0
- package/proto/camus_sql.proto +566 -0
package/dist/json.js
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* A JSON reader and writer that keeps 64-bit integers exact.
|
|
9
|
+
*
|
|
10
|
+
* CamusDB is a 64-bit database. An `int64` column, a transaction's physical-time component, and a
|
|
11
|
+
* date's tick count all reach the wire as JSON numbers whose value can exceed 2^53, which is where
|
|
12
|
+
* a JavaScript number stops being able to name every integer. `JSON.parse` would round such a
|
|
13
|
+
* value silently, and `JSON.stringify` refuses a `bigint` outright. Both are unacceptable in a
|
|
14
|
+
* driver: a row must come back holding what was written.
|
|
15
|
+
*
|
|
16
|
+
* So this module reads an integer that does not fit a `number` as a `bigint`, and writes a
|
|
17
|
+
* `bigint` as the bare digits a JSON number is. Everything else behaves exactly as the built-in
|
|
18
|
+
* functions do.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Parses JSON text, reading an integer outside the safe range as a `bigint`.
|
|
22
|
+
*
|
|
23
|
+
* The common reply holds no such integer, and the built-in parser is far faster than any parser
|
|
24
|
+
* written in JavaScript. So the text is first tested for a run of 16 or more digits — the shortest
|
|
25
|
+
* run that can leave the safe range. Without one the built-in parser is exact and is used. A run
|
|
26
|
+
* inside a string literal costs nothing but a slower parse of that one reply.
|
|
27
|
+
*/
|
|
28
|
+
export function parseLossless(text) {
|
|
29
|
+
return LONG_INTEGER.test(text) ? new LosslessParser(text).parse() : JSON.parse(text);
|
|
30
|
+
}
|
|
31
|
+
const LONG_INTEGER = /\d{16,}/;
|
|
32
|
+
/**
|
|
33
|
+
* Serializes a value as JSON, writing a `bigint` as a JSON number.
|
|
34
|
+
*
|
|
35
|
+
* `undefined`, a function, and a symbol are omitted from an object and become `null` in an array,
|
|
36
|
+
* which is what `JSON.stringify` does. A value with a `toJSON` method is replaced by its result,
|
|
37
|
+
* also as `JSON.stringify` does.
|
|
38
|
+
*/
|
|
39
|
+
export function stringifyLossless(value) {
|
|
40
|
+
const out = [];
|
|
41
|
+
writeValue(value, out, 0);
|
|
42
|
+
return out.join('');
|
|
43
|
+
}
|
|
44
|
+
const MAX_DEPTH = 200;
|
|
45
|
+
function writeValue(value, out, depth) {
|
|
46
|
+
if (depth > MAX_DEPTH) {
|
|
47
|
+
throw new TypeError('Cannot serialize a value nested more than 200 levels deep.');
|
|
48
|
+
}
|
|
49
|
+
if (value === null) {
|
|
50
|
+
out.push('null');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
switch (typeof value) {
|
|
54
|
+
case 'bigint':
|
|
55
|
+
out.push(value.toString());
|
|
56
|
+
return;
|
|
57
|
+
case 'number':
|
|
58
|
+
out.push(Number.isFinite(value) ? String(value) : 'null');
|
|
59
|
+
return;
|
|
60
|
+
case 'boolean':
|
|
61
|
+
out.push(value ? 'true' : 'false');
|
|
62
|
+
return;
|
|
63
|
+
case 'string':
|
|
64
|
+
out.push(quote(value));
|
|
65
|
+
return;
|
|
66
|
+
case 'object':
|
|
67
|
+
break;
|
|
68
|
+
default:
|
|
69
|
+
out.push('null');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const object = value;
|
|
73
|
+
if (typeof object.toJSON === 'function') {
|
|
74
|
+
writeValue(object.toJSON(), out, depth + 1);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(value)) {
|
|
78
|
+
out.push('[');
|
|
79
|
+
for (let i = 0; i < value.length; i++) {
|
|
80
|
+
if (i > 0)
|
|
81
|
+
out.push(',');
|
|
82
|
+
const item = value[i];
|
|
83
|
+
if (isOmitted(item))
|
|
84
|
+
out.push('null');
|
|
85
|
+
else
|
|
86
|
+
writeValue(item, out, depth + 1);
|
|
87
|
+
}
|
|
88
|
+
out.push(']');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (value instanceof Map) {
|
|
92
|
+
writeEntries(value.entries(), out, depth);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
writeEntries(Object.entries(value).values(), out, depth);
|
|
96
|
+
}
|
|
97
|
+
function writeEntries(entries, out, depth) {
|
|
98
|
+
out.push('{');
|
|
99
|
+
let first = true;
|
|
100
|
+
for (const [key, entryValue] of entries) {
|
|
101
|
+
if (isOmitted(entryValue))
|
|
102
|
+
continue;
|
|
103
|
+
if (typeof key !== 'string')
|
|
104
|
+
continue;
|
|
105
|
+
if (!first)
|
|
106
|
+
out.push(',');
|
|
107
|
+
first = false;
|
|
108
|
+
out.push(quote(key), ':');
|
|
109
|
+
writeValue(entryValue, out, depth + 1);
|
|
110
|
+
}
|
|
111
|
+
out.push('}');
|
|
112
|
+
}
|
|
113
|
+
function isOmitted(value) {
|
|
114
|
+
return value === undefined || typeof value === 'function' || typeof value === 'symbol';
|
|
115
|
+
}
|
|
116
|
+
const ESCAPES = {
|
|
117
|
+
'"': '\\"',
|
|
118
|
+
'\\': '\\\\',
|
|
119
|
+
'\b': '\\b',
|
|
120
|
+
'\f': '\\f',
|
|
121
|
+
'\n': '\\n',
|
|
122
|
+
'\r': '\\r',
|
|
123
|
+
'\t': '\\t',
|
|
124
|
+
};
|
|
125
|
+
// eslint-disable-next-line no-control-regex -- JSON requires these characters to be escaped.
|
|
126
|
+
const NEEDS_ESCAPE = /["\\\u0000-\u001f\u007f-\u009f]/;
|
|
127
|
+
// eslint-disable-next-line no-control-regex -- JSON requires these characters to be escaped.
|
|
128
|
+
const ESCAPE_ALL = /["\\\u0000-\u001f\u007f-\u009f]/g;
|
|
129
|
+
function quote(value) {
|
|
130
|
+
if (!NEEDS_ESCAPE.test(value))
|
|
131
|
+
return `"${value}"`;
|
|
132
|
+
return `"${value.replace(ESCAPE_ALL, (character) => {
|
|
133
|
+
const escape = ESCAPES[character];
|
|
134
|
+
if (escape !== undefined)
|
|
135
|
+
return escape;
|
|
136
|
+
return `\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`;
|
|
137
|
+
})}"`;
|
|
138
|
+
}
|
|
139
|
+
const MIN_SAFE = BigInt(Number.MIN_SAFE_INTEGER);
|
|
140
|
+
const MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);
|
|
141
|
+
/** A recursive-descent JSON reader. It is used only for text that holds a long integer run. */
|
|
142
|
+
class LosslessParser {
|
|
143
|
+
text;
|
|
144
|
+
position = 0;
|
|
145
|
+
constructor(text) {
|
|
146
|
+
this.text = text;
|
|
147
|
+
}
|
|
148
|
+
parse() {
|
|
149
|
+
this.skipWhitespace();
|
|
150
|
+
const value = this.readValue(0);
|
|
151
|
+
this.skipWhitespace();
|
|
152
|
+
if (this.position < this.text.length) {
|
|
153
|
+
throw new SyntaxError(`Unexpected text after the JSON value at position ${String(this.position)}.`);
|
|
154
|
+
}
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
readValue(depth) {
|
|
158
|
+
if (depth > MAX_DEPTH) {
|
|
159
|
+
throw new SyntaxError('The JSON value is nested more than 200 levels deep.');
|
|
160
|
+
}
|
|
161
|
+
const character = this.text[this.position];
|
|
162
|
+
switch (character) {
|
|
163
|
+
case '{':
|
|
164
|
+
return this.readObject(depth);
|
|
165
|
+
case '[':
|
|
166
|
+
return this.readArray(depth);
|
|
167
|
+
case '"':
|
|
168
|
+
return this.readString();
|
|
169
|
+
case 't':
|
|
170
|
+
return this.readLiteral('true', true);
|
|
171
|
+
case 'f':
|
|
172
|
+
return this.readLiteral('false', false);
|
|
173
|
+
case 'n':
|
|
174
|
+
return this.readLiteral('null', null);
|
|
175
|
+
default:
|
|
176
|
+
return this.readNumber();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
readObject(depth) {
|
|
180
|
+
const object = {};
|
|
181
|
+
this.position++; // past '{'
|
|
182
|
+
this.skipWhitespace();
|
|
183
|
+
if (this.text[this.position] === '}') {
|
|
184
|
+
this.position++;
|
|
185
|
+
return object;
|
|
186
|
+
}
|
|
187
|
+
for (;;) {
|
|
188
|
+
this.skipWhitespace();
|
|
189
|
+
if (this.text[this.position] !== '"') {
|
|
190
|
+
throw new SyntaxError(`Expected a property name at position ${String(this.position)}.`);
|
|
191
|
+
}
|
|
192
|
+
const key = this.readString();
|
|
193
|
+
this.skipWhitespace();
|
|
194
|
+
this.expect(':');
|
|
195
|
+
this.skipWhitespace();
|
|
196
|
+
const value = this.readValue(depth + 1);
|
|
197
|
+
// A prototype-polluting key is stored as an own property rather than assigned through the
|
|
198
|
+
// prototype chain, so hostile JSON cannot reach Object.prototype.
|
|
199
|
+
Object.defineProperty(object, key, { value, writable: true, enumerable: true, configurable: true });
|
|
200
|
+
this.skipWhitespace();
|
|
201
|
+
if (this.text[this.position] === ',') {
|
|
202
|
+
this.position++;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
this.expect('}');
|
|
206
|
+
return object;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
readArray(depth) {
|
|
210
|
+
const array = [];
|
|
211
|
+
this.position++; // past '['
|
|
212
|
+
this.skipWhitespace();
|
|
213
|
+
if (this.text[this.position] === ']') {
|
|
214
|
+
this.position++;
|
|
215
|
+
return array;
|
|
216
|
+
}
|
|
217
|
+
for (;;) {
|
|
218
|
+
this.skipWhitespace();
|
|
219
|
+
array.push(this.readValue(depth + 1));
|
|
220
|
+
this.skipWhitespace();
|
|
221
|
+
if (this.text[this.position] === ',') {
|
|
222
|
+
this.position++;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
this.expect(']');
|
|
226
|
+
return array;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
readString() {
|
|
230
|
+
const start = this.position;
|
|
231
|
+
this.position++; // past the opening quote
|
|
232
|
+
// A string with no escape is the common case; slice it out whole.
|
|
233
|
+
let hasEscape = false;
|
|
234
|
+
while (this.position < this.text.length) {
|
|
235
|
+
const character = this.text[this.position];
|
|
236
|
+
if (character === '\\') {
|
|
237
|
+
hasEscape = true;
|
|
238
|
+
this.position += 2;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (character === '"') {
|
|
242
|
+
const raw = this.text.slice(start, this.position + 1);
|
|
243
|
+
this.position++;
|
|
244
|
+
return hasEscape ? JSON.parse(raw) : raw.slice(1, -1);
|
|
245
|
+
}
|
|
246
|
+
this.position++;
|
|
247
|
+
}
|
|
248
|
+
throw new SyntaxError(`Unterminated string starting at position ${String(start)}.`);
|
|
249
|
+
}
|
|
250
|
+
readNumber() {
|
|
251
|
+
const start = this.position;
|
|
252
|
+
if (this.text[this.position] === '-')
|
|
253
|
+
this.position++;
|
|
254
|
+
while (isDigit(this.text[this.position]))
|
|
255
|
+
this.position++;
|
|
256
|
+
let isInteger = true;
|
|
257
|
+
if (this.text[this.position] === '.') {
|
|
258
|
+
isInteger = false;
|
|
259
|
+
this.position++;
|
|
260
|
+
while (isDigit(this.text[this.position]))
|
|
261
|
+
this.position++;
|
|
262
|
+
}
|
|
263
|
+
const exponent = this.text[this.position];
|
|
264
|
+
if (exponent === 'e' || exponent === 'E') {
|
|
265
|
+
isInteger = false;
|
|
266
|
+
this.position++;
|
|
267
|
+
const sign = this.text[this.position];
|
|
268
|
+
if (sign === '+' || sign === '-')
|
|
269
|
+
this.position++;
|
|
270
|
+
while (isDigit(this.text[this.position]))
|
|
271
|
+
this.position++;
|
|
272
|
+
}
|
|
273
|
+
const raw = this.text.slice(start, this.position);
|
|
274
|
+
if (raw.length === 0 || raw === '-') {
|
|
275
|
+
throw new SyntaxError(`Expected a value at position ${String(start)}.`);
|
|
276
|
+
}
|
|
277
|
+
if (!isInteger)
|
|
278
|
+
return Number(raw);
|
|
279
|
+
const asNumber = Number(raw);
|
|
280
|
+
if (Number.isSafeInteger(asNumber))
|
|
281
|
+
return asNumber;
|
|
282
|
+
const asBigInt = BigInt(raw);
|
|
283
|
+
return asBigInt >= MIN_SAFE && asBigInt <= MAX_SAFE ? Number(asBigInt) : asBigInt;
|
|
284
|
+
}
|
|
285
|
+
readLiteral(literal, value) {
|
|
286
|
+
if (!this.text.startsWith(literal, this.position)) {
|
|
287
|
+
throw new SyntaxError(`Expected '${literal}' at position ${String(this.position)}.`);
|
|
288
|
+
}
|
|
289
|
+
this.position += literal.length;
|
|
290
|
+
return value;
|
|
291
|
+
}
|
|
292
|
+
expect(character) {
|
|
293
|
+
if (this.text[this.position] !== character) {
|
|
294
|
+
throw new SyntaxError(`Expected '${character}' at position ${String(this.position)}.`);
|
|
295
|
+
}
|
|
296
|
+
this.position++;
|
|
297
|
+
}
|
|
298
|
+
skipWhitespace() {
|
|
299
|
+
while (this.position < this.text.length) {
|
|
300
|
+
const character = this.text[this.position];
|
|
301
|
+
if (character === ' ' || character === '\n' || character === '\r' || character === '\t') {
|
|
302
|
+
this.position++;
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function isDigit(character) {
|
|
310
|
+
return character !== undefined && character >= '0' && character <= '9';
|
|
311
|
+
}
|
|
312
|
+
/** Reads a value that may have arrived as a number, a bigint, or a numeric string. */
|
|
313
|
+
export function asBigInt(value, fallback = 0n) {
|
|
314
|
+
switch (typeof value) {
|
|
315
|
+
case 'bigint':
|
|
316
|
+
return value;
|
|
317
|
+
case 'number':
|
|
318
|
+
return Number.isFinite(value) ? BigInt(Math.trunc(value)) : fallback;
|
|
319
|
+
case 'string':
|
|
320
|
+
try {
|
|
321
|
+
return BigInt(value);
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
return fallback;
|
|
325
|
+
}
|
|
326
|
+
default:
|
|
327
|
+
return fallback;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/** Reads a value that may have arrived as a number or a bigint, as a `number`. */
|
|
331
|
+
export function asNumber(value, fallback = 0) {
|
|
332
|
+
switch (typeof value) {
|
|
333
|
+
case 'number':
|
|
334
|
+
return Number.isFinite(value) ? value : fallback;
|
|
335
|
+
case 'bigint':
|
|
336
|
+
return Number(value);
|
|
337
|
+
case 'string': {
|
|
338
|
+
const parsed = Number(value);
|
|
339
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
340
|
+
}
|
|
341
|
+
default:
|
|
342
|
+
return fallback;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=json.js.map
|
package/dist/json.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* A CamusDB ObjectId: the 12-byte identifier an `id` column holds, written as 24 lowercase
|
|
9
|
+
* hexadecimal characters.
|
|
10
|
+
*
|
|
11
|
+
* The layout mirrors the server's `CamusObjectIdValue` exactly, so an id this class generates is
|
|
12
|
+
* indistinguishable from one the server generates: a 4-byte second-resolution timestamp, a 3-byte
|
|
13
|
+
* machine identifier, a 2-byte process identifier, and a 3-byte counter.
|
|
14
|
+
*/
|
|
15
|
+
export declare class CamusObjectId {
|
|
16
|
+
readonly a: number;
|
|
17
|
+
readonly b: number;
|
|
18
|
+
readonly c: number;
|
|
19
|
+
constructor(a: number, b: number, c: number);
|
|
20
|
+
/** True when every component is zero — the value `default(CamusObjectIdValue)` holds. */
|
|
21
|
+
isNull(): boolean;
|
|
22
|
+
/** The 12 bytes, in the server's little-endian-per-component order. */
|
|
23
|
+
toBytes(): Uint8Array;
|
|
24
|
+
/** The 24 lowercase hexadecimal characters. */
|
|
25
|
+
toString(): string;
|
|
26
|
+
/** `toString`, so `JSON.stringify` renders an id the way the wire does. */
|
|
27
|
+
toJSON(): string;
|
|
28
|
+
/** Orders two ids the way the server does: by unsigned component, most significant first. */
|
|
29
|
+
compareTo(other: CamusObjectId): number;
|
|
30
|
+
/** True when both ids name the same value. */
|
|
31
|
+
equals(other: CamusObjectId): boolean;
|
|
32
|
+
/** Parses 24 hexadecimal characters. Throws `TypeError` for anything else. */
|
|
33
|
+
static parse(value: string): CamusObjectId;
|
|
34
|
+
/** A new id for the current instant. */
|
|
35
|
+
static generate(): CamusObjectId;
|
|
36
|
+
/** A new id for the current instant, as its 24-character string. */
|
|
37
|
+
static generateAsString(): string;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=object-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-id.d.ts","sourceRoot":"","sources":["../src/object-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;gBAEP,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAM3C,yFAAyF;IACzF,MAAM,IAAI,OAAO;IAIjB,uEAAuE;IACvE,OAAO,IAAI,UAAU;IASrB,+CAA+C;IAC/C,QAAQ,IAAI,MAAM;IAIlB,2EAA2E;IAC3E,MAAM,IAAI,MAAM;IAIhB,6FAA6F;IAC7F,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAUvC,8CAA8C;IAC9C,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAIrC,8EAA8E;IAC9E,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa;IAY1C,wCAAwC;IACxC,MAAM,CAAC,QAAQ,IAAI,aAAa;IAWhC,oEAAoE;IACpE,MAAM,CAAC,gBAAgB,IAAI,MAAM;CAGlC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
import { randomInt } from 'node:crypto';
|
|
8
|
+
/**
|
|
9
|
+
* A CamusDB ObjectId: the 12-byte identifier an `id` column holds, written as 24 lowercase
|
|
10
|
+
* hexadecimal characters.
|
|
11
|
+
*
|
|
12
|
+
* The layout mirrors the server's `CamusObjectIdValue` exactly, so an id this class generates is
|
|
13
|
+
* indistinguishable from one the server generates: a 4-byte second-resolution timestamp, a 3-byte
|
|
14
|
+
* machine identifier, a 2-byte process identifier, and a 3-byte counter.
|
|
15
|
+
*/
|
|
16
|
+
export class CamusObjectId {
|
|
17
|
+
a;
|
|
18
|
+
b;
|
|
19
|
+
c;
|
|
20
|
+
constructor(a, b, c) {
|
|
21
|
+
this.a = a | 0;
|
|
22
|
+
this.b = b | 0;
|
|
23
|
+
this.c = c | 0;
|
|
24
|
+
}
|
|
25
|
+
/** True when every component is zero — the value `default(CamusObjectIdValue)` holds. */
|
|
26
|
+
isNull() {
|
|
27
|
+
return this.a === 0 && this.b === 0 && this.c === 0;
|
|
28
|
+
}
|
|
29
|
+
/** The 12 bytes, in the server's little-endian-per-component order. */
|
|
30
|
+
toBytes() {
|
|
31
|
+
const bytes = new Uint8Array(12);
|
|
32
|
+
const view = new DataView(bytes.buffer);
|
|
33
|
+
view.setInt32(0, this.a, true);
|
|
34
|
+
view.setInt32(4, this.b, true);
|
|
35
|
+
view.setInt32(8, this.c, true);
|
|
36
|
+
return bytes;
|
|
37
|
+
}
|
|
38
|
+
/** The 24 lowercase hexadecimal characters. */
|
|
39
|
+
toString() {
|
|
40
|
+
return hex8(this.a) + hex8(this.b) + hex8(this.c);
|
|
41
|
+
}
|
|
42
|
+
/** `toString`, so `JSON.stringify` renders an id the way the wire does. */
|
|
43
|
+
toJSON() {
|
|
44
|
+
return this.toString();
|
|
45
|
+
}
|
|
46
|
+
/** Orders two ids the way the server does: by unsigned component, most significant first. */
|
|
47
|
+
compareTo(other) {
|
|
48
|
+
const a = compareUnsigned(this.a, other.a);
|
|
49
|
+
if (a !== 0)
|
|
50
|
+
return a;
|
|
51
|
+
const b = compareUnsigned(this.b, other.b);
|
|
52
|
+
if (b !== 0)
|
|
53
|
+
return b;
|
|
54
|
+
return compareUnsigned(this.c, other.c);
|
|
55
|
+
}
|
|
56
|
+
/** True when both ids name the same value. */
|
|
57
|
+
equals(other) {
|
|
58
|
+
return this.a === other.a && this.b === other.b && this.c === other.c;
|
|
59
|
+
}
|
|
60
|
+
/** Parses 24 hexadecimal characters. Throws `TypeError` for anything else. */
|
|
61
|
+
static parse(value) {
|
|
62
|
+
if (value.length !== 24 || !/^[0-9a-fA-F]{24}$/.test(value)) {
|
|
63
|
+
throw new TypeError('An ObjectId is 24 hexadecimal digits.');
|
|
64
|
+
}
|
|
65
|
+
return new CamusObjectId(Number.parseInt(value.slice(0, 8), 16) | 0, Number.parseInt(value.slice(8, 16), 16) | 0, Number.parseInt(value.slice(16, 24), 16) | 0);
|
|
66
|
+
}
|
|
67
|
+
/** A new id for the current instant. */
|
|
68
|
+
static generate() {
|
|
69
|
+
const timestamp = Math.floor(Date.now() / 1000) | 0;
|
|
70
|
+
const increment = nextIncrement();
|
|
71
|
+
const a = timestamp;
|
|
72
|
+
const b = (machine << 8) | ((processId >> 8) & 0xff);
|
|
73
|
+
const c = (processId << 24) | increment;
|
|
74
|
+
return new CamusObjectId(a, b | 0, c | 0);
|
|
75
|
+
}
|
|
76
|
+
/** A new id for the current instant, as its 24-character string. */
|
|
77
|
+
static generateAsString() {
|
|
78
|
+
return CamusObjectId.generate().toString();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// One machine identity and one process identity per process, exactly as the server's generator
|
|
82
|
+
// holds them. Both are random rather than derived from the host: an id must not disclose where it
|
|
83
|
+
// was minted, and a container has no stable machine name to derive one from anyway.
|
|
84
|
+
const machine = randomInt(0x01000000);
|
|
85
|
+
const processId = randomInt(0x00010000);
|
|
86
|
+
let increment = randomInt(0x7fffffff);
|
|
87
|
+
function nextIncrement() {
|
|
88
|
+
increment = (increment + 1) | 0;
|
|
89
|
+
return increment & 0x00ffffff;
|
|
90
|
+
}
|
|
91
|
+
function hex8(value) {
|
|
92
|
+
return (value >>> 0).toString(16).padStart(8, '0');
|
|
93
|
+
}
|
|
94
|
+
function compareUnsigned(left, right) {
|
|
95
|
+
const a = left >>> 0;
|
|
96
|
+
const b = right >>> 0;
|
|
97
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=object-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-id.js","sourceRoot":"","sources":["../src/object-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The SQL isolation level a transaction runs at. It is independent of `CamusLocking`.
|
|
9
|
+
*
|
|
10
|
+
* The member values are the exact strings the server accepts in the `isolationLevel` wire field.
|
|
11
|
+
*/
|
|
12
|
+
export declare const CamusIsolationLevel: {
|
|
13
|
+
/** Lock-free reads of the latest committed value. No repeatable-read or phantom protection. */
|
|
14
|
+
readonly ReadCommitted: "ReadCommitted";
|
|
15
|
+
/**
|
|
16
|
+
* The strongest level. The outcome is equivalent to some serial order. A read-write transaction
|
|
17
|
+
* takes point and range locks; a read-only one is a lock-free consistent snapshot.
|
|
18
|
+
*/
|
|
19
|
+
readonly Serializable: "Serializable";
|
|
20
|
+
};
|
|
21
|
+
export type CamusIsolationLevel = (typeof CamusIsolationLevel)[keyof typeof CamusIsolationLevel];
|
|
22
|
+
/** Whether a transaction may write. */
|
|
23
|
+
export declare const CamusTransactionMode: {
|
|
24
|
+
/** The transaction may read and write. This is the default. */
|
|
25
|
+
readonly ReadWrite: "ReadWrite";
|
|
26
|
+
/**
|
|
27
|
+
* The transaction only reads. Together with `Serializable` this is a lock-free consistent
|
|
28
|
+
* snapshot, pinned to the instant it began and resumable across several requests.
|
|
29
|
+
*/
|
|
30
|
+
readonly ReadOnly: "ReadOnly";
|
|
31
|
+
};
|
|
32
|
+
export type CamusTransactionMode = (typeof CamusTransactionMode)[keyof typeof CamusTransactionMode];
|
|
33
|
+
/** How a transaction resolves a conflict. It is independent of `CamusIsolationLevel`. */
|
|
34
|
+
export declare const CamusLocking: {
|
|
35
|
+
/**
|
|
36
|
+
* Take locks up front. A conflicting transaction blocks, or deadlock avoidance aborts it, at the
|
|
37
|
+
* moment it asks for a lock. This is the default, and what almost every caller uses.
|
|
38
|
+
*/
|
|
39
|
+
readonly Pessimistic: "Pessimistic";
|
|
40
|
+
/**
|
|
41
|
+
* Take no explicit locks. Stage the writes, record what was read, and detect write-write and
|
|
42
|
+
* read-write conflicts only at commit. A losing transaction fails its commit and must be retried.
|
|
43
|
+
* Good for a read-mostly workload with little contention. It does not protect against phantoms;
|
|
44
|
+
* use `Serializable` with pessimistic locking when you need that.
|
|
45
|
+
*/
|
|
46
|
+
readonly Optimistic: "Optimistic";
|
|
47
|
+
};
|
|
48
|
+
export type CamusLocking = (typeof CamusLocking)[keyof typeof CamusLocking];
|
|
49
|
+
/**
|
|
50
|
+
* The concurrency knobs for one transaction, or for the short transaction the server begins for a
|
|
51
|
+
* single autocommit statement.
|
|
52
|
+
*
|
|
53
|
+
* Every knob is optional. A knob left unset falls back to the client's default options, then to
|
|
54
|
+
* the connection-string defaults, then to the server default.
|
|
55
|
+
*/
|
|
56
|
+
export interface CamusTransactionOptions {
|
|
57
|
+
readonly isolationLevel?: CamusIsolationLevel | undefined;
|
|
58
|
+
readonly mode?: CamusTransactionMode | undefined;
|
|
59
|
+
readonly locking?: CamusLocking | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* The exact SQL text of the statement whose learned route decides where this transaction starts.
|
|
62
|
+
*
|
|
63
|
+
* It matters only with learned routing on. Without it, the transaction's first statement chooses
|
|
64
|
+
* the endpoint; with it, `BEGIN` is sent at once, to the endpoint that statement's route names.
|
|
65
|
+
* Set it when the transaction's hot statement is not its first one.
|
|
66
|
+
*/
|
|
67
|
+
readonly affinity?: string | undefined;
|
|
68
|
+
}
|
|
69
|
+
/** No knob set: every one deferred to a lower level of defaults. */
|
|
70
|
+
export declare const DEFAULT_TRANSACTION_OPTIONS: CamusTransactionOptions;
|
|
71
|
+
/** Optimistic locking, with isolation and mode left to the defaults. */
|
|
72
|
+
export declare const OPTIMISTIC_TRANSACTION_OPTIONS: CamusTransactionOptions;
|
|
73
|
+
/** A lock-free consistent snapshot: serializable and read-only. */
|
|
74
|
+
export declare const SNAPSHOT_TRANSACTION_OPTIONS: CamusTransactionOptions;
|
|
75
|
+
/** Fills every knob this object left unset from `fallback`. */
|
|
76
|
+
export declare function withDefaults(options: CamusTransactionOptions, fallback: CamusTransactionOptions | undefined): CamusTransactionOptions;
|
|
77
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;IAC9B,+FAA+F;;IAG/F;;;OAGG;;CAEK,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjG,uCAAuC;AACvC,eAAO,MAAM,oBAAoB;IAC/B,+DAA+D;;IAG/D;;;OAGG;;CAEK,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEpG,yFAAyF;AACzF,eAAO,MAAM,YAAY;IACvB;;;OAGG;;IAGH;;;;;OAKG;;CAEK,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAE5C;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,oEAAoE;AACpE,eAAO,MAAM,2BAA2B,EAAE,uBAA2C,CAAC;AAEtF,wEAAwE;AACxE,eAAO,MAAM,8BAA8B,EAAE,uBAE3C,CAAC;AAEH,mEAAmE;AACnE,eAAO,MAAM,4BAA4B,EAAE,uBAGzC,CAAC;AAEH,+DAA+D;AAC/D,wBAAgB,YAAY,CAC1B,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,GAC5C,uBAAuB,CASzB"}
|
package/dist/options.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The SQL isolation level a transaction runs at. It is independent of `CamusLocking`.
|
|
9
|
+
*
|
|
10
|
+
* The member values are the exact strings the server accepts in the `isolationLevel` wire field.
|
|
11
|
+
*/
|
|
12
|
+
export const CamusIsolationLevel = {
|
|
13
|
+
/** Lock-free reads of the latest committed value. No repeatable-read or phantom protection. */
|
|
14
|
+
ReadCommitted: 'ReadCommitted',
|
|
15
|
+
/**
|
|
16
|
+
* The strongest level. The outcome is equivalent to some serial order. A read-write transaction
|
|
17
|
+
* takes point and range locks; a read-only one is a lock-free consistent snapshot.
|
|
18
|
+
*/
|
|
19
|
+
Serializable: 'Serializable',
|
|
20
|
+
};
|
|
21
|
+
/** Whether a transaction may write. */
|
|
22
|
+
export const CamusTransactionMode = {
|
|
23
|
+
/** The transaction may read and write. This is the default. */
|
|
24
|
+
ReadWrite: 'ReadWrite',
|
|
25
|
+
/**
|
|
26
|
+
* The transaction only reads. Together with `Serializable` this is a lock-free consistent
|
|
27
|
+
* snapshot, pinned to the instant it began and resumable across several requests.
|
|
28
|
+
*/
|
|
29
|
+
ReadOnly: 'ReadOnly',
|
|
30
|
+
};
|
|
31
|
+
/** How a transaction resolves a conflict. It is independent of `CamusIsolationLevel`. */
|
|
32
|
+
export const CamusLocking = {
|
|
33
|
+
/**
|
|
34
|
+
* Take locks up front. A conflicting transaction blocks, or deadlock avoidance aborts it, at the
|
|
35
|
+
* moment it asks for a lock. This is the default, and what almost every caller uses.
|
|
36
|
+
*/
|
|
37
|
+
Pessimistic: 'Pessimistic',
|
|
38
|
+
/**
|
|
39
|
+
* Take no explicit locks. Stage the writes, record what was read, and detect write-write and
|
|
40
|
+
* read-write conflicts only at commit. A losing transaction fails its commit and must be retried.
|
|
41
|
+
* Good for a read-mostly workload with little contention. It does not protect against phantoms;
|
|
42
|
+
* use `Serializable` with pessimistic locking when you need that.
|
|
43
|
+
*/
|
|
44
|
+
Optimistic: 'Optimistic',
|
|
45
|
+
};
|
|
46
|
+
/** No knob set: every one deferred to a lower level of defaults. */
|
|
47
|
+
export const DEFAULT_TRANSACTION_OPTIONS = Object.freeze({});
|
|
48
|
+
/** Optimistic locking, with isolation and mode left to the defaults. */
|
|
49
|
+
export const OPTIMISTIC_TRANSACTION_OPTIONS = Object.freeze({
|
|
50
|
+
locking: CamusLocking.Optimistic,
|
|
51
|
+
});
|
|
52
|
+
/** A lock-free consistent snapshot: serializable and read-only. */
|
|
53
|
+
export const SNAPSHOT_TRANSACTION_OPTIONS = Object.freeze({
|
|
54
|
+
isolationLevel: CamusIsolationLevel.Serializable,
|
|
55
|
+
mode: CamusTransactionMode.ReadOnly,
|
|
56
|
+
});
|
|
57
|
+
/** Fills every knob this object left unset from `fallback`. */
|
|
58
|
+
export function withDefaults(options, fallback) {
|
|
59
|
+
if (fallback === undefined)
|
|
60
|
+
return options;
|
|
61
|
+
return {
|
|
62
|
+
isolationLevel: options.isolationLevel ?? fallback.isolationLevel,
|
|
63
|
+
mode: options.mode ?? fallback.mode,
|
|
64
|
+
locking: options.locking ?? fallback.locking,
|
|
65
|
+
affinity: options.affinity ?? fallback.affinity,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=options.js.map
|