@evolu/common 1.0.17 → 2.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 (75) hide show
  1. package/README.md +7 -7
  2. package/dist/src/Config.d.ts +4 -6
  3. package/dist/src/Config.d.ts.map +1 -1
  4. package/dist/src/Config.js +1 -1
  5. package/dist/src/Crdt.d.ts +15 -9
  6. package/dist/src/Crdt.d.ts.map +1 -1
  7. package/dist/src/Crdt.js +15 -14
  8. package/dist/src/Crypto.d.ts +7 -13
  9. package/dist/src/Crypto.d.ts.map +1 -1
  10. package/dist/src/Crypto.js +7 -9
  11. package/dist/src/Db.d.ts +36 -70
  12. package/dist/src/Db.d.ts.map +1 -1
  13. package/dist/src/Db.js +45 -51
  14. package/dist/src/DbWorker.d.ts +13 -14
  15. package/dist/src/DbWorker.d.ts.map +1 -1
  16. package/dist/src/DbWorker.js +56 -57
  17. package/dist/src/Diff.d.ts +3 -1
  18. package/dist/src/Diff.d.ts.map +1 -1
  19. package/dist/src/Diff.js +3 -7
  20. package/dist/src/{Errors.d.ts → ErrorStore.d.ts} +14 -7
  21. package/dist/src/ErrorStore.d.ts.map +1 -0
  22. package/dist/src/{Errors.js → ErrorStore.js} +2 -0
  23. package/dist/src/Evolu.d.ts +316 -58
  24. package/dist/src/Evolu.d.ts.map +1 -1
  25. package/dist/src/Evolu.js +199 -185
  26. package/dist/src/Model.d.ts +47 -57
  27. package/dist/src/Model.d.ts.map +1 -1
  28. package/dist/src/Model.js +30 -35
  29. package/dist/src/OnCompletes.d.ts +11 -0
  30. package/dist/src/OnCompletes.d.ts.map +1 -0
  31. package/dist/src/OnCompletes.js +21 -0
  32. package/dist/src/Owner.d.ts +31 -0
  33. package/dist/src/Owner.d.ts.map +1 -0
  34. package/dist/src/Owner.js +20 -0
  35. package/dist/src/Platform.d.ts +15 -8
  36. package/dist/src/Platform.d.ts.map +1 -1
  37. package/dist/src/Platform.js +5 -5
  38. package/dist/src/Protobuf.d.ts +25 -73
  39. package/dist/src/Protobuf.d.ts.map +1 -1
  40. package/dist/src/Protobuf.js +4 -12
  41. package/dist/src/Public.d.ts +5 -3
  42. package/dist/src/Public.d.ts.map +1 -1
  43. package/dist/src/Public.js +1 -0
  44. package/dist/src/Sqlite.d.ts +8 -11
  45. package/dist/src/Sqlite.d.ts.map +1 -1
  46. package/dist/src/Sqlite.js +7 -7
  47. package/dist/src/Store.d.ts +6 -5
  48. package/dist/src/Store.d.ts.map +1 -1
  49. package/dist/src/Store.js +21 -16
  50. package/dist/src/SyncWorker.d.ts +8 -2
  51. package/dist/src/SyncWorker.d.ts.map +1 -1
  52. package/dist/src/SyncWorker.js +12 -19
  53. package/dist/src/index.d.ts +6 -2
  54. package/dist/src/index.d.ts.map +1 -1
  55. package/dist/src/index.js +6 -2
  56. package/package.json +23 -13
  57. package/src/Config.ts +7 -7
  58. package/src/Crdt.ts +29 -26
  59. package/src/Crypto.ts +14 -19
  60. package/src/Db.ts +113 -166
  61. package/src/DbWorker.ts +110 -140
  62. package/src/Diff.ts +5 -7
  63. package/src/{Errors.ts → ErrorStore.ts} +17 -8
  64. package/src/Evolu.ts +682 -442
  65. package/src/Model.ts +60 -85
  66. package/src/OnCompletes.ts +46 -0
  67. package/src/Owner.ts +65 -0
  68. package/src/Platform.ts +24 -16
  69. package/src/Protobuf.ts +25 -73
  70. package/src/Public.ts +5 -3
  71. package/src/Sqlite.ts +13 -24
  72. package/src/Store.ts +36 -24
  73. package/src/SyncWorker.ts +30 -38
  74. package/src/index.ts +6 -2
  75. package/dist/src/Errors.d.ts.map +0 -1
