@evolu/common 8.15.1 → 8.17.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/dist/src/Console.d.ts +24 -46
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +34 -29
- package/dist/src/Crypto.d.ts +21 -3
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +18 -2
- package/dist/src/Error.d.ts +10 -6
- package/dist/src/Error.d.ts.map +1 -1
- package/dist/src/Error.js +52 -20
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +16 -12
- package/dist/src/Task.d.ts +3 -1
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +15 -13
- package/dist/src/Worker.d.ts +3 -0
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +6 -1
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +7 -7
- package/dist/src/local-first/Owner.d.ts +20 -8
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Owner.js +23 -10
- package/dist/src/local-first/Schema.d.ts +1 -1
- package/dist/src/local-first/Shared.d.ts +55 -39
- package/dist/src/local-first/Shared.d.ts.map +1 -1
- package/dist/src/local-first/Shared.js +264 -318
- package/package.json +1 -1
- package/src/Console.test.ts +75 -247
- package/src/Console.ts +68 -110
- package/src/Crypto.ts +23 -3
- package/src/Error.test.ts +85 -0
- package/src/Error.ts +48 -22
- package/src/Sqlite.ts +19 -11
- package/src/Task.test.ts +46 -0
- package/src/Task.ts +17 -13
- package/src/Worker.ts +6 -1
- package/src/local-first/Db.ts +12 -8
- package/src/local-first/Owner.test.ts +52 -1
- package/src/local-first/Owner.ts +26 -7
- package/src/local-first/Shared.test.ts +414 -39
- package/src/local-first/Shared.ts +386 -438
package/dist/src/Console.d.ts
CHANGED
|
@@ -43,9 +43,7 @@ import { type Millis, type TimeDep } from "./Time.ts";
|
|
|
43
43
|
* createConsole,
|
|
44
44
|
* createConsoleArrayOutput,
|
|
45
45
|
* Data,
|
|
46
|
-
* type Console,
|
|
47
46
|
* type ConsoleEntry,
|
|
48
|
-
* type ConsoleLevel,
|
|
49
47
|
* } from "@evolu/common";
|
|
50
48
|
*
|
|
51
49
|
* const entries: Array<ConsoleEntry> = [];
|
|
@@ -64,16 +62,11 @@ import { type Millis, type TimeDep } from "./Time.ts";
|
|
|
64
62
|
* assertType(Data, args);
|
|
65
63
|
* assertEqual(args, ["Creating instance", { config: { port: 4000 } }]);
|
|
66
64
|
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* )
|
|
71
|
-
*
|
|
72
|
-
* for (const child of console.children) setLevelRecursive(child, level);
|
|
73
|
-
* };
|
|
74
|
-
* setLevelRecursive(root, "warn");
|
|
75
|
-
* assertEqual(root.getLevel(), "warn");
|
|
76
|
-
* assertEqual(relay.getLevel(), "warn");
|
|
65
|
+
* // Children without their own level follow their parent.
|
|
66
|
+
* const db = root.child("db");
|
|
67
|
+
* root.setLevel("warn");
|
|
68
|
+
* assertEqual(db.getLevel(), "warn");
|
|
69
|
+
* assertEqual(relay.getLevel(), "silent");
|
|
77
70
|
* ```
|
|
78
71
|
*
|
|
79
72
|
* Console intentionally does not use {@link Task}. Logging must be as fast as
|
|
@@ -86,15 +79,12 @@ import { type Millis, type TimeDep } from "./Time.ts";
|
|
|
86
79
|
* @see {@link createConsole}
|
|
87
80
|
*/
|
|
88
81
|
export interface Console {
|
|
89
|
-
/** Name of this console. Empty for root. */
|
|
90
|
-
readonly name: string;
|
|
91
|
-
/** Child consoles created via {@link Console.child}. */
|
|
92
|
-
readonly children: ReadonlySet<Console>;
|
|
93
82
|
/**
|
|
94
83
|
* Returns the effective log level.
|
|
95
84
|
*
|
|
96
85
|
* If this console has its own level set via {@link Console.setLevel}, returns
|
|
97
|
-
* that. Otherwise returns
|
|
86
|
+
* that. Otherwise returns its parent's current level, or
|
|
87
|
+
* {@link ConsoleConfig.level} for a root console.
|
|
98
88
|
*/
|
|
99
89
|
readonly getLevel: () => ConsoleLevel;
|
|
100
90
|
/**
|
|
@@ -109,11 +99,11 @@ export interface Console {
|
|
|
109
99
|
/**
|
|
110
100
|
* Creates a child console with the given name added to the path.
|
|
111
101
|
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
102
|
+
* A child without its own level follows its parent's level, including later
|
|
103
|
+
* changes.
|
|
114
104
|
*/
|
|
115
105
|
readonly child: (name: string) => Console;
|
|
116
|
-
/**
|
|
106
|
+
/** Most detailed execution flow, such as every SQL query. */
|
|
117
107
|
readonly trace: (...args: ReadonlyArray<unknown>) => void;
|
|
118
108
|
/** Development diagnostics. */
|
|
119
109
|
readonly debug: (...args: ReadonlyArray<unknown>) => void;
|
|
@@ -125,24 +115,10 @@ export interface Console {
|
|
|
125
115
|
readonly warn: (...args: ReadonlyArray<unknown>) => void;
|
|
126
116
|
/** Failures requiring immediate attention. */
|
|
127
117
|
readonly error: (...args: ReadonlyArray<unknown>) => void;
|
|
128
|
-
/** Displays an object with expandable properties. Level: debug. */
|
|
129
|
-
readonly dir: (item: unknown) => void;
|
|
130
|
-
/** Displays tabular data. Level: debug. */
|
|
131
|
-
readonly table: (data: unknown) => void;
|
|
132
|
-
/** Starts a timer with the given label. Level: debug. */
|
|
133
|
-
readonly time: (label: string) => void;
|
|
134
|
-
/** Logs elapsed time for a timer. Level: debug. */
|
|
135
|
-
readonly timeLog: (label: string, ...args: ReadonlyArray<unknown>) => void;
|
|
136
|
-
/** Ends a timer and logs elapsed time. Level: debug. */
|
|
137
|
-
readonly timeEnd: (label: string) => void;
|
|
138
|
-
/** Increments and logs a counter. Level: debug. */
|
|
139
|
-
readonly count: (label?: string) => void;
|
|
140
|
-
/** Resets a counter. Level: debug. */
|
|
141
|
-
readonly countReset: (label?: string) => void;
|
|
142
118
|
/**
|
|
143
|
-
* Writes a pre-built {@link ConsoleEntry}
|
|
144
|
-
* level
|
|
145
|
-
*
|
|
119
|
+
* Writes a pre-built {@link ConsoleEntry} to the output if this console's
|
|
120
|
+
* level allows its method. Used to replay entries from another context, such
|
|
121
|
+
* as a worker, that filtered them by its own level.
|
|
146
122
|
*/
|
|
147
123
|
readonly write: (entry: ConsoleEntry) => void;
|
|
148
124
|
}
|
|
@@ -160,8 +136,8 @@ export interface ConsoleDep {
|
|
|
160
136
|
* Setting a level enables all logs at that level and above (ordered by
|
|
161
137
|
* severity):
|
|
162
138
|
*
|
|
163
|
-
* - `"trace"` —
|
|
164
|
-
* - `"debug"` — Development diagnostics
|
|
139
|
+
* - `"trace"` — Most detailed execution flow, such as every SQL query
|
|
140
|
+
* - `"debug"` — Development diagnostics
|
|
165
141
|
* - `"log"` — General-purpose messages
|
|
166
142
|
* - `"info"` — Operational milestones (startup, shutdown)
|
|
167
143
|
* - `"warn"` — Recoverable issues that may need attention
|
|
@@ -195,7 +171,7 @@ export interface ConsoleEntry {
|
|
|
195
171
|
*
|
|
196
172
|
* @group Core
|
|
197
173
|
*/
|
|
198
|
-
export type ConsoleMethod = "trace" | "debug" | "log" | "info" | "warn" | "error"
|
|
174
|
+
export type ConsoleMethod = "trace" | "debug" | "log" | "info" | "warn" | "error";
|
|
199
175
|
/**
|
|
200
176
|
* Output destination for {@link Console}.
|
|
201
177
|
*
|
|
@@ -225,8 +201,6 @@ export type ConsoleFormatter = (entry: ConsoleEntry) => ReadonlyArray<unknown>;
|
|
|
225
201
|
* @group Core
|
|
226
202
|
*/
|
|
227
203
|
export interface ConsoleConfig {
|
|
228
|
-
/** Name of this console. Defaults to empty string. */
|
|
229
|
-
readonly name?: string;
|
|
230
204
|
/** Initial log level. Defaults to `"log"`. */
|
|
231
205
|
readonly level?: ConsoleLevel;
|
|
232
206
|
/**
|
|
@@ -261,7 +235,8 @@ export interface ConsoleFormatterConfig {
|
|
|
261
235
|
*/
|
|
262
236
|
readonly timestampFormat?: ConsoleEntryTimestampFormat;
|
|
263
237
|
/**
|
|
264
|
-
* Start time for relative timestamps. Defaults to first entry
|
|
238
|
+
* Start time for relative timestamps. Defaults to the time the first entry is
|
|
239
|
+
* formatted.
|
|
265
240
|
*
|
|
266
241
|
* Pass a {@link Millis} value to use a custom start time, useful when multiple
|
|
267
242
|
* consoles should share the same relative timeline.
|
|
@@ -349,7 +324,7 @@ export interface TestConsoleDep {
|
|
|
349
324
|
*
|
|
350
325
|
* @group Core
|
|
351
326
|
*/
|
|
352
|
-
export declare const createConsole: ({
|
|
327
|
+
export declare const createConsole: ({ level, output, path, formatter, }?: ConsoleConfig) => Console;
|
|
353
328
|
/**
|
|
354
329
|
* Creates a {@link ConsoleOutput} that writes to `globalThis.console`.
|
|
355
330
|
*
|
|
@@ -357,6 +332,9 @@ export declare const createConsole: ({ name, level, output, path, formatter, }?:
|
|
|
357
332
|
* Use {@link createConsoleFormatter} with {@link ConsoleConfig.formatter} for
|
|
358
333
|
* timestamps and path prefixes.
|
|
359
334
|
*
|
|
335
|
+
* Trace entries are written with native `console.debug`, because native
|
|
336
|
+
* `console.trace` prints a stack trace with every call.
|
|
337
|
+
*
|
|
360
338
|
* ### Example
|
|
361
339
|
*
|
|
362
340
|
* ```ts
|
|
@@ -503,8 +481,8 @@ export declare const createMultiOutput: (outputs: ReadonlyArray<ConsoleOutput>)
|
|
|
503
481
|
/**
|
|
504
482
|
* Creates a {@link TestConsole} that captures all output for testing.
|
|
505
483
|
*
|
|
506
|
-
*
|
|
507
|
-
*
|
|
484
|
+
* Captures entries in memory and defaults to the `"trace"` level, so tests see
|
|
485
|
+
* every entry.
|
|
508
486
|
*
|
|
509
487
|
* ### Example
|
|
510
488
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Console.d.ts","sourceRoot":"","sources":["../../src/Console.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Console.d.ts","sourceRoot":"","sources":["../../src/Console.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Console.js
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { objectFrom } from "./Object.js";
|
|
7
6
|
import { createStore } from "./Store.js";
|
|
8
7
|
import { createTime, formatMillisAsClockTime, formatMillisAsDuration, } from "./Time.js";
|
|
9
8
|
const levelOrder = {
|
|
@@ -20,39 +19,41 @@ const levelOrder = {
|
|
|
20
19
|
*
|
|
21
20
|
* @group Core
|
|
22
21
|
*/
|
|
23
|
-
export const createConsole = ({
|
|
24
|
-
|
|
22
|
+
export const createConsole = ({ level = "log", output = createNativeConsoleOutput(), path = [], formatter, } = {}) => createConsoleWithInheritedLevel({
|
|
23
|
+
getInheritedLevel: () => level,
|
|
24
|
+
output,
|
|
25
|
+
path,
|
|
26
|
+
formatter,
|
|
27
|
+
});
|
|
28
|
+
const createConsoleWithInheritedLevel = ({ getInheritedLevel, output, path, formatter, }) => {
|
|
25
29
|
let ownLevel = null;
|
|
26
|
-
const getLevel = () => ownLevel ??
|
|
27
|
-
const
|
|
28
|
-
|
|
30
|
+
const getLevel = () => ownLevel ?? getInheritedLevel();
|
|
31
|
+
const isEnabled = (method) => levelOrder[method] >= levelOrder[getLevel()];
|
|
32
|
+
const createMethod = (method) => (...args) => {
|
|
33
|
+
if (isEnabled(method))
|
|
29
34
|
output.write({ method, path, args }, formatter);
|
|
30
35
|
};
|
|
31
|
-
const levelMethod = (method) => createMethod(method, method, formatter);
|
|
32
|
-
const debugMethod = (method) => createMethod(method, "debug");
|
|
33
36
|
return {
|
|
34
|
-
name,
|
|
35
|
-
children: childrenSet,
|
|
36
37
|
getLevel,
|
|
37
38
|
setLevel: (level) => {
|
|
38
39
|
ownLevel = level;
|
|
39
40
|
},
|
|
40
41
|
hasOwnLevel: () => ownLevel !== null,
|
|
41
|
-
child: (name) => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
...objectFrom(["dir", "table", "time", "timeLog", "timeEnd", "count", "countReset"], debugMethod),
|
|
42
|
+
child: (name) => createConsoleWithInheritedLevel({
|
|
43
|
+
getInheritedLevel: getLevel,
|
|
44
|
+
output,
|
|
45
|
+
path: [...path, name],
|
|
46
|
+
formatter,
|
|
47
|
+
}),
|
|
48
|
+
trace: createMethod("trace"),
|
|
49
|
+
debug: createMethod("debug"),
|
|
50
|
+
log: createMethod("log"),
|
|
51
|
+
info: createMethod("info"),
|
|
52
|
+
warn: createMethod("warn"),
|
|
53
|
+
error: createMethod("error"),
|
|
54
54
|
write: (entry) => {
|
|
55
|
-
|
|
55
|
+
if (isEnabled(entry.method))
|
|
56
|
+
output.write(entry, formatter);
|
|
56
57
|
},
|
|
57
58
|
};
|
|
58
59
|
};
|
|
@@ -63,6 +64,9 @@ export const createConsole = ({ name = "", level = "log", output = createNativeC
|
|
|
63
64
|
* Use {@link createConsoleFormatter} with {@link ConsoleConfig.formatter} for
|
|
64
65
|
* timestamps and path prefixes.
|
|
65
66
|
*
|
|
67
|
+
* Trace entries are written with native `console.debug`, because native
|
|
68
|
+
* `console.trace` prints a stack trace with every call.
|
|
69
|
+
*
|
|
66
70
|
* ### Example
|
|
67
71
|
*
|
|
68
72
|
* ```ts
|
|
@@ -83,8 +87,7 @@ export const createNativeConsoleOutput = () => ({
|
|
|
83
87
|
write: (entry, formatter) => {
|
|
84
88
|
const args = formatter ? formatter(entry) : entry.args;
|
|
85
89
|
// oxlint-disable-next-line evolu/no-unnecessary-global-this -- Write to the global object console even if a realm lexical binding shadows it.
|
|
86
|
-
|
|
87
|
-
nativeConsole[entry.method](...args);
|
|
90
|
+
globalThis.console[entry.method === "trace" ? "debug" : entry.method](...args);
|
|
88
91
|
},
|
|
89
92
|
});
|
|
90
93
|
/**
|
|
@@ -150,7 +153,9 @@ export const createConsoleFormatter = ({ time = createTime() } = {}) => (config
|
|
|
150
153
|
timestamp = "";
|
|
151
154
|
break;
|
|
152
155
|
case "relative":
|
|
153
|
-
|
|
156
|
+
// A clock set back, or a startTime ahead of now, must not print a
|
|
157
|
+
// negative duration.
|
|
158
|
+
timestamp = `+${formatMillisAsDuration(Math.max(0, now - startTime))}`;
|
|
154
159
|
break;
|
|
155
160
|
case "absolute":
|
|
156
161
|
timestamp = formatMillisAsClockTime(now);
|
|
@@ -256,8 +261,8 @@ export const createMultiOutput = (outputs) => ({
|
|
|
256
261
|
/**
|
|
257
262
|
* Creates a {@link TestConsole} that captures all output for testing.
|
|
258
263
|
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
264
|
+
* Captures entries in memory and defaults to the `"trace"` level, so tests see
|
|
265
|
+
* every entry.
|
|
261
266
|
*
|
|
262
267
|
* ### Example
|
|
263
268
|
*
|
package/dist/src/Crypto.d.ts
CHANGED
|
@@ -84,6 +84,13 @@ type Entropy = typeof Entropy.Output;
|
|
|
84
84
|
*/
|
|
85
85
|
export declare const Entropy16: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length16", import("./Type.ts").LengthError<16>>;
|
|
86
86
|
export type Entropy16 = typeof Entropy16.Output;
|
|
87
|
+
/**
|
|
88
|
+
* Cryptographic entropy of exactly 20 bytes.
|
|
89
|
+
*
|
|
90
|
+
* @group Random bytes
|
|
91
|
+
*/
|
|
92
|
+
export declare const Entropy20: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length20", import("./Type.ts").LengthError<20>>;
|
|
93
|
+
export type Entropy20 = typeof Entropy20.Output;
|
|
87
94
|
/**
|
|
88
95
|
* Cryptographic entropy of exactly 24 bytes.
|
|
89
96
|
*
|
|
@@ -91,6 +98,13 @@ export type Entropy16 = typeof Entropy16.Output;
|
|
|
91
98
|
*/
|
|
92
99
|
export declare const Entropy24: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length24", import("./Type.ts").LengthError<24>>;
|
|
93
100
|
export type Entropy24 = typeof Entropy24.Output;
|
|
101
|
+
/**
|
|
102
|
+
* Cryptographic entropy of exactly 28 bytes.
|
|
103
|
+
*
|
|
104
|
+
* @group Random bytes
|
|
105
|
+
*/
|
|
106
|
+
export declare const Entropy28: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length28", import("./Type.ts").LengthError<28>>;
|
|
107
|
+
export type Entropy28 = typeof Entropy28.Output;
|
|
94
108
|
/**
|
|
95
109
|
* Cryptographic entropy of exactly 32 bytes.
|
|
96
110
|
*
|
|
@@ -119,13 +133,17 @@ export declare const createRandomBytes: () => RandomBytes;
|
|
|
119
133
|
*/
|
|
120
134
|
export declare const testCreateRandomBytes: (deps: RandomLibDep) => RandomBytes;
|
|
121
135
|
/**
|
|
122
|
-
*
|
|
136
|
+
* Derives a 32-byte key from a seed and a path using
|
|
137
|
+
* [SLIP-21](https://github.com/satoshilabs/slips/blob/master/slip-0021.md).
|
|
123
138
|
*
|
|
124
|
-
*
|
|
139
|
+
* Derived keys are no stronger than the seed. A 16-byte seed gives 128 bits of
|
|
140
|
+
* security, or about 64 against a quantum computer, whatever the output length.
|
|
141
|
+
* Use a 32-byte random seed for keys that must stay safe against a quantum
|
|
142
|
+
* computer.
|
|
125
143
|
*
|
|
126
144
|
* @group Key derivation
|
|
127
145
|
*/
|
|
128
|
-
export declare const createSlip21: (seed: Entropy16 | Entropy32 | Entropy64, path: ReadonlyArray<string | number>) => Entropy32;
|
|
146
|
+
export declare const createSlip21: (seed: Entropy16 | Entropy20 | Entropy24 | Entropy28 | Entropy32 | Entropy64, path: ReadonlyArray<string | number>) => Entropy32;
|
|
129
147
|
/**
|
|
130
148
|
* Derives a single node in the SLIP-21 hierarchical key derivation.
|
|
131
149
|
*
|
package/dist/src/Crypto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAGL,cAAc,EAEd,KAAK,KAAK,EAEX,MAAM,WAAW,CAAC;AAEnB;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACH,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,QAAA,MAAM,OAAO,uSAA6C,CAAC;AAC3D,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAO,WAEnC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,YAAY,KAAG,WAMxC,CAAC;AAEpB
|
|
1
|
+
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Crypto.js
CHANGED
|
@@ -20,12 +20,24 @@ const Entropy = /*#__PURE__*/ brand("Entropy", Uint8Array);
|
|
|
20
20
|
* @group Random bytes
|
|
21
21
|
*/
|
|
22
22
|
export const Entropy16 = /*#__PURE__*/ length(16)(Entropy);
|
|
23
|
+
/**
|
|
24
|
+
* Cryptographic entropy of exactly 20 bytes.
|
|
25
|
+
*
|
|
26
|
+
* @group Random bytes
|
|
27
|
+
*/
|
|
28
|
+
export const Entropy20 = /*#__PURE__*/ length(20)(Entropy);
|
|
23
29
|
/**
|
|
24
30
|
* Cryptographic entropy of exactly 24 bytes.
|
|
25
31
|
*
|
|
26
32
|
* @group Random bytes
|
|
27
33
|
*/
|
|
28
34
|
export const Entropy24 = /*#__PURE__*/ length(24)(Entropy);
|
|
35
|
+
/**
|
|
36
|
+
* Cryptographic entropy of exactly 28 bytes.
|
|
37
|
+
*
|
|
38
|
+
* @group Random bytes
|
|
39
|
+
*/
|
|
40
|
+
export const Entropy28 = /*#__PURE__*/ length(28)(Entropy);
|
|
29
41
|
/**
|
|
30
42
|
* Cryptographic entropy of exactly 32 bytes.
|
|
31
43
|
*
|
|
@@ -56,9 +68,13 @@ export const testCreateRandomBytes = (deps) => ({
|
|
|
56
68
|
create: (bytesLength) => globalThis.Uint8Array.from({ length: bytesLength }, () => deps.randomLib.int(0, 255)),
|
|
57
69
|
});
|
|
58
70
|
/**
|
|
59
|
-
*
|
|
71
|
+
* Derives a 32-byte key from a seed and a path using
|
|
72
|
+
* [SLIP-21](https://github.com/satoshilabs/slips/blob/master/slip-0021.md).
|
|
60
73
|
*
|
|
61
|
-
*
|
|
74
|
+
* Derived keys are no stronger than the seed. A 16-byte seed gives 128 bits of
|
|
75
|
+
* security, or about 64 against a quantum computer, whatever the output length.
|
|
76
|
+
* Use a 32-byte random seed for keys that must stay safe against a quantum
|
|
77
|
+
* computer.
|
|
62
78
|
*
|
|
63
79
|
* @group Key derivation
|
|
64
80
|
*/
|
package/dist/src/Error.d.ts
CHANGED
|
@@ -27,12 +27,16 @@ export interface UnknownError extends InferType<typeof UnknownError> {
|
|
|
27
27
|
* Creates an {@link UnknownError} from an unknown error.
|
|
28
28
|
*
|
|
29
29
|
* An `Error` becomes a plain object of its own properties, such as `message`
|
|
30
|
-
* and `stack
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
30
|
+
* and `stack`, plus its `name`, `message`, and `stack` when they are inherited,
|
|
31
|
+
* as in a `DOMException`. A property that is an `Error`, such as `cause`, is
|
|
32
|
+
* converted the same way, an array, such as the `errors` of an
|
|
33
|
+
* `AggregateError`, is converted element by element, a function is dropped, and
|
|
34
|
+
* any other property is kept when it can be structured-cloned, or described as
|
|
35
|
+
* a string when it cannot. Reference cycles through errors and arrays stay
|
|
36
|
+
* cycles in the result. An `Error`'s properties are not enumerable, so JSON and
|
|
37
|
+
* comparisons by content miss them, and a structured clone creates a new
|
|
38
|
+
* `Error`. Any other value is structured-cloned, or described by `String` when
|
|
39
|
+
* it cannot be, or as `"[Unserializable Object]"` when even that throws.
|
|
36
40
|
*/
|
|
37
41
|
export declare const createUnknownError: (error: unknown) => UnknownError;
|
|
38
42
|
/**
|
package/dist/src/Error.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Error.d.ts","sourceRoot":"","sources":["../../src/Error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,SAAS,EAAS,KAAK,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE3E;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,CAClC,cAAc,EACd;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,OAAO,CAAA;CAAE,CAGlC,CAAC;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,OAAO,YAAY,CAAC;CAAG;AAEvE
|
|
1
|
+
{"version":3,"file":"Error.d.ts","sourceRoot":"","sources":["../../src/Error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,SAAS,EAAS,KAAK,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE3E;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,CAClC,cAAc,EACd;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,OAAO,CAAA;CAAE,CAGlC,CAAC;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,OAAO,YAAY,CAAC;CAAG;AAEvE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,UAAW,OAAO,KAAG,YAwEnD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,aAAa,aAAc,OAAO,KAAG,KAuBjD,CAAC"}
|
package/dist/src/Error.js
CHANGED
|
@@ -27,30 +27,62 @@ export const UnknownError = /*#__PURE__*/ typed("UnknownError", {
|
|
|
27
27
|
* Creates an {@link UnknownError} from an unknown error.
|
|
28
28
|
*
|
|
29
29
|
* An `Error` becomes a plain object of its own properties, such as `message`
|
|
30
|
-
* and `stack
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
30
|
+
* and `stack`, plus its `name`, `message`, and `stack` when they are inherited,
|
|
31
|
+
* as in a `DOMException`. A property that is an `Error`, such as `cause`, is
|
|
32
|
+
* converted the same way, an array, such as the `errors` of an
|
|
33
|
+
* `AggregateError`, is converted element by element, a function is dropped, and
|
|
34
|
+
* any other property is kept when it can be structured-cloned, or described as
|
|
35
|
+
* a string when it cannot. Reference cycles through errors and arrays stay
|
|
36
|
+
* cycles in the result. An `Error`'s properties are not enumerable, so JSON and
|
|
37
|
+
* comparisons by content miss them, and a structured clone creates a new
|
|
38
|
+
* `Error`. Any other value is structured-cloned, or described by `String` when
|
|
39
|
+
* it cannot be, or as `"[Unserializable Object]"` when even that throws.
|
|
36
40
|
*/
|
|
37
41
|
export const createUnknownError = (error) => {
|
|
42
|
+
// An UnknownError is posted between workers, so its values must clone.
|
|
43
|
+
// Each error and array is converted once and registered before its values,
|
|
44
|
+
// so a reference cycle becomes a cycle in the result instead of endless
|
|
45
|
+
// recursion, and structured cloning preserves it.
|
|
46
|
+
const converted = new Map();
|
|
47
|
+
const convertValue = (value) => {
|
|
48
|
+
if (value instanceof Error)
|
|
49
|
+
return convertError(value);
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
const known = converted.get(value);
|
|
52
|
+
if (known !== undefined)
|
|
53
|
+
return known;
|
|
54
|
+
const result = [];
|
|
55
|
+
converted.set(value, result);
|
|
56
|
+
for (const element of value)
|
|
57
|
+
result.push(convertValue(element));
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
structuredClone(value);
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return safelyStringifyUnknownValue(value);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
38
68
|
const convertError = (err) => {
|
|
39
|
-
const
|
|
69
|
+
const known = converted.get(err);
|
|
70
|
+
if (known !== undefined)
|
|
71
|
+
return known;
|
|
72
|
+
const result = {};
|
|
73
|
+
converted.set(err, result);
|
|
74
|
+
for (const key of Object.getOwnPropertyNames(err)) {
|
|
75
|
+
const value = err[key];
|
|
76
|
+
if (typeof value !== "function")
|
|
77
|
+
result[key] = convertValue(value);
|
|
78
|
+
}
|
|
79
|
+
// A DOMException keeps `name` and `message` on its prototype, and Firefox
|
|
80
|
+
// defines `stack` as a getter on Error.prototype, so getOwnPropertyNames
|
|
81
|
+
// misses them. Explicitly include them.
|
|
82
|
+
for (const key of ["name", "message", "stack"]) {
|
|
40
83
|
const value = err[key];
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
acc[key] = convertError(value);
|
|
44
|
-
}
|
|
45
|
-
else if (typeof value !== "function") {
|
|
46
|
-
acc[key] = value;
|
|
47
|
-
}
|
|
48
|
-
return acc;
|
|
49
|
-
}, {});
|
|
50
|
-
// Firefox defines `stack` as a getter on Error.prototype, not as an own
|
|
51
|
-
// property, so getOwnPropertyNames misses it. Explicitly include it.
|
|
52
|
-
if (err.stack !== undefined && !("stack" in result)) {
|
|
53
|
-
result.stack = err.stack;
|
|
84
|
+
if (value !== undefined && !(key in result))
|
|
85
|
+
result[key] = value;
|
|
54
86
|
}
|
|
55
87
|
return result;
|
|
56
88
|
};
|
package/dist/src/Sqlite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAIlC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,KAAK,IAAI,EAAiB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Sqlite.js
CHANGED
|
@@ -61,6 +61,7 @@ import { disposable } from "./Function.js";
|
|
|
61
61
|
import { createMutableRecord, objectToEntries } from "./Object.js";
|
|
62
62
|
import { ok } from "./Result.js";
|
|
63
63
|
import { testCreateRun } from "./Task.js";
|
|
64
|
+
import { performanceDurationBetween } from "./Time.js";
|
|
64
65
|
import { array, FiniteNumber, Null, object, record, set, String, testName, Uint8Array, union, } from "./Type.js";
|
|
65
66
|
/**
|
|
66
67
|
* A value that can be stored in {@link Sqlite}.
|
|
@@ -130,22 +131,25 @@ export const sqliteQueryStringToSqliteQuery = (query) => {
|
|
|
130
131
|
export const createSqlite = (name, options) => async (run) => {
|
|
131
132
|
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
132
133
|
try {
|
|
133
|
-
const { createSqliteDriver } = run.deps;
|
|
134
|
+
const { createSqliteDriver, time } = run.deps;
|
|
134
135
|
const console = run.deps.console.child("sql");
|
|
135
136
|
const disposer = __addDisposableResource(env_1, new AsyncDisposableStack(), true);
|
|
136
137
|
const driver = disposer.use(await run.ok(createSqliteDriver(name, options)));
|
|
137
138
|
console.debug("SQLite driver created");
|
|
138
139
|
return ok(disposable({
|
|
139
140
|
exec: (query) => {
|
|
140
|
-
console.
|
|
141
|
-
const
|
|
142
|
-
?
|
|
141
|
+
console.trace({ query });
|
|
142
|
+
const start = query.options?.logQueryExecutionTime === true
|
|
143
|
+
? time.performance.now()
|
|
143
144
|
: null;
|
|
144
|
-
if (label !== null)
|
|
145
|
-
console.time(label);
|
|
146
145
|
const result = driver.exec(query);
|
|
147
|
-
if (
|
|
148
|
-
|
|
146
|
+
if (start !== null) {
|
|
147
|
+
const duration = performanceDurationBetween(start, time.performance.now());
|
|
148
|
+
console.log("[logQueryExecutionTime]", {
|
|
149
|
+
query,
|
|
150
|
+
duration: `${duration.toFixed(3)}ms`,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
149
153
|
if (query.options?.logExplainQueryPlan) {
|
|
150
154
|
const result = driver.exec({
|
|
151
155
|
...query,
|
|
@@ -154,13 +158,13 @@ export const createSqlite = (name, options) => async (run) => {
|
|
|
154
158
|
console.log("[logExplainQueryPlan]", query);
|
|
155
159
|
console.log(drawSqliteQueryPlan(result.rows));
|
|
156
160
|
}
|
|
157
|
-
console.
|
|
161
|
+
console.trace({ result });
|
|
158
162
|
return result;
|
|
159
163
|
},
|
|
160
164
|
transaction: ((callback) => {
|
|
161
165
|
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
162
166
|
try {
|
|
163
|
-
console.
|
|
167
|
+
console.trace("begin");
|
|
164
168
|
driver.exec(sql `begin;`);
|
|
165
169
|
// After errors such as SQLITE_FULL or SQLITE_IOERR, SQLite may roll
|
|
166
170
|
// back the transaction itself, and this rollback then fails with
|
|
@@ -174,13 +178,13 @@ export const createSqlite = (name, options) => async (run) => {
|
|
|
174
178
|
rollback.defer(() => {
|
|
175
179
|
if (!shouldRollback)
|
|
176
180
|
return;
|
|
177
|
-
console.
|
|
181
|
+
console.trace("rollback");
|
|
178
182
|
driver.exec(sql `rollback;`);
|
|
179
183
|
});
|
|
180
184
|
const result = callback();
|
|
181
185
|
if (result != null && !result.ok)
|
|
182
186
|
return result;
|
|
183
|
-
console.
|
|
187
|
+
console.trace("commit");
|
|
184
188
|
driver.exec(sql `commit;`);
|
|
185
189
|
shouldRollback = false;
|
|
186
190
|
return result;
|
package/dist/src/Task.d.ts
CHANGED
|
@@ -1904,9 +1904,11 @@ export type RunDefaultDeps = ConsoleDep & LeakDetectorDep & NativeFetchDep & Ran
|
|
|
1904
1904
|
/**
|
|
1905
1905
|
* Creates {@link RunDefaultDeps}.
|
|
1906
1906
|
*
|
|
1907
|
+
* The leak detector reports to the provided console, or to a default one.
|
|
1908
|
+
*
|
|
1907
1909
|
* @group Run
|
|
1908
1910
|
*/
|
|
1909
|
-
export declare const createRunDefaultDeps: () => RunDefaultDeps;
|
|
1911
|
+
export declare const createRunDefaultDeps: ({ console, }?: Partial<ConsoleDep>) => RunDefaultDeps;
|
|
1910
1912
|
/**
|
|
1911
1913
|
* Factory type for creating root {@link DisposableRun} instances.
|
|
1912
1914
|
*
|