@evolu/common 4.1.0 → 5.0.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.
Files changed (78) hide show
  1. package/README.md +1 -1
  2. package/dist/src/Config.d.ts +26 -27
  3. package/dist/src/Config.d.ts.map +1 -1
  4. package/dist/src/Config.js +35 -7
  5. package/dist/src/Crdt.d.ts +5 -4
  6. package/dist/src/Crdt.d.ts.map +1 -1
  7. package/dist/src/Crdt.js +27 -24
  8. package/dist/src/Crypto.d.ts +16 -10
  9. package/dist/src/Crypto.d.ts.map +1 -1
  10. package/dist/src/Crypto.js +24 -11
  11. package/dist/src/Db.d.ts +58 -78
  12. package/dist/src/Db.d.ts.map +1 -1
  13. package/dist/src/Db.js +383 -185
  14. package/dist/src/Diff.d.ts +9 -3
  15. package/dist/src/Diff.d.ts.map +1 -1
  16. package/dist/src/Diff.js +12 -11
  17. package/dist/src/Error.d.ts +15 -0
  18. package/dist/src/Error.d.ts.map +1 -0
  19. package/dist/src/Error.js +14 -0
  20. package/dist/src/Evolu.d.ts +139 -91
  21. package/dist/src/Evolu.d.ts.map +1 -1
  22. package/dist/src/Evolu.js +267 -239
  23. package/dist/src/Model.d.ts +52 -0
  24. package/dist/src/Model.d.ts.map +1 -1
  25. package/dist/src/Model.js +47 -5
  26. package/dist/src/Owner.d.ts.map +1 -1
  27. package/dist/src/Owner.js +14 -8
  28. package/dist/src/Platform.d.ts +24 -34
  29. package/dist/src/Platform.d.ts.map +1 -1
  30. package/dist/src/Platform.js +9 -31
  31. package/dist/src/Public.d.ts +3 -5
  32. package/dist/src/Public.d.ts.map +1 -1
  33. package/dist/src/Public.js +2 -3
  34. package/dist/src/Sqlite.d.ts +25 -15
  35. package/dist/src/Sqlite.d.ts.map +1 -1
  36. package/dist/src/Sqlite.js +28 -7
  37. package/dist/src/Store.d.ts.map +1 -1
  38. package/dist/src/Sync.d.ts +70 -0
  39. package/dist/src/Sync.d.ts.map +1 -0
  40. package/dist/src/Sync.js +126 -0
  41. package/dist/src/index.d.ts +2 -5
  42. package/dist/src/index.d.ts.map +1 -1
  43. package/dist/src/index.js +2 -5
  44. package/package.json +12 -10
  45. package/src/Config.ts +82 -39
  46. package/src/Crdt.ts +61 -76
  47. package/src/Crypto.ts +83 -60
  48. package/src/Db.ts +802 -370
  49. package/src/Diff.ts +23 -21
  50. package/src/Error.ts +29 -0
  51. package/src/Evolu.ts +599 -499
  52. package/src/Model.ts +102 -6
  53. package/src/Owner.ts +24 -24
  54. package/src/Platform.ts +33 -81
  55. package/src/Public.ts +3 -5
  56. package/src/Sqlite.ts +81 -27
  57. package/src/Sync.ts +306 -0
  58. package/src/index.ts +2 -5
  59. package/dist/src/DbWorker.d.ts +0 -82
  60. package/dist/src/DbWorker.d.ts.map +0 -1
  61. package/dist/src/DbWorker.js +0 -335
  62. package/dist/src/ErrorStore.d.ts +0 -29
  63. package/dist/src/ErrorStore.d.ts.map +0 -1
  64. package/dist/src/ErrorStore.js +0 -13
  65. package/dist/src/OnCompletes.d.ts +0 -14
  66. package/dist/src/OnCompletes.d.ts.map +0 -1
  67. package/dist/src/OnCompletes.js +0 -25
  68. package/dist/src/SyncWorker.d.ts +0 -80
  69. package/dist/src/SyncWorker.d.ts.map +0 -1
  70. package/dist/src/SyncWorker.js +0 -150
  71. package/dist/src/Types.d.ts +0 -13
  72. package/dist/src/Types.d.ts.map +0 -1
  73. package/dist/src/Types.js +0 -1
  74. package/src/DbWorker.ts +0 -721
  75. package/src/ErrorStore.ts +0 -46
  76. package/src/OnCompletes.ts +0 -51
  77. package/src/SyncWorker.ts +0 -361
  78. package/src/Types.ts +0 -11
package/README.md CHANGED
@@ -55,7 +55,7 @@ Start developing and watch for code changes:
55
55
  pnpm dev
56
56
  ```
57
57
 
58
- Start iOS developing:
58
+ Start iOS developing (pnpm dev must be running too):
59
59
 
60
60
  ```
61
61
  pnpm ios
@@ -1,43 +1,42 @@
1
1
  import * as Context from "effect/Context";
