@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/NoopTracer.d.ts +7 -8
- package/dist/NoopTracer.d.ts.map +1 -1
- package/dist/NoopTracer.js +3 -18
- package/dist/NoopTracer.js.map +1 -1
- package/dist/NoopTracer.test.d.ts +2 -0
- package/dist/NoopTracer.test.d.ts.map +1 -0
- package/dist/NoopTracer.test.js +17 -0
- package/dist/NoopTracer.test.js.map +1 -0
- package/dist/browser/Opfs/Opfs.d.ts +179 -29
- package/dist/browser/Opfs/Opfs.d.ts.map +1 -1
- package/dist/browser/Opfs/Opfs.js +132 -307
- package/dist/browser/Opfs/Opfs.js.map +1 -1
- package/dist/browser/Opfs/debug-utils.d.ts.map +1 -1
- package/dist/browser/Opfs/debug-utils.js +5 -4
- package/dist/browser/Opfs/debug-utils.js.map +1 -1
- package/dist/browser/Opfs/utils.d.ts +8 -8
- package/dist/browser/Opfs/utils.d.ts.map +1 -1
- package/dist/browser/Opfs/utils.js +35 -26
- package/dist/browser/Opfs/utils.js.map +1 -1
- package/dist/browser/QuotaExceededError.d.ts +10 -9
- package/dist/browser/QuotaExceededError.d.ts.map +1 -1
- package/dist/browser/WebChannelBrowser.d.ts.map +1 -1
- package/dist/browser/WebChannelBrowser.js +21 -10
- package/dist/browser/WebChannelBrowser.js.map +1 -1
- package/dist/browser/WebError.d.ts +54 -86
- package/dist/browser/WebError.d.ts.map +1 -1
- package/dist/browser/WebError.js +91 -84
- package/dist/browser/WebError.js.map +1 -1
- package/dist/browser/WebError.test.js +6 -6
- package/dist/browser/WebError.test.js.map +1 -1
- package/dist/browser/WebLock.d.ts.map +1 -1
- package/dist/browser/WebLock.js +13 -13
- package/dist/browser/WebLock.js.map +1 -1
- package/dist/effect/Debug.d.ts +4 -7
- package/dist/effect/Debug.d.ts.map +1 -1
- package/dist/effect/Debug.js +32 -36
- package/dist/effect/Debug.js.map +1 -1
- package/dist/effect/Effect.d.ts +31 -22
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +51 -47
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/Effect.test.d.ts +2 -0
- package/dist/effect/Effect.test.d.ts.map +1 -0
- package/dist/effect/Effect.test.js +72 -0
- package/dist/effect/Effect.test.js.map +1 -0
- package/dist/effect/Error.d.ts +4 -6
- package/dist/effect/Error.d.ts.map +1 -1
- package/dist/effect/Logger.d.ts +0 -6
- package/dist/effect/Logger.d.ts.map +1 -1
- package/dist/effect/Logger.js +0 -32
- package/dist/effect/Logger.js.map +1 -1
- package/dist/effect/OtelTracer.d.ts +1 -1
- package/dist/effect/OtelTracer.d.ts.map +1 -1
- package/dist/effect/OtelTracer.js +2 -3
- package/dist/effect/OtelTracer.js.map +1 -1
- package/dist/effect/RpcClient.d.ts +7 -7
- package/dist/effect/RpcClient.d.ts.map +1 -1
- package/dist/effect/RpcClient.js +72 -52
- package/dist/effect/RpcClient.js.map +1 -1
- package/dist/effect/Schedule.d.ts +1 -1
- package/dist/effect/Schedule.d.ts.map +1 -1
- package/dist/effect/Schedule.js +2 -2
- package/dist/effect/Schedule.js.map +1 -1
- package/dist/effect/Schema/debug-diff.d.ts +1 -1
- package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
- package/dist/effect/Schema/debug-diff.js +5 -7
- package/dist/effect/Schema/debug-diff.js.map +1 -1
- package/dist/effect/Schema/debug-diff.test.js +7 -4
- package/dist/effect/Schema/debug-diff.test.js.map +1 -1
- package/dist/effect/Schema/index.d.ts +28 -20
- package/dist/effect/Schema/index.d.ts.map +1 -1
- package/dist/effect/Schema/index.js +55 -28
- package/dist/effect/Schema/index.js.map +1 -1
- package/dist/effect/Stream.d.ts +13 -5
- package/dist/effect/Stream.d.ts.map +1 -1
- package/dist/effect/Stream.js +19 -12
- package/dist/effect/Stream.js.map +1 -1
- package/dist/effect/Stream.test.js +9 -9
- package/dist/effect/Stream.test.js.map +1 -1
- package/dist/effect/Subscribable.d.ts +9 -3
- package/dist/effect/Subscribable.d.ts.map +1 -1
- package/dist/effect/Subscribable.js +20 -35
- package/dist/effect/Subscribable.js.map +1 -1
- package/dist/effect/SubscriptionRef.d.ts +5 -6
- package/dist/effect/SubscriptionRef.d.ts.map +1 -1
- package/dist/effect/SubscriptionRef.js +2 -3
- package/dist/effect/SubscriptionRef.js.map +1 -1
- package/dist/effect/TaskTracing.d.ts +1 -1
- package/dist/effect/TaskTracing.d.ts.map +1 -1
- package/dist/effect/TaskTracing.js +12 -16
- package/dist/effect/TaskTracing.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.d.ts +7 -7
- package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
- package/dist/effect/WebChannel/WebChannel.js +64 -43
- package/dist/effect/WebChannel/WebChannel.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.test.js +15 -15
- package/dist/effect/WebChannel/WebChannel.test.js.map +1 -1
- package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
- package/dist/effect/WebChannel/broadcastChannelWithAck.js +16 -9
- package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
- package/dist/effect/WebChannel/common.d.ts +16 -17
- package/dist/effect/WebChannel/common.d.ts.map +1 -1
- package/dist/effect/WebChannel/common.js +6 -6
- package/dist/effect/WebChannel/common.js.map +1 -1
- package/dist/effect/WebSocket.d.ts +4 -6
- package/dist/effect/WebSocket.d.ts.map +1 -1
- package/dist/effect/WebSocket.js +4 -4
- package/dist/effect/WebSocket.js.map +1 -1
- package/dist/effect/WebSocket.test.js +2 -2
- package/dist/effect/WebSocket.test.js.map +1 -1
- package/dist/effect/mod.browser-build.test.d.ts +2 -0
- package/dist/effect/mod.browser-build.test.d.ts.map +1 -0
- package/dist/effect/mod.browser-build.test.js +18 -0
- package/dist/effect/mod.browser-build.test.js.map +1 -0
- package/dist/effect/mod.d.ts +13 -15
- package/dist/effect/mod.d.ts.map +1 -1
- package/dist/effect/mod.js +13 -18
- package/dist/effect/mod.js.map +1 -1
- package/dist/effect/spanEvent.d.ts.map +1 -1
- package/dist/effect/spanEvent.js +2 -2
- package/dist/effect/spanEvent.js.map +1 -1
- package/dist/effect/spanEvent.test.js +10 -13
- package/dist/effect/spanEvent.test.js.map +1 -1
- package/dist/fast-deep-equal.d.ts.map +1 -1
- package/dist/fast-deep-equal.js +1 -2
- package/dist/fast-deep-equal.js.map +1 -1
- package/dist/misc.js +2 -2
- package/dist/misc.js.map +1 -1
- package/dist/mod.d.ts +0 -35
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +0 -8
- package/dist/mod.js.map +1 -1
- package/dist/node/mod.d.ts +17 -11
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +23 -16
- package/dist/node/mod.js.map +1 -1
- package/dist/object/index.d.ts +0 -9
- package/dist/object/index.d.ts.map +1 -1
- package/dist/object/index.js +0 -9
- package/dist/object/index.js.map +1 -1
- package/dist/string.d.ts +0 -2
- package/dist/string.d.ts.map +1 -1
- package/dist/string.js +0 -2
- package/dist/string.js.map +1 -1
- package/package.json +18 -36
- package/src/NoopTracer.test.ts +20 -0
- package/src/NoopTracer.ts +18 -41
- package/src/browser/Opfs/Opfs.ts +304 -277
- package/src/browser/Opfs/debug-utils.ts +7 -6
- package/src/browser/Opfs/utils.ts +36 -26
- package/src/browser/QuotaExceededError.ts +13 -10
- package/src/browser/WebChannelBrowser.ts +25 -11
- package/src/browser/WebError.test.ts +6 -6
- package/src/browser/WebError.ts +107 -133
- package/src/browser/WebLock.ts +13 -14
- package/src/effect/Debug.ts +66 -59
- package/src/effect/Effect.test.ts +117 -0
- package/src/effect/Effect.ts +84 -71
- package/src/effect/Logger.ts +0 -48
- package/src/effect/OtelTracer.ts +2 -3
- package/src/effect/RpcClient.ts +80 -61
- package/src/effect/Schedule.ts +4 -5
- package/src/effect/Schema/debug-diff.test.ts +6 -6
- package/src/effect/Schema/debug-diff.ts +6 -8
- package/src/effect/Schema/index.ts +122 -61
- package/src/effect/Stream.test.ts +9 -9
- package/src/effect/Stream.ts +23 -16
- package/src/effect/Subscribable.ts +31 -42
- package/src/effect/SubscriptionRef.ts +8 -12
- package/src/effect/TaskTracing.ts +13 -16
- package/src/effect/WebChannel/WebChannel.test.ts +23 -23
- package/src/effect/WebChannel/WebChannel.ts +87 -55
- package/src/effect/WebChannel/broadcastChannelWithAck.ts +21 -11
- package/src/effect/WebChannel/common.ts +14 -15
- package/src/effect/WebSocket.test.ts +2 -2
- package/src/effect/WebSocket.ts +9 -6
- package/src/effect/mod.browser-build.test.ts +19 -0
- package/src/effect/mod.ts +35 -69
- package/src/effect/spanEvent.test.ts +10 -13
- package/src/effect/spanEvent.ts +5 -3
- package/src/fast-deep-equal.ts +1 -2
- package/src/misc.ts +2 -2
- package/src/mod.ts +0 -36
- package/src/node/mod.ts +26 -20
- package/src/object/index.ts +0 -24
- package/src/string.ts +0 -3
- package/dist/effect/BucketQueue.d.ts +0 -20
- package/dist/effect/BucketQueue.d.ts.map +0 -1
- package/dist/effect/BucketQueue.js +0 -34
- package/dist/effect/BucketQueue.js.map +0 -1
- package/dist/effect/Scheduler.d.ts +0 -4
- package/dist/effect/Scheduler.d.ts.map +0 -1
- package/dist/effect/Scheduler.js +0 -9
- package/dist/effect/Scheduler.js.map +0 -1
- package/dist/effect/ServiceContext.d.ts +0 -37
- package/dist/effect/ServiceContext.d.ts.map +0 -1
- package/dist/effect/ServiceContext.js +0 -55
- package/dist/effect/ServiceContext.js.map +0 -1
- package/dist/guards.d.ts +0 -20
- package/dist/guards.d.ts.map +0 -1
- package/dist/guards.js +0 -20
- package/dist/guards.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -4
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js +0 -128
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +0 -10
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +0 -217
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +0 -84
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +0 -68
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +0 -2
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +0 -52
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +0 -23
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -138
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +0 -1
- package/dist/object/omit.d.ts +0 -3
- package/dist/object/omit.d.ts.map +0 -1
- package/dist/object/omit.js +0 -14
- package/dist/object/omit.js.map +0 -1
- package/dist/object/pick.d.ts +0 -14
- package/dist/object/pick.d.ts.map +0 -1
- package/dist/object/pick.js +0 -17
- package/dist/object/pick.js.map +0 -1
- package/dist/time.d.ts +0 -12
- package/dist/time.d.ts.map +0 -1
- package/dist/time.js +0 -22
- package/dist/time.js.map +0 -1
- package/src/effect/BucketQueue.ts +0 -49
- package/src/effect/Scheduler.ts +0 -13
- package/src/effect/ServiceContext.ts +0 -108
- package/src/guards.ts +0 -23
- package/src/node/ChildProcessRunner/ChildProcessRunner.ts +0 -148
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +0 -311
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +0 -78
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +0 -65
- package/src/node/ChildProcessRunner/ChildProcessWorker.ts +0 -169
- package/src/object/omit.ts +0 -17
- package/src/object/pick.ts +0 -27
- package/src/time.ts +0 -25
package/src/browser/WebError.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './QuotaExceededError.ts'
|
|
2
|
-
import {
|
|
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))
|
|
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).
|
|
127
|
-
Schema.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
|
600
|
-
export function
|
|
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
|
|
605
|
-
const parsed =
|
|
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
|
-
|
|
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
|
+
}
|
package/src/browser/WebLock.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
163
|
+
cb(Effect.void)
|
|
165
164
|
} else {
|
|
166
165
|
console.error('[@livestore/utils:WebLock] getLockAndWaitForSteal. error', error)
|
|
167
166
|
throw error
|