package/src/Store.ts CHANGED
@@ -1,32 +1,44 @@
1
- export type StoreListener = () => void;
1
+ import { Effect } from "effect";
2
2
 
3
- export type StoreUnsubscribe = () => void;
3
+ export type Listener = () => void;
4
+
5
+ export type Unsubscribe = () => void;
4
6
 
5
7
  export interface Store<T> {
6
- readonly subscribe: (listener: StoreListener) => StoreUnsubscribe;
7
- readonly setState: (state: T) => void;
8
+ // No Effect API because of React useSyncExternalStore
9
+ readonly subscribe: (listener: Listener) => Unsubscribe;
8
10
  readonly getState: () => T;
9
- }
10
-
11
- export const makeStore = <T>(initialState: T): Store<T> => {
12
- let currentState = initialState;
13
11
 
14
- const listeners = new Set<StoreListener>();
12
+ // Effect API because it's a side-effect.
13
+ readonly setState: (state: T) => Effect.Effect<never, never, void>;
14
+ }
15
15
 
16
- const subscribe: Store<T>["subscribe"] = (listener) => {
17
- listeners.add(listener);
18
- return () => {
19
- listeners.delete(listener);
16
+ export const makeStore = <T>(
17
+ initialState: T,
18
+ ): Effect.Effect<never, never, Store<T>> =>
19
+ Effect.sync(() => {
20
+ const listeners = new Set<Listener>();
21
+ let currentState = initialState;
22
+
23
+ const store: Store<T> = {
24
+ subscribe(listener) {
25
+ listeners.add(listener);
26
+ return () => {
27
+ listeners.delete(listener);
28
+ };
29
+ },
30
+
31
+ getState() {
32
+ return currentState;
33
+ },
34
+
35
+ setState: (state) =>
36
+ Effect.sync(() => {
37
+ if (state === currentState) return;
38
+ currentState = state;
39
+ listeners.forEach((listener) => listener());
40
+ }),
20
41
  };
21
- };
22
-
23
- const setState: Store<T>["setState"] = (state: T) => {
24
- if (state === currentState) return;
25
- currentState = state;
26
- listeners.forEach((listener) => listener());
27
- };
28
-
29
- const getState: Store<T>["getState"] = () => currentState;
30
42
 
31
- return { subscribe, setState, getState };
32
- };
43
+ return store;
44
+ });
package/src/SyncWorker.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  Equivalence,
7
7
  Function,
8
8
  Layer,
9
+ Match,
9
10
  Option,
10
11
  Predicate,
11
12
  ReadonlyArray,
@@ -21,9 +22,9 @@ import {
21
22
  unsafeMerkleTreeFromString,
22
23
  } from "./Crdt.js";
23
24
  import { SecretBox } from "./Crypto.js";
24
- import { Owner } from "./Db.js";
25
- import { UnexpectedError, makeUnexpectedError } from "./Errors.js";
25
+ import { UnexpectedError, makeUnexpectedError } from "./ErrorStore.js";
26
26
  import { Id } from "./Model.js";
27
+ import { Owner } from "./Owner.js";
27
28
  import { Fetch, SyncLock } from "./Platform.js";
28
29
  import {
29
30
  EncryptedMessage,
@@ -38,13 +39,11 @@ export interface SyncWorker {
38
39
  onMessage: (output: SyncWorkerOutput) => void;
39
40
  }
40
41
 
41
- export const SyncWorker = Context.Tag<SyncWorker>("evolu/SyncWorker");
42
+ export const SyncWorker = Context.Tag<SyncWorker>();
42
43
 
43
44
  export type SyncWorkerPostMessage = SyncWorker["postMessage"];
44
45
 
45
- export const SyncWorkerPostMessage = Context.Tag<SyncWorkerPostMessage>(
46
- "evolu/SyncWorkerPostMessage",
47
- );
46
+ export const SyncWorkerPostMessage = Context.Tag<SyncWorkerPostMessage>();
48
47
 
49
48
  export type SyncWorkerInput =
50
49
  | SyncWorkerInputSync
@@ -86,9 +85,7 @@ interface SyncWorkerInputSyncCompleted {
86
85
 
87
86
  type SyncWorkerOnMessage = SyncWorker["onMessage"];
88
87
 
89
- const SyncWorkerOnMessage = Context.Tag<SyncWorkerOnMessage>(
90
- "evolu/SyncWorkerOnMessage",
91
- );
88
+ const SyncWorkerOnMessage = Context.Tag<SyncWorkerOnMessage>();
92
89
 
93
90
  export type SyncWorkerOutput =
94
91
  | UnexpectedError
@@ -103,6 +100,12 @@ export type SyncWorkerOutputSyncResponse = {
103
100
  readonly syncLoopCount: number;
104
101
  };
105
102
 
103
+ /**
104
+ * The SyncState type represents the various states that a synchronization
105
+ * process can be in. Evolu apps should not bother users with an "unsynced"
106
+ * state. Instead, they should warn users if data have not been synced for too
107
+ * long (a week, for example).
108
+ */
106
109
  export type SyncState =
107
110
  | SyncStateInitial
108
111
  | SyncStateIsSyncing
@@ -319,8 +322,6 @@ export const SyncWorkerLive = Layer.effect(
319
322
  SyncWorker,
320
323
  Effect.gen(function* (_) {
321
324
  const syncLock = yield* _(SyncLock);
322
- const fetch = yield* _(Fetch);
323
- const secretBox = yield* _(SecretBox);
324
325
 
325
326
  const onError = (
326
327
  error: UnexpectedError,
@@ -329,35 +330,26 @@ export const SyncWorkerLive = Layer.effect(
329
330
  syncWorker.onMessage(error);
330
331
  });
331
332
 
332
- const mapInputToEffect = (
333
- input: SyncWorkerInput,
334
- ): Effect.Effect<
335
- SyncLock | SyncWorkerOnMessage | Fetch | SecretBox,
336
- never,
337
- void
338
- > => {
339
- switch (input._tag) {
340
- case "sync":
341
- return sync(input);
342
- case "syncCompleted":
343
- return syncLock.release;
344
- }
345
- };
346
-
347
- const postMessage: SyncWorker["postMessage"] = (input) => {
348
- void mapInputToEffect(input).pipe(
349
- Effect.catchAllDefect(makeUnexpectedError),
350
- Effect.catchAll(onError),
351
- Effect.provideService(SyncLock, syncLock),
352
- Effect.provideService(Fetch, fetch),
353
- Effect.provideService(SecretBox, secretBox),
354
- Effect.provideService(SyncWorkerOnMessage, syncWorker.onMessage),
355
- Effect.runPromise,
356
- );
357
- };
333
+ const context = Context.empty().pipe(
334
+ Context.add(SyncLock, syncLock),
335
+ Context.add(Fetch, yield* _(Fetch)),
336
+ Context.add(SecretBox, yield* _(SecretBox)),
337
+ );
358
338
 
359
339
  const syncWorker: SyncWorker = {
360
- postMessage,
340
+ postMessage: (input) => {
341
+ Match.value(input).pipe(
342
+ Match.tagsExhaustive({
343
+ sync,
344
+ syncCompleted: () => syncLock.release,
345
+ }),
346
+ Effect.catchAllDefect(makeUnexpectedError),
347
+ Effect.catchAll(onError),
348
+ Effect.provide(context),
349
+ Effect.provideService(SyncWorkerOnMessage, syncWorker.onMessage),
350
+ Effect.runPromise,
351
+ );
352
+ },
361
353
  onMessage: Function.constVoid,
362
354
  };
363
355
 
package/src/index.ts CHANGED
@@ -1,14 +1,18 @@
1
- export { jsonArrayFrom, jsonObjectFrom } from "kysely/helpers/sqlite";
2
1
  export * from "./Config.js";
3
2
  export * from "./Crdt.js";
4
3
  export * from "./Crypto.js";
5
4
  export * from "./Db.js";
6
5
  export * from "./DbWorker.js";
7
- export * from "./Errors.js";
6
+ export * from "./Diff.js";
7
+ export * from "./ErrorStore.js";
8
8
  export * from "./Evolu.js";
9
9
  export * from "./Model.js";
10
+ export * from "./Murmurhash.js";
11
+ export * from "./OnCompletes.js";
12
+ export * from "./Owner.js";
10
13
  export * from "./Platform.js";
11
14
  export * from "./Protobuf.js";
15
+ export * from "./Public.js";
12
16
  export * from "./Sqlite.js";
13
17
  export * from "./Store.js";
14
18
  export * from "./SyncWorker.js";
@@ -1 +0,0 @@
1
- {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../src/Errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,cAAc,CAAC;AAE1D;;;;GAIG;AACH,UAAU,iBAAiB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,eAAO,MAAM,mBAAmB,UACvB,OAAO,KACb,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAU7C,CAAC"}