@evolu/common 7.4.0 → 8.0.0-next.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 (251) hide show
  1. package/README.md +4 -61
  2. package/dist/src/Array.d.ts +343 -102
  3. package/dist/src/Array.d.ts.map +1 -1
  4. package/dist/src/Array.js +181 -85
  5. package/dist/src/Assert.d.ts +57 -11
  6. package/dist/src/Assert.d.ts.map +1 -1
  7. package/dist/src/Assert.js +47 -11
  8. package/dist/src/BigInt.d.ts +6 -1
  9. package/dist/src/BigInt.d.ts.map +1 -1
  10. package/dist/src/BigInt.js +5 -0
  11. package/dist/src/Brand.d.ts +40 -12
  12. package/dist/src/Brand.d.ts.map +1 -1
  13. package/dist/src/Brand.js +5 -0
  14. package/dist/src/Buffer.d.ts +6 -1
  15. package/dist/src/Buffer.d.ts.map +1 -1
  16. package/dist/src/Buffer.js +7 -2
  17. package/dist/src/Cache.d.ts +10 -2
  18. package/dist/src/Cache.d.ts.map +1 -1
  19. package/dist/src/Cache.js +6 -0
  20. package/dist/src/Callbacks.d.ts +10 -7
  21. package/dist/src/Callbacks.d.ts.map +1 -1
  22. package/dist/src/Callbacks.js +23 -13
  23. package/dist/src/Console.d.ts +361 -69
  24. package/dist/src/Console.d.ts.map +1 -1
  25. package/dist/src/Console.js +217 -117
  26. package/dist/src/Crypto.d.ts +70 -21
  27. package/dist/src/Crypto.d.ts.map +1 -1
  28. package/dist/src/Crypto.js +72 -27
  29. package/dist/src/Eq.d.ts +22 -2
  30. package/dist/src/Eq.d.ts.map +1 -1
  31. package/dist/src/Eq.js +21 -1
  32. package/dist/src/Error.d.ts +23 -12
  33. package/dist/src/Error.d.ts.map +1 -1
  34. package/dist/src/Error.js +27 -11
  35. package/dist/src/Function.d.ts +128 -56
  36. package/dist/src/Function.d.ts.map +1 -1
  37. package/dist/src/Function.js +118 -14
  38. package/dist/src/Identicon.d.ts +5 -0
  39. package/dist/src/Identicon.d.ts.map +1 -1
  40. package/dist/src/Identicon.js +6 -1
  41. package/dist/src/Lookup.d.ts +160 -0
  42. package/dist/src/Lookup.d.ts.map +1 -0
  43. package/dist/src/Lookup.js +192 -0
  44. package/dist/src/Microtask.d.ts +21 -0
  45. package/dist/src/Microtask.d.ts.map +1 -0
  46. package/dist/src/Microtask.js +37 -0
  47. package/dist/src/Number.d.ts +18 -4
  48. package/dist/src/Number.d.ts.map +1 -1
  49. package/dist/src/Number.js +23 -1
  50. package/dist/src/Object.d.ts +110 -5
  51. package/dist/src/Object.d.ts.map +1 -1
  52. package/dist/src/Object.js +108 -5
  53. package/dist/src/Option.d.ts +58 -0
  54. package/dist/src/Option.d.ts.map +1 -0
  55. package/dist/src/Option.js +43 -0
  56. package/dist/src/Order.d.ts +5 -0
  57. package/dist/src/Order.d.ts.map +1 -1
  58. package/dist/src/Order.js +8 -3
  59. package/dist/src/Platform.d.ts +36 -2
  60. package/dist/src/Platform.d.ts.map +1 -1
  61. package/dist/src/Platform.js +10 -6
  62. package/dist/src/Polyfills.d.ts +27 -0
  63. package/dist/src/Polyfills.d.ts.map +1 -0
  64. package/dist/src/Polyfills.js +299 -0
  65. package/dist/src/Random.d.ts +18 -7
  66. package/dist/src/Random.d.ts.map +1 -1
  67. package/dist/src/Random.js +9 -7
  68. package/dist/src/Redacted.d.ts +7 -4
  69. package/dist/src/Redacted.d.ts.map +1 -1
  70. package/dist/src/Redacted.js +5 -0
  71. package/dist/src/Ref.d.ts +31 -16
  72. package/dist/src/Ref.d.ts.map +1 -1
  73. package/dist/src/Ref.js +35 -7
  74. package/dist/src/RefCount.d.ts +62 -0
  75. package/dist/src/RefCount.d.ts.map +1 -0
  76. package/dist/src/RefCount.js +83 -0
  77. package/dist/src/Relation.d.ts +84 -29
  78. package/dist/src/Relation.d.ts.map +1 -1
  79. package/dist/src/Relation.js +83 -105
  80. package/dist/src/Resource.d.ts +263 -0
  81. package/dist/src/Resource.d.ts.map +1 -0
  82. package/dist/src/Resource.js +389 -0
  83. package/dist/src/Result.d.ts +390 -374
  84. package/dist/src/Result.d.ts.map +1 -1
  85. package/dist/src/Result.js +142 -70
  86. package/dist/src/Schedule.d.ts +953 -0
  87. package/dist/src/Schedule.d.ts.map +1 -0
  88. package/dist/src/Schedule.js +1199 -0
  89. package/dist/src/Set.d.ts +181 -0
  90. package/dist/src/Set.d.ts.map +1 -0
  91. package/dist/src/Set.js +137 -0
  92. package/dist/src/Skiplist.d.ts +6 -1
  93. package/dist/src/Skiplist.d.ts.map +1 -1
  94. package/dist/src/Skiplist.js +5 -0
  95. package/dist/src/Sqlite.d.ts +160 -60
  96. package/dist/src/Sqlite.d.ts.map +1 -1
  97. package/dist/src/Sqlite.js +290 -190
  98. package/dist/src/Store.d.ts +36 -28
  99. package/dist/src/Store.d.ts.map +1 -1
  100. package/dist/src/Store.js +55 -15
  101. package/dist/src/String.d.ts +5 -0
  102. package/dist/src/String.d.ts.map +1 -1
  103. package/dist/src/String.js +5 -0
  104. package/dist/src/Task.d.ts +2263 -423
  105. package/dist/src/Task.d.ts.map +1 -1
  106. package/dist/src/Task.js +1488 -348
  107. package/dist/src/Test.d.ts +122 -0
  108. package/dist/src/Test.d.ts.map +1 -0
  109. package/dist/src/Test.js +66 -0
  110. package/dist/src/Time.d.ts +201 -48
  111. package/dist/src/Time.d.ts.map +1 -1
  112. package/dist/src/Time.js +190 -86
  113. package/dist/src/Tracer.d.ts +48 -0
  114. package/dist/src/Tracer.d.ts.map +1 -0
  115. package/dist/src/Tracer.js +6 -0
  116. package/dist/src/Type.d.ts +582 -209
  117. package/dist/src/Type.d.ts.map +1 -1
  118. package/dist/src/Type.js +362 -240
  119. package/dist/src/Types.d.ts +160 -6
  120. package/dist/src/Types.d.ts.map +1 -1
  121. package/dist/src/Types.js +22 -2
  122. package/dist/src/WebSocket.d.ts +113 -58
  123. package/dist/src/WebSocket.d.ts.map +1 -1
  124. package/dist/src/WebSocket.js +210 -118
  125. package/dist/src/Worker.d.ts +245 -60
  126. package/dist/src/Worker.d.ts.map +1 -1
  127. package/dist/src/Worker.js +220 -64
  128. package/dist/src/index.d.ts +25 -3
  129. package/dist/src/index.d.ts.map +1 -1
  130. package/dist/src/index.js +19 -3
  131. package/dist/src/local-first/Db.d.ts +24 -213
  132. package/dist/src/local-first/Db.d.ts.map +1 -1
  133. package/dist/src/local-first/Db.js +622 -293
  134. package/dist/src/local-first/Error.d.ts +12 -0
  135. package/dist/src/local-first/Error.d.ts.map +1 -0
  136. package/dist/src/local-first/Error.js +6 -0
  137. package/dist/src/local-first/Evolu.d.ts +330 -285
  138. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  139. package/dist/src/local-first/Evolu.js +472 -402
  140. package/dist/src/local-first/LocalAuth.d.ts +10 -10
  141. package/dist/src/local-first/LocalAuth.d.ts.map +1 -1
  142. package/dist/src/local-first/LocalAuth.js +6 -1
  143. package/dist/src/local-first/Owner.d.ts +70 -27
  144. package/dist/src/local-first/Owner.d.ts.map +1 -1
  145. package/dist/src/local-first/Owner.js +27 -14
  146. package/dist/src/local-first/Protocol.d.ts +58 -50
  147. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  148. package/dist/src/local-first/Protocol.js +253 -155
  149. package/dist/src/local-first/Query.d.ts +133 -43
  150. package/dist/src/local-first/Query.d.ts.map +1 -1
  151. package/dist/src/local-first/Query.js +139 -90
  152. package/dist/src/local-first/Relay.d.ts +18 -38
  153. package/dist/src/local-first/Relay.d.ts.map +1 -1
  154. package/dist/src/local-first/Relay.js +59 -171
  155. package/dist/src/local-first/Schema.d.ts +139 -144
  156. package/dist/src/local-first/Schema.d.ts.map +1 -1
  157. package/dist/src/local-first/Schema.js +78 -163
  158. package/dist/src/local-first/Shared.d.ts +125 -0
  159. package/dist/src/local-first/Shared.d.ts.map +1 -0
  160. package/dist/src/local-first/Shared.js +569 -0
  161. package/dist/src/local-first/Storage.d.ts +50 -53
  162. package/dist/src/local-first/Storage.d.ts.map +1 -1
  163. package/dist/src/local-first/Storage.js +121 -173
  164. package/dist/src/local-first/Timestamp.d.ts +28 -35
  165. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  166. package/dist/src/local-first/Timestamp.js +24 -25
  167. package/dist/src/local-first/index.d.ts +2 -15
  168. package/dist/src/local-first/index.d.ts.map +1 -1
  169. package/dist/src/local-first/index.js +2 -15
  170. package/package.json +36 -26
  171. package/src/Array.ts +467 -106
  172. package/src/Assert.ts +87 -12
  173. package/src/BigInt.ts +7 -1
  174. package/src/Brand.ts +41 -12
  175. package/src/Buffer.ts +10 -4
  176. package/src/Cache.ts +11 -2
  177. package/src/Callbacks.ts +33 -23
  178. package/src/Console.ts +567 -178
  179. package/src/Crypto.ts +111 -62
  180. package/src/Eq.ts +30 -3
  181. package/src/Error.ts +50 -34
  182. package/src/Function.ts +140 -68
  183. package/src/Identicon.ts +7 -1
  184. package/src/Lookup.ts +415 -0
  185. package/src/Microtask.ts +58 -0
  186. package/src/Number.ts +40 -7
  187. package/src/Object.ts +155 -16
  188. package/src/Option.ts +74 -0
  189. package/src/Order.ts +11 -3
  190. package/src/Platform.ts +43 -7
  191. package/src/Polyfills.ts +465 -0
  192. package/src/Random.ts +25 -11
  193. package/src/Redacted.ts +8 -4
  194. package/src/Ref.ts +72 -21
  195. package/src/RefCount.ts +170 -0
  196. package/src/Relation.ts +188 -136
  197. package/src/Resource.ts +864 -0
  198. package/src/Result.ts +548 -381
  199. package/src/Schedule.ts +1471 -0
  200. package/src/Set.ts +247 -0
  201. package/src/Skiplist.ts +7 -1
  202. package/src/Sqlite.ts +409 -304
  203. package/src/Store.ts +94 -48
  204. package/src/String.ts +6 -0
  205. package/src/Task.ts +3685 -740
  206. package/src/Test.ts +162 -0
  207. package/src/Time.ts +348 -145
  208. package/src/Tracer.ts +54 -0
  209. package/src/Type.ts +1064 -630
  210. package/src/Types.ts +202 -7
  211. package/src/WebSocket.ts +311 -178
  212. package/src/Worker.ts +527 -147
  213. package/src/index.ts +74 -3
  214. package/src/local-first/Db.ts +871 -597
  215. package/src/local-first/Error.ts +17 -0
  216. package/src/local-first/Evolu.ts +884 -823
  217. package/src/local-first/LocalAuth.ts +10 -10
  218. package/src/local-first/Owner.ts +94 -42
  219. package/src/local-first/Protocol.ts +440 -303
  220. package/src/local-first/Query.ts +243 -194
  221. package/src/local-first/Relay.ts +91 -252
  222. package/src/local-first/Schema.ts +284 -394
  223. package/src/local-first/Shared.ts +932 -0
  224. package/src/local-first/Storage.ts +209 -282
  225. package/src/local-first/Timestamp.ts +38 -45
  226. package/src/local-first/index.ts +2 -16
  227. package/LICENSE +0 -21
  228. package/dist/src/Instances.d.ts +0 -34
  229. package/dist/src/Instances.d.ts.map +0 -1
  230. package/dist/src/Instances.js +0 -44
  231. package/dist/src/Resources.d.ts +0 -118
  232. package/dist/src/Resources.d.ts.map +0 -1
  233. package/dist/src/Resources.js +0 -197
  234. package/dist/src/local-first/Platform.d.ts +0 -25
  235. package/dist/src/local-first/Platform.d.ts.map +0 -1
  236. package/dist/src/local-first/Platform.js +0 -1
  237. package/dist/src/local-first/Public.d.ts +0 -22
  238. package/dist/src/local-first/Public.d.ts.map +0 -1
  239. package/dist/src/local-first/Public.js +0 -15
  240. package/dist/src/local-first/PublicKysely.d.ts +0 -148
  241. package/dist/src/local-first/PublicKysely.d.ts.map +0 -1
  242. package/dist/src/local-first/PublicKysely.js +0 -184
  243. package/dist/src/local-first/Sync.d.ts +0 -112
  244. package/dist/src/local-first/Sync.d.ts.map +0 -1
  245. package/dist/src/local-first/Sync.js +0 -529
  246. package/src/Instances.ts +0 -90
  247. package/src/Resources.ts +0 -367
  248. package/src/local-first/Platform.ts +0 -27
  249. package/src/local-first/Public.ts +0 -42
  250. package/src/local-first/PublicKysely.ts +0 -239
  251. package/src/local-first/Sync.ts +0 -960
