@livestore/utils 0.0.54-dev.25 → 0.0.54-dev.27
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.json +1 -1
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +9 -8
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/Scheduler.d.ts +4 -0
- package/dist/effect/Scheduler.d.ts.map +1 -0
- package/dist/effect/Scheduler.js +10 -0
- package/dist/effect/Scheduler.js.map +1 -0
- package/dist/effect/WebLock.d.ts.map +1 -1
- package/dist/effect/WebLock.js +22 -7
- package/dist/effect/WebLock.js.map +1 -1
- package/dist/effect/index.d.ts +2 -1
- package/dist/effect/index.d.ts.map +1 -1
- package/dist/effect/index.js +2 -1
- package/dist/effect/index.js.map +1 -1
- package/package.json +2 -2
- package/src/effect/Effect.ts +9 -10
- package/src/effect/Scheduler.ts +14 -0
- package/src/effect/WebLock.ts +42 -26
- package/src/effect/index.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Effect.d.ts","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtD,OAAO,EAAS,QAAQ,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAA;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAK9C,cAAc,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"Effect.d.ts","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtD,OAAO,EAAS,QAAQ,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAA;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAK9C,cAAc,eAAe,CAAA;AAwB7B,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,iBAAkB,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAU1F,CAAA;AAEJ,eAAO,MAAM,wBAAwB,wBACb;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,aAAa,CAAA;CAAE,oBAC1D,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CA2BzD,CAAA;AAEN,eAAO,MAAM,OAAO,aACP,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,iBAChB,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CACL,CAAA;AAEvD,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,OAAO,MAAM,CAAC,QAAQ,OAAO,CAAC,KAAK,CAAC,CAI5E,CAAA;AAEH,eAAO,MAAM,UAAU,gBACP;IAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,SAAS,aAAa,CAAA;CAAE,qBAC1D,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CACb,CAAA;AAEnD,eAAO,MAAM,aAAa,YACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,aAAa,CAAA;CAAE,qBAC7C,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAK3D,CAAA;AAEL,eAAO,MAAM,gBAAgB,iBACtB,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC1B,OAAO,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,KAAK,CAW7D,CAAA;AAEH,eAAO,MAAM,sBAAsB,gBACnB,MAAM,oBACL,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAS1D,CAAA"}
|
package/dist/effect/Effect.js
CHANGED
|
@@ -15,19 +15,20 @@ export * from 'effect/Effect';
|
|
|
15
15
|
// Effect.sync(() => {
|
|
16
16
|
// console.error(message, ...rest)
|
|
17
17
|
// })
|
|
18
|
-
const getThreadName = () =>
|
|
18
|
+
const getThreadName = () => typeof self !== 'undefined' && isNonEmptyString(self.name)
|
|
19
|
+
? self.name
|
|
20
|
+
: typeof window === 'object'
|
|
21
|
+
? 'Browser Main Thread'
|
|
22
|
+
: 'unknown-thread';
|
|
19
23
|
/** Logs both on errors and defects */
|
|
20
|
-
export const tapCauseLogPretty = (eff) => Effect.tapErrorCause(eff, (
|
|
21
|
-
if (Cause.isInterruptedOnly(
|
|
24
|
+
export const tapCauseLogPretty = (eff) => Effect.tapErrorCause(eff, (cause) => {
|
|
25
|
+
if (Cause.isInterruptedOnly(cause)) {
|
|
22
26
|
// console.log('interrupted', Cause.pretty(err), err)
|
|
23
27
|
return Effect.void;
|
|
24
28
|
}
|
|
25
29
|
const threadName = getThreadName();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// return Effect.logError(`Error on ${threadName}:`, prettyError)
|
|
29
|
-
const firstErrLine = err.toString().split('\n')[0];
|
|
30
|
-
return Effect.logError(`Error on ${threadName}: ${firstErrLine}`, err);
|
|
30
|
+
const firstErrLine = cause.toString().split('\n')[0];
|
|
31
|
+
return Effect.logError(`Error on ${threadName}: ${firstErrLine}`, cause);
|
|
31
32
|
});
|
|
32
33
|
export const logWarnIfTakesLongerThan = ({ label, duration }) => (eff) => Effect.gen(function* () {
|
|
33
34
|
const runtime = yield* Effect.runtime();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Effect.js","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,cAAc,eAAe,CAAA;AAE7B,6EAA6E;AAC7E,wBAAwB;AACxB,oCAAoC;AACpC,OAAO;AAEP,iFAAiF;AACjF,wBAAwB;AACxB,qCAAqC;AACrC,OAAO;AAEP,kFAAkF;AAClF,wBAAwB;AACxB,sCAAsC;AACtC,OAAO;AAEP,MAAM,aAAa,GAAG,GAAG,EAAE,CACzB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"Effect.js","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,cAAc,eAAe,CAAA;AAE7B,6EAA6E;AAC7E,wBAAwB;AACxB,oCAAoC;AACpC,OAAO;AAEP,iFAAiF;AACjF,wBAAwB;AACxB,qCAAqC;AACrC,OAAO;AAEP,kFAAkF;AAClF,wBAAwB;AACxB,sCAAsC;AACtC,OAAO;AAEP,MAAM,aAAa,GAAG,GAAG,EAAE,CACzB,OAAO,IAAI,KAAK,WAAW,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,CAAC,CAAC,IAAI,CAAC,IAAI;IACX,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,gBAAgB,CAAA;AAExB,sCAAsC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAU,GAA2B,EAA0B,EAAE,CAChG,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;IAClC,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,qDAAqD;QACrD,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,YAAY,UAAU,KAAK,YAAY,EAAE,EAAE,KAAK,CAAC,CAAA;AAC1E,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,wBAAwB,GACnC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAuD,EAAE,EAAE,CAC7E,CAAU,GAA2B,EAA0B,EAAE,CAC/D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAS,CAAA;IAE9C,IAAI,QAAQ,GAAG,KAAK,CAAA;IAEpB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,CAAA;QACf,yBAAyB;QACzB,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,sBAAsB,QAAQ,IAAI,CAAC,CAAA;IACtE,CAAC,CAAC,EACF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB,MAAM,CAAC,OAAO,CACf,CAAA;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAA;IAEtB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,sBAAsB,GAAG,GAAG,KAAK,IAAI,CAAC,CAAA;IACzE,CAAC;IAED,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IAEpC,OAAO,GAAG,CAAA;AACZ,CAAC,CAAC,CAAA;AAEN,MAAM,CAAC,MAAM,OAAO,GAClB,CAAI,KAAwB,EAAE,EAAE,CAChC,CAAO,GAA2B,EAA0B,EAAE,CAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAY,EAAyC,EAAE,CACjF,IAAI,CACF,MAAM,CAAC,OAAO,EAAS,EACvB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,aAAa,EAAE,GAAG,CAAC,CAAC,CACpD,CAAA;AAEH,MAAM,CAAC,MAAM,UAAU,GACrB,CAAK,OAAqE,EAAE,EAAE,CAC9E,CAAU,IAA4B,EAA0B,EAAE,CAChE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAEnD,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,OAA4D,EAAE,EAAE,CACjE,CAAU,IAA4B,EAA0B,EAAE,CAChE,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC7G,IAAI,CACL,CACF,CAAA;AAEL,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAA2B,EACqC,EAAE,CAClE,IAAI,CACF,QAAQ,CAAC,IAAI,EAAQ,EACrB,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtB,IAAI,CACF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAChB,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EACnD,iBAAiB,EACjB,MAAM,CAAC,UAAU,CAClB,CACF,CACF,CAAA;AAEH,MAAM,CAAC,MAAM,sBAAsB,GACjC,CAAC,WAAmB,EAAE,EAAE,CACxB,CAAU,GAA2B,EAA0B,EAAE,CAC/D,MAAM,CAAC,iBAAiB,CACtB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC,EAC3D,GAAG,EAAE,CAAC,GAAG,EACT,GAAG,EAAE,CACH,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,MAAM,CAAC,CAAA;IACtC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,WAAW,QAAQ,EAAE,GAAG,WAAW,MAAM,CAAC,CAAA;AAChF,CAAC,CAAC,CACL,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/effect/Scheduler.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGlC,eAAO,MAAM,cAAc,iBAAiB,UAAU,SAAS,CAAC,aAAa,CAAC,wBAQ7D,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from 'effect/Scheduler';
|
|
2
|
+
import { Scheduler } from 'effect';
|
|
3
|
+
// Based on https://github.com/astoilkov/main-thread-scheduling/blob/4b99c26ab96781bc35a331f5c225ad9c8a62cb95/src/utils/waitNextTask.ts#L25
|
|
4
|
+
export const messageChannel = (shouldYield = Scheduler.defaultShouldYield) => Scheduler.makeBatched((task) => {
|
|
5
|
+
const messageChannel = new MessageChannel();
|
|
6
|
+
messageChannel.port1.postMessage(undefined);
|
|
7
|
+
// eslint-disable-next-line unicorn/prefer-add-event-listener
|
|
8
|
+
messageChannel.port2.onmessage = task;
|
|
9
|
+
}, shouldYield);
|
|
10
|
+
//# sourceMappingURL=Scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/effect/Scheduler.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,2IAA2I;AAC3I,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,cAAkD,SAAS,CAAC,kBAAkB,EAAE,EAAE,CAC/G,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;IAC7B,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA;IAE3C,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IAE3C,6DAA6D;IAC7D,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;AACvC,CAAC,EAAE,WAAW,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebLock.d.ts","sourceRoot":"","sources":["../../src/effect/WebLock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAW,MAAM,QAAQ,CAAA;AAGlD,eAAO,MAAM,QAAQ,wCAKhB;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,KAAK,WAAW,EAAE,QAAQ,CAAC,CAAA;CACtC,sBACgB,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"WebLock.d.ts","sourceRoot":"","sources":["../../src/effect/WebLock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAW,MAAM,QAAQ,CAAA;AAGlD,eAAO,MAAM,QAAQ,wCAKhB;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,KAAK,WAAW,EAAE,QAAQ,CAAC,CAAA;CACtC,sBACgB,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAG,OAAO,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,CAiC3E,CAAA;AAEN,eAAO,MAAM,mBAAmB,aAAc,SAAS,QAAQ,CAAC,IAAI,CAAC,YAAY,MAAM,sCAyBnF,CAAA;AAEJ,eAAO,MAAM,kBAAkB,aAAc,SAAS,QAAQ,CAAC,IAAI,CAAC,YAAY,MAAM,yCAwBlF,CAAA"}
|
package/dist/effect/WebLock.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Deferred, Effect, Runtime } from 'effect';
|
|
2
2
|
// See https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API
|
|
3
|
-
export const withLock = ({ lockName, onTaken, options, }) => (eff) => Effect.gen(function* (
|
|
4
|
-
const runtime = yield*
|
|
5
|
-
const exit = yield*
|
|
3
|
+
export const withLock = ({ lockName, onTaken, options, }) => (eff) => Effect.gen(function* () {
|
|
4
|
+
const runtime = yield* Effect.runtime();
|
|
5
|
+
const exit = yield* Effect.tryPromise({
|
|
6
6
|
try: (signal) => {
|
|
7
7
|
if (signal.aborted)
|
|
8
8
|
return 'aborted';
|
|
@@ -23,9 +23,9 @@ export const withLock = ({ lockName, onTaken, options, }) => (eff) => Effect.gen
|
|
|
23
23
|
});
|
|
24
24
|
},
|
|
25
25
|
catch: (err) => err,
|
|
26
|
-
})
|
|
26
|
+
});
|
|
27
27
|
if (exit._tag === 'Failure') {
|
|
28
|
-
return yield*
|
|
28
|
+
return yield* Effect.failCause(exit.cause);
|
|
29
29
|
}
|
|
30
30
|
else {
|
|
31
31
|
return exit.value;
|
|
@@ -34,6 +34,9 @@ export const withLock = ({ lockName, onTaken, options, }) => (eff) => Effect.gen
|
|
|
34
34
|
export const waitForDeferredLock = (deferred, lockName) => Effect.async((cb, signal) => {
|
|
35
35
|
if (signal.aborted)
|
|
36
36
|
return;
|
|
37
|
+
signal.addEventListener('abort', () => {
|
|
38
|
+
console.log('[@livestore/utils:WebLock] waitForDeferredLock. aborted', lockName);
|
|
39
|
+
});
|
|
37
40
|
navigator.locks
|
|
38
41
|
.request(lockName, { signal, mode: 'exclusive', ifAvailable: false }, (_lock) => {
|
|
39
42
|
// immediately continuing calling Effect since we have the lock
|
|
@@ -51,12 +54,24 @@ export const waitForDeferredLock = (deferred, lockName) => Effect.async((cb, sig
|
|
|
51
54
|
}
|
|
52
55
|
});
|
|
53
56
|
});
|
|
54
|
-
export const tryGetDeferredLock = (deferred, lockName) => Effect.async((cb) => {
|
|
57
|
+
export const tryGetDeferredLock = (deferred, lockName) => Effect.async((cb, signal) => {
|
|
55
58
|
navigator.locks.request(lockName, { mode: 'exclusive', ifAvailable: true }, (lock) => {
|
|
56
59
|
cb(Effect.succeed(lock !== null));
|
|
57
60
|
// the code below is still running
|
|
61
|
+
console.log('[@livestore/utils:WebLock] tryGetDeferredLock. lock', lock, 'waiting...');
|
|
62
|
+
const abortPromise = new Promise((resolve) => {
|
|
63
|
+
signal.addEventListener('abort', () => {
|
|
64
|
+
console.log('[@livestore/utils:WebLock] tryGetDeferredLock. aborted', lockName);
|
|
65
|
+
resolve();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
58
68
|
// holding lock until deferred is resolved
|
|
59
|
-
return
|
|
69
|
+
return Promise.race([
|
|
70
|
+
Effect.runPromise(Deferred.await(deferred)).finally(() => {
|
|
71
|
+
console.log('[@livestore/utils:WebLock] tryGetDeferredLock. finally', lockName);
|
|
72
|
+
}),
|
|
73
|
+
abortPromise,
|
|
74
|
+
]);
|
|
60
75
|
});
|
|
61
76
|
});
|
|
62
77
|
//# sourceMappingURL=WebLock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebLock.js","sourceRoot":"","sources":["../../src/effect/WebLock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAElD,qEAAqE;AACrE,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAK,EACH,QAAQ,EACR,OAAO,EACP,OAAO,GAKR,EAAE,EAAE,CACL,CAAY,GAA6B,EAAwC,EAAE,CACjF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC
|
|
1
|
+
{"version":3,"file":"WebLock.js","sourceRoot":"","sources":["../../src/effect/WebLock.ts"],"names":[],"mappings":"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"}
|
package/dist/effect/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import '../global.js';
|
|
2
|
-
export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime,
|
|
2
|
+
export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime, FiberRef, FiberRefs, FiberRefsPatch, Deferred, Metric, MetricState, Request, Tracer, Context, Data, Either, Brand, Hash, Equal, Chunk, Duration, Array as ReadonlyArray, Record as ReadonlyRecord, SortedMap, HashMap, HashSet, MutableHashSet, Option, LogLevel, Logger, Layer, STM, TRef, Channel, pipe, identity, Match, } from 'effect';
|
|
3
3
|
export { dual } from 'effect/Function';
|
|
4
4
|
export * as Stream from './Stream.js';
|
|
5
5
|
export * as SubscriptionRef from './SubscriptionRef.js';
|
|
@@ -11,6 +11,7 @@ export { BrowserWorker, BrowserWorkerRunner } from '@effect/platform-browser';
|
|
|
11
11
|
export * as PortPlatformRunner from './port-platform-runner.js';
|
|
12
12
|
export * as Effect from './Effect.js';
|
|
13
13
|
export * as Schedule from './Schedule.js';
|
|
14
|
+
export * as Scheduler from './Scheduler.js';
|
|
14
15
|
export * from './Error.js';
|
|
15
16
|
export * as ServiceContext from './ServiceContext.js';
|
|
16
17
|
export * as WebLock from './WebLock.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAA;AAErB,OAAO,EACL,KAAK,EACL,GAAG,EACH,eAAe,EACf,KAAK,EACL,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAA;AAErB,OAAO,EACL,KAAK,EACL,GAAG,EACH,eAAe,EACf,KAAK,EACL,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,EACT,cAAc,EACd,QAAQ,EACR,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,EACN,OAAO,EACP,IAAI,EACJ,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAK,IAAI,aAAa,EACtB,MAAM,IAAI,cAAc,EACxB,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,GAAG,EACH,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,KAAK,GACN,MAAM,QAAQ,CAAA;AAEf,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAEvD,OAAO,EACL,aAAa,EACb,GAAG,IAAI,SAAS,EAChB,MAAM,IAAI,YAAY,EACtB,WAAW,IAAI,iBAAiB,EAChC,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAA;AAE1D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACpH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC7E,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAE/D,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,cAAc,YAAY,CAAA;AAC1B,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA"}
|
package/dist/effect/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import '../global.js';
|
|
2
|
-
export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime,
|
|
2
|
+
export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime, FiberRef, FiberRefs, FiberRefsPatch, Deferred, Metric, MetricState, Request, Tracer, Context, Data, Either, Brand, Hash, Equal, Chunk, Duration, Array as ReadonlyArray, Record as ReadonlyRecord, SortedMap, HashMap, HashSet, MutableHashSet, Option, LogLevel, Logger, Layer, STM, TRef, Channel, pipe, identity, Match, } from 'effect';
|
|
3
3
|
export { dual } from 'effect/Function';
|
|
4
4
|
export * as Stream from './Stream.js';
|
|
5
5
|
export * as SubscriptionRef from './SubscriptionRef.js';
|
|
@@ -11,6 +11,7 @@ export { BrowserWorker, BrowserWorkerRunner } from '@effect/platform-browser';
|
|
|
11
11
|
export * as PortPlatformRunner from './port-platform-runner.js';
|
|
12
12
|
export * as Effect from './Effect.js';
|
|
13
13
|
export * as Schedule from './Schedule.js';
|
|
14
|
+
export * as Scheduler from './Scheduler.js';
|
|
14
15
|
export * from './Error.js';
|
|
15
16
|
export * as ServiceContext from './ServiceContext.js';
|
|
16
17
|
export * as WebLock from './WebLock.js';
|
package/dist/effect/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAA;AAErB,OAAO,EACL,KAAK,EACL,GAAG,EACH,eAAe,EACf,KAAK,EACL,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAA;AAErB,OAAO,EACL,KAAK,EACL,GAAG,EACH,eAAe,EACf,KAAK,EACL,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,EACT,cAAc,EACd,QAAQ,EACR,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,EACN,OAAO,EACP,IAAI,EACJ,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAK,IAAI,aAAa,EACtB,MAAM,IAAI,cAAc,EACxB,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,GAAG,EACH,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,KAAK,GACN,MAAM,QAAQ,CAAA;AAEf,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAEvD,OAAO,EACL,aAAa,EACb,GAAG,IAAI,SAAS,EAChB,MAAM,IAAI,YAAY,EACtB,WAAW,IAAI,iBAAiB,EAChC,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAA;AAE1D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACpH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC7E,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAE/D,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,cAAc,YAAY,CAAA;AAC1B,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/utils",
|
|
3
|
-
"version": "0.0.54-dev.
|
|
3
|
+
"version": "0.0.54-dev.27",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"date-fns": "^3.6.0",
|
|
36
36
|
"otel-websocket-exporter": "^0.0.29",
|
|
37
37
|
"pretty-bytes": "^6.1.1",
|
|
38
|
-
"effect-db-schema": "0.0.54-dev.
|
|
38
|
+
"effect-db-schema": "0.0.54-dev.27"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"@effect/experimental": "^0.18.1",
|
package/src/effect/Effect.ts
CHANGED
|
@@ -24,24 +24,23 @@ export * from 'effect/Effect'
|
|
|
24
24
|
// })
|
|
25
25
|
|
|
26
26
|
const getThreadName = () =>
|
|
27
|
-
|
|
27
|
+
typeof self !== 'undefined' && isNonEmptyString(self.name)
|
|
28
|
+
? self.name
|
|
29
|
+
: typeof window === 'object'
|
|
30
|
+
? 'Browser Main Thread'
|
|
31
|
+
: 'unknown-thread'
|
|
28
32
|
|
|
29
33
|
/** Logs both on errors and defects */
|
|
30
34
|
export const tapCauseLogPretty = <R, E, A>(eff: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
|
|
31
|
-
Effect.tapErrorCause(eff, (
|
|
32
|
-
if (Cause.isInterruptedOnly(
|
|
35
|
+
Effect.tapErrorCause(eff, (cause) => {
|
|
36
|
+
if (Cause.isInterruptedOnly(cause)) {
|
|
33
37
|
// console.log('interrupted', Cause.pretty(err), err)
|
|
34
38
|
return Effect.void
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
const threadName = getThreadName()
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// const prettyError = Cause.pretty(err)
|
|
41
|
-
|
|
42
|
-
// return Effect.logError(`Error on ${threadName}:`, prettyError)
|
|
43
|
-
const firstErrLine = err.toString().split('\n')[0]
|
|
44
|
-
return Effect.logError(`Error on ${threadName}: ${firstErrLine}`, err)
|
|
42
|
+
const firstErrLine = cause.toString().split('\n')[0]
|
|
43
|
+
return Effect.logError(`Error on ${threadName}: ${firstErrLine}`, cause)
|
|
45
44
|
})
|
|
46
45
|
|
|
47
46
|
export const logWarnIfTakesLongerThan =
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from 'effect/Scheduler'
|
|
2
|
+
|
|
3
|
+
import { Scheduler } from 'effect'
|
|
4
|
+
|
|
5
|
+
// Based on https://github.com/astoilkov/main-thread-scheduling/blob/4b99c26ab96781bc35a331f5c225ad9c8a62cb95/src/utils/waitNextTask.ts#L25
|
|
6
|
+
export const messageChannel = (shouldYield: Scheduler.Scheduler['shouldYield'] = Scheduler.defaultShouldYield) =>
|
|
7
|
+
Scheduler.makeBatched((task) => {
|
|
8
|
+
const messageChannel = new MessageChannel()
|
|
9
|
+
|
|
10
|
+
messageChannel.port1.postMessage(undefined)
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line unicorn/prefer-add-event-listener
|
|
13
|
+
messageChannel.port2.onmessage = task
|
|
14
|
+
}, shouldYield)
|
package/src/effect/WebLock.ts
CHANGED
|
@@ -13,37 +13,35 @@ export const withLock =
|
|
|
13
13
|
options?: Omit<LockOptions, 'signal'>
|
|
14
14
|
}) =>
|
|
15
15
|
<Ctx, E, A>(eff: Effect.Effect<A, E, Ctx>): Effect.Effect<A | void, E | E2, Ctx> =>
|
|
16
|
-
Effect.gen(function* (
|
|
17
|
-
const runtime = yield*
|
|
16
|
+
Effect.gen(function* () {
|
|
17
|
+
const runtime = yield* Effect.runtime<Ctx>()
|
|
18
18
|
|
|
19
|
-
const exit = yield*
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (signal.aborted) return 'aborted' as never
|
|
19
|
+
const exit = yield* Effect.tryPromise<Exit.Exit<A, E>, E | E2>({
|
|
20
|
+
try: (signal) => {
|
|
21
|
+
if (signal.aborted) return 'aborted' as never
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
23
|
+
// NOTE The 'signal' and 'ifAvailable' options cannot be used together.
|
|
24
|
+
const requestOptions = options?.ifAvailable === true ? options : { ...options, signal }
|
|
25
|
+
return navigator.locks.request(lockName, requestOptions, async (lock) => {
|
|
26
|
+
if (lock === null) {
|
|
27
|
+
if (onTaken) {
|
|
28
|
+
const exit = await Runtime.runPromiseExit(runtime)(onTaken)
|
|
29
|
+
if (exit._tag === 'Failure') {
|
|
30
|
+
return exit
|
|
33
31
|
}
|
|
34
|
-
return
|
|
35
32
|
}
|
|
33
|
+
return
|
|
34
|
+
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
)
|
|
36
|
+
// TODO also propagate Effect interruption to the execution
|
|
37
|
+
return Runtime.runPromiseExit(runtime)(eff)
|
|
38
|
+
})
|
|
39
|
+
},
|
|
40
|
+
catch: (err) => err as any as E,
|
|
41
|
+
})
|
|
44
42
|
|
|
45
43
|
if (exit._tag === 'Failure') {
|
|
46
|
-
return yield*
|
|
44
|
+
return yield* Effect.failCause(exit.cause)
|
|
47
45
|
} else {
|
|
48
46
|
return exit.value
|
|
49
47
|
}
|
|
@@ -53,6 +51,10 @@ export const waitForDeferredLock = (deferred: Deferred.Deferred<void>, lockName:
|
|
|
53
51
|
Effect.async<void>((cb, signal) => {
|
|
54
52
|
if (signal.aborted) return
|
|
55
53
|
|
|
54
|
+
signal.addEventListener('abort', () => {
|
|
55
|
+
console.log('[@livestore/utils:WebLock] waitForDeferredLock. aborted', lockName)
|
|
56
|
+
})
|
|
57
|
+
|
|
56
58
|
navigator.locks
|
|
57
59
|
.request(lockName, { signal, mode: 'exclusive', ifAvailable: false }, (_lock) => {
|
|
58
60
|
// immediately continuing calling Effect since we have the lock
|
|
@@ -73,13 +75,27 @@ export const waitForDeferredLock = (deferred: Deferred.Deferred<void>, lockName:
|
|
|
73
75
|
})
|
|
74
76
|
|
|
75
77
|
export const tryGetDeferredLock = (deferred: Deferred.Deferred<void>, lockName: string) =>
|
|
76
|
-
Effect.async<boolean>((cb) => {
|
|
78
|
+
Effect.async<boolean>((cb, signal) => {
|
|
77
79
|
navigator.locks.request(lockName, { mode: 'exclusive', ifAvailable: true }, (lock) => {
|
|
78
80
|
cb(Effect.succeed(lock !== null))
|
|
79
81
|
|
|
80
82
|
// the code below is still running
|
|
81
83
|
|
|
84
|
+
console.log('[@livestore/utils:WebLock] tryGetDeferredLock. lock', lock, 'waiting...')
|
|
85
|
+
|
|
86
|
+
const abortPromise = new Promise<void>((resolve) => {
|
|
87
|
+
signal.addEventListener('abort', () => {
|
|
88
|
+
console.log('[@livestore/utils:WebLock] tryGetDeferredLock. aborted', lockName)
|
|
89
|
+
resolve()
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
|
|
82
93
|
// holding lock until deferred is resolved
|
|
83
|
-
return
|
|
94
|
+
return Promise.race([
|
|
95
|
+
Effect.runPromise(Deferred.await(deferred)).finally(() => {
|
|
96
|
+
console.log('[@livestore/utils:WebLock] tryGetDeferredLock. finally', lockName)
|
|
97
|
+
}),
|
|
98
|
+
abortPromise,
|
|
99
|
+
])
|
|
84
100
|
})
|
|
85
101
|
})
|
package/src/effect/index.ts
CHANGED
|
@@ -12,7 +12,6 @@ export {
|
|
|
12
12
|
Exit,
|
|
13
13
|
Cause,
|
|
14
14
|
Runtime,
|
|
15
|
-
Scheduler,
|
|
16
15
|
FiberRef,
|
|
17
16
|
FiberRefs,
|
|
18
17
|
FiberRefsPatch,
|
|
@@ -71,6 +70,7 @@ export * as PortPlatformRunner from './port-platform-runner.js'
|
|
|
71
70
|
|
|
72
71
|
export * as Effect from './Effect.js'
|
|
73
72
|
export * as Schedule from './Schedule.js'
|
|
73
|
+
export * as Scheduler from './Scheduler.js'
|
|
74
74
|
export * from './Error.js'
|
|
75
75
|
export * as ServiceContext from './ServiceContext.js'
|
|
76
76
|
export * as WebLock from './WebLock.js'
|