2
- import * as Layer from "effect/Layer";
3
- import { CreateIndexBuilder } from "kysely";
2
+ import * as ManagedRuntime from "effect/ManagedRuntime";
4
3
  export interface Config {
5
- /** Alternate URL to Evolu sync and backup server. */
6
- readonly syncUrl: string;
7
4
  /**
8
- * Alternate URL to reload browser tabs after {@link Owner} reset or restore.
5
+ * URL to reload browser tabs after {@link Owner} reset or restore.
6
+ *
9
7
  * The default value is `/`.
10
8
  */
11
- readonly reloadUrl: string;
9
+ reloadUrl: string;
12
10
  /**
13
- * Maximum physical clock drift allowed in ms. The default value is 5 * 60 *
14
- * 1000 (5 minutes).
11
+ * URL for Evolu sync and backup server.
12
+ *
13
+ * The default value is `https://evolu.world`.
15
14
  */
16
- readonly maxDrift: number;
15
+ syncUrl: string;
17
16
  /**
18
- * Evolu application name. For now, this is only useful for localhost
19
- * development, where we want each application to have its own database. The
20
- * default value is: "Evolu".
17
+ * Evolu is multitenant - it can run more instances concurrently. Every Evolu
18
+ * instance has to have its own unique name. Database files are separated and
19
+ * invisible to each other.
20
+ *
21
+ * The default value is: `Evolu`.
21
22
  */
22
- readonly name: string;
23
+ name: string;
23
24
  /**
24
- * Use the `indexes` property to define SQLite indexes.
25
- *
26
- * Table and column names are not typed because Kysely doesn't support it.
25
+ * Maximum physical clock drift allowed in ms.
27
26
  *
28
- * https://medium.com/@JasonWyatt/squeezing-performance-from-sqlite-indexes-indexes-c4e175f3c346
29
- *
30
- * @example
31
- * const indexes = [
32
- * createIndex("indexTodoCreatedAt").on("todo").column("createdAt"),
27
+ * The default value is 5 * 60 * 1000 (5 minutes).
28
+ */
29
+ maxDrift: number;
30
+ /**
31
+ * Setting the minimum log level. The default value is `none`.
33
32
  *
34
- * createIndex("indexTodoCategoryCreatedAt")
35
- * .on("todoCategory")
36
- * .column("createdAt"),
37
- * ];
33
+ * For development, use `trace` to log all events and `debug` to log only
34
+ * events with values. For production, use `warning`.
38
35
  */
39
- readonly indexes: ReadonlyArray<CreateIndexBuilder<any>>;
36
+ minimumLogLevel: "none" | "trace" | "debug" | "warning";
40
37
  }
41
38
  export declare const Config: Context.Tag<Config, Config>;
42
- export declare const ConfigLive: (config?: Partial<Config>) => Layer.Layer<Config>;
39
+ export declare const defaultConfig: Config;
40
+ /** https://effect.website/docs/guides/runtime */
41
+ export declare const createRuntime: (partialConfig?: Partial<Config>) => ManagedRuntime.ManagedRuntime<Config, never>;
43
42
  //# sourceMappingURL=Config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,MAAM,6BAAiD,CAAC;AAErE,eAAO,MAAM,UAAU,YAAa,QAAQ,MAAM,CAAC,KAAG,WAAW,CAAC,MAAM,CAWrE,CAAC"}
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAI1C,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;CACzD;AAED,eAAO,MAAM,MAAM,6BAAuC,CAAC;AAE3D,eAAO,MAAM,aAAa,EAAE,MAM3B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,aAAa,mBACR,QAAQ,MAAM,CAAC,KAC9B,eAAe,cAAc,CAAC,MAAM,EAAE,KAAK,CAsB7C,CAAC"}
@@ -1,11 +1,39 @@
1
1
  import * as Context from "effect/Context";
2
2
  import * as Layer from "effect/Layer";
3
- export const Config = Context.GenericTag("@services/Config");
4
- export const ConfigLive = (config) => Layer.succeed(Config, Config.of({
5
- syncUrl: "https://evolu.world",
6
- maxDrift: 5 * 60 * 1000,
3
+ import * as LogLevel from "effect/LogLevel";
4
+ import * as Logger from "effect/Logger";
5
+ import * as ManagedRuntime from "effect/ManagedRuntime";
6
+ import * as Match from "effect/Match";
7
+ export const Config = Context.GenericTag("Config");
8
+ export const defaultConfig = {
7
9
  reloadUrl: "/",
10
+ syncUrl: "https://evolu.world",
8
11
  name: "Evolu",
9
- indexes: [],
10
- ...config,
11
- }));
12
+ maxDrift: 5 * 60 * 1000,
13
+ minimumLogLevel: "none",
14
+ };
15
+ /** https://effect.website/docs/guides/runtime */
16
+ export const createRuntime = (partialConfig) => {
17
+ const config = { ...defaultConfig, ...partialConfig };
18
+ const ConfigLive = Layer.succeed(Config, config);
19
+ const minimumLogLevel = Match.value(config.minimumLogLevel).pipe(Match.when("debug", () => LogLevel.Debug), Match.when("none", () => LogLevel.None), Match.when("trace", () => LogLevel.Trace), Match.when("warning", () => LogLevel.Warning), Match.exhaustive);
20
+ const evoluLayer = config.minimumLogLevel === "none"
21
+ ? ConfigLive
22
+ : Layer.mergeAll(ConfigLive, Logger.minimumLogLevel(minimumLogLevel), Logger.replace(Logger.defaultLogger, makeEvoluLogger(config.name)));
23
+ return ManagedRuntime.make(evoluLayer);
24
+ };
25
+ // TODO: Spans and Effect native variadic log args.
26
+ const makeEvoluLogger = (name) => Logger.make(({ logLevel, message, date }) => {
27
+ const fn = logLevel._tag === "Warning"
28
+ ? "warn"
29
+ : logLevel._tag === "Error"
30
+ ? "error"
31
+ : "log";
32
+ const hours = date.getHours().toString().padStart(2, "0");
33
+ const minutes = date.getMinutes().toString().padStart(2, "0");
34
+ const seconds = date.getSeconds().toString().padStart(2, "0");
35
+ const milliseconds = date.getMilliseconds().toString().padStart(3, "0");
36
+ const formattedDate = `${hours}:${minutes}:${seconds}:${milliseconds}`;
37
+ const messages = Array.isArray(message) ? message : [message];
38
+ globalThis.console[fn](`${formattedDate} [${name}]`, ...messages);
39
+ });
@@ -34,11 +34,12 @@ export declare const unsafeTimestampFromString: (s: TimestampString) => Timestam
34
34
  export declare const timestampToHash: (t: Timestamp) => TimestampHash;