@@ -1,22 +1,24 @@
1
- import { filterArray, firstInArray, isNonEmptyReadonlyArray, mapArray, } from "../Array.js";
2
- import { createInstances } from "../Instances.js";
3
- import { err, ok } from "../Result.js";
1
+ /**
2
+ * Relay server for data synchronization.
3
+ *
4
+ * @module
5
+ */
6
+ import { filterArray, firstInArray, isNonEmptyArray, mapArray, } from "../Array.js";
7
+ import { assert } from "../Assert.js";
8
+ import { err, getOk, ok } from "../Result.js";
4
9
  import { sql } from "../Sqlite.js";
5
- import { createMutex, isAsync } from "../Task.js";
6
- import { PositiveInt } from "../Type.js";
7
- import { ownerIdBytesToOwnerId, } from "./Owner.js";
10
+ import { createMutexByKey } from "../Task.js";
11
+ import { Name, PositiveInt } from "../Type.js";
12
+ import { isPromiseLike } from "../Types.js";
13
+ import { OwnerId, ownerIdBytesToOwnerId,
14
+ // OwnerTransport,
15
+ OwnerWriteKey, } from "./Owner.js";
8
16
  import { createBaseSqliteStorage, getOwnerUsage, getTimestampInsertStrategy, updateOwnerUsage, } from "./Storage.js";
