@evolu/common 3.1.2 → 3.1.4
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 +1 -1
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Config.js +1 -1
- package/dist/src/Crdt.d.ts +7 -7
- package/dist/src/Crdt.d.ts.map +1 -1
- package/dist/src/Crdt.js +1 -1
- package/dist/src/Crypto.d.ts +11 -11
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +3 -3
- package/dist/src/Db.d.ts +20 -20
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +1 -1
- package/dist/src/DbWorker.d.ts +2 -2
- package/dist/src/DbWorker.d.ts.map +1 -1
- package/dist/src/DbWorker.js +3 -3
- package/dist/src/ErrorStore.d.ts +2 -2
- package/dist/src/ErrorStore.d.ts.map +1 -1
- package/dist/src/Evolu.d.ts +5 -5
- package/dist/src/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu.js +6 -6
- package/dist/src/Model.d.ts +8 -8
- package/dist/src/OnCompletes.d.ts +3 -3
- package/dist/src/OnCompletes.d.ts.map +1 -1
- package/dist/src/OnCompletes.js +1 -1
- package/dist/src/Owner.d.ts +1 -1
- package/dist/src/Owner.d.ts.map +1 -1
- package/dist/src/Owner.js +1 -1
- package/dist/src/Platform.d.ts +5 -5
- package/dist/src/Platform.d.ts.map +1 -1
- package/dist/src/Platform.js +5 -5
- package/dist/src/Sqlite.d.ts +1 -1
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +1 -1
- package/dist/src/Store.d.ts +2 -2
- package/dist/src/Store.d.ts.map +1 -1
- package/dist/src/SyncWorker.d.ts +1 -1
- package/dist/src/SyncWorker.d.ts.map +1 -1
- package/dist/src/SyncWorker.js +3 -3
- package/package.json +6 -6
- package/src/Config.ts +2 -4
- package/src/Crdt.ts +8 -8
- package/src/Crypto.ts +11 -13
- package/src/Db.ts +17 -18
- package/src/DbWorker.ts +24 -22
- package/src/ErrorStore.ts +1 -1
- package/src/Evolu.ts +14 -10
- package/src/Model.ts +1 -1
- package/src/OnCompletes.ts +5 -5
- package/src/Owner.ts +2 -2
- package/src/Platform.ts +11 -9
- package/src/Sqlite.ts +2 -4
- package/src/Store.ts +2 -4
- package/src/SyncWorker.ts +12 -8
package/dist/src/Owner.js
CHANGED
|
@@ -2,7 +2,7 @@ import * as Context from "effect/Context";
|
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import { urlAlphabet } from "nanoid";
|
|
4
4
|
import { Bip39, slip21Derive } from "./Crypto.js";
|
|
5
|
-
export const Owner = Context.
|
|
5
|
+
export const Owner = Context.GenericTag("@services/Owner");
|
|
6
6
|
export const makeOwner = (mnemonic) => Effect.gen(function* (_) {
|
|
7
7
|
const bip39 = yield* _(Bip39);
|
|
8
8
|
if (mnemonic == null)
|
package/dist/src/Platform.d.ts
CHANGED
|
@@ -10,12 +10,12 @@ export interface SyncLock {
|
|
|
10
10
|
* Try to acquire a sync lock. The caller must not call sync if a sync lock
|
|
11
11
|
* can't be acquired.
|
|
12
12
|
*/
|
|
13
|
-
readonly acquire: Effect.Effect<
|
|
13
|
+
readonly acquire: Effect.Effect<boolean>;
|
|
14
14
|
/** Release a sync lock. */
|
|
15
|
-
readonly release: Effect.Effect<
|
|
15
|
+
readonly release: Effect.Effect<void>;
|
|
16
16
|
}
|
|
17
17
|
export declare const SyncLock: Context.Tag<SyncLock, SyncLock>;
|
|
18
|
-
export type Fetch = (url: string, body: Uint8Array) => Effect.Effect<
|
|
18
|
+
export type Fetch = (url: string, body: Uint8Array) => Effect.Effect<Response, FetchError>;
|
|
19
19
|
export declare const Fetch: Context.Tag<Fetch, Fetch>;
|
|
20
20
|
/**
|
|
21
21
|
* This error occurs when there is a problem with the network connection, or the
|
|
@@ -24,13 +24,13 @@ export declare const Fetch: Context.Tag<Fetch, Fetch>;
|
|
|
24
24
|
export interface FetchError {
|
|
25
25
|
readonly _tag: "FetchError";
|
|
26
26
|
}
|
|
27
|
-
export declare const FetchLive: Layer.Layer<
|
|
27
|
+
export declare const FetchLive: Layer.Layer<Fetch, never, never>;
|
|
28
28
|
interface AppStateConfig {
|
|
29
29
|
readonly onRequestSync: () => void;
|
|
30
30
|
}
|
|
31
31
|
export interface AppState {
|
|
32
32
|
readonly init: (config: AppStateConfig) => void;
|
|
33
|
-
readonly reset: Effect.Effect<
|
|
33
|
+
readonly reset: Effect.Effect<void>;
|
|
34
34
|
}
|
|
35
35
|
export declare const AppState: Context.Tag<AppState, AppState>;
|
|
36
36
|
/** To detect whether DOM can be used. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Platform.d.ts","sourceRoot":"","sources":["../../src/Platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,eAAe,GACf,kBAAkB,GAClB,cAAc,CAAC;AAEnB,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"Platform.d.ts","sourceRoot":"","sources":["../../src/Platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,eAAe,GACf,kBAAkB,GAClB,cAAc,CAAC;AAEnB,eAAO,MAAM,YAAY,yCAExB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAEvD,eAAO,MAAM,SAAS,mCAAuD,CAAC;AAE9E,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,QAAQ,iCAAqD,CAAC;AAE3E,MAAM,MAAM,KAAK,GAAG,CAClB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,KACb,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAEzC,eAAO,MAAM,KAAK,2BAA+C,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAED,eAAO,MAAM,SAAS,kCAgBrB,CAAC;AAEF,UAAU,cAAc;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,QAAQ,iCAAqD,CAAC;AAE3E,yCAAyC;AACzC,eAAO,MAAM,SAAS,SAYlB,CAAC"}
|
package/dist/src/Platform.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as Context from "effect/Context";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import * as Layer from "effect/Layer";
|
|
4
|
-
export const PlatformName = Context.
|
|
5
|
-
export const FlushSync = Context.
|
|
6
|
-
export const SyncLock = Context.
|
|
7
|
-
export const Fetch = Context.
|
|
4
|
+
export const PlatformName = Context.GenericTag("@services/PlatformName");
|
|
5
|
+
export const FlushSync = Context.GenericTag("@services/FlushSync");
|
|
6
|
+
export const SyncLock = Context.GenericTag("@services/SyncLock");
|
|
7
|
+
export const Fetch = Context.GenericTag("@services/Fetch");
|
|
8
8
|
export const FetchLive = Layer.succeed(Fetch, Fetch.of((url, body) => Effect.tryPromise({
|
|
9
9
|
try: () => fetch(url, {
|
|
10
10
|
method: "POST",
|
|
@@ -16,7 +16,7 @@ export const FetchLive = Layer.succeed(Fetch, Fetch.of((url, body) => Effect.try
|
|
|
16
16
|
}),
|
|
17
17
|
catch: () => ({ _tag: "FetchError" }),
|
|
18
18
|
})));
|
|
19
|
-
export const AppState = Context.
|
|
19
|
+
export const AppState = Context.GenericTag("@services/AppState");
|
|
20
20
|
/** To detect whether DOM can be used. */
|
|
21
21
|
export const canUseDom = (() => {
|
|
22
22
|
// IDK why try-catch is necessary, but it is.
|
package/dist/src/Sqlite.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import * as Effect from "effect/Effect";
|
|
|
3
3
|
import * as Predicate from "effect/Predicate";
|
|
4
4
|
import * as ReadonlyRecord from "effect/ReadonlyRecord";
|
|
5
5
|
export interface Sqlite {
|
|
6
|
-
readonly exec: (arg: string | SqliteQuery) => Effect.Effect<
|
|
6
|
+
readonly exec: (arg: string | SqliteQuery) => Effect.Effect<ExecResult>;
|
|
7
7
|
}
|
|
8
8
|
export declare const Sqlite: Context.Tag<Sqlite, Sqlite>;
|
|
9
9
|
export interface SqliteQuery {
|
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,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;CACzE;AAED,eAAO,MAAM,MAAM,6BAAiD,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,iBAAiB,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAAC;AACvD,KAAK,UAAU,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACtD,KAAK,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AACrC,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAAC;AAEtE,UAAU,UAAU;IAClB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEpD,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,UAAU,CACpD,KAAK,EACL,iBAAiB,CAE4D,CAAC;AAEhF,eAAO,MAAM,oBAAoB,WACvB,cAAc,KAAK,CAAC,KAC3B,WAAW,EAGX,CAAC;AAEJ,eAAO,MAAM,iBAAiB,QAAS,MAAM,GAAG,WAAW,KAAG,WAG7D,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,SAAS,EAAE,KAAG,SAAS,EAC1C,CAAC;AA0BnB,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CACpB,CAAC"}
|
package/dist/src/Sqlite.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Context from "effect/Context";
|
|
2
2
|
import * as Predicate from "effect/Predicate";
|
|
3
|
-
export const Sqlite = Context.
|
|
3
|
+
export const Sqlite = Context.GenericTag("@services/Sqlite");
|
|
4
4
|
export const isJsonObjectOrArray = (value) => value !== null && typeof value === "object" && !Predicate.isUint8Array(value);
|
|
5
5
|
export const valuesToSqliteValues = (values) => values.map((value) => isJsonObjectOrArray(value) ? JSON.stringify(value) : value);
|
|
6
6
|
export const ensureSqliteQuery = (arg) => {
|
package/dist/src/Store.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export type Unsubscribe = () => void;
|
|
|
4
4
|
export interface Store<T> {
|
|
5
5
|
readonly subscribe: (listener: Listener) => Unsubscribe;
|
|
6
6
|
readonly getState: () => T;
|
|
7
|
-
readonly setState: (state: T) => Effect.Effect<
|
|
7
|
+
readonly setState: (state: T) => Effect.Effect<void>;
|
|
8
8
|
}
|
|
9
|
-
export declare const makeStore: <T>(initialState: T) => Effect.Effect<never, never
|
|
9
|
+
export declare const makeStore: <T>(initialState: T) => Effect.Effect<Store<T>, never, never>;
|
|
10
10
|
//# sourceMappingURL=Store.d.ts.map
|
package/dist/src/Store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/Store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAElC,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,MAAM,WAAW,KAAK,CAAC,CAAC;IAEtB,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,WAAW,CAAC;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAG3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/Store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAElC,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,MAAM,WAAW,KAAK,CAAC,CAAC;IAEtB,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,WAAW,CAAC;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAG3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,eAAO,MAAM,SAAS,+DA0BlB,CAAC"}
|
package/dist/src/SyncWorker.d.ts
CHANGED
|
@@ -76,6 +76,6 @@ export interface SyncStateServerError {
|
|
|
76
76
|
export interface SyncStatePaymentRequiredError {
|
|
77
77
|
readonly _tag: "PaymentRequiredError";
|
|
78
78
|
}
|
|
79
|
-
export declare const SyncWorkerLive: Layer.Layer<SecretBox | SyncLock | Fetch
|
|
79
|
+
export declare const SyncWorkerLive: Layer.Layer<SyncWorker, never, SecretBox | SyncLock | Fetch>;
|
|
80
80
|
export {};
|
|
81
81
|
//# sourceMappingURL=SyncWorker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncWorker.d.ts","sourceRoot":"","sources":["../../src/SyncWorker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAC;AAGlD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAKtC,OAAO,EACL,UAAU,EACV,MAAM,EACN,SAAS,EACT,eAAe,EAGhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAuB,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOhD,OAAO,EAAqB,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACvD,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC/C;AAED,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"SyncWorker.d.ts","sourceRoot":"","sources":["../../src/SyncWorker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAC;AAGlD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAKtC,OAAO,EACL,UAAU,EACV,MAAM,EACN,SAAS,EACT,eAAe,EAGhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAuB,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOhD,OAAO,EAAqB,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACvD,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC/C;AAED,eAAO,MAAM,UAAU,qCAEtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAE9D,eAAO,MAAM,qBAAqB,sBAVF,eAAe,KAAK,IAAI,UAAxB,eAAe,KAAK,IAAI,CAYvD,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,4BAA4B,CAAC;AAEjC,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,WAAW,CAAC,UAAU,CAOjB,CAAC;AAEtD,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;CACrC;AAED,UAAU,4BAA4B;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;CAChC;AAQD,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,4BAA4B,GAC5B,yBAAyB,GACzB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,KAAK,EACV,qBAAqB,GACrB,oBAAoB,GACpB,6BAA6B,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC;AAiLD,eAAO,MAAM,cAAc,8DAmC1B,CAAC"}
|
package/dist/src/SyncWorker.js
CHANGED
|
@@ -15,13 +15,13 @@ import { SecretBox } from "./Crypto.js";
|
|
|
15
15
|
import { makeUnexpectedError } from "./ErrorStore.js";
|
|
16
16
|
import { Fetch, SyncLock } from "./Platform.js";
|
|
17
17
|
import { MessageContent, SyncRequest, SyncResponse, } from "./Protobuf.js";
|
|
18
|
-
export const SyncWorker = Context.
|
|
19
|
-
export const SyncWorkerPostMessage = Context.
|
|
18
|
+
export const SyncWorker = Context.GenericTag("@services/SyncWorker");
|
|
19
|
+
export const SyncWorkerPostMessage = Context.GenericTag("@services/SyncWorkerPostMessage");
|
|
20
20
|
export const NewMessageEquivalence = (a, b) => a.table === b.table &&
|
|
21
21
|
a.row === b.row &&
|
|
22
22
|
a.column === b.column &&
|
|
23
23
|
JSON.stringify(a.value) === JSON.stringify(b.value);
|
|
24
|
-
const SyncWorkerOnMessage = Context.
|
|
24
|
+
const SyncWorkerOnMessage = Context.GenericTag("@services/SyncWorkerOnMessage");
|
|
25
25
|
const version1 = new Uint8Array([0, 1]);
|
|
26
26
|
const valueToProtobuf = (value) => {
|
|
27
27
|
switch (typeof value) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@evolu/common",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"description": "Local-first platform designed for privacy, ease of use, and no vendor lock-in to sync and backup people's lifetime data",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"evolu",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"README.md"
|
|
45
45
|
],
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@noble/ciphers": "^0.
|
|
47
|
+
"@noble/ciphers": "^0.5.1",
|
|
48
48
|
"@noble/hashes": "^1.3.3",
|
|
49
49
|
"@protobuf-ts/runtime": "^2.9.3",
|
|
50
50
|
"@scure/bip39": "^1.2.2",
|
|
@@ -52,11 +52,11 @@
|
|
|
52
52
|
"nanoid": "^5.0.5"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@effect/schema": "^0.
|
|
55
|
+
"@effect/schema": "^0.62.7",
|
|
56
56
|
"@protobuf-ts/plugin": "^2.9.3",
|
|
57
57
|
"@protobuf-ts/protoc": "^2.9.3",
|
|
58
58
|
"array-shuffle": "^3.0.0",
|
|
59
|
-
"effect": "2.
|
|
59
|
+
"effect": "2.3.6",
|
|
60
60
|
"eslint": "^8.56.0",
|
|
61
61
|
"typescript": "^5.3.3",
|
|
62
62
|
"vitest": "^1.2.2",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"eslint-config-evolu": "1.0.0"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@effect/schema": "^0.
|
|
68
|
-
"effect": "2.
|
|
67
|
+
"@effect/schema": "^0.62.7",
|
|
68
|
+
"effect": "2.3.6"
|
|
69
69
|
},
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|
package/src/Config.ts
CHANGED
|
@@ -18,11 +18,9 @@ export interface Config {
|
|
|
18
18
|
readonly maxDrift: number;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export const Config = Context.
|
|
21
|
+
export const Config = Context.GenericTag<Config>("@services/Config");
|
|
22
22
|
|
|
23
|
-
export const ConfigLive = (
|
|
24
|
-
config?: Partial<Config>,
|
|
25
|
-
): Layer.Layer<never, never, Config> =>
|
|
23
|
+
export const ConfigLive = (config?: Partial<Config>): Layer.Layer<Config> =>
|
|
26
24
|
Layer.succeed(
|
|
27
25
|
Config,
|
|
28
26
|
Config.of({
|
package/src/Crdt.ts
CHANGED
|
@@ -98,10 +98,10 @@ export const makeInitialTimestamp = NanoId.pipe(
|
|
|
98
98
|
);
|
|
99
99
|
|
|
100
100
|
export interface Time {
|
|
101
|
-
readonly now: Effect.Effect<
|
|
101
|
+
readonly now: Effect.Effect<Millis, TimestampTimeOutOfRangeError>;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
export const Time = Context.
|
|
104
|
+
export const Time = Context.GenericTag<Time>("@services/Time");
|
|
105
105
|
|
|
106
106
|
export const TimeLive = Layer.succeed(
|
|
107
107
|
Time,
|
|
@@ -149,9 +149,9 @@ export interface TimestampTimeOutOfRangeError {
|
|
|
149
149
|
const getNextMillis = (
|
|
150
150
|
millis: ReadonlyArray<Millis>,
|
|
151
151
|
): Effect.Effect<
|
|
152
|
-
|
|
152
|
+
Millis,
|
|
153
153
|
TimestampDriftError | TimestampTimeOutOfRangeError,
|
|
154
|
-
|
|
154
|
+
Time | Config
|
|
155
155
|
> =>
|
|
156
156
|
Effect.gen(function* (_) {
|
|
157
157
|
const time = yield* _(Time);
|
|
@@ -186,11 +186,11 @@ const counterMin = S.decodeSync(Counter)(0);
|
|
|
186
186
|
export const sendTimestamp = (
|
|
187
187
|
timestamp: Timestamp,
|
|
188
188
|
): Effect.Effect<
|
|
189
|
-
|
|
189
|
+
Timestamp,
|
|
190
190
|
| TimestampDriftError
|
|
191
191
|
| TimestampCounterOverflowError
|
|
192
192
|
| TimestampTimeOutOfRangeError,
|
|
193
|
-
|
|
193
|
+
Time | Config
|
|
194
194
|
> =>
|
|
195
195
|
Effect.gen(function* (_) {
|
|
196
196
|
const millis = yield* _(getNextMillis([timestamp.millis]));
|
|
@@ -208,12 +208,12 @@ export const receiveTimestamp = ({
|
|
|
208
208
|
readonly local: Timestamp;
|
|
209
209
|
readonly remote: Timestamp;
|
|
210
210
|
}): Effect.Effect<
|
|
211
|
-
|
|
211
|
+
Timestamp,
|
|
212
212
|
| TimestampDriftError
|
|
213
213
|
| TimestampCounterOverflowError
|
|
214
214
|
| TimestampDuplicateNodeError
|
|
215
215
|
| TimestampTimeOutOfRangeError,
|
|
216
|
-
|
|
216
|
+
Time | Config
|
|
217
217
|
> =>
|
|
218
218
|
Effect.gen(function* (_) {
|
|
219
219
|
if (local.node === remote.node)
|
package/src/Crypto.ts
CHANGED
|
@@ -12,18 +12,16 @@ import { customAlphabet, nanoid } from "nanoid";
|
|
|
12
12
|
|
|
13
13
|
// TODO: Add dynamic import error.
|
|
14
14
|
export interface Bip39 {
|
|
15
|
-
readonly make: Effect.Effect<
|
|
15
|
+
readonly make: Effect.Effect<Mnemonic>;
|
|
16
16
|
|
|
17
|
-
readonly toSeed: (
|
|
18
|
-
mnemonic: Mnemonic,
|
|
19
|
-
) => Effect.Effect<never, never, Uint8Array>;
|
|
17
|
+
readonly toSeed: (mnemonic: Mnemonic) => Effect.Effect<Uint8Array>;
|
|
20
18
|
|
|
21
19
|
readonly parse: (
|
|
22
20
|
mnemonic: string,
|
|
23
|
-
) => Effect.Effect<
|
|
21
|
+
) => Effect.Effect<Mnemonic, InvalidMnemonicError>;
|
|
24
22
|
}
|
|
25
23
|
|
|
26
|
-
export const Bip39 = Context.
|
|
24
|
+
export const Bip39 = Context.GenericTag<Bip39>("@services/Bip39");
|
|
27
25
|
|
|
28
26
|
export interface InvalidMnemonicError {
|
|
29
27
|
readonly _tag: "InvalidMnemonicError";
|
|
@@ -39,11 +37,11 @@ export interface InvalidMnemonicError {
|
|
|
39
37
|
export type Mnemonic = string & Brand.Brand<"Mnemonic">;
|
|
40
38
|
|
|
41
39
|
export interface NanoId {
|
|
42
|
-
readonly nanoid: Effect.Effect<
|
|
43
|
-
readonly nanoidAsNodeId: Effect.Effect<
|
|
40
|
+
readonly nanoid: Effect.Effect<string>;
|
|
41
|
+
readonly nanoidAsNodeId: Effect.Effect<NodeId>;
|
|
44
42
|
}
|
|
45
43
|
|
|
46
|
-
export const NanoId = Context.
|
|
44
|
+
export const NanoId = Context.GenericTag<NanoId>("@services/NanoId");
|
|
47
45
|
|
|
48
46
|
export const NodeId = S.string.pipe(
|
|
49
47
|
S.pattern(/^[\w-]{16}$/),
|
|
@@ -66,7 +64,7 @@ export const NanoIdLive = Layer.succeed(
|
|
|
66
64
|
export const slip21Derive = (
|
|
67
65
|
seed: Uint8Array,
|
|
68
66
|
path: ReadonlyArray<string>,
|
|
69
|
-
): Effect.Effect<
|
|
67
|
+
): Effect.Effect<Uint8Array> =>
|
|
70
68
|
Effect.sync(() => {
|
|
71
69
|
let m = hmac(sha512, "Symmetric key seed", seed);
|
|
72
70
|
for (let i = 0; i < path.length; i++) {
|
|
@@ -84,15 +82,15 @@ export interface SecretBox {
|
|
|
84
82
|
readonly seal: (
|
|
85
83
|
key: Uint8Array,
|
|
86
84
|
plaintext: Uint8Array,
|
|
87
|
-
) => Effect.Effect<
|
|
85
|
+
) => Effect.Effect<Uint8Array>;
|
|
88
86
|
|
|
89
87
|
readonly open: (
|
|
90
88
|
key: Uint8Array,
|
|
91
89
|
ciphertext: Uint8Array,
|
|
92
|
-
) => Effect.Effect<
|
|
90
|
+
) => Effect.Effect<Uint8Array>;
|
|
93
91
|
}
|
|
94
92
|
|
|
95
|
-
export const SecretBox = Context.
|
|
93
|
+
export const SecretBox = Context.GenericTag<SecretBox>("@services/SecretBox");
|
|
96
94
|
|
|
97
95
|
export const SecretBoxLive = Layer.succeed(
|
|
98
96
|
SecretBox,
|
package/src/Db.ts
CHANGED
|
@@ -73,12 +73,11 @@ export const table = <Fields extends TableFields>(
|
|
|
73
73
|
? ValidateFieldsNames<Fields> extends true
|
|
74
74
|
? ValidateFieldsHasId<Fields> extends true
|
|
75
75
|
? S.Schema<
|
|
76
|
-
never,
|
|
77
76
|
Types.Simplify<
|
|
78
|
-
S.
|
|
77
|
+
S.ToStruct<Fields> & S.Schema.To<typeof ReservedColumns>
|
|
79
78
|
>,
|
|
80
79
|
Types.Simplify<
|
|
81
|
-
S.
|
|
80
|
+
S.FromStruct<Fields> & S.Schema.From<typeof ReservedColumns>
|
|
82
81
|
>
|
|
83
82
|
>
|
|
84
83
|
: EvoluTypeError<"table() called without id column.">
|
|
@@ -92,7 +91,7 @@ const ReservedColumns = S.struct({
|
|
|
92
91
|
isDeleted: SqliteBoolean,
|
|
93
92
|
});
|
|
94
93
|
|
|
95
|
-
type TableFields = Record<string, S.Schema<
|
|
94
|
+
type TableFields = Record<string, S.Schema<any>>;
|
|
96
95
|
|
|
97
96
|
type ValidateFieldsTypes<Fields extends TableFields> =
|
|
98
97
|
keyof Fields extends infer K
|
|
@@ -100,7 +99,7 @@ type ValidateFieldsTypes<Fields extends TableFields> =
|
|
|
100
99
|
? Fields[K] extends TableFields
|
|
101
100
|
? ValidateFieldsTypes<Fields[K]>
|
|
102
101
|
: // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
103
|
-
Fields[K] extends S.Schema<
|
|
102
|
+
Fields[K] extends S.Schema<infer A, infer _I>
|
|
104
103
|
? A extends Value
|
|
105
104
|
? true
|
|
106
105
|
: false
|
|
@@ -259,9 +258,9 @@ export interface Table {
|
|
|
259
258
|
|
|
260
259
|
// https://github.com/Effect-TS/schema/releases/tag/v0.18.0
|
|
261
260
|
const getPropertySignatures = <I extends { [K in keyof A]: any }, A>(
|
|
262
|
-
schema: S.Schema<
|
|
263
|
-
): { [K in keyof A]: S.Schema<
|
|
264
|
-
const out: Record<PropertyKey, S.Schema<
|
|
261
|
+
schema: S.Schema<A, I>,
|
|
262
|
+
): { [K in keyof A]: S.Schema<A[K], I[K]> } => {
|
|
263
|
+
const out: Record<PropertyKey, S.Schema<any>> = {};
|
|
265
264
|
const propertySignatures = AST.getPropertySignatures(schema.ast);
|
|
266
265
|
for (let i = 0; i < propertySignatures.length; i++) {
|
|
267
266
|
const propertySignature = propertySignatures[i];
|
|
@@ -271,7 +270,7 @@ const getPropertySignatures = <I extends { [K in keyof A]: any }, A>(
|
|
|
271
270
|
return out as any;
|
|
272
271
|
};
|
|
273
272
|
|
|
274
|
-
export const schemaToTables = (schema: S.Schema<
|
|
273
|
+
export const schemaToTables = (schema: S.Schema<any>): Tables =>
|
|
275
274
|
pipe(
|
|
276
275
|
getPropertySignatures(schema),
|
|
277
276
|
ReadonlyRecord.toEntries,
|
|
@@ -284,8 +283,8 @@ export const schemaToTables = (schema: S.Schema<never, any, any>): Tables =>
|
|
|
284
283
|
);
|
|
285
284
|
|
|
286
285
|
export const transaction = <R, E, A>(
|
|
287
|
-
effect: Effect.Effect<
|
|
288
|
-
): Effect.Effect<Sqlite | R
|
|
286
|
+
effect: Effect.Effect<A, E, R>,
|
|
287
|
+
): Effect.Effect<A, E, Sqlite | R> =>
|
|
289
288
|
Effect.flatMap(Sqlite, (sqlite) =>
|
|
290
289
|
Effect.acquireUseRelease(
|
|
291
290
|
sqlite.exec("BEGIN"),
|
|
@@ -323,7 +322,7 @@ export const someDefectToNoSuchTableOrColumnError = Effect.catchSomeDefect(
|
|
|
323
322
|
|
|
324
323
|
export const lazyInit = (
|
|
325
324
|
mnemonic?: Mnemonic,
|
|
326
|
-
): Effect.Effect<Sqlite | Bip39 | NanoId
|
|
325
|
+
): Effect.Effect<Owner, never, Sqlite | Bip39 | NanoId> =>
|
|
327
326
|
Effect.gen(function* (_) {
|
|
328
327
|
const [owner, sqlite, initialTimestampString] = yield* _(
|
|
329
328
|
Effect.all([makeOwner(mnemonic), Sqlite, makeInitialTimestamp], {
|
|
@@ -354,9 +353,9 @@ export const lazyInit = (
|
|
|
354
353
|
});
|
|
355
354
|
|
|
356
355
|
const getTables: Effect.Effect<
|
|
357
|
-
|
|
356
|
+
ReadonlyArray<string>,
|
|
358
357
|
never,
|
|
359
|
-
|
|
358
|
+
Sqlite
|
|
360
359
|
> = Sqlite.pipe(
|
|
361
360
|
Effect.flatMap((sqlite) =>
|
|
362
361
|
sqlite.exec(`SELECT "name" FROM "sqlite_schema" WHERE "type" = 'table'`),
|
|
@@ -370,7 +369,7 @@ const getTables: Effect.Effect<
|
|
|
370
369
|
const updateTable = ({
|
|
371
370
|
name,
|
|
372
371
|
columns,
|
|
373
|
-
}: Table): Effect.Effect<
|
|
372
|
+
}: Table): Effect.Effect<void, never, Sqlite> =>
|
|
374
373
|
Effect.gen(function* (_) {
|
|
375
374
|
const sqlite = yield* _(Sqlite);
|
|
376
375
|
const sql = yield* _(
|
|
@@ -396,7 +395,7 @@ const updateTable = ({
|
|
|
396
395
|
const createTable = ({
|
|
397
396
|
name,
|
|
398
397
|
columns,
|
|
399
|
-
}: Table): Effect.Effect<
|
|
398
|
+
}: Table): Effect.Effect<void, never, Sqlite> =>
|
|
400
399
|
Effect.flatMap(Sqlite, (sqlite) =>
|
|
401
400
|
sqlite.exec(`
|
|
402
401
|
CREATE TABLE ${name} (
|
|
@@ -414,7 +413,7 @@ const createTable = ({
|
|
|
414
413
|
|
|
415
414
|
export const ensureSchema = (
|
|
416
415
|
tables: Tables,
|
|
417
|
-
): Effect.Effect<
|
|
416
|
+
): Effect.Effect<void, never, Sqlite> =>
|
|
418
417
|
Effect.flatMap(getTables, (existingTables) =>
|
|
419
418
|
Effect.forEach(
|
|
420
419
|
tables,
|
|
@@ -427,7 +426,7 @@ export const ensureSchema = (
|
|
|
427
426
|
);
|
|
428
427
|
|
|
429
428
|
export type RowsStore = Store<RowsStoreValue>;
|
|
430
|
-
export const RowsStore = Context.
|
|
429
|
+
export const RowsStore = Context.GenericTag<RowsStore>("@services/RowsStore");
|
|
431
430
|
|
|
432
431
|
type RowsStoreValue = ReadonlyMap<Query, ReadonlyArray<Row>>;
|
|
433
432
|
|
package/src/DbWorker.ts
CHANGED
|
@@ -64,7 +64,7 @@ export interface DbWorker {
|
|
|
64
64
|
onMessage: (output: DbWorkerOutput) => void;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export const DbWorker = Context.
|
|
67
|
+
export const DbWorker = Context.GenericTag<DbWorker>("@services/DbWorker");
|
|
68
68
|
|
|
69
69
|
export type DbWorkerInput =
|
|
70
70
|
| DbWorkerInputInit
|
|
@@ -108,7 +108,9 @@ interface DbWorkerInputEnsureSchema {
|
|
|
108
108
|
|
|
109
109
|
type DbWorkerOnMessage = DbWorker["onMessage"];
|
|
110
110
|
|
|
111
|
-
const DbWorkerOnMessage = Context.
|
|
111
|
+
const DbWorkerOnMessage = Context.GenericTag<DbWorkerOnMessage>(
|
|
112
|
+
"@services/DbWorkerOnMessage",
|
|
113
|
+
);
|
|
112
114
|
|
|
113
115
|
export type DbWorkerOutput =
|
|
114
116
|
| DbWorkerOutputOnError
|
|
@@ -182,7 +184,7 @@ const query = ({
|
|
|
182
184
|
}: {
|
|
183
185
|
readonly queries: Queries;
|
|
184
186
|
readonly onCompleteIds?: ReadonlyArray<OnCompleteId>;
|
|
185
|
-
}): Effect.Effect<Sqlite | RowsStore | DbWorkerOnMessage
|
|
187
|
+
}): Effect.Effect<void, never, Sqlite | RowsStore | DbWorkerOnMessage> =>
|
|
186
188
|
Effect.gen(function* (_) {
|
|
187
189
|
const sqlite = yield* _(Sqlite);
|
|
188
190
|
const rowsStore = yield* _(RowsStore);
|
|
@@ -271,7 +273,7 @@ export const mutationsToNewMessages = (
|
|
|
271
273
|
|
|
272
274
|
const ensureSchemaByNewMessages = (
|
|
273
275
|
messages: ReadonlyArray<NewMessage>,
|
|
274
|
-
): Effect.Effect<
|
|
276
|
+
): Effect.Effect<void, never, Sqlite> =>
|
|
275
277
|
Effect.gen(function* (_) {
|
|
276
278
|
const tablesMap = new Map<string, Table>();
|
|
277
279
|
messages.forEach((message) => {
|
|
@@ -295,7 +297,7 @@ const ensureSchemaByNewMessages = (
|
|
|
295
297
|
export const upsertValueIntoTableRowColumn = (
|
|
296
298
|
message: NewMessage,
|
|
297
299
|
messages: ReadonlyArray<NewMessage>,
|
|
298
|
-
): Effect.Effect<
|
|
300
|
+
): Effect.Effect<void, never, Sqlite> =>
|
|
299
301
|
Effect.gen(function* (_) {
|
|
300
302
|
const sqlite = yield* _(Sqlite);
|
|
301
303
|
|
|
@@ -320,7 +322,7 @@ const applyMessages = ({
|
|
|
320
322
|
}: {
|
|
321
323
|
merkleTree: MerkleTree;
|
|
322
324
|
messages: ReadonlyArray<Message>;
|
|
323
|
-
}): Effect.Effect<
|
|
325
|
+
}): Effect.Effect<MerkleTree, never, Sqlite> =>
|
|
324
326
|
Effect.gen(function* (_) {
|
|
325
327
|
const sqlite = yield* _(Sqlite);
|
|
326
328
|
|
|
@@ -366,7 +368,7 @@ const applyMessages = ({
|
|
|
366
368
|
const writeTimestampAndMerkleTree = ({
|
|
367
369
|
timestamp,
|
|
368
370
|
merkleTree,
|
|
369
|
-
}: TimestampAndMerkleTree): Effect.Effect<
|
|
371
|
+
}: TimestampAndMerkleTree): Effect.Effect<void, never, Sqlite> =>
|
|
370
372
|
Effect.flatMap(Sqlite, (sqlite) =>
|
|
371
373
|
sqlite.exec({
|
|
372
374
|
sql: Sql.updateOwnerTimestampAndMerkleTree,
|
|
@@ -381,17 +383,17 @@ const mutate = ({
|
|
|
381
383
|
mutations,
|
|
382
384
|
queries,
|
|
383
385
|
}: DbWorkerInputMutate): Effect.Effect<
|
|
386
|
+
void,
|
|
387
|
+
| TimestampDriftError
|
|
388
|
+
| TimestampCounterOverflowError
|
|
389
|
+
| TimestampTimeOutOfRangeError,
|
|
384
390
|
| Sqlite
|
|
385
391
|
| Owner
|
|
386
392
|
| Time
|
|
387
393
|
| Config
|
|
388
394
|
| RowsStore
|
|
389
395
|
| DbWorkerOnMessage
|
|
390
|
-
| SyncWorkerPostMessage
|
|
391
|
-
| TimestampDriftError
|
|
392
|
-
| TimestampCounterOverflowError
|
|
393
|
-
| TimestampTimeOutOfRangeError,
|
|
394
|
-
void
|
|
396
|
+
| SyncWorkerPostMessage
|
|
395
397
|
> =>
|
|
396
398
|
Effect.gen(function* (_) {
|
|
397
399
|
const [toSync, localOnly] = ReadonlyArray.partition(mutations, (item) =>
|
|
@@ -455,9 +457,9 @@ const handleSyncResponse = ({
|
|
|
455
457
|
messages,
|
|
456
458
|
...response
|
|
457
459
|
}: SyncWorkerOutputSyncResponse): Effect.Effect<
|
|
458
|
-
|
|
460
|
+
void,
|
|
459
461
|
TimestampError,
|
|
460
|
-
|
|
462
|
+
Sqlite | Time | Config | DbWorkerOnMessage | SyncWorkerPostMessage | Owner
|
|
461
463
|
> =>
|
|
462
464
|
Effect.gen(function* (_) {
|
|
463
465
|
let { timestamp, merkleTree } = yield* _(readTimestampAndMerkleTree);
|
|
@@ -523,14 +525,14 @@ const handleSyncResponse = ({
|
|
|
523
525
|
const sync = ({
|
|
524
526
|
queries,
|
|
525
527
|
}: DbWorkerInputSync): Effect.Effect<
|
|
528
|
+
void,
|
|
529
|
+
never,
|
|
526
530
|
| Sqlite
|
|
527
531
|
| Config
|
|
528
532
|
| DbWorkerOnMessage
|
|
529
533
|
| SyncWorkerPostMessage
|
|
530
534
|
| Owner
|
|
531
|
-
| RowsStore
|
|
532
|
-
never,
|
|
533
|
-
void
|
|
535
|
+
| RowsStore
|
|
534
536
|
> =>
|
|
535
537
|
Effect.gen(function* (_) {
|
|
536
538
|
if (queries.length > 0) yield* _(query({ queries }));
|
|
@@ -547,7 +549,7 @@ const sync = ({
|
|
|
547
549
|
|
|
548
550
|
const reset = (
|
|
549
551
|
input: DbWorkerInputReset,
|
|
550
|
-
): Effect.Effect<Sqlite | Bip39 | NanoId | DbWorkerOnMessage
|
|
552
|
+
): Effect.Effect<void, never, Sqlite | Bip39 | NanoId | DbWorkerOnMessage> =>
|
|
551
553
|
Effect.gen(function* (_) {
|
|
552
554
|
const sqlite = yield* _(Sqlite);
|
|
553
555
|
|
|
@@ -577,7 +579,7 @@ export const DbWorkerLive = Layer.effect(
|
|
|
577
579
|
Effect.gen(function* (_) {
|
|
578
580
|
const syncWorker = yield* _(SyncWorker);
|
|
579
581
|
|
|
580
|
-
const onError = (error: EvoluError): Effect.Effect<
|
|
582
|
+
const onError = (error: EvoluError): Effect.Effect<void> =>
|
|
581
583
|
Effect.sync(() => {
|
|
582
584
|
dbWorker.onMessage({ _tag: "onError", error });
|
|
583
585
|
});
|
|
@@ -606,9 +608,9 @@ export const DbWorkerLive = Layer.effect(
|
|
|
606
608
|
|
|
607
609
|
const run = (
|
|
608
610
|
effect: Effect.Effect<
|
|
609
|
-
|
|
611
|
+
void,
|
|
610
612
|
EvoluError,
|
|
611
|
-
|
|
613
|
+
Sqlite | Bip39 | NanoId | DbWorkerOnMessage
|
|
612
614
|
>,
|
|
613
615
|
): Promise<void> =>
|
|
614
616
|
effect.pipe(
|
|
@@ -636,7 +638,7 @@ export const DbWorkerLive = Layer.effect(
|
|
|
636
638
|
Layer.succeed(SyncWorkerPostMessage, syncWorker.postMessage),
|
|
637
639
|
RowsStoreLive,
|
|
638
640
|
TimeLive,
|
|
639
|
-
);
|
|
641
|
+
).pipe(Layer.memoize, Effect.scoped, Effect.runSync);
|
|
640
642
|
|
|
641
643
|
return (input) => {
|
|
642
644
|
if (skipAllBecauseOfReset) return Promise.resolve(undefined);
|
package/src/ErrorStore.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface UnexpectedError {
|
|
|
19
19
|
|
|
20
20
|
export const makeUnexpectedError = (
|
|
21
21
|
error: unknown,
|
|
22
|
-
): Effect.Effect<never, UnexpectedError
|
|
22
|
+
): Effect.Effect<never, UnexpectedError> => {
|
|
23
23
|
const isError = error instanceof Error;
|
|
24
24
|
|
|
25
25
|
return Effect.fail({
|