35
35
  export declare const makeSyncTimestamp: (millis?: Millis) => Timestamp;
36
36
  export declare const makeInitialTimestamp: Effect.Effect<Timestamp, never, NanoIdGenerator>;
37
- export interface Time {
37
+ declare const Time_base: Context.TagClass<Time, "Time", {
38
38
  readonly now: Effect.Effect<Millis, TimestampTimeOutOfRangeError>;
39
+ }>;
40
+ export declare class Time extends Time_base {
41
+ static Live: Layer.Layer<Time, never, never>;
39
42
  }
40
- export declare const Time: Context.Tag<Time, Time>;
41
- export declare const TimeLive: Layer.Layer<Time, never, never>;
42
43
  /**
43
44
  * The TimestampError type represents all Timestamp-related errors. If such an
44
45
  * error happens, the device clock is skewed and should be set to the current
@@ -80,7 +81,7 @@ export declare const initialMerkleTree: MerkleTree;
80
81
  type MerkleTreeKey = keyof Omit<MerkleTree, "hash">;
81
82
  type MerkleTreePath = ReadonlyArray<MerkleTreeKey>;
82
83
  export declare const millisToMerkleTreePath: (millis: Millis) => MerkleTreePath;
83
- export declare const insertIntoMerkleTree: (timestamp: Timestamp) => (tree: MerkleTree) => MerkleTree;
84
+ export declare const insertIntoMerkleTree: (tree: MerkleTree, timestamp: Timestamp) => MerkleTree;
84
85
  export declare const diffMerkleTrees: (tree1: MerkleTree, tree2: MerkleTree) => Option.Option<Millis>;
85
86
  export declare const merkleTreeToString: (m: MerkleTree) => MerkleTreeString;
86
87
  export declare const unsafeMerkleTreeFromString: (m: MerkleTreeString) => MerkleTree;
@@ -1 +1 @@
1
- {"version":3,"file":"Crdt.d.ts","sourceRoot":"","sources":["../../src/Crdt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Crdt.d.ts","sourceRoot":"","sources":["../../src/Crdt.ts"],"names":[],"mappings":"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"}
package/dist/src/Crdt.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as S from "@effect/schema/Schema";
2
+ import * as Arr from "effect/Array";
2
3
  import * as Context from "effect/Context";
3
4
  import * as Effect from "effect/Effect";
4
5
  import * as Either from "effect/Either";
@@ -6,7 +7,6 @@ import { pipe } from "effect/Function";
6
7
  import * as Layer from "effect/Layer";
7
8
  import * as Number from "effect/Number";
8
9
  import * as Option from "effect/Option";
9
- import * as ReadonlyArray from "effect/ReadonlyArray";
10
10
  import * as String from "effect/String";
11
11
  import { Config } from "./Config.js";
12
12
  import { NanoIdGenerator, NodeId } from "./Crypto.js";
@@ -22,9 +22,9 @@ export const AllowedTimeRange = {
22
22
  * the device clock is out of range, Evolu will not store data until it's
23
23
  * fixed.
24
24
  */
25
- export const Millis = S.number.pipe(S.greaterThan(AllowedTimeRange.greaterThan), S.lessThan(AllowedTimeRange.lessThan), S.brand("Millis"));
25
+ export const Millis = S.Number.pipe(S.greaterThan(AllowedTimeRange.greaterThan), S.lessThan(AllowedTimeRange.lessThan), S.brand("Millis"));
26
26
  export const initialMillis = S.decodeSync(Millis)(AllowedTimeRange.greaterThan + 1);
27
- export const Counter = S.number.pipe(S.between(0, 65535), S.brand("Counter"));
27
+ export const Counter = S.Number.pipe(S.between(0, 65535), S.brand("Counter"));
28
28
  const initialCounter = S.decodeSync(Counter)(0);
29
29
  export const timestampToString = (t) => [
30
30
  new Date(t.millis).toISOString(),
@@ -46,53 +46,56 @@ export const makeSyncTimestamp = (millis = initialMillis) => ({
46
46
  counter: initialCounter,
47
47
  node: syncNodeId,
48
48
  });
49
- export const makeInitialTimestamp = NanoIdGenerator.pipe(Effect.flatMap(({ nanoidAsNodeId }) => nanoidAsNodeId), Effect.map((node) => ({
49
+ export const makeInitialTimestamp = NanoIdGenerator.pipe(Effect.flatMap(({ nodeId }) => nodeId), Effect.map((node) => ({
50
50
  millis: initialMillis,
51
51
  counter: initialCounter,
52
52
  node,
53
53
  })));
54
- export const Time = Context.GenericTag("@services/Time");
55
- export const TimeLive = Layer.succeed(Time, Time.of({
54
+ export class Time extends Context.Tag("Time")() {
55
+ }
56
+ Time.Live = Layer.succeed(Time, {
56
57
  now: Effect.suspend(() => S.decode(Millis)(Date.now())).pipe(Effect.catchTag("ParseError", () => Effect.fail({
57
58
  _tag: "TimestampTimeOutOfRangeError",
58
59
  }))),
59
- }));
60
- const getNextMillis = (millis) => Effect.gen(function* (_) {
61
- const time = yield* _(Time);
62
- const config = yield* _(Config);
63
- const now = yield* _(time.now);
60
+ });
61
+ const getNextMillis = (millis) => Effect.gen(function* () {
62
+ const time = yield* Time;
63
+ const config = yield* Config;
64
+ const now = yield* time.now;
64
65
  const next = Math.max(now, ...millis);
65
66
  if (next - now > config.maxDrift)
66
- yield* _(Effect.fail({
67
+ yield* Effect.fail({
67
68
  _tag: "TimestampDriftError",
68
69
  now,
69
70
  next,
70
- }));
71
+ });
71
72
  return next;
72
73
  });
73
- const incrementCounter = (counter) => pipe(Number.increment(counter), S.decodeEither(Counter), Either.mapLeft(() => ({ _tag: "TimestampCounterOverflowError" })));
74
+ const incrementCounter = (counter) => pipe(Number.increment(counter), S.decodeEither(Counter), Either.mapLeft(() => ({
75
+ _tag: "TimestampCounterOverflowError",
76
+ })));
74
77
  const counterMin = S.decodeSync(Counter)(0);
75
- export const sendTimestamp = (timestamp) => Effect.gen(function* (_) {
76
- const millis = yield* _(getNextMillis([timestamp.millis]));
78
+ export const sendTimestamp = (timestamp) => Effect.gen(function* () {
79
+ const millis = yield* getNextMillis([timestamp.millis]);
77
80
  const counter = millis === timestamp.millis
78
- ? yield* _(incrementCounter(timestamp.counter))
81
+ ? yield* incrementCounter(timestamp.counter)
79
82
  : counterMin;
80
83
  return { ...timestamp, millis, counter };
81
84
  });
82
85
  export const receiveTimestamp = ({ local, remote, }) => Effect.gen(function* (_) {
83
86
  if (local.node === remote.node)
84
- yield* _(Effect.fail({
87
+ yield* Effect.fail({
85
88
  _tag: "TimestampDuplicateNodeError",
86
89
  node: local.node,
87
- }));
88
- const millis = yield* _(getNextMillis([local.millis, remote.millis]));
89
- const counter = yield* _(millis === local.millis && millis === remote.millis
90
+ });
91
+ const millis = yield* getNextMillis([local.millis, remote.millis]);
92
+ const counter = yield* millis === local.millis && millis === remote.millis
90
93
  ? incrementCounter(Math.max(local.counter, remote.counter))
91
94
  : millis === local.millis
92
95
  ? incrementCounter(local.counter)
93
96
  : millis === remote.millis
94
97
  ? incrementCounter(remote.counter)
95
- : Either.right(counterMin));
98
+ : Either.right(counterMin);
96
99
  return { ...local, millis, counter };
97
100
  });
98
101
  export const initialMerkleTree = Object.create(null);
@@ -119,7 +122,7 @@ const insertKey = (tree, path, hash) => {
119
122
  },
120
123
  };
121
124
  };
122
- export const insertIntoMerkleTree = (timestamp) => (tree) => {
125
+ export const insertIntoMerkleTree = (tree, timestamp) => {
123
126
  const path = millisToMerkleTreePath(timestamp.millis);
124
127
  const hash = timestampToHash(timestamp);
125
128
  return insertKey({ ...tree, hash: xorTimestampHashes(tree.hash, hash) }, path, hash);
@@ -138,7 +141,7 @@ export const diffMerkleTrees = (tree1, tree2) => {
138
141
  // the top of this function should pass)
139
142
  // eslint-disable-next-line no-constant-condition
140
143
  while (1) {
141
- const keys = ReadonlyArray.dedupeWith(getSortedMerkleTreeKeys(node1).concat(getSortedMerkleTreeKeys(node2)), String.Equivalence);
144
+ const keys = Arr.dedupeWith(getSortedMerkleTreeKeys(node1).concat(getSortedMerkleTreeKeys(node2)), String.Equivalence);
142
145
  let diffKey = null;
143
146
  // Traverse down the trie through keys that are different. We
144
147
  // traverse down the keys in order. Stop in two cases: either one
@@ -3,15 +3,18 @@ import * as Brand from "effect/Brand";
3
3
  import * as Context from "effect/Context";
4
4
  import * as Effect from "effect/Effect";
5
5
  import * as Layer from "effect/Layer";
6
- export interface Bip39 {
6
+ import { Id } from "./Model.js";
7
+ declare const Bip39_base: Context.TagClass<Bip39, "Bip39", {
7
8
  readonly make: Effect.Effect<Mnemonic>;
8
9
  readonly toSeed: (mnemonic: Mnemonic) => Effect.Effect<Uint8Array>;
9
10
  readonly parse: (mnemonic: string) => Effect.Effect<Mnemonic, InvalidMnemonicError>;
11
+ }>;
12
+ export declare class Bip39 extends Bip39_base {
10
13
  }
11
- export declare const Bip39: Context.Tag<Bip39, Bip39>;
12
14
  export interface InvalidMnemonicError {
13
15
  readonly _tag: "InvalidMnemonicError";
14
16
  }
17
+ export declare const validateMnemonicToEffect: (validateMnemonic: (mnemonic: string, wordlist: string[]) => boolean) => (mnemonic: string, wordlist: string[]) => Effect.Effect<Mnemonic, InvalidMnemonicError, never>;
15
18
  /**
16
19
  * Mnemonic is a password generated by Evolu in BIP39 format.
17
20
  *
@@ -20,21 +23,24 @@ export interface InvalidMnemonicError {
20
23
  * provide a human-readable way of storing a private key.
21
24
  */
22
25
  export type Mnemonic = string & Brand.Brand<"Mnemonic">;
23
- export interface NanoIdGenerator {
26
+ declare const NanoIdGenerator_base: Context.TagClass<NanoIdGenerator, "NanoIdGenerator", {
24
27
  readonly nanoid: Effect.Effect<NanoId>;
25
- readonly nanoidAsNodeId: Effect.Effect<NodeId>;
28
+ readonly nodeId: Effect.Effect<NodeId>;
29
+ readonly rowId: Effect.Effect<Id>;
30
+ }>;
31
+ export declare class NanoIdGenerator extends NanoIdGenerator_base {
26
32
  }
27
- export declare const NanoIdGenerator: Context.Tag<NanoIdGenerator, NanoIdGenerator>;
33
+ export declare const createNanoIdGeneratorLive: (customAlphabet: (alphabet: string, defaultSize?: number | undefined) => (size?: number | undefined) => string, nanoid: (size?: number) => string) => Layer.Layer<NanoIdGenerator, never, never>;
28
34
  export type NanoId = string & Brand.Brand<"NanoId">;
29
35
  export declare const NodeId: S.brand<S.Schema<string, string, never>, "NodeId">;
30
36
  export type NodeId = S.Schema.Type<typeof NodeId>;
31
- export declare const NanoIdGeneratorLive: Layer.Layer<NanoIdGenerator, never, never>;
32
37
  export declare const slip21Derive: (seed: Uint8Array, path: ReadonlyArray<string>) => Effect.Effect<Uint8Array>;
33
- /** Alias to xsalsa20poly1305, for compatibility with libsodium/nacl */
34
- export interface SecretBox {
38
+ declare const SecretBox_base: Context.TagClass<SecretBox, "SecretBox", {
35
39
  readonly seal: (key: Uint8Array, plaintext: Uint8Array) => Effect.Effect<Uint8Array>;
36
40
  readonly open: (key: Uint8Array, ciphertext: Uint8Array) => Effect.Effect<Uint8Array>;
41
+ }>;
42
+ export declare class SecretBox extends SecretBox_base {
43
+ static Live: Layer.Layer<SecretBox, never, never>;
37
44
  }
38
- export declare const SecretBox: Context.Tag<SecretBox, SecretBox>;
39
- export declare const SecretBoxLive: Layer.Layer<SecretBox, never, never>;
45
+ export {};
40
46
  //# sourceMappingURL=Crypto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAM3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAItC,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEnE,QAAQ,CAAC,KAAK,EAAE,CACd,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,KAAK,2BAA+C,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,eAAe,+CAE3B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAEpD,eAAO,MAAM,MAAM,oDAGlB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC;AAIlD,eAAO,MAAM,mBAAmB,4CAM/B,CAAC;AAIF,eAAO,MAAM,YAAY,SACjB,UAAU,QACV,cAAc,MAAM,CAAC,KAC1B,aAAa,CAAC,UAAU,CAWvB,CAAC;AAEL,uEAAuE;AACvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,CACb,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,UAAU,KAClB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE/B,QAAQ,CAAC,IAAI,EAAE,CACb,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,UAAU,KACnB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,SAAS,mCAAuD,CAAC;AAE9E,eAAO,MAAM,aAAa,sCAgBzB,CAAC"}
1
+ {"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAM3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;;mBAKb,OAAO,MAAM,CAAC,QAAQ,CAAC;qBAErB,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,MAAM,CAAC,UAAU,CAAC;oBAElD,CACd,QAAQ,EAAE,MAAM,KACb,OAAO,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC;;AATtD,qBAAa,KAAM,SAAQ,UAWxB;CAAG;AAEN,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC;AAED,eAAO,MAAM,wBAAwB,qBAChB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,OAAO,gBAExD,MAAM,YACN,MAAM,EAAE,KACjB,OAAO,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,CAOrD,CAAC;AAEJ;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;qBAKnC,OAAO,MAAM,CAAC,MAAM,CAAC;qBACrB,OAAO,MAAM,CAAC,MAAM,CAAC;oBACtB,OAAO,MAAM,CAAC,EAAE,CAAC;;AALrC,qBAAa,eAAgB,SAAQ,oBAOlC;CAAG;AAEN,eAAO,MAAM,yBAAyB,mBACpB,CACd,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,KAC7B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,UAClC,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,KAChC,MAAM,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAU3C,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAEpD,eAAO,MAAM,MAAM,oDAGlB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC;AAIlD,eAAO,MAAM,YAAY,SACjB,UAAU,QACV,cAAc,MAAM,CAAC,KAC1B,OAAO,MAAM,CAAC,UAAU,CAWvB,CAAC;;mBAKc,CACb,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,UAAU,KAClB,OAAO,MAAM,CAAC,UAAU,CAAC;mBAEf,CACb,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,UAAU,KACnB,OAAO,MAAM,CAAC,UAAU,CAAC;;AAXlC,qBAAa,SAAU,SAAQ,cAa5B;IACD,MAAM,CAAC,IAAI,uCAgBT;CACH"}
@@ -7,15 +7,27 @@ import { randomBytes } from "@noble/hashes/utils";
7
7
  import * as Context from "effect/Context";
8
8
  import * as Effect from "effect/Effect";
9
9
  import * as Layer from "effect/Layer";
10
- import { customAlphabet, nanoid } from "nanoid";
11
- export const Bip39 = Context.GenericTag("@services/Bip39");
12
- export const NanoIdGenerator = Context.GenericTag("@services/NanoIdGenerator");
13
- export const NodeId = S.string.pipe(S.pattern(/^[\w-]{16}$/), S.brand("NodeId"));
14
- const nanoidForNodeId = customAlphabet("0123456789abcdef", 16);
15
- export const NanoIdGeneratorLive = Layer.succeed(NanoIdGenerator, NanoIdGenerator.of({
16
- nanoid: Effect.sync(() => nanoid()),
17
- nanoidAsNodeId: Effect.sync(() => nanoidForNodeId()),
18
- }));
10
+ export class Bip39 extends Context.Tag("Bip39")() {
11
+ }
12
+ export const validateMnemonicToEffect = (validateMnemonic) => (mnemonic, wordlist) => {
13
+ const mnemonicTrimmed = mnemonic.trim();
14
+ return validateMnemonic(mnemonicTrimmed, wordlist)
15
+ ? Effect.succeed(mnemonicTrimmed)
16
+ : Effect.fail({
17
+ _tag: "InvalidMnemonicError",
18
+ });
19
+ };
20
+ export class NanoIdGenerator extends Context.Tag("NanoIdGenerator")() {
21
+ }
22
+ export const createNanoIdGeneratorLive = (customAlphabet, nanoid) => {
23
+ const nanoidForNodeId = customAlphabet("0123456789abcdef", 16);
24
+ return Layer.succeed(NanoIdGenerator, NanoIdGenerator.of({
25
+ nanoid: Effect.sync(() => nanoid()),
26
+ nodeId: Effect.sync(() => nanoidForNodeId()),
27
+ rowId: Effect.sync(() => nanoid()),
28
+ }));
29
+ };
30
+ export const NodeId = S.String.pipe(S.pattern(/^[\w-]{16}$/), S.brand("NodeId"));
19
31
  // SLIP-21 implementation
20
32
  // https://github.com/satoshilabs/slips/blob/master/slip-0021.md
21
33
  export const slip21Derive = (seed, path) => Effect.sync(() => {
@@ -29,8 +41,9 @@ export const slip21Derive = (seed, path) => Effect.sync(() => {
29
41
  }
30
42
  return m.slice(32, 64);
31
43
  });
32
- export const SecretBox = Context.GenericTag("@services/SecretBox");
33
- export const SecretBoxLive = Layer.succeed(SecretBox, SecretBox.of({
44
+ export class SecretBox extends Context.Tag("SecretBox")() {
45
+ }
46
+ SecretBox.Live = Layer.succeed(SecretBox, SecretBox.of({
34
47
  seal: (key, plaintext) => Effect.sync(() => {
35
48
  const nonce = randomBytes(24);
36
49
  const ciphertext = secretbox(key, nonce).seal(plaintext);
package/dist/src/Db.d.ts CHANGED
@@ -2,81 +2,76 @@ import * as S from "@effect/schema/Schema";
2
2
  import * as Brand from "effect/Brand";
3
3
  import * as Context from "effect/Context";
4
4
  import * as Effect from "effect/Effect";
5
- import * as Layer from "effect/Layer";
6
- import * as ReadonlyArray from "effect/ReadonlyArray";
7
- import * as ReadonlyRecord from "effect/ReadonlyRecord";
8
- import * as Types from "effect/Types";
5
+ import * as Record from "effect/Record";
9
6
  import * as Kysely from "kysely";
7
+ import { Config } from "./Config.js";
8
+ import { Millis, Time, TimestampCounterOverflowError, TimestampDriftError, TimestampTimeOutOfRangeError } from "./Crdt.js";
10
9
  import { Bip39, Mnemonic, NanoIdGenerator } from "./Crypto.js";
11
- import { EvoluTypeError } from "./ErrorStore.js";
10
+ import { QueryPatches } from "./Diff.js";
11
+ import { EvoluError } from "./Error.js";
12
12
  import { Id } from "./Model.js";
13
13
  import { Owner } from "./Owner.js";
14
- import { Sqlite, SqliteQuery, SqliteSchema, Table, Value } from "./Sqlite.js";
15
- import { Store } from "./Store.js";
16
- export type DatabaseSchema = ReadonlyRecord.ReadonlyRecord<string, TableSchema>;
17
- type TableSchema = ReadonlyRecord.ReadonlyRecord<string, Value> & {
18
- readonly id: Id;
19
- };
20
- /**
21
- * Create table schema.
22
- *
23
- * Supported types are null, string, number, Uint8Array, JSON Object, and JSON
24
- * Array. Use SqliteDate for dates and SqliteBoolean for booleans.
25
- *
26
- * Reserved columns are createdAt, updatedAt, isDeleted. Those columns are added
27
- * by default.
28
- *
29
- * @example
30
- * const TodoId = id("Todo");
31
- * type TodoId = S.Schema.Type<typeof TodoId>;
32
- *
33
- * const TodoTable = table({
34
- * id: TodoId,
35
- * title: NonEmptyString1000,
36
- * isCompleted: S.nullable(SqliteBoolean),
37
- * });
38
- * type TodoTable = S.Schema.Type<typeof TodoTable>;
39
- */
40
- export declare const table: <Fields extends TableFields>(fields: Fields) => ValidateFieldsTypes<Fields> extends true ? ValidateFieldsNames<Fields> extends true ? ValidateFieldsHasId<Fields> extends true ? S.Schema<Types.Simplify<S.Struct.Type<Fields> & S.Schema.Type<typeof ReservedColumns>>, Types.Simplify<S.Struct.Encoded<Fields> & S.Schema.Encoded<typeof ReservedColumns>>> : EvoluTypeError<"table() called without id column."> : EvoluTypeError<"table() called with a reserved column. Reserved columns are createdAt, updatedAt, isDeleted. Those columns are added by default."> : EvoluTypeError<"table() called with unsupported type. Supported types are null, string, number, Uint8Array, JSON Object, and JSON Array. Use SqliteDate for dates and SqliteBoolean for booleans.">;
41
- declare const ReservedColumns: S.struct<{
42
- createdAt: S.brand<S.Schema<string, string, never>, "SqliteDate">;
43
- updatedAt: S.brand<S.Schema<string, string, never>, "SqliteDate">;
44
- isDeleted: S.brand<S.Schema<number, number, never>, "SqliteBoolean">;
14
+ import { SyncLock } from "./Platform.js";
15
+ import { Sqlite, SqliteExecResult, SqliteFactory, SqliteQuery, Value } from "./Sqlite.js";
16
+ import { NewMessage, SyncFactory, SyncState } from "./Sync.js";
17
+ export interface Db {
18
+ readonly init: (schema: DbSchema, initialData: ReadonlyArray<Mutation>, onError: Callbacks["onError"], onSyncStateChange: Callbacks["onSyncStateChange"], onReceive: Callbacks["onReceive"]) => Effect.Effect<Owner, NotSupportedPlatformError | TimestampTimeOutOfRangeError | TimestampDriftError | TimestampCounterOverflowError, Config>;
19
+ readonly loadQueries: (queries: ReadonlyArray<Query>) => Effect.Effect<ReadonlyArray<QueryPatches>>;
20
+ readonly mutate: (mutations: ReadonlyArray<Mutation>, queriesToRefresh: ReadonlyArray<Query>) => Effect.Effect<ReadonlyArray<QueryPatches>, TimestampTimeOutOfRangeError | TimestampDriftError | TimestampCounterOverflowError, Config>;
21
+ readonly resetOwner: () => Effect.Effect<void>;
22
+ readonly restoreOwner: (schema: DbSchema, mnemonic: Mnemonic) => Effect.Effect<void>;
23
+ readonly ensureSchema: (schema: DbSchema) => Effect.Effect<void>;
24
+ readonly sync: (queriesToRefresh: ReadonlyArray<Query>) => Effect.Effect<ReadonlyArray<QueryPatches>, never, Config>;
25
+ }
26
+ export interface DbSchema {
27
+ readonly tables: ReadonlyArray<Table>;
28
+ readonly indexes: ReadonlyArray<Index>;
29
+ }
30
+ export interface Table {
31
+ readonly name: string;
32
+ readonly columns: ReadonlyArray<string>;
33
+ }
34
+ export declare const Index: S.Struct<{
35
+ name: S.$String;
36
+ sql: S.$String;
45
37
  }>;
46
- type TableFields = Record<string, S.Schema<any>>;
47
- type ValidateFieldsTypes<Fields extends TableFields> = keyof Fields extends infer K ? K extends keyof Fields ? Fields[K] extends TableFields ? ValidateFieldsTypes<Fields[K]> : Fields[K] extends S.Schema<infer A, infer _I> ? A extends Value ? true : false : never : never : never;
48
- type ValidateFieldsNames<Fields extends TableFields> = keyof Fields extends infer K ? K extends keyof Fields ? K extends "createdAt" | "updatedAt" | "isDeleted" ? false : true : never : never;
49
- type ValidateFieldsHasId<Fields extends TableFields> = "id" extends keyof Fields ? true : false;
50
- /**
51
- * Create database schema.
52
- *
53
- * Tables with a name prefixed with _ are local-only, which means they are not
54
- * synced. Local-only tables are useful for device-specific or temporal data.
55
- *
56
- * @example
57
- * const Database = database({
58
- * // A local-only table.
59
- * _todo: TodoTable,
60
- * todo: TodoTable,
61
- * todoCategory: TodoCategoryTable,
62
- * });
63
- * type Database = S.Schema.Type<typeof Database>;
64
- */
65
- export declare const database: typeof S.struct;
38
+ export type Index = S.Schema.Type<typeof Index>;
39
+ export interface Mutation {
40
+ readonly table: string;
41
+ readonly id: Id;
42
+ readonly values: Record.ReadonlyRecord<string, Value | Date | boolean | undefined>;
43
+ readonly isInsert: boolean;
44
+ }
45
+ export interface NotSupportedPlatformError {
46
+ readonly _tag: "NotSupportedPlatformError";
47
+ }
66
48
  declare const __queryBrand: unique symbol;
67
49
  /**
68
- * The query is an SQL query serialized as a string with a branded type
69
- * representing a row it returns.
50
+ * Query is SQL query serialized as a string with a branded type representing a
51
+ * row it returns.
70
52
  */
71
53
  export type Query<R extends Row = Row> = string & Brand.Brand<"Query"> & {
72
54
  readonly [__queryBrand]: R;
73
55
  };
74
- export type Queries<R extends Row = Row> = ReadonlyArray<Query<R>>;
75
- export declare const serializeQuery: <R extends Row>({ sql, parameters, options, }: SqliteQuery) => Query<R>;
76
- export declare const deserializeQuery: <R extends Row>(query: Query<R>) => SqliteQuery;
77
56
  export type Row = {
78
57
  [key: string]: Value | Row | ReadonlyArray<Row>;
79
58
  };
59
+ declare const DbFactory_base: Context.TagClass<DbFactory, "DbFactory", {
60
+ readonly createDb: Effect.Effect<Db>;
61
+ }>;
62
+ export declare class DbFactory extends DbFactory_base {
63
+ }
64
+ export declare const createDb: Effect.Effect<Db, never, SqliteFactory | Bip39 | NanoIdGenerator | Time | SyncFactory | SyncLock>;
65
+ export interface Callbacks {
66
+ readonly onError: (error: EvoluError) => void;
67
+ readonly onSyncStateChange: (state: SyncState) => void;
68
+ readonly onReceive: () => void;
69
+ }
70
+ export declare const Callbacks: Context.Tag<Callbacks, Callbacks>;
71
+ export type QueryRowsMap = ReadonlyMap<Query, ReadonlyArray<Row>>;
72
+ export declare const upsertValueIntoTableRowColumn: (message: NewMessage, messages: ReadonlyArray<NewMessage>, millis: Millis) => Effect.Effect<SqliteExecResult, never, Sqlite>;
73
+ export declare const serializeQuery: <R extends Row>({ sql, parameters, options, }: SqliteQuery) => Query<R>;
74
+ export declare const deserializeQuery: <R extends Row>(query: Query<R>) => SqliteQuery;
80
75
  /**
81
76
  * Extract {@link Row} from {@link Query} instance.
82
77
  *
@@ -98,6 +93,7 @@ export interface QueryResult<R extends Row = Row> {
98
93
  */
99
94
  readonly row: Readonly<Kysely.Simplify<R>> | null;
100
95
  }
96
+ export type Queries<R extends Row = Row> = ReadonlyArray<Query<R>>;
101
97
  export type QueryResultsFromQueries<Q extends Queries> = {
102
98
  [P in keyof Q]: Q[P] extends Query<infer R> ? QueryResult<R> : never;
103
99
  };
@@ -105,22 +101,6 @@ export type QueryResultsPromisesFromQueries<Q extends Queries> = {
105
101
  [P in keyof Q]: Q[P] extends Query<infer R> ? Promise<QueryResult<R>> : never;
106
102
  };
107
103
  export declare const queryResultFromRows: <R extends Row>(rows: ReadonlyArray<R>) => QueryResult<R>;
108
- export declare const schemaToTables: (schema: S.Schema<any>) => ReadonlyArray<Table>;
109
- export declare const transaction: <R, E, A>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Sqlite | R>;
110
- export interface NoSuchTableOrColumnError {
111
- readonly _tag: "NoSuchTableOrColumnError";
112
- }
113
- export declare const SqliteNoSuchTableOrColumnError: S.struct<{
114
- message: S.union<[S.Schema<string, string, never>, S.Schema<string, string, never>, S.Schema<string, string, never>]>;
115
- }>;
116
- export type SqliteNoSuchTableOrColumnError = S.Schema.Type<typeof SqliteNoSuchTableOrColumnError>;
117
- export declare const someDefectToNoSuchTableOrColumnError: <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, NoSuchTableOrColumnError | E, R>;
118
- export declare const lazyInit: (mnemonic?: Mnemonic) => Effect.Effect<Owner, never, Sqlite | Bip39 | NanoIdGenerator>;
119
- export declare const ensureSchema: (schema: SqliteSchema) => Effect.Effect<void, never, Sqlite>;
120
- export declare const dropAllTables: Effect.Effect<void, never, Sqlite>;
121
- export type RowsStore = Store<RowsStoreValue>;
122
- export declare const RowsStore: Context.Tag<RowsStore, RowsStore>;
123
- type RowsStoreValue = ReadonlyMap<Query, ReadonlyArray<Row>>;
124
- export declare const RowsStoreLive: Layer.Layer<RowsStore, never, never>;
104
+ export declare const notSupportedPlatformWorker: Db;
125
105
  export {};
126
106
  //# sourceMappingURL=Db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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"}