9
17
  import { timestampToTimestampBytes } from "./Timestamp.js";
10
18
  export const createRelaySqliteStorage = (deps) => (config) => {
11
- const sqliteStorageBase = createBaseSqliteStorage(deps)(config);
12
- /**
13
- * Mutex instances are cached per OwnerId to prevent concurrent writes for
14
- * the same owner. Instances are never evicted, causing a memory leak
15
- * proportional to unique owner count. However, per-instance overhead should
16
- * be small. Monitor production memory usage to determine if
17
- * eviction/cleanup is needed.
18
- */
19
- const ownerMutexes = createInstances();
19
+ const sqliteStorageBase = createBaseSqliteStorage(deps);
20
+ /** Mutex keyed by OwnerId to prevent concurrent writes. */
21
+ const mutexByOwnerId = createMutexByKey();
20
22
  return {
21
23
  ...sqliteStorageBase,
22
24
  /**
@@ -34,98 +36,73 @@ export const createRelaySqliteStorage = (deps) => (config) => {
34
36
  from evolu_writeKey
35
37
  where ownerId = ${ownerId};
36
38
  `);
37
- if (!selectWriteKey.ok) {
38
- config.onStorageError(selectWriteKey.error);
39
- return false;
40
- }
41
- const { rows } = selectWriteKey.value;
42
- if (isNonEmptyReadonlyArray(rows)) {
39
+ const { rows } = selectWriteKey;
40
+ if (isNonEmptyArray(rows)) {
43
41
  return deps.timingSafeEqual(rows[0].writeKey, writeKey);
44
42
  }
45
- const insertWriteKey = deps.sqlite.exec(sql `
43
+ deps.sqlite.exec(sql `
46
44
  insert into evolu_writeKey (ownerId, writeKey)
47
45
  values (${ownerId}, ${writeKey});
48
46
  `);
49
- if (!insertWriteKey.ok) {
50
- config.onStorageError(insertWriteKey.error);
51
- return false;
52
- }
53
47
  return true;
54
48
  },
55
49
  setWriteKey: (ownerId, writeKey) => {
56
- const upsertWriteKey = deps.sqlite.exec(sql `
50
+ deps.sqlite.exec(sql `
57
51
  insert into evolu_writeKey (ownerId, writeKey)
58
52
  values (${ownerId}, ${writeKey})
59
53
  on conflict (ownerId) do update
60
54
  set writeKey = excluded.writeKey;
61
55
  `);
62
- if (!upsertWriteKey.ok) {
63
- config.onStorageError(upsertWriteKey.error);
64
- return false;
65
- }
66
- return true;
67
56
  },
68
- writeMessages: async (ownerIdBytes, messages) => {
57
+ writeMessages: (ownerIdBytes, messages) => async (run) => {
69
58
  const ownerId = ownerIdBytesToOwnerId(ownerIdBytes);
70
59
  const messagesWithTimestampBytes = mapArray(messages, (m) => ({
71
60
  timestamp: timestampToTimestampBytes(m.timestamp),
72
61
  change: m.change,
73
62
  }));
74
- const result = await ownerMutexes
75
- .ensure(ownerId, createMutex)
76
- .withLock(async () => {
63
+ const result = await run(mutexByOwnerId.withLock(ownerId, async () => {
77
64
  const existingTimestampsResult = sqliteStorageBase.getExistingTimestamps(ownerIdBytes, mapArray(messagesWithTimestampBytes, (m) => m.timestamp));
78
- if (!existingTimestampsResult.ok)
79
- return existingTimestampsResult;
80
- const existingTimestampsSet = new Set(existingTimestampsResult.value.map((t) => t.toString()));
65
+ const existingTimestampsSet = new Set(existingTimestampsResult.map((t) => t.toString()));
81
66
  const newMessages = filterArray(messagesWithTimestampBytes, (m) => !existingTimestampsSet.has(m.timestamp.toString()));
82
67
  // Nothing to write
83
- if (!isNonEmptyReadonlyArray(newMessages)) {
68
+ if (!isNonEmptyArray(newMessages)) {
84
69
  return ok();
85
70
  }
86
- const usage = getOwnerUsage(deps)(ownerIdBytes, firstInArray(newMessages).timestamp);
87
- if (!usage.ok)
88
- return usage;
89
- const { storedBytes } = usage.value;
71
+ const usage = getOk(getOwnerUsage(deps)(ownerIdBytes, firstInArray(newMessages).timestamp));
90
72
  const incomingBytes = newMessages.reduce((sum, m) => sum + m.change.length, 0);
91
- const newStoredBytes = PositiveInt.orThrow((storedBytes ?? 0) + incomingBytes);
92
- const result = config.isOwnerWithinQuota(ownerId, newStoredBytes);
93
- const isWithinQuota = isAsync(result) ? await result : result;
73
+ const newStoredBytes = PositiveInt.orThrow((usage.storedBytes ?? 0) + incomingBytes);
74
+ const quotaResult = config.isOwnerWithinQuota(ownerId, newStoredBytes);
75
+ const isWithinQuota = isPromiseLike(quotaResult)
76
+ ? await quotaResult
77
+ : quotaResult;
94
78
  if (!isWithinQuota) {
95
- return err({ type: "StorageQuotaError", ownerId });
79
+ return err({
80
+ type: "StorageQuotaError",
81
+ ownerId,
82
+ });
96
83
  }
97
- let { firstTimestamp, lastTimestamp } = usage.value;
84
+ let { firstTimestamp, lastTimestamp } = usage;
98
85
  return deps.sqlite.transaction(() => {
99
86
  for (const { timestamp, change } of newMessages) {
100
87
  let strategy;
101
88
  [strategy, firstTimestamp, lastTimestamp] =
102
89
  getTimestampInsertStrategy(timestamp, firstTimestamp, lastTimestamp);
103
- {
104
- const result = sqliteStorageBase.insertTimestamp(ownerIdBytes, timestamp, strategy);
105
- if (!result.ok)
106
- return result;
107
- }
108
- {
109
- const result = deps.sqlite.exec(sql `
110
- insert into evolu_message ("ownerId", "timestamp", "change")
111
- values (${ownerIdBytes}, ${timestamp}, ${change})
112
- on conflict do nothing;
113
- `);
114
- if (!result.ok)
115
- return result;
116
- }
90
+ sqliteStorageBase.insertTimestamp(ownerIdBytes, timestamp, strategy);
91
+ deps.sqlite.exec(sql `
92
+ insert into evolu_message
93
+ ("ownerId", "timestamp", "change")
94
+ values (${ownerIdBytes}, ${timestamp}, ${change})
95
+ on conflict do nothing;
96
+ `);
117
97
  }
118
- return updateOwnerUsage(deps)(ownerIdBytes, newStoredBytes, firstTimestamp, lastTimestamp);
98
+ updateOwnerUsage(deps)(ownerIdBytes, newStoredBytes, firstTimestamp, lastTimestamp);
99
+ return ok();
119
100
  });
120
- })();
121
- if (!result.ok && result.error.type !== "AbortError") {
122
- switch (result.error.type) {
123
- case "SqliteError":
124
- config.onStorageError(result.error);
125
- return err({ type: "StorageWriteError", ownerId });
126
- case "StorageQuotaError":
127
- return err({ type: "StorageQuotaError", ownerId });
128
- }
101
+ }));
102
+ if (!result.ok) {
103
+ if (result.error.type === "AbortError")
104
+ return ok();
105
+ return result;
129
106
  }
130
107
  return ok();
131
108
  },
@@ -135,40 +112,24 @@ export const createRelaySqliteStorage = (deps) => (config) => {
135
112
  from evolu_message
136
113
  where "ownerId" = ${ownerId} and "timestamp" = ${timestamp};
137
114
  `);
138
- if (!result.ok) {
139
- config.onStorageError(result.error);
140
- return null;
141
- }
142
- return result.value.rows[0]?.change;
115
+ const row = result.rows[0];
116
+ assert(row, "Every timestamp must have a change");
117
+ return row.change;
143
118
  },
144
119
  deleteOwner: (ownerId) => {
145
- const transactionResult = deps.sqlite.transaction(() => {
146
- const deleteWriteKey = deps.sqlite.exec(sql `
120
+ deps.sqlite.transaction(() => {
121
+ deps.sqlite.exec(sql `
147
122
  delete from evolu_writeKey where ownerId = ${ownerId};
148
123
  `);
149
- if (!deleteWriteKey.ok)
150
- return deleteWriteKey;
151
- const deleteMessages = deps.sqlite.exec(sql `
124
+ deps.sqlite.exec(sql `
152
125
  delete from evolu_message where ownerId = ${ownerId};
153
126
  `);
154
- if (!deleteMessages.ok)
155
- return deleteMessages;
156
- const deleteUsage = deps.sqlite.exec(sql `
127
+ deps.sqlite.exec(sql `
157
128
  delete from evolu_usage where ownerId = ${ownerId};
158
129
  `);
159
- if (!deleteUsage.ok)
160
- return deleteUsage;
161
- const deleteBaseOwner = sqliteStorageBase.deleteOwner(ownerId);
162
- if (!deleteBaseOwner)
163
- return err(null);
130
+ sqliteStorageBase.deleteOwner(ownerId);
164
131
  return ok();
165
132
  });
166
- if (!transactionResult.ok) {
167
- if (transactionResult.error)
168
- config.onStorageError(transactionResult.error);
169
- return false;
170
- }
171
- return true;
172
133
  },
173
134
  };
174
135
  };
@@ -192,79 +153,6 @@ export const createRelayStorageTables = (deps) => {
192
153
  strict;
193
154
  `,
194
155
  ]) {
195
- const result = deps.sqlite.exec(query);
196
- if (!result.ok)
197
- return result;
156
+ deps.sqlite.exec(query);
198
157
  }
199
- return ok();
200
158
  };
201
- export const createRelayLogger = (deps) => ({
202
- started: (enableLogging, port) => {
203
- deps.console.enabled = true;
204
- deps.console.log(`Evolu Relay started on port ${port}`);
205
- deps.console.enabled = enableLogging;
206
- },
207
- storageError: (error) => {
208
- deps.console.error("[relay]", "storage", error);
209
- },
210
- upgradeSocketError: (error) => {
211
- deps.console.warn("[relay]", "socket error", { error });
212
- },
213
- invalidOrMissingOwnerIdInUrl: (url) => {
214
- deps.console.warn("[relay]", "invalid or missing ownerId in URL", { url });
215
- },
216
- unauthorizedOwner: (ownerId) => {
217
- deps.console.warn("[relay]", "unauthorized owner", { ownerId });
218
- },
219
- connectionEstablished: (totalConnectionCount) => {
220
- deps.console.log("[relay]", "connection", { totalConnectionCount });
221
- },
222
- connectionWebSocketError: (error) => {
223
- deps.console.error("[relay]", "error", { error });
224
- },
225
- relayOptionSubscribe: (ownerId, getSubscriberCount) => {
226
- if (deps.console.enabled)
227
- deps.console.log("[relay]", "subscribe", {
228
- ownerId,
229
- subscriberCount: getSubscriberCount(),
230
- });
231
- },
232
- relayOptionUnsubscribe: (ownerId, getSubscriberCount) => {
233
- if (deps.console.enabled)
234
- deps.console.log("[relay]", "unsubscribe", {
235
- ownerId,
236
- subscriberCount: getSubscriberCount(),
237
- });
238
- },
239
- relayOptionBroadcast: (ownerId, broadcastCount, totalSubscribers) => {
240
- deps.console.log("[relay]", "broadcast", {
241
- ownerId,
242
- broadcastCount,
243
- totalSubscribers,
244
- });
245
- },
246
- messageLength: (messageLength) => {
247
- deps.console.log("[relay]", "on message", { messageLength });
248
- },
249
- applyProtocolMessageAsRelayError: (error) => {
250
- deps.console.error("[relay]", "applyProtocolMessageAsRelay", error);
251
- },
252
- responseLength: (responseLength) => {
253
- deps.console.log("[relay]", "responseLength", { responseLength });
254
- },
255
- applyProtocolMessageAsRelayUnknownError: (error) => {
256
- deps.console.error("[relay]", "applyProtocolMessageAsRelayUnknownError", error);
257
- },
258
- connectionClosed: (totalConnectionCount) => {
259
- deps.console.log("[relay]", "close", { totalConnectionCount });
260
- },
261
- shuttingDown: () => {
262
- deps.console.log("Shutting down Evolu Relay...");
263
- },
264
- webSocketServerDisposed: () => {
265
- deps.console.log("Evolu Relay WebSocketServer disposed");
266
- },
267
- httpServerDisposed: () => {
268
- deps.console.log("Evolu Relay HTTP server disposed");
269
- },
270
- });