@evolu/common 3.1.8 → 4.0.1
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/Config.d.ts +6 -0
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Config.js +1 -0
- package/dist/src/Crdt.d.ts +2 -2
- package/dist/src/Crdt.d.ts.map +1 -1
- package/dist/src/Crdt.js +2 -2
- package/dist/src/Crypto.d.ts +5 -4
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +2 -2
- package/dist/src/Db.d.ts +2 -2
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +5 -7
- package/dist/src/DbWorker.d.ts +8 -8
- package/dist/src/DbWorker.d.ts.map +1 -1
- package/dist/src/DbWorker.js +44 -28
- package/dist/src/Evolu.d.ts +4 -5
- package/dist/src/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu.js +10 -13
- package/dist/src/OnCompletes.d.ts +3 -3
- package/dist/src/OnCompletes.d.ts.map +1 -1
- package/dist/src/OnCompletes.js +3 -3
- package/dist/src/Platform.d.ts +3 -1
- package/dist/src/Platform.d.ts.map +1 -1
- package/dist/src/Platform.js +1 -0
- package/dist/src/Sql.d.ts +10 -10
- package/dist/src/Sql.d.ts.map +1 -1
- package/dist/src/Sql.js +48 -47
- package/dist/src/Sqlite.d.ts +3 -2
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +11 -0
- package/dist/src/SyncWorker.d.ts +3 -4
- package/dist/src/SyncWorker.d.ts.map +1 -1
- package/dist/src/SyncWorker.js +1 -1
- package/dist/src/Types.d.ts +13 -0
- package/dist/src/Types.d.ts.map +1 -0
- package/dist/src/Types.js +1 -0
- package/package.json +5 -5
- package/src/Config.ts +8 -0
- package/src/Crdt.ts +2 -2
- package/src/Crypto.ts +11 -7
- package/src/Db.ts +9 -11
- package/src/DbWorker.ts +54 -44
- package/src/Evolu.ts +23 -18
- package/src/OnCompletes.ts +4 -4
- package/src/Platform.ts +6 -5
- package/src/Sql.ts +52 -49
- package/src/Sqlite.ts +18 -2
- package/src/SyncWorker.ts +4 -6
- package/src/Types.ts +11 -0
package/dist/src/Config.d.ts
CHANGED
|
@@ -13,6 +13,12 @@ export interface Config {
|
|
|
13
13
|
* 1000 (5 minutes).
|
|
14
14
|
*/
|
|
15
15
|
readonly maxDrift: number;
|
|
16
|
+
/**
|
|
17
|
+
* Evolu application name. For now, this is only useful for localhost
|
|
18
|
+
* development, where we want each application to have its own database. The
|
|
19
|
+
* default value is: "Evolu".
|
|
20
|
+
*/
|
|
21
|
+
readonly name: string;
|
|
16
22
|
}
|
|
17
23
|
export declare const Config: Context.Tag<Config, Config>;
|
|
18
24
|
export declare const ConfigLive: (config?: Partial<Config>) => Layer.Layer<Config>;
|
package/dist/src/Config.d.ts.map
CHANGED
|
@@ -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;AAEtC,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;
|
|
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;AAEtC,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;CACvB;AAED,eAAO,MAAM,MAAM,6BAAiD,CAAC;AAErE,eAAO,MAAM,UAAU,YAAa,QAAQ,MAAM,CAAC,KAAG,WAAW,CAAC,MAAM,CAUrE,CAAC"}
|
package/dist/src/Config.js
CHANGED
package/dist/src/Crdt.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import * as Effect from "effect/Effect";
|
|
|
5
5
|
import * as Layer from "effect/Layer";
|
|
6
6
|
import * as Option from "effect/Option";
|
|
7
7
|
import { Config } from "./Config.js";
|
|
8
|
-
import {
|
|
8
|
+
import { NanoIdGenerator, NodeId } from "./Crypto.js";
|
|
9
9
|
export interface Timestamp {
|
|
10
10
|
readonly node: NodeId;
|
|
11
11
|
readonly millis: Millis;
|
|
@@ -33,7 +33,7 @@ export declare const timestampToString: (t: Timestamp) => TimestampString;
|
|
|
33
33
|
export declare const unsafeTimestampFromString: (s: TimestampString) => Timestamp;
|
|
34
34
|
export declare const timestampToHash: (t: Timestamp) => TimestampHash;
|
|
35
35
|
export declare const makeSyncTimestamp: (millis?: Millis) => Timestamp;
|
|
36
|
-
export declare const makeInitialTimestamp: Effect.Effect<Timestamp, never,
|
|
36
|
+
export declare const makeInitialTimestamp: Effect.Effect<Timestamp, never, NanoIdGenerator>;
|
|
37
37
|
export interface Time {
|
|
38
38
|
readonly now: Effect.Effect<Millis, TimestampTimeOutOfRangeError>;
|
|
39
39
|
}
|
package/dist/src/Crdt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Crdt.d.ts","sourceRoot":"","sources":["../../src/Crdt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Crdt.d.ts","sourceRoot":"","sources":["../../src/Crdt.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Crdt.js
CHANGED
|
@@ -9,7 +9,7 @@ import * as Option from "effect/Option";
|
|
|
9
9
|
import * as ReadonlyArray from "effect/ReadonlyArray";
|
|
10
10
|
import * as String from "effect/String";
|
|
11
11
|
import { Config } from "./Config.js";
|
|
12
|
-
import {
|
|
12
|
+
import { NanoIdGenerator, NodeId } from "./Crypto.js";
|
|
13
13
|
import { murmurhash } from "./Murmurhash.js";
|
|
14
14
|
export const AllowedTimeRange = {
|
|
15
15
|
greaterThan: 860934419999,
|
|
@@ -46,7 +46,7 @@ export const makeSyncTimestamp = (millis = initialMillis) => ({
|
|
|
46
46
|
counter: initialCounter,
|
|
47
47
|
node: syncNodeId,
|
|
48
48
|
});
|
|
49
|
-
export const makeInitialTimestamp =
|
|
49
|
+
export const makeInitialTimestamp = NanoIdGenerator.pipe(Effect.flatMap(({ nanoidAsNodeId }) => nanoidAsNodeId), Effect.map((node) => ({
|
|
50
50
|
millis: initialMillis,
|
|
51
51
|
counter: initialCounter,
|
|
52
52
|
node,
|
package/dist/src/Crypto.d.ts
CHANGED
|
@@ -20,14 +20,15 @@ export interface InvalidMnemonicError {
|
|
|
20
20
|
* provide a human-readable way of storing a private key.
|
|
21
21
|
*/
|
|
22
22
|
export type Mnemonic = string & Brand.Brand<"Mnemonic">;
|
|
23
|
-
export interface
|
|
24
|
-
readonly nanoid: Effect.Effect<
|
|
23
|
+
export interface NanoIdGenerator {
|
|
24
|
+
readonly nanoid: Effect.Effect<NanoId>;
|
|
25
25
|
readonly nanoidAsNodeId: Effect.Effect<NodeId>;
|
|
26
26
|
}
|
|
27
|
-
export declare const
|
|
27
|
+
export declare const NanoIdGenerator: Context.Tag<NanoIdGenerator, NanoIdGenerator>;
|
|
28
|
+
export type NanoId = string & Brand.Brand<"NanoId">;
|
|
28
29
|
export declare const NodeId: S.BrandSchema<string & Brand.Brand<"NodeId">, string, never>;
|
|
29
30
|
export type NodeId = S.Schema.To<typeof NodeId>;
|
|
30
|
-
export declare const
|
|
31
|
+
export declare const NanoIdGeneratorLive: Layer.Layer<NanoIdGenerator, never, never>;
|
|
31
32
|
export declare const slip21Derive: (seed: Uint8Array, path: ReadonlyArray<string>) => Effect.Effect<Uint8Array>;
|
|
32
33
|
/** Alias to xsalsa20poly1305, for compatibility with libsodium/nacl */
|
|
33
34
|
export interface SecretBox {
|
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,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,
|
|
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,8DAGlB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,CAAC;AAIhD,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"}
|
package/dist/src/Crypto.js
CHANGED
|
@@ -9,10 +9,10 @@ import * as Effect from "effect/Effect";
|
|
|
9
9
|
import * as Layer from "effect/Layer";
|
|
10
10
|
import { customAlphabet, nanoid } from "nanoid";
|
|
11
11
|
export const Bip39 = Context.GenericTag("@services/Bip39");
|
|
12
|
-
export const
|
|
12
|
+
export const NanoIdGenerator = Context.GenericTag("@services/NanoIdGenerator");
|
|
13
13
|
export const NodeId = S.string.pipe(S.pattern(/^[\w-]{16}$/), S.brand("NodeId"));
|
|
14
14
|
const nanoidForNodeId = customAlphabet("0123456789abcdef", 16);
|
|
15
|
-
export const
|
|
15
|
+
export const NanoIdGeneratorLive = Layer.succeed(NanoIdGenerator, NanoIdGenerator.of({
|
|
16
16
|
nanoid: Effect.sync(() => nanoid()),
|
|
17
17
|
nanoidAsNodeId: Effect.sync(() => nanoidForNodeId()),
|
|
18
18
|
}));
|
package/dist/src/Db.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import * as ReadonlyArray from "effect/ReadonlyArray";
|
|
|
7
7
|
import * as ReadonlyRecord from "effect/ReadonlyRecord";
|
|
8
8
|
import * as Types from "effect/Types";
|
|
9
9
|
import * as Kysely from "kysely";
|
|
10
|
-
import { Bip39, Mnemonic,
|
|
10
|
+
import { Bip39, Mnemonic, NanoIdGenerator } from "./Crypto.js";
|
|
11
11
|
import { EvoluTypeError } from "./ErrorStore.js";
|
|
12
12
|
import { Id } from "./Model.js";
|
|
13
13
|
import { Owner } from "./Owner.js";
|
|
@@ -134,7 +134,7 @@ export declare const SqliteNoSuchTableOrColumnError: S.Schema<{
|
|
|
134
134
|
}, never>;
|
|
135
135
|
export type SqliteNoSuchTableOrColumnError = S.Schema.To<typeof SqliteNoSuchTableOrColumnError>;
|
|
136
136
|
export declare const someDefectToNoSuchTableOrColumnError: <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, NoSuchTableOrColumnError | E, R>;
|
|
137
|
-
export declare const lazyInit: (mnemonic?: Mnemonic) => Effect.Effect<Owner, never, Sqlite | Bip39 |
|
|
137
|
+
export declare const lazyInit: (mnemonic?: Mnemonic) => Effect.Effect<Owner, never, Sqlite | Bip39 | NanoIdGenerator>;
|
|
138
138
|
export declare const ensureSchema: (tables: Tables) => Effect.Effect<void, never, Sqlite>;
|
|
139
139
|
export type RowsStore = Store<RowsStoreValue>;
|
|
140
140
|
export declare const RowsStore: Context.Tag<RowsStore, RowsStore>;
|
package/dist/src/Db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Db.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as AST from "@effect/schema/AST";
|
|
2
2
|
import * as S from "@effect/schema/Schema";
|
|
3
3
|
import { make } from "@effect/schema/Schema";
|
|
4
|
-
import { bytesToHex } from "@noble/ciphers/utils";
|
|
5
4
|
import * as Context from "effect/Context";
|
|
6
5
|
import * as Effect from "effect/Effect";
|
|
7
6
|
import * as Exit from "effect/Exit";
|
|
@@ -111,7 +110,7 @@ export const schemaToTables = (schema) => pipe(getPropertySignatures(schema), Re
|
|
|
111
110
|
name,
|
|
112
111
|
columns: Object.keys(getPropertySignatures(schema)),
|
|
113
112
|
})));
|
|
114
|
-
export const transaction = (effect) => Effect.flatMap(Sqlite, (sqlite) => Effect.acquireUseRelease(sqlite.exec("
|
|
113
|
+
export const transaction = (effect) => Effect.flatMap(Sqlite, (sqlite) => Effect.acquireUseRelease(sqlite.exec("begin"), () => effect, (_, exit) => Exit.isFailure(exit) ? sqlite.exec("rollback") : sqlite.exec("end")));
|
|
115
114
|
export const SqliteNoSuchTableOrColumnError = S.struct({
|
|
116
115
|
message: S.union(S.string.pipe(S.includes("no such table")), S.string.pipe(S.includes("no such column")), S.string.pipe(S.includes("has no column"))),
|
|
117
116
|
});
|
|
@@ -133,8 +132,7 @@ export const lazyInit = (mnemonic) => Effect.gen(function* (_) {
|
|
|
133
132
|
parameters: [
|
|
134
133
|
owner.id,
|
|
135
134
|
owner.mnemonic,
|
|
136
|
-
|
|
137
|
-
bytesToHex(owner.encryptionKey),
|
|
135
|
+
owner.encryptionKey,
|
|
138
136
|
timestampToString(initialTimestampString),
|
|
139
137
|
merkleTreeToString(initialMerkleTree),
|
|
140
138
|
],
|
|
@@ -142,15 +140,15 @@ export const lazyInit = (mnemonic) => Effect.gen(function* (_) {
|
|
|
142
140
|
]));
|
|
143
141
|
return owner;
|
|
144
142
|
});
|
|
145
|
-
const getTables = Sqlite.pipe(Effect.flatMap((sqlite) => sqlite.exec(`
|
|
143
|
+
const getTables = Sqlite.pipe(Effect.flatMap((sqlite) => sqlite.exec(`select "name" from "sqlite_schema" where "type" = 'table'`)), Effect.map((result) => result.rows), Effect.map(ReadonlyArray.map((row) => row.name + "")), Effect.map(ReadonlyArray.filter(Predicate.not(String.startsWith("__")))), Effect.map(ReadonlyArray.dedupeWith(String.Equivalence)));
|
|
146
144
|
const updateTable = ({ name, columns, }) => Effect.gen(function* (_) {
|
|
147
145
|
const sqlite = yield* _(Sqlite);
|
|
148
|
-
const sql = yield* _(sqlite.exec(`
|
|
146
|
+
const sql = yield* _(sqlite.exec(`pragma table_info (${name})`), Effect.map((result) => result.rows), Effect.map(ReadonlyArray.map((row) => row.name)), Effect.map((existingColumns) => ReadonlyArray.differenceWith(String.Equivalence)(existingColumns)(columns)), Effect.map(ReadonlyArray.map((newColumn) => `alter table "${name}" add column "${newColumn}" blob;`)), Effect.map(ReadonlyArray.join("")));
|
|
149
147
|
if (sql)
|
|
150
148
|
yield* _(sqlite.exec(sql));
|
|
151
149
|
});
|
|
152
150
|
const createTable = ({ name, columns, }) => Effect.flatMap(Sqlite, (sqlite) => sqlite.exec(`
|
|
153
|
-
|
|
151
|
+
create table ${name} (
|
|
154
152
|
"id" text primary key,
|
|
155
153
|
${columns
|
|
156
154
|
.filter((c) => c !== "id")
|
package/dist/src/DbWorker.d.ts
CHANGED
|
@@ -4,18 +4,19 @@ import * as Layer from "effect/Layer";
|
|
|
4
4
|
import * as ReadonlyArray from "effect/ReadonlyArray";
|
|
5
5
|
import * as ReadonlyRecord from "effect/ReadonlyRecord";
|
|
6
6
|
import { Config } from "./Config.js";
|
|
7
|
-
import {
|
|
7
|
+
import { Millis } from "./Crdt.js";
|
|
8
|
+
import { Bip39, Mnemonic, NanoIdGenerator } from "./Crypto.js";
|
|
8
9
|
import { Queries, Query, Tables } from "./Db.js";
|
|
9
10
|
import { QueryPatches } from "./Diff.js";
|
|
10
11
|
import { EvoluError } from "./ErrorStore.js";
|
|
11
|
-
import { Id
|
|
12
|
+
import { Id } from "./Model.js";
|
|
12
13
|
import { OnCompleteId } from "./OnCompletes.js";
|
|
13
14
|
import { Owner } from "./Owner.js";
|
|
15
|
+
import { DbWorkerLock } from "./Platform.js";
|
|
14
16
|
import { Sqlite, Value } from "./Sqlite.js";
|
|
15
17
|
import { NewMessage, SyncState, SyncWorker, SyncWorkerOutputSyncResponse } from "./SyncWorker.js";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
onMessage: (output: DbWorkerOutput) => void;
|
|
18
|
+
import { Messaging } from "./Types.js";
|
|
19
|
+
export interface DbWorker extends Messaging<DbWorkerInput, DbWorkerOutput> {
|
|
19
20
|
}
|
|
20
21
|
export declare const DbWorker: Context.Tag<DbWorker, DbWorker>;
|
|
21
22
|
export type DbWorkerInput = DbWorkerInputInit | DbWorkerInputQuery | DbWorkerInputMutate | DbWorkerInputSync | DbWorkerInputReset | DbWorkerInputEnsureSchema | SyncWorkerOutputSyncResponse;
|
|
@@ -73,11 +74,10 @@ export interface Mutation {
|
|
|
73
74
|
readonly id: Id;
|
|
74
75
|
readonly values: ReadonlyRecord.ReadonlyRecord<string, Value | Date | boolean | undefined>;
|
|
75
76
|
readonly isInsert: boolean;
|
|
76
|
-
readonly now: SqliteDate;
|
|
77
77
|
readonly onCompleteId: OnCompleteId | null;
|
|
78
78
|
}
|
|
79
79
|
export declare const mutationsToNewMessages: (mutations: ReadonlyArray<Mutation>) => ReadonlyArray<NewMessage>;
|
|
80
|
-
export declare const upsertValueIntoTableRowColumn: (message: NewMessage, messages: ReadonlyArray<NewMessage
|
|
81
|
-
export declare const
|
|
80
|
+
export declare const upsertValueIntoTableRowColumn: (message: NewMessage, messages: ReadonlyArray<NewMessage>, millis: Millis) => Effect.Effect<void, never, Sqlite>;
|
|
81
|
+
export declare const DbWorkerCommonLive: Layer.Layer<DbWorker, never, Bip39 | NanoIdGenerator | Sqlite | DbWorkerLock | SyncWorker>;
|
|
82
82
|
export {};
|
|
83
83
|
//# sourceMappingURL=DbWorker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbWorker.d.ts","sourceRoot":"","sources":["../../src/DbWorker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DbWorker.d.ts","sourceRoot":"","sources":["../../src/DbWorker.ts"],"names":[],"mappings":"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"}
|
package/dist/src/DbWorker.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { hexToBytes } from "@noble/ciphers/utils";
|
|
2
1
|
import * as Context from "effect/Context";
|
|
3
2
|
import * as Effect from "effect/Effect";
|
|
4
3
|
import * as Function from "effect/Function";
|
|
@@ -9,12 +8,13 @@ import * as Option from "effect/Option";
|
|
|
9
8
|
import * as ReadonlyArray from "effect/ReadonlyArray";
|
|
10
9
|
import { Config, ConfigLive } from "./Config.js";
|
|
11
10
|
import { Time, TimeLive, diffMerkleTrees, insertIntoMerkleTree, makeSyncTimestamp, merkleTreeToString, receiveTimestamp, sendTimestamp, timestampToString, unsafeTimestampFromString, } from "./Crdt.js";
|
|
12
|
-
import { Bip39,
|
|
11
|
+
import { Bip39, NanoIdGenerator } from "./Crypto.js";
|
|
13
12
|
import { RowsStore, RowsStoreLive, deserializeQuery, ensureSchema, lazyInit, someDefectToNoSuchTableOrColumnError, transaction, } from "./Db.js";
|
|
14
13
|
import { makePatches } from "./Diff.js";
|
|
15
14
|
import { makeUnexpectedError } from "./ErrorStore.js";
|
|
16
15
|
import { cast } from "./Model.js";
|
|
17
16
|
import { Owner } from "./Owner.js";
|
|
17
|
+
import { DbWorkerLock } from "./Platform.js";
|
|
18
18
|
import * as Sql from "./Sql.js";
|
|
19
19
|
import { Sqlite } from "./Sqlite.js";
|
|
20
20
|
import { NewMessageEquivalence, SyncWorker, SyncWorkerPostMessage, } from "./SyncWorker.js";
|
|
@@ -25,8 +25,7 @@ const init = Effect.gen(function* (_) {
|
|
|
25
25
|
return yield* _(sqlite.exec(Sql.selectOwner), Effect.map(({ rows: [row] }) => ({
|
|
26
26
|
id: row.id,
|
|
27
27
|
mnemonic: row.mnemonic,
|
|
28
|
-
|
|
29
|
-
encryptionKey: hexToBytes(row.encryptionKey),
|
|
28
|
+
encryptionKey: row.encryptionKey,
|
|
30
29
|
})), someDefectToNoSuchTableOrColumnError, Effect.catchTag("NoSuchTableOrColumnError", () => lazyInit()));
|
|
31
30
|
});
|
|
32
31
|
const query = ({ queries, onCompleteIds = [], }) => Effect.gen(function* (_) {
|
|
@@ -44,23 +43,27 @@ const query = ({ queries, onCompleteIds = [], }) => Effect.gen(function* (_) {
|
|
|
44
43
|
}));
|
|
45
44
|
dbWorkerOnMessage({ _tag: "onQuery", queriesPatches, onCompleteIds });
|
|
46
45
|
});
|
|
47
|
-
const readTimestampAndMerkleTree = Sqlite.pipe(Effect.flatMap((sqlite) => sqlite.exec(Sql.selectOwnerTimestampAndMerkleTree)), Effect.map((
|
|
46
|
+
const readTimestampAndMerkleTree = Sqlite.pipe(Effect.flatMap((sqlite) => sqlite.exec(Sql.selectOwnerTimestampAndMerkleTree)), Effect.map(({ rows: [{ timestamp, merkleTree }] }) => ({
|
|
48
47
|
timestamp: unsafeTimestampFromString(timestamp),
|
|
49
48
|
merkleTree: merkleTree,
|
|
50
49
|
})));
|
|
51
|
-
export const mutationsToNewMessages = (mutations) => pipe(mutations, ReadonlyArray.map(({ id, isInsert,
|
|
50
|
+
export const mutationsToNewMessages = (mutations) => pipe(mutations, ReadonlyArray.map(({ id, isInsert, table, values }) => pipe(Object.entries(values),
|
|
51
|
+
// Filter values.
|
|
52
|
+
ReadonlyArray.filterMap(([key, value]) =>
|
|
52
53
|
// The value can be undefined if exactOptionalPropertyTypes isn't true.
|
|
53
54
|
// Don't insert nulls because null is the default value.
|
|
54
55
|
value === undefined || (isInsert && value == null)
|
|
55
56
|
? Option.none()
|
|
56
|
-
: Option.some([key, value])),
|
|
57
|
+
: Option.some([key, value])),
|
|
58
|
+
// Cast values.
|
|
59
|
+
ReadonlyArray.map(([key, value]) => [
|
|
57
60
|
key,
|
|
58
61
|
typeof value === "boolean"
|
|
59
62
|
? cast(value)
|
|
60
63
|
: value instanceof Date
|
|
61
64
|
? cast(value)
|
|
62
65
|
: value,
|
|
63
|
-
]), ReadonlyArray.
|
|
66
|
+
]), ReadonlyArray.map(([key, value]) => ({
|
|
64
67
|
table,
|
|
65
68
|
row: id,
|
|
66
69
|
column: key,
|
|
@@ -73,7 +76,7 @@ const ensureSchemaByNewMessages = (messages) => Effect.gen(function* (_) {
|
|
|
73
76
|
if (table == null) {
|
|
74
77
|
tablesMap.set(message.table, {
|
|
75
78
|
name: message.table,
|
|
76
|
-
columns: [message.column],
|
|
79
|
+
columns: [message.column, "createdAt", "updatedAt"],
|
|
77
80
|
});
|
|
78
81
|
return;
|
|
79
82
|
}
|
|
@@ -86,11 +89,19 @@ const ensureSchemaByNewMessages = (messages) => Effect.gen(function* (_) {
|
|
|
86
89
|
});
|
|
87
90
|
yield* _(ensureSchema(Array.from(tablesMap.values())));
|
|
88
91
|
});
|
|
89
|
-
export const upsertValueIntoTableRowColumn = (message, messages) => Effect.gen(function* (_) {
|
|
92
|
+
export const upsertValueIntoTableRowColumn = (message, messages, millis) => Effect.gen(function* (_) {
|
|
90
93
|
const sqlite = yield* _(Sqlite);
|
|
94
|
+
const createdAtOrUpdatedAt = cast(new Date(millis));
|
|
91
95
|
const insert = sqlite.exec({
|
|
92
96
|
sql: Sql.upsertValueIntoTableRowColumn(message.table, message.column),
|
|
93
|
-
parameters: [
|
|
97
|
+
parameters: [
|
|
98
|
+
message.row,
|
|
99
|
+
message.value,
|
|
100
|
+
createdAtOrUpdatedAt,
|
|
101
|
+
createdAtOrUpdatedAt,
|
|
102
|
+
message.value,
|
|
103
|
+
createdAtOrUpdatedAt,
|
|
104
|
+
],
|
|
94
105
|
});
|
|
95
106
|
yield* _(insert, someDefectToNoSuchTableOrColumnError, Effect.catchTag("NoSuchTableOrColumnError", () =>
|
|
96
107
|
// If one message fails, we ensure schema for all messages.
|
|
@@ -104,7 +115,8 @@ const applyMessages = ({ merkleTree, messages, }) => Effect.gen(function* (_) {
|
|
|
104
115
|
parameters: [message.table, message.row, message.column],
|
|
105
116
|
}), Effect.map((result) => result.rows), Effect.flatMap(ReadonlyArray.head), Effect.map((row) => row.timestamp), Effect.catchTag("NoSuchElementException", () => Effect.succeed(null)));
|
|
106
117
|
if (timestamp == null || timestamp < message.timestamp) {
|
|
107
|
-
|
|
118
|
+
const { millis } = unsafeTimestampFromString(message.timestamp);
|
|
119
|
+
yield* _(upsertValueIntoTableRowColumn(message, messages, millis));
|
|
108
120
|
}
|
|
109
121
|
if (timestamp == null || timestamp !== message.timestamp) {
|
|
110
122
|
const { changes } = yield* _(sqlite.exec({
|
|
@@ -135,7 +147,11 @@ const writeTimestampAndMerkleTree = ({ timestamp, merkleTree, }) => Effect.flatM
|
|
|
135
147
|
const mutate = ({ mutations, queries, }) => Effect.gen(function* (_) {
|
|
136
148
|
const [toSync, localOnly] = ReadonlyArray.partition(mutations, (item) => item.table.startsWith("_"));
|
|
137
149
|
const [toUpsert, toDelete] = ReadonlyArray.partition(localOnly, (item) => mutationsToNewMessages([item]).some((message) => message.column === "isDeleted" && message.value === 1)).map(mutationsToNewMessages);
|
|
138
|
-
yield* _(
|
|
150
|
+
const time = yield* _(Time);
|
|
151
|
+
for (const messageToUpsert of toUpsert) {
|
|
152
|
+
const now = yield* _(time.now);
|
|
153
|
+
yield* _(upsertValueIntoTableRowColumn(messageToUpsert, toUpsert, now));
|
|
154
|
+
}
|
|
139
155
|
const { exec } = yield* _(Sqlite);
|
|
140
156
|
yield* _(Effect.forEach(toDelete, ({ table, row }) => exec({ sql: Sql.deleteTableRow(table), parameters: [row] })));
|
|
141
157
|
if (toSync.length > 0) {
|
|
@@ -209,7 +225,8 @@ const handleSyncResponse = ({ messages, ...response }) => Effect.gen(function* (
|
|
|
209
225
|
const sync = ({ queries, }) => Effect.gen(function* (_) {
|
|
210
226
|
if (queries.length > 0)
|
|
211
227
|
yield* _(query({ queries }));
|
|
212
|
-
|
|
228
|
+
const syncWorkerPostMessage = yield* _(SyncWorkerPostMessage);
|
|
229
|
+
syncWorkerPostMessage({
|
|
213
230
|
_tag: "sync",
|
|
214
231
|
...(yield* _(readTimestampAndMerkleTree)),
|
|
215
232
|
syncUrl: (yield* _(Config)).syncUrl,
|
|
@@ -231,7 +248,7 @@ const reset = (input) => Effect.gen(function* (_) {
|
|
|
231
248
|
const onMessage = yield* _(DbWorkerOnMessage);
|
|
232
249
|
onMessage({ _tag: "onResetOrRestore" });
|
|
233
250
|
});
|
|
234
|
-
export const
|
|
251
|
+
export const DbWorkerCommonLive = Layer.effect(DbWorker, Effect.gen(function* (_) {
|
|
235
252
|
const syncWorker = yield* _(SyncWorker);
|
|
236
253
|
const onError = (error) => Effect.sync(() => {
|
|
237
254
|
dbWorker.onMessage({ _tag: "onError", error });
|
|
@@ -242,23 +259,23 @@ export const DbWorkerLive = Layer.effect(DbWorker, Effect.gen(function* (_) {
|
|
|
242
259
|
onError(output).pipe(Effect.runSync);
|
|
243
260
|
break;
|
|
244
261
|
case "SyncWorkerOutputSyncResponse":
|
|
245
|
-
postMessage(output);
|
|
262
|
+
dbWorker.postMessage(output);
|
|
246
263
|
break;
|
|
247
264
|
default:
|
|
248
265
|
dbWorker.onMessage({ _tag: "onSyncState", state: output });
|
|
249
266
|
}
|
|
250
267
|
};
|
|
251
|
-
const runContext = Context.empty().pipe(Context.add(Sqlite, yield* _(Sqlite)), Context.add(Bip39, yield* _(Bip39)), Context.add(
|
|
268
|
+
const runContext = Context.empty().pipe(Context.add(Sqlite, yield* _(Sqlite)), Context.add(Bip39, yield* _(Bip39)), Context.add(NanoIdGenerator, yield* _(NanoIdGenerator)), Context.add(DbWorkerOnMessage, (output) => {
|
|
252
269
|
dbWorker.onMessage(output);
|
|
253
270
|
}));
|
|
254
271
|
const run = (effect) => effect.pipe(Effect.catchAllDefect(makeUnexpectedError), transaction, Effect.catchAll(onError), Effect.provide(runContext), Effect.runPromise);
|
|
255
|
-
|
|
256
|
-
const
|
|
272
|
+
/** If init fails, we have to allow reset at least. */
|
|
273
|
+
const handleInputForInitFail = (input) => {
|
|
257
274
|
if (input._tag !== "reset")
|
|
258
275
|
return Promise.resolve(undefined);
|
|
259
276
|
return reset(input).pipe(run);
|
|
260
277
|
};
|
|
261
|
-
const
|
|
278
|
+
const makeHandleInputForInitSuccess = (config, owner) => {
|
|
262
279
|
let skipAllBecauseOfReset = false;
|
|
263
280
|
const layer = Layer.mergeAll(ConfigLive(config), Layer.succeed(Owner, owner), Layer.succeed(SyncWorkerPostMessage, syncWorker.postMessage), RowsStoreLive, TimeLive).pipe(Layer.memoize, Effect.scoped, Effect.runSync);
|
|
264
281
|
return (input) => {
|
|
@@ -278,21 +295,20 @@ export const DbWorkerLive = Layer.effect(DbWorker, Effect.gen(function* (_) {
|
|
|
278
295
|
}), Effect.provide(layer), run);
|
|
279
296
|
};
|
|
280
297
|
};
|
|
281
|
-
let
|
|
298
|
+
let handleInput = (input) => {
|
|
282
299
|
if (input._tag !== "init")
|
|
283
300
|
return run(makeUnexpectedError(new Error("init must be called first")));
|
|
284
|
-
|
|
301
|
+
handleInput = handleInputForInitFail;
|
|
285
302
|
return init.pipe(Effect.map((owner) => {
|
|
286
303
|
dbWorker.onMessage({ _tag: "onOwner", owner });
|
|
287
|
-
|
|
304
|
+
handleInput = makeHandleInputForInitSuccess(input.config, owner);
|
|
288
305
|
}), run);
|
|
289
306
|
};
|
|
290
|
-
|
|
291
|
-
const postMessage = (input) => {
|
|
292
|
-
messageQueue = messageQueue.then(() => write(input));
|
|
293
|
-
};
|
|
307
|
+
const dbWorkerLock = yield* _(DbWorkerLock);
|
|
294
308
|
const dbWorker = {
|
|
295
|
-
postMessage
|
|
309
|
+
postMessage: (input) => {
|
|
310
|
+
dbWorkerLock(() => handleInput(input));
|
|
311
|
+
},
|
|
296
312
|
onMessage: Function.constVoid,
|
|
297
313
|
};
|
|
298
314
|
return dbWorker;
|
package/dist/src/Evolu.d.ts
CHANGED
|
@@ -266,14 +266,14 @@ export interface Evolu<S extends DatabaseSchema = DatabaseSchema> {
|
|
|
266
266
|
}
|
|
267
267
|
export declare const Evolu: Context.Tag<Evolu<DatabaseSchema>, Evolu<DatabaseSchema>>;
|
|
268
268
|
type CreateQuery<S extends DatabaseSchema> = <R extends Row>(queryCallback: QueryCallback<S, R>) => Query<R>;
|
|
269
|
-
type QueryCallback<S extends DatabaseSchema, R extends Row> = (db: Pick<Kysely.Kysely<QuerySchema<S>>, "selectFrom" | "fn">) => Kysely.SelectQueryBuilder<any, any, R>;
|
|
269
|
+
type QueryCallback<S extends DatabaseSchema, R extends Row> = (db: Pick<Kysely.Kysely<QuerySchema<S>>, "selectFrom" | "fn" | "with" | "withRecursive">) => Kysely.SelectQueryBuilder<any, any, R>;
|
|
270
270
|
type QuerySchema<S extends DatabaseSchema> = {
|
|
271
|
-
readonly [Table in keyof S]:
|
|
271
|
+
readonly [Table in keyof S]: NullableExceptForIdAndAutomaticColumns<{
|
|
272
272
|
readonly [Column in keyof S[Table]]: S[Table][Column];
|
|
273
273
|
}>;
|
|
274
274
|
};
|
|
275
|
-
type
|
|
276
|
-
readonly [K in keyof T]: K extends "id" ? T[K] : T[K] | null;
|
|
275
|
+
type NullableExceptForIdAndAutomaticColumns<T> = {
|
|
276
|
+
readonly [K in keyof T]: K extends "id" | "createdAt" | "updatedAt" ? T[K] : T[K] | null;
|
|
277
277
|
};
|
|
278
278
|
export declare const makeCreateQuery: <S extends DatabaseSchema = DatabaseSchema>() => CreateQuery<S>;
|
|
279
279
|
export interface LoadingPromises {
|
|
@@ -328,7 +328,6 @@ type PartialForNullable<T, NK extends keyof T = {
|
|
|
328
328
|
type Castable<T> = {
|
|
329
329
|
readonly [K in keyof T]: T[K] extends SqliteBoolean ? boolean | SqliteBoolean : T[K] extends null | SqliteBoolean ? null | boolean | SqliteBoolean : T[K] extends SqliteDate ? Date | SqliteDate : T[K] extends null | SqliteDate ? null | Date | SqliteDate : T[K];
|
|
330
330
|
};
|
|
331
|
-
/** EvoluCommonLive has only platform independent side-effects. */
|
|
332
331
|
export declare const EvoluCommonLive: Layer.Layer<Evolu<DatabaseSchema>, never, Config | PlatformName | FlushSync | AppState | DbWorker>;
|
|
333
332
|
/**
|
|
334
333
|
* The recipe for creating Evolu for a platform and UI library:
|
package/dist/src/Evolu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../src/Evolu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAK1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAItC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../src/Evolu.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu.js
CHANGED
|
@@ -9,15 +9,14 @@ import * as Number from "effect/Number";
|
|
|
9
9
|
import * as ReadonlyArray from "effect/ReadonlyArray";
|
|
10
10
|
import * as Kysely from "kysely";
|
|
11
11
|
import { Config, ConfigLive } from "./Config.js";
|
|
12
|
-
import {
|
|
13
|
-
import { NanoId, NanoIdLive } from "./Crypto.js";
|
|
12
|
+
import { NanoIdGenerator, NanoIdGeneratorLive } from "./Crypto.js";
|
|
14
13
|
import { RowsStore, RowsStoreLive, emptyRows, queryResultFromRows, schemaToTables, serializeQuery, } from "./Db.js";
|
|
15
14
|
import { DbWorker } from "./DbWorker.js";
|
|
16
15
|
import { applyPatches } from "./Diff.js";
|
|
17
16
|
import { makeErrorStore } from "./ErrorStore.js";
|
|
18
|
-
import { cast } from "./Model.js";
|
|
19
17
|
import { OnCompletes, OnCompletesLive } from "./OnCompletes.js";
|
|
20
18
|
import { AppState, FlushSync, PlatformName } from "./Platform.js";
|
|
19
|
+
import { isSqlMutation } from "./Sqlite.js";
|
|
21
20
|
import { makeStore } from "./Store.js";
|
|
22
21
|
export const Evolu = Context.GenericTag("@services/Evolu");
|
|
23
22
|
const kysely = new Kysely.Kysely({
|
|
@@ -30,10 +29,11 @@ const kysely = new Kysely.Kysely({
|
|
|
30
29
|
createQueryCompiler: () => new Kysely.SqliteQueryCompiler(),
|
|
31
30
|
},
|
|
32
31
|
});
|
|
33
|
-
export const makeCreateQuery = () => (queryCallback) => pipe(queryCallback(kysely).compile(), ({ sql, parameters }) =>
|
|
34
|
-
sql
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
export const makeCreateQuery = () => (queryCallback) => pipe(queryCallback(kysely).compile(), ({ sql, parameters }) => {
|
|
33
|
+
if (isSqlMutation(sql))
|
|
34
|
+
throw new Error("SQL mutation (INSERT, UPDATE, DELETE, etc.) isn't allowed in the Evolu `createQuery` function. Kysely suggests it because there is no read-only Kysely yet, and removing such an API is not possible. For mutations, use Evolu mutation API.");
|
|
35
|
+
return { sql, parameters: parameters };
|
|
36
|
+
}, (query) => serializeQuery(query));
|
|
37
37
|
export const LoadingPromises = Context.GenericTag("@services/LoadingPromises");
|
|
38
38
|
export const LoadingPromiseLive = Layer.effect(LoadingPromises, Effect.gen(function* (_) {
|
|
39
39
|
const subscribedQueries = yield* _(SubscribedQueries);
|
|
@@ -155,9 +155,8 @@ export const SubscribedQueriesLive = Layer.effect(SubscribedQueries, Effect.gen(
|
|
|
155
155
|
}));
|
|
156
156
|
export const Mutate = Context.GenericTag("@services/Mutate");
|
|
157
157
|
const MutateLive = Layer.effect(Mutate, Effect.gen(function* (_) {
|
|
158
|
-
const nanoid = yield* _(
|
|
158
|
+
const { nanoid } = yield* _(NanoIdGenerator);
|
|
159
159
|
const onCompletes = yield* _(OnCompletes);
|
|
160
|
-
const time = yield* _(Time);
|
|
161
160
|
const subscribedQueries = yield* _(SubscribedQueries);
|
|
162
161
|
const loadingPromises = yield* _(LoadingPromises);
|
|
163
162
|
const dbWorker = yield* _(DbWorker);
|
|
@@ -165,7 +164,7 @@ const MutateLive = Layer.effect(Mutate, Effect.gen(function* (_) {
|
|
|
165
164
|
return Mutate.of((table, { id, ...values }, onComplete) => {
|
|
166
165
|
const isInsert = id == null;
|
|
167
166
|
if (isInsert)
|
|
168
|
-
id = Effect.runSync(nanoid
|
|
167
|
+
id = Effect.runSync(nanoid);
|
|
169
168
|
const onCompleteId = onComplete
|
|
170
169
|
? onCompletes.add(onComplete).pipe(Effect.runSync)
|
|
171
170
|
: null;
|
|
@@ -176,7 +175,6 @@ const MutateLive = Layer.effect(Mutate, Effect.gen(function* (_) {
|
|
|
176
175
|
id,
|
|
177
176
|
values,
|
|
178
177
|
isInsert,
|
|
179
|
-
now: cast(new Date(Effect.runSync(time.now))),
|
|
180
178
|
onCompleteId,
|
|
181
179
|
},
|
|
182
180
|
];
|
|
@@ -254,8 +252,7 @@ const EvoluCommon = Layer.effect(Evolu, Effect.gen(function* (_) {
|
|
|
254
252
|
platformName,
|
|
255
253
|
});
|
|
256
254
|
})).pipe(Layer.provide(Layer.mergeAll(LoadQueryLive, OnQueryLive, MutateLive)), Layer.provide(LoadingPromiseLive), Layer.provide(SubscribedQueriesLive), Layer.provide(Layer.merge(RowsStoreLive, OnCompletesLive)));
|
|
257
|
-
|
|
258
|
-
export const EvoluCommonLive = EvoluCommon.pipe(Layer.provide(Layer.merge(TimeLive, NanoIdLive)));
|
|
255
|
+
export const EvoluCommonLive = EvoluCommon.pipe(Layer.provide(NanoIdGeneratorLive));
|
|
259
256
|
/**
|
|
260
257
|
* The recipe for creating Evolu for a platform and UI library:
|
|
261
258
|
*
|
|
@@ -2,13 +2,13 @@ import * as Brand from "effect/Brand";
|
|
|
2
2
|
import * as Context from "effect/Context";
|
|
3
3
|
import * as Effect from "effect/Effect";
|
|
4
4
|
import * as Layer from "effect/Layer";
|
|
5
|
-
import { NanoId } from "./Crypto.js";
|
|
5
|
+
import { NanoId, NanoIdGenerator } from "./Crypto.js";
|
|
6
6
|
export interface OnCompletes {
|
|
7
7
|
readonly add: (onComplete: OnComplete) => Effect.Effect<OnCompleteId>;
|
|
8
8
|
readonly complete: (onCompleteIds: readonly OnCompleteId[]) => Effect.Effect<void>;
|
|
9
9
|
}
|
|
10
10
|
export type OnComplete = () => void;
|
|
11
|
-
export type OnCompleteId =
|
|
11
|
+
export type OnCompleteId = NanoId & Brand.Brand<"OnCompleteId">;
|
|
12
12
|
export declare const OnCompletes: Context.Tag<OnCompletes, OnCompletes>;
|
|
13
|
-
export declare const OnCompletesLive: Layer.Layer<OnCompletes, never,
|
|
13
|
+
export declare const OnCompletesLive: Layer.Layer<OnCompletes, never, NanoIdGenerator>;
|
|
14
14
|
//# sourceMappingURL=OnCompletes.d.ts.map
|