@livestore/utils 0.4.0 → 0.5.0-dev.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 (247) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/NoopTracer.d.ts +7 -8
  3. package/dist/NoopTracer.d.ts.map +1 -1
  4. package/dist/NoopTracer.js +3 -18
  5. package/dist/NoopTracer.js.map +1 -1
  6. package/dist/NoopTracer.test.d.ts +2 -0
  7. package/dist/NoopTracer.test.d.ts.map +1 -0
  8. package/dist/NoopTracer.test.js +17 -0
  9. package/dist/NoopTracer.test.js.map +1 -0
  10. package/dist/browser/Opfs/Opfs.d.ts +179 -29
  11. package/dist/browser/Opfs/Opfs.d.ts.map +1 -1
  12. package/dist/browser/Opfs/Opfs.js +132 -307
  13. package/dist/browser/Opfs/Opfs.js.map +1 -1
  14. package/dist/browser/Opfs/debug-utils.d.ts.map +1 -1
  15. package/dist/browser/Opfs/debug-utils.js +5 -4
  16. package/dist/browser/Opfs/debug-utils.js.map +1 -1
  17. package/dist/browser/Opfs/utils.d.ts +8 -8
  18. package/dist/browser/Opfs/utils.d.ts.map +1 -1
  19. package/dist/browser/Opfs/utils.js +35 -26
  20. package/dist/browser/Opfs/utils.js.map +1 -1
  21. package/dist/browser/QuotaExceededError.d.ts +10 -9
  22. package/dist/browser/QuotaExceededError.d.ts.map +1 -1
  23. package/dist/browser/WebChannelBrowser.d.ts.map +1 -1
  24. package/dist/browser/WebChannelBrowser.js +21 -10
  25. package/dist/browser/WebChannelBrowser.js.map +1 -1
  26. package/dist/browser/WebError.d.ts +54 -86
  27. package/dist/browser/WebError.d.ts.map +1 -1
  28. package/dist/browser/WebError.js +91 -84
  29. package/dist/browser/WebError.js.map +1 -1
  30. package/dist/browser/WebError.test.js +6 -6
  31. package/dist/browser/WebError.test.js.map +1 -1
  32. package/dist/browser/WebLock.d.ts.map +1 -1
  33. package/dist/browser/WebLock.js +13 -13
  34. package/dist/browser/WebLock.js.map +1 -1
  35. package/dist/effect/Debug.d.ts +4 -7
  36. package/dist/effect/Debug.d.ts.map +1 -1
  37. package/dist/effect/Debug.js +32 -36
  38. package/dist/effect/Debug.js.map +1 -1
  39. package/dist/effect/Effect.d.ts +31 -22
  40. package/dist/effect/Effect.d.ts.map +1 -1
  41. package/dist/effect/Effect.js +51 -47
  42. package/dist/effect/Effect.js.map +1 -1
  43. package/dist/effect/Effect.test.d.ts +2 -0
  44. package/dist/effect/Effect.test.d.ts.map +1 -0
  45. package/dist/effect/Effect.test.js +72 -0
  46. package/dist/effect/Effect.test.js.map +1 -0
  47. package/dist/effect/Error.d.ts +4 -6
  48. package/dist/effect/Error.d.ts.map +1 -1
  49. package/dist/effect/Logger.d.ts +0 -6
  50. package/dist/effect/Logger.d.ts.map +1 -1
  51. package/dist/effect/Logger.js +0 -32
  52. package/dist/effect/Logger.js.map +1 -1
  53. package/dist/effect/OtelTracer.d.ts +1 -1
  54. package/dist/effect/OtelTracer.d.ts.map +1 -1
  55. package/dist/effect/OtelTracer.js +2 -3
  56. package/dist/effect/OtelTracer.js.map +1 -1
  57. package/dist/effect/RpcClient.d.ts +7 -7
  58. package/dist/effect/RpcClient.d.ts.map +1 -1
  59. package/dist/effect/RpcClient.js +72 -52
  60. package/dist/effect/RpcClient.js.map +1 -1
  61. package/dist/effect/Schedule.d.ts +1 -1
  62. package/dist/effect/Schedule.d.ts.map +1 -1
  63. package/dist/effect/Schedule.js +2 -2
  64. package/dist/effect/Schedule.js.map +1 -1
  65. package/dist/effect/Schema/debug-diff.d.ts +1 -1
  66. package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
  67. package/dist/effect/Schema/debug-diff.js +5 -7
  68. package/dist/effect/Schema/debug-diff.js.map +1 -1
  69. package/dist/effect/Schema/debug-diff.test.js +7 -4
  70. package/dist/effect/Schema/debug-diff.test.js.map +1 -1
  71. package/dist/effect/Schema/index.d.ts +28 -20
  72. package/dist/effect/Schema/index.d.ts.map +1 -1
  73. package/dist/effect/Schema/index.js +55 -28
  74. package/dist/effect/Schema/index.js.map +1 -1
  75. package/dist/effect/Stream.d.ts +13 -5
  76. package/dist/effect/Stream.d.ts.map +1 -1
  77. package/dist/effect/Stream.js +19 -12
  78. package/dist/effect/Stream.js.map +1 -1
  79. package/dist/effect/Stream.test.js +9 -9
  80. package/dist/effect/Stream.test.js.map +1 -1
  81. package/dist/effect/Subscribable.d.ts +9 -3
  82. package/dist/effect/Subscribable.d.ts.map +1 -1
  83. package/dist/effect/Subscribable.js +20 -35
  84. package/dist/effect/Subscribable.js.map +1 -1
  85. package/dist/effect/SubscriptionRef.d.ts +5 -6
  86. package/dist/effect/SubscriptionRef.d.ts.map +1 -1
  87. package/dist/effect/SubscriptionRef.js +2 -3
  88. package/dist/effect/SubscriptionRef.js.map +1 -1
  89. package/dist/effect/TaskTracing.d.ts +1 -1
  90. package/dist/effect/TaskTracing.d.ts.map +1 -1
  91. package/dist/effect/TaskTracing.js +12 -16
  92. package/dist/effect/TaskTracing.js.map +1 -1
  93. package/dist/effect/WebChannel/WebChannel.d.ts +7 -7
  94. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
  95. package/dist/effect/WebChannel/WebChannel.js +64 -43
  96. package/dist/effect/WebChannel/WebChannel.js.map +1 -1
  97. package/dist/effect/WebChannel/WebChannel.test.js +15 -15
  98. package/dist/effect/WebChannel/WebChannel.test.js.map +1 -1
  99. package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
  100. package/dist/effect/WebChannel/broadcastChannelWithAck.js +16 -9
  101. package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
  102. package/dist/effect/WebChannel/common.d.ts +16 -17
  103. package/dist/effect/WebChannel/common.d.ts.map +1 -1
  104. package/dist/effect/WebChannel/common.js +6 -6
  105. package/dist/effect/WebChannel/common.js.map +1 -1
  106. package/dist/effect/WebSocket.d.ts +4 -6
  107. package/dist/effect/WebSocket.d.ts.map +1 -1
  108. package/dist/effect/WebSocket.js +4 -4
  109. package/dist/effect/WebSocket.js.map +1 -1
  110. package/dist/effect/WebSocket.test.js +2 -2
  111. package/dist/effect/WebSocket.test.js.map +1 -1
  112. package/dist/effect/mod.browser-build.test.d.ts +2 -0
  113. package/dist/effect/mod.browser-build.test.d.ts.map +1 -0
  114. package/dist/effect/mod.browser-build.test.js +18 -0
  115. package/dist/effect/mod.browser-build.test.js.map +1 -0
  116. package/dist/effect/mod.d.ts +13 -15
  117. package/dist/effect/mod.d.ts.map +1 -1
  118. package/dist/effect/mod.js +13 -18
  119. package/dist/effect/mod.js.map +1 -1
  120. package/dist/effect/spanEvent.d.ts.map +1 -1
  121. package/dist/effect/spanEvent.js +2 -2
  122. package/dist/effect/spanEvent.js.map +1 -1
  123. package/dist/effect/spanEvent.test.js +10 -13
  124. package/dist/effect/spanEvent.test.js.map +1 -1
  125. package/dist/fast-deep-equal.d.ts.map +1 -1
  126. package/dist/fast-deep-equal.js +1 -2
  127. package/dist/fast-deep-equal.js.map +1 -1
  128. package/dist/misc.js +2 -2
  129. package/dist/misc.js.map +1 -1
  130. package/dist/mod.d.ts +0 -35
  131. package/dist/mod.d.ts.map +1 -1
  132. package/dist/mod.js +0 -8
  133. package/dist/mod.js.map +1 -1
  134. package/dist/node/mod.d.ts +17 -11
  135. package/dist/node/mod.d.ts.map +1 -1
  136. package/dist/node/mod.js +23 -16
  137. package/dist/node/mod.js.map +1 -1
  138. package/dist/object/index.d.ts +0 -9
  139. package/dist/object/index.d.ts.map +1 -1
  140. package/dist/object/index.js +0 -9
  141. package/dist/object/index.js.map +1 -1
  142. package/dist/string.d.ts +0 -2
  143. package/dist/string.d.ts.map +1 -1
  144. package/dist/string.js +0 -2
  145. package/dist/string.js.map +1 -1
  146. package/package.json +18 -36
  147. package/src/NoopTracer.test.ts +20 -0
  148. package/src/NoopTracer.ts +18 -41
  149. package/src/browser/Opfs/Opfs.ts +304 -277
  150. package/src/browser/Opfs/debug-utils.ts +7 -6
  151. package/src/browser/Opfs/utils.ts +36 -26
  152. package/src/browser/QuotaExceededError.ts +13 -10
  153. package/src/browser/WebChannelBrowser.ts +25 -11
  154. package/src/browser/WebError.test.ts +6 -6
  155. package/src/browser/WebError.ts +107 -133
  156. package/src/browser/WebLock.ts +13 -14
  157. package/src/effect/Debug.ts +66 -59
  158. package/src/effect/Effect.test.ts +117 -0
  159. package/src/effect/Effect.ts +84 -71
  160. package/src/effect/Logger.ts +0 -48
  161. package/src/effect/OtelTracer.ts +2 -3
  162. package/src/effect/RpcClient.ts +80 -61
  163. package/src/effect/Schedule.ts +4 -5
  164. package/src/effect/Schema/debug-diff.test.ts +6 -6
  165. package/src/effect/Schema/debug-diff.ts +6 -8
  166. package/src/effect/Schema/index.ts +122 -61
  167. package/src/effect/Stream.test.ts +9 -9
  168. package/src/effect/Stream.ts +23 -16
  169. package/src/effect/Subscribable.ts +31 -42
  170. package/src/effect/SubscriptionRef.ts +8 -12
  171. package/src/effect/TaskTracing.ts +13 -16
  172. package/src/effect/WebChannel/WebChannel.test.ts +23 -23
  173. package/src/effect/WebChannel/WebChannel.ts +87 -55
  174. package/src/effect/WebChannel/broadcastChannelWithAck.ts +21 -11
  175. package/src/effect/WebChannel/common.ts +14 -15
  176. package/src/effect/WebSocket.test.ts +2 -2
  177. package/src/effect/WebSocket.ts +9 -6
  178. package/src/effect/mod.browser-build.test.ts +19 -0
  179. package/src/effect/mod.ts +35 -69
  180. package/src/effect/spanEvent.test.ts +10 -13
  181. package/src/effect/spanEvent.ts +5 -3
  182. package/src/fast-deep-equal.ts +1 -2
  183. package/src/misc.ts +2 -2
  184. package/src/mod.ts +0 -36
  185. package/src/node/mod.ts +26 -20
  186. package/src/object/index.ts +0 -24
  187. package/src/string.ts +0 -3
  188. package/dist/effect/BucketQueue.d.ts +0 -20
  189. package/dist/effect/BucketQueue.d.ts.map +0 -1
  190. package/dist/effect/BucketQueue.js +0 -34
  191. package/dist/effect/BucketQueue.js.map +0 -1
  192. package/dist/effect/Scheduler.d.ts +0 -4
  193. package/dist/effect/Scheduler.d.ts.map +0 -1
  194. package/dist/effect/Scheduler.js +0 -9
  195. package/dist/effect/Scheduler.js.map +0 -1
  196. package/dist/effect/ServiceContext.d.ts +0 -37
  197. package/dist/effect/ServiceContext.d.ts.map +0 -1
  198. package/dist/effect/ServiceContext.js +0 -55
  199. package/dist/effect/ServiceContext.js.map +0 -1
  200. package/dist/guards.d.ts +0 -20
  201. package/dist/guards.d.ts.map +0 -1
  202. package/dist/guards.js +0 -20
  203. package/dist/guards.js.map +0 -1
  204. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -4
  205. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +0 -1
  206. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +0 -128
  207. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +0 -1
  208. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +0 -10
  209. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +0 -1
  210. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +0 -217
  211. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +0 -1
  212. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +0 -84
  213. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +0 -1
  214. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +0 -68
  215. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +0 -1
  216. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +0 -2
  217. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +0 -1
  218. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +0 -52
  219. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +0 -1
  220. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +0 -23
  221. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +0 -1
  222. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -138
  223. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +0 -1
  224. package/dist/object/omit.d.ts +0 -3
  225. package/dist/object/omit.d.ts.map +0 -1
  226. package/dist/object/omit.js +0 -14
  227. package/dist/object/omit.js.map +0 -1
  228. package/dist/object/pick.d.ts +0 -14
  229. package/dist/object/pick.d.ts.map +0 -1
  230. package/dist/object/pick.js +0 -17
  231. package/dist/object/pick.js.map +0 -1
  232. package/dist/time.d.ts +0 -12
  233. package/dist/time.d.ts.map +0 -1
  234. package/dist/time.js +0 -22
  235. package/dist/time.js.map +0 -1
  236. package/src/effect/BucketQueue.ts +0 -49
  237. package/src/effect/Scheduler.ts +0 -13
  238. package/src/effect/ServiceContext.ts +0 -108
  239. package/src/guards.ts +0 -23
  240. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +0 -148
  241. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +0 -311
  242. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +0 -78
  243. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +0 -65
  244. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +0 -169
  245. package/src/object/omit.ts +0 -17
  246. package/src/object/pick.ts +0 -27
  247. package/src/time.ts +0 -25
@@ -1,5 +1,5 @@
1
1
  import './QuotaExceededError.ts'
2
- import { Either, ParseResult, Predicate, Schema } from 'effect'
2
+ import { Predicate, Schema } from 'effect'
3
3
 
4
4
  /**
5
5
  * Unique identifier for web errors.
@@ -23,7 +23,7 @@ const TypeId = '~@livestore/utils/WebError' as const
23
23
  * })
24
24
  *
25
25
  * console.log(WebError.isWebError(someError)) // false
26
- * console.log(WebError.isWebError(webError)) // true
26
+ * console.log(WebError.isWebError(webError)) // true
27
27
  * ```
28
28
  */
29
29
  export const isWebError = (u: unknown): u is WebError => Predicate.hasProperty(u, TypeId)
@@ -43,9 +43,7 @@ export const isWebError = (u: unknown): u is WebError => Predicate.hasProperty(u
43
43
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Evalerror | MDN Reference}
44
44
  * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-evalerror | Specification}
45
45
  */
46
- export class EvalError extends Schema.TaggedError<EvalError>(
47
- `${TypeId}/EvalError`,
48
- )('EvalError', {
46
+ export class EvalError extends Schema.TaggedError<EvalError>(`${TypeId}/EvalError`)('EvalError', {
49
47
  cause: Schema.instanceOf(globalThis.EvalError),
50
48
  }) {
51
49
  readonly [TypeId] = TypeId
@@ -59,9 +57,7 @@ export class EvalError extends Schema.TaggedError<EvalError>(
59
57
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Rangeerror | MDN Reference}
60
58
  * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-rangeerror | Specification}
61
59
  */
62
- export class RangeError extends Schema.TaggedError<RangeError>(
63
- `${TypeId}/RangeError`,
64
- )('RangeError', {
60
+ export class RangeError extends Schema.TaggedError<RangeError>(`${TypeId}/RangeError`)('RangeError', {
65
61
  cause: Schema.instanceOf(globalThis.RangeError),
66
62
  }) {
67
63
  readonly [TypeId] = TypeId
@@ -75,9 +71,7 @@ export class RangeError extends Schema.TaggedError<RangeError>(
75
71
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Referenceerror | MDN Reference}
76
72
  * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-referenceerror | Specification}
77
73
  */
78
- export class ReferenceError extends Schema.TaggedError<ReferenceError>(
79
- `${TypeId}/ReferenceError`,
80
- )('ReferenceError', {
74
+ export class ReferenceError extends Schema.TaggedError<ReferenceError>(`${TypeId}/ReferenceError`)('ReferenceError', {
81
75
  cause: Schema.instanceOf(globalThis.ReferenceError),
82
76
  }) {
83
77
  readonly [TypeId] = TypeId
@@ -91,9 +85,7 @@ export class ReferenceError extends Schema.TaggedError<ReferenceError>(
91
85
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Typeerror | MDN Reference}
92
86
  * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-typeerror | Specification}
93
87
  */
94
- export class TypeError extends Schema.TaggedError<TypeError>(
95
- `${TypeId}/TypeError`,
96
- )('TypeError', {
88
+ export class TypeError extends Schema.TaggedError<TypeError>(`${TypeId}/TypeError`)('TypeError', {
97
89
  cause: Schema.instanceOf(globalThis.TypeError),
98
90
  }) {
99
91
  readonly [TypeId] = TypeId
@@ -107,9 +99,7 @@ export class TypeError extends Schema.TaggedError<TypeError>(
107
99
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIerror | MDN Reference}
108
100
  * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-urierror | Specification}
109
101
  */
110
- export class URIError extends Schema.TaggedError<URIError>(
111
- `${TypeId}/URIError`,
112
- )('URIError', {
102
+ export class URIError extends Schema.TaggedError<URIError>(`${TypeId}/URIError`)('URIError', {
113
103
  cause: Schema.instanceOf(globalThis.URIError),
114
104
  }) {
115
105
  readonly [TypeId] = TypeId
@@ -123,13 +113,11 @@ export class URIError extends Schema.TaggedError<URIError>(
123
113
  // [Specification](https://webidl.spec.whatwg.org/#idl-DOMException-derived-predefineds)
124
114
 
125
115
  const domExceptionWithName = (expectedName: string) =>
126
- Schema.instanceOf(DOMException).pipe(
127
- Schema.filter((a, options) =>
128
- ParseResult.validateEither(
129
- Schema.Struct({
130
- name: Schema.Literal(expectedName),
131
- }),
132
- )(a, options).pipe(Either.flip, Either.getOrUndefined),
116
+ Schema.instanceOf(DOMException).check(
117
+ Schema.makeFilter((domException) =>
118
+ domException.name === expectedName
119
+ ? undefined
120
+ : `Expected DOMException with name "${expectedName}", got "${domException.name}"`,
133
121
  ),
134
122
  )
135
123
 
@@ -141,17 +129,18 @@ const domExceptionWithName = (expectedName: string) =>
141
129
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/QuotaExceededError | MDN Reference}
142
130
  * @see {@link https://webidl.spec.whatwg.org/#quotaexceedederror | Specification}
143
131
  */
144
- export class QuotaExceededError extends Schema.TaggedError<QuotaExceededError>(
145
- `${TypeId}/QuotaExceededError`,
146
- )('QuotaExceededError', {
147
- cause: Schema.Union(
148
- typeof globalThis.QuotaExceededError === 'function'
149
- ? Schema.instanceOf(globalThis.QuotaExceededError)
150
- : Schema.Never,
151
- // Deprecated but still in use in some browsers
152
- domExceptionWithName('QuotaExceededError'),
153
- ),
154
- }) {
132
+ export class QuotaExceededError extends Schema.TaggedError<QuotaExceededError>(`${TypeId}/QuotaExceededError`)(
133
+ 'QuotaExceededError',
134
+ {
135
+ cause: Schema.Union([
136
+ typeof globalThis.QuotaExceededError === 'function'
137
+ ? Schema.instanceOf(globalThis.QuotaExceededError)
138
+ : Schema.Never,
139
+ // Deprecated but still in use in some browsers
140
+ domExceptionWithName('QuotaExceededError'),
141
+ ]),
142
+ },
143
+ ) {
155
144
  readonly [TypeId] = TypeId
156
145
  override get message(): string {
157
146
  return this.cause.message
@@ -192,9 +181,7 @@ export class NoModificationAllowedError extends Schema.TaggedError<NoModificatio
192
181
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#notfounderror | MDN Reference}
193
182
  * @see {@link https://webidl.spec.whatwg.org/#notfounderror | Specification}
194
183
  */
195
- export class NotFoundError extends Schema.TaggedError<NotFoundError>(
196
- `${TypeId}/NotFoundError`,
197
- )('NotFoundError', {
184
+ export class NotFoundError extends Schema.TaggedError<NotFoundError>(`${TypeId}/NotFoundError`)('NotFoundError', {
198
185
  cause: domExceptionWithName('NotFoundError'),
199
186
  }) {
200
187
  readonly [TypeId] = TypeId
@@ -211,11 +198,12 @@ export class NotFoundError extends Schema.TaggedError<NotFoundError>(
211
198
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#notallowederror | MDN Reference}
212
199
  * @see {@link https://webidl.spec.whatwg.org/#notallowederror | Specification}
213
200
  */
214
- export class NotAllowedError extends Schema.TaggedError<NotAllowedError>(
215
- `${TypeId}/NotAllowedError`,
216
- )('NotAllowedError', {
217
- cause: domExceptionWithName('NotAllowedError'),
218
- }) {
201
+ export class NotAllowedError extends Schema.TaggedError<NotAllowedError>(`${TypeId}/NotAllowedError`)(
202
+ 'NotAllowedError',
203
+ {
204
+ cause: domExceptionWithName('NotAllowedError'),
205
+ },
206
+ ) {
219
207
  readonly [TypeId] = TypeId
220
208
  override get message(): string {
221
209
  return this.cause.message
@@ -230,11 +218,12 @@ export class NotAllowedError extends Schema.TaggedError<NotAllowedError>(
230
218
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#typemismatcherror | MDN Reference}
231
219
  * @see {@link https://webidl.spec.whatwg.org/#typemismatcherror | Specification}
232
220
  */
233
- export class TypeMismatchError extends Schema.TaggedError<TypeMismatchError>(
234
- `${TypeId}/TypeMismatchError`,
235
- )('TypeMismatchError', {
236
- cause: domExceptionWithName('TypeMismatchError'),
237
- }) {
221
+ export class TypeMismatchError extends Schema.TaggedError<TypeMismatchError>(`${TypeId}/TypeMismatchError`)(
222
+ 'TypeMismatchError',
223
+ {
224
+ cause: domExceptionWithName('TypeMismatchError'),
225
+ },
226
+ ) {
238
227
  readonly [TypeId] = TypeId
239
228
  override get message(): string {
240
229
  return this.cause.message
@@ -249,11 +238,12 @@ export class TypeMismatchError extends Schema.TaggedError<TypeMismatchError>(
249
238
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#invalidstateerror | MDN Reference}
250
239
  * @see {@link https://webidl.spec.whatwg.org/#invalidstateerror | Specification}
251
240
  */
252
- export class InvalidStateError extends Schema.TaggedError<InvalidStateError>(
253
- `${TypeId}/InvalidStateError`,
254
- )('InvalidStateError', {
255
- cause: domExceptionWithName('InvalidStateError'),
256
- }) {
241
+ export class InvalidStateError extends Schema.TaggedError<InvalidStateError>(`${TypeId}/InvalidStateError`)(
242
+ 'InvalidStateError',
243
+ {
244
+ cause: domExceptionWithName('InvalidStateError'),
245
+ },
246
+ ) {
257
247
  readonly [TypeId] = TypeId
258
248
  override get message(): string {
259
249
  return this.cause.message
@@ -268,9 +258,7 @@ export class InvalidStateError extends Schema.TaggedError<InvalidStateError>(
268
258
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#aborterror | MDN Reference}
269
259
  * @see {@link https://webidl.spec.whatwg.org/#aborterror | Specification}
270
260
  */
271
- export class AbortError extends Schema.TaggedError<AbortError>(
272
- `${TypeId}/AbortError`,
273
- )('AbortError', {
261
+ export class AbortError extends Schema.TaggedError<AbortError>(`${TypeId}/AbortError`)('AbortError', {
274
262
  cause: domExceptionWithName('AbortError'),
275
263
  }) {
276
264
  readonly [TypeId] = TypeId
@@ -306,9 +294,7 @@ export class InvalidModificationError extends Schema.TaggedError<InvalidModifica
306
294
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#securityerror | MDN Reference}
307
295
  * @see {@link https://webidl.spec.whatwg.org/#securityerror | Specification}
308
296
  */
309
- export class SecurityError extends Schema.TaggedError<SecurityError>(
310
- `${TypeId}/SecurityError`,
311
- )('SecurityError', {
297
+ export class SecurityError extends Schema.TaggedError<SecurityError>(`${TypeId}/SecurityError`)('SecurityError', {
312
298
  cause: domExceptionWithName('SecurityError'),
313
299
  }) {
314
300
  readonly [TypeId] = TypeId
@@ -325,9 +311,7 @@ export class SecurityError extends Schema.TaggedError<SecurityError>(
325
311
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#datacloneerror | MDN Reference}
326
312
  * @see {@link https://webidl.spec.whatwg.org/#datacloneerror | Specification}
327
313
  */
328
- export class DataCloneError extends Schema.TaggedError<DataCloneError>(
329
- `${TypeId}/DataCloneError`,
330
- )('DataCloneError', {
314
+ export class DataCloneError extends Schema.TaggedError<DataCloneError>(`${TypeId}/DataCloneError`)('DataCloneError', {
331
315
  cause: domExceptionWithName('DataCloneError'),
332
316
  }) {
333
317
  readonly [TypeId] = TypeId
@@ -375,13 +359,11 @@ export class DataCloneError extends Schema.TaggedError<DataCloneError>(
375
359
  * )
376
360
  * ```
377
361
  */
378
- export class UnknownError extends Schema.TaggedError<UnknownError>(
379
- `${TypeId}/UnknownError`,
380
- )('UnknownError', {
362
+ export class UnknownError extends Schema.TaggedError<UnknownError>(`${TypeId}/UnknownError`)('UnknownError', {
381
363
  module: Schema.optional(Schema.String),
382
364
  method: Schema.optional(Schema.String),
383
365
  description: Schema.optional(Schema.String),
384
- cause: Schema.optional(Schema.Defect),
366
+ cause: Schema.optional(Schema.Defect()),
385
367
  }) {
386
368
  readonly [TypeId] = TypeId
387
369
  override get message(): string {
@@ -467,7 +449,7 @@ export const WebError: Schema.Union<
467
449
  // Custom Errors
468
450
  typeof UnknownError,
469
451
  ]
470
- > = Schema.Union(
452
+ > = Schema.Union([
471
453
  // Simple Exception Errors
472
454
  EvalError,
473
455
  RangeError,
@@ -488,7 +470,7 @@ export const WebError: Schema.Union<
488
470
  DataCloneError,
489
471
  // Custom Errors
490
472
  UnknownError,
491
- )
473
+ ])
492
474
 
493
475
  /**
494
476
  * Constructor type for any `WebError` variant exposed by the schema union.
@@ -498,65 +480,6 @@ export const WebError: Schema.Union<
498
480
  */
499
481
  type WebErrorConstructor = (typeof WebError.members)[number]
500
482
 
501
- /**
502
- * Schema transform for converting unknown values to WebError instances.
503
- *
504
- * This transform handles various web error types and converts them to
505
- * properly typed WebError instances while preserving the original cause.
506
- */
507
- const WebErrorFromUnknown = Schema.transform(Schema.Unknown, WebError, {
508
- strict: true,
509
- decode: (value) => {
510
- // Already a WebError
511
- if (isWebError(value) === true) return value
512
-
513
- // Simple Exception Errors
514
- if (value instanceof globalThis.EvalError) return new EvalError({ cause: value })
515
- if (value instanceof globalThis.RangeError) return new RangeError({ cause: value })
516
- if (value instanceof globalThis.ReferenceError) return new ReferenceError({ cause: value })
517
- if (value instanceof globalThis.TypeError) return new TypeError({ cause: value })
518
- if (value instanceof globalThis.URIError) return new URIError({ cause: value })
519
-
520
- // Predefined DOMException Errors
521
- if (typeof globalThis.QuotaExceededError === 'function' && value instanceof globalThis.QuotaExceededError) {
522
- return new QuotaExceededError({ cause: value })
523
- }
524
-
525
- // Base DOMException Errors
526
- if (value instanceof DOMException) {
527
- switch (value.name) {
528
- case 'QuotaExceededError':
529
- return new QuotaExceededError({ cause: value })
530
- case 'NoModificationAllowedError':
531
- return new NoModificationAllowedError({ cause: value })
532
- case 'NotFoundError':
533
- return new NotFoundError({ cause: value })
534
- case 'NotAllowedError':
535
- return new NotAllowedError({ cause: value })
536
- case 'TypeMismatchError':
537
- return new TypeMismatchError({ cause: value })
538
- case 'InvalidStateError':
539
- return new InvalidStateError({ cause: value })
540
- case 'AbortError':
541
- return new AbortError({ cause: value })
542
- case 'InvalidModificationError':
543
- return new InvalidModificationError({ cause: value })
544
- case 'SecurityError':
545
- return new SecurityError({ cause: value })
546
- case 'DataCloneError':
547
- return new DataCloneError({ cause: value })
548
- default:
549
- break
550
- }
551
- }
552
-
553
- if (value instanceof Error) return new UnknownError({ description: value.message, cause: value })
554
-
555
- return new UnknownError({ cause: value })
556
- },
557
- encode: (webError) => webError,
558
- })
559
-
560
483
  /**
561
484
  * Parses an unknown value into a typed WebError instance.
562
485
  *
@@ -596,18 +519,69 @@ const WebErrorFromUnknown = Schema.transform(Schema.Unknown, WebError, {
596
519
  * // anyError is typed as WebError (all possible error types)
597
520
  * ```
598
521
  */
599
- export function parseWebError(value: unknown): WebError
600
- export function parseWebError<BECs extends readonly WebErrorConstructor[]>(
522
+ export function classifyWebError(value: unknown): WebError
523
+ export function classifyWebError<BECs extends readonly WebErrorConstructor[]>(
601
524
  value: unknown,
602
525
  expected: BECs,
603
526
  ): InstanceType<BECs[number]> | UnknownError
604
- export function parseWebError(value: unknown, expected: readonly WebErrorConstructor[] = []): WebError {
605
- const parsed = Schema.decodeUnknownSync(WebErrorFromUnknown)(value)
527
+ export function classifyWebError(value: unknown, expected: readonly WebErrorConstructor[] = []): WebError {
528
+ const parsed = parseWebError(value)
606
529
 
607
530
  if (expected.length === 0) return parsed
608
531
 
609
- const expectedTags = new Set(expected.map((ErrorConstructor) => ErrorConstructor._tag))
610
- if (expectedTags.has(parsed._tag) === true) return parsed
532
+ if (expected.some((ErrorConstructor) => parsed instanceof ErrorConstructor) === true) return parsed
611
533
 
612
534
  return parsed instanceof UnknownError ? parsed : new UnknownError({ cause: parsed })
613
535
  }
536
+
537
+ /**
538
+ * Converts web-native exception shapes to LiveStore's `WebError`
539
+ * classes while preserving the original value as `cause`.
540
+ */
541
+ const parseWebError = (cause: unknown): WebError => {
542
+ if (isWebError(cause) === true) return cause
543
+
544
+ // Simple Exception Errors
545
+ if (cause instanceof globalThis.EvalError) return new EvalError({ cause: cause })
546
+ if (cause instanceof globalThis.RangeError) return new RangeError({ cause: cause })
547
+ if (cause instanceof globalThis.ReferenceError) return new ReferenceError({ cause: cause })
548
+ if (cause instanceof globalThis.TypeError) return new TypeError({ cause: cause })
549
+ if (cause instanceof globalThis.URIError) return new URIError({ cause: cause })
550
+
551
+ // Predefined DOMException Errors
552
+ if (typeof globalThis.QuotaExceededError === 'function' && cause instanceof globalThis.QuotaExceededError) {
553
+ return new QuotaExceededError({ cause: cause })
554
+ }
555
+
556
+ // Base DOMException Errors
557
+ if (cause instanceof DOMException) {
558
+ switch (cause.name) {
559
+ case 'QuotaExceededError':
560
+ return new QuotaExceededError({ cause: cause })
561
+ case 'NoModificationAllowedError':
562
+ return new NoModificationAllowedError({ cause: cause })
563
+ case 'NotFoundError':
564
+ return new NotFoundError({ cause: cause })
565
+ case 'NotAllowedError':
566
+ return new NotAllowedError({ cause: cause })
567
+ case 'TypeMismatchError':
568
+ return new TypeMismatchError({ cause: cause })
569
+ case 'InvalidStateError':
570
+ return new InvalidStateError({ cause: cause })
571
+ case 'AbortError':
572
+ return new AbortError({ cause: cause })
573
+ case 'InvalidModificationError':
574
+ return new InvalidModificationError({ cause: cause })
575
+ case 'SecurityError':
576
+ return new SecurityError({ cause: cause })
577
+ case 'DataCloneError':
578
+ return new DataCloneError({ cause: cause })
579
+ default:
580
+ break
581
+ }
582
+ }
583
+
584
+ if (cause instanceof Error) return new UnknownError({ description: cause.message, cause: cause })
585
+
586
+ return new UnknownError({ cause: cause })
587
+ }
@@ -1,5 +1,4 @@
1
- import type { Exit } from 'effect'
2
- import { Deferred, Effect, Runtime } from 'effect'
1
+ import { Deferred, Effect, type Exit } from 'effect'
3
2
 
4
3
  // See https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API
5
4
  export const withLock =
@@ -14,7 +13,7 @@ export const withLock =
14
13
  }) =>
15
14
  <Ctx, E, A>(eff: Effect.Effect<A, E, Ctx>): Effect.Effect<A, E | E2, Ctx> =>
16
15
  Effect.gen(function* () {
17
- const runtime = yield* Effect.runtime<Ctx>()
16
+ const services = yield* Effect.context<Ctx>()
18
17
 
19
18
  const exit = yield* Effect.tryPromise<Exit.Exit<A, E>, E | E2>({
20
19
  try: (signal) => {
@@ -25,7 +24,7 @@ export const withLock =
25
24
  return navigator.locks.request(lockName, requestOptions, async (lock: Lock | null) => {
26
25
  if (lock === null) {
27
26
  if (onTaken !== undefined) {
28
- const onTakenExit = await Runtime.runPromiseExit(runtime)(onTaken)
27
+ const onTakenExit = await Effect.runPromiseExitWith(services)(onTaken)
29
28
  if (onTakenExit._tag === 'Failure') {
30
29
  return onTakenExit
31
30
  }
@@ -34,7 +33,7 @@ export const withLock =
34
33
  }
35
34
 
36
35
  // TODO also propagate Effect interruption to the execution
37
- return Runtime.runPromiseExit(runtime)(eff)
36
+ return Effect.runPromiseExitWith(services)(eff)
38
37
  }) as unknown as Promise<Exit.Exit<A, E>>
39
38
  },
40
39
  catch: (err) => err as any as E,
@@ -48,7 +47,7 @@ export const withLock =
48
47
  })
49
48
 
50
49
  export const waitForDeferredLock = (deferred: Deferred.Deferred<void>, lockName: string) =>
51
- Effect.async<void>((cb, signal) => {
50
+ Effect.callback<void>((cb, signal) => {
52
51
  if (signal.aborted === true) return
53
52
 
54
53
  navigator.locks
@@ -71,7 +70,7 @@ export const waitForDeferredLock = (deferred: Deferred.Deferred<void>, lockName:
71
70
  })
72
71
 
73
72
  export const tryGetDeferredLock = (deferred: Deferred.Deferred<void>, lockName: string) =>
74
- Effect.async<boolean>((cb, signal) => {
73
+ Effect.callback<boolean>((cb, signal) => {
75
74
  navigator.locks.request(lockName, { mode: 'exclusive', ifAvailable: true }, (lock: Lock | null) => {
76
75
  cb(Effect.succeed(lock !== null))
77
76
 
@@ -95,7 +94,7 @@ export const tryGetDeferredLock = (deferred: Deferred.Deferred<void>, lockName:
95
94
  })
96
95
 
97
96
  export const stealDeferredLock = (deferred: Deferred.Deferred<void>, lockName: string) =>
98
- Effect.async<boolean>((cb, signal) => {
97
+ Effect.callback<boolean>((cb, signal) => {
99
98
  navigator.locks.request(lockName, { mode: 'exclusive', steal: true }, (lock: Lock | null) => {
100
99
  cb(Effect.succeed(lock !== null))
101
100
 
@@ -116,24 +115,24 @@ export const stealDeferredLock = (deferred: Deferred.Deferred<void>, lockName: s
116
115
  })
117
116
 
118
117
  export const waitForLock = (lockName: string) =>
119
- Effect.async<void>((cb, signal) => {
118
+ Effect.callback<void>((cb, signal) => {
120
119
  if (signal.aborted === true) return
121
120
 
122
121
  navigator.locks.request(lockName, { mode: 'shared', signal, ifAvailable: false }, (_lock: Lock | null) => {
123
- cb(Effect.succeed(void 0))
122
+ cb(Effect.void)
124
123
  })
125
124
  })
126
125
 
127
126
  /** Attempts to get the lock if available and waits for it to be stolen */
128
127
  export const getLockAndWaitForSteal = (lockName: string) =>
129
- Effect.async<void>((cb, signal) => {
128
+ Effect.callback<void>((cb, signal) => {
130
129
  if (signal.aborted === true) return
131
130
 
132
131
  navigator.locks
133
132
  .request(lockName, { mode: 'exclusive', ifAvailable: true }, async (lock: Lock | null) => {
134
133
  if (lock === null) {
135
134
  // Lock wasn't available, resolve immediately
136
- cb(Effect.succeed(void 0))
135
+ cb(Effect.void)
137
136
  return
138
137
  }
139
138
 
@@ -151,7 +150,7 @@ export const getLockAndWaitForSteal = (lockName: string) =>
151
150
  return Promise.race([holdLock, signal.aborted === true ? Promise.resolve() : holdLock]).catch(() => {})
152
151
  }).catch(() => {})
153
152
 
154
- cb(Effect.succeed(void 0))
153
+ cb(Effect.void)
155
154
  })
156
155
  .catch((error) => {
157
156
  if (
@@ -161,7 +160,7 @@ export const getLockAndWaitForSteal = (lockName: string) =>
161
160
  ) {
162
161
  // Given signal interruption is handled via Effect, we can ignore this case
163
162
  // or the case when the lock is stolen
164
- cb(Effect.succeed(void 0))
163
+ cb(Effect.void)
165
164
  } else {
166
165
  console.error('[@livestore/utils:WebLock] getLockAndWaitForSteal. error', error)
167
166
  throw error