@livestore/utils 0.0.46-dev.4 → 0.0.47-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.
@@ -1,5 +1,6 @@
1
- import type { Context } from 'effect';
2
- import { Effect } from 'effect';
1
+ import type { Context, Duration } from 'effect';
2
+ import { Deferred, Effect } from 'effect';
3
+ import type { LazyArg } from 'effect/Function';
3
4
  export * from 'effect/Effect';
4
5
  export declare const log: <A>(message: A, ...rest: any[]) => Effect.Effect<void>;
5
6
  export declare const logWarn: <A>(message: A, ...rest: any[]) => Effect.Effect<void>;
@@ -8,4 +9,14 @@ export declare const logError: <A>(message: A, ...rest: any[]) => Effect.Effect<
8
9
  export declare const tapCauseLogPretty: <R, E, A>(eff: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
9
10
  export declare const tapSync: <A>(tapFn: (a: A) => unknown) => <R, E>(eff: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
10
11
  export declare const debugLogEnv: (msg?: string) => Effect.Effect<Context.Context<never>>;
12
+ export declare const timeoutDie: <E1>(options: {
13
+ onTimeout: LazyArg<E1>;
14
+ duration: Duration.DurationInput;
15
+ }) => <R, E, A>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
16
+ export declare const timeoutDieMsg: (options: {
17
+ error: string;
18
+ duration: Duration.DurationInput;
19
+ }) => <R, E, A>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
20
+ export declare const toForkedDeferred: <R, E, A>(eff: Effect.Effect<A, E, R>) => Effect.Effect<Deferred.Deferred<A, E>, never, R>;
21
+ export declare const withPerformanceMeasure: (meaureLabel: string) => <R, E, A>(eff: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
11
22
  //# sourceMappingURL=Effect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Effect.d.ts","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAS,MAAM,EAAQ,MAAM,QAAQ,CAAA;AAI5C,cAAc,eAAe,CAAA;AAE7B,eAAO,MAAM,GAAG,eAAgB,CAAC,WAAW,GAAG,EAAE,KAAG,aAAa,CAAC,IAAI,CAGlE,CAAA;AAEJ,eAAO,MAAM,OAAO,eAAgB,CAAC,WAAW,GAAG,EAAE,KAAG,aAAa,CAAC,IAAI,CAGtE,CAAA;AAEJ,eAAO,MAAM,QAAQ,eAAgB,CAAC,WAAW,GAAG,EAAE,KAAG,aAAa,CAAC,IAAI,CAGvE,CAAA;AAEJ,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,iBAAkB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAU1F,CAAA;AAEJ,eAAO,MAAM,OAAO,iBACH,CAAC,KAAK,OAAO,iBAChB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CACL,CAAA;AAEvD,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAI5E,CAAA"}
1
+ {"version":3,"file":"Effect.d.ts","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAS,QAAQ,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAK9C,cAAc,eAAe,CAAA;AAE7B,eAAO,MAAM,GAAG,eAAgB,CAAC,WAAW,GAAG,EAAE,KAAG,aAAa,CAAC,IAAI,CAGlE,CAAA;AAEJ,eAAO,MAAM,OAAO,eAAgB,CAAC,WAAW,GAAG,EAAE,KAAG,aAAa,CAAC,IAAI,CAGtE,CAAA;AAEJ,eAAO,MAAM,QAAQ,eAAgB,CAAC,WAAW,GAAG,EAAE,KAAG,aAAa,CAAC,IAAI,CAGvE,CAAA;AAEJ,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,iBAAkB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAU1F,CAAA;AAEJ,eAAO,MAAM,OAAO,iBACH,CAAC,KAAK,OAAO,iBAChB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CACL,CAAA;AAEvD,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,aAAa,CAAC,eAAe,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,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,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,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAK3D,CAAA;AAEL,eAAO,MAAM,gBAAgB,iBACtB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC1B,aAAa,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAU/C,CAAA;AAEH,eAAO,MAAM,sBAAsB,gBACnB,MAAM,oBACL,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAS1D,CAAA"}
@@ -1,5 +1,6 @@
1
- import { Cause, Effect, pipe } from 'effect';
1
+ import { Cause, Deferred, Effect, pipe } from 'effect';
2
2
  import { isNonEmptyString } from '../index.js';
3
+ import { UnknownError } from './Error.js';
3
4
  export * from 'effect/Effect';
4
5
  export const log = (message, ...rest) => Effect.sync(() => {
5
6
  console.log(message, ...rest);
@@ -20,4 +21,11 @@ export const tapCauseLogPretty = (eff) => Effect.tapErrorCause(eff, (err) => {
20
21
  });
21
22
  export const tapSync = (tapFn) => (eff) => Effect.tap(eff, (a) => Effect.sync(() => tapFn(a)));
22
23
  export const debugLogEnv = (msg) => pipe(Effect.context(), Effect.tap((env) => log(msg ?? 'debugLogEnv', env)));
24
+ export const timeoutDie = (options) => (self) => Effect.orDie(Effect.timeoutFail(options)(self));
25
+ export const timeoutDieMsg = (options) => (self) => Effect.orDie(Effect.timeoutFail({ onTimeout: () => new UnknownError({ error: options.error }), duration: options.duration })(self));
26
+ export const toForkedDeferred = (eff) => pipe(Deferred.make(), Effect.tap((deferred) => pipe(Effect.exit(eff), Effect.flatMap((ex) => Deferred.done(deferred, ex)), Effect.forkDaemon)));
27
+ export const withPerformanceMeasure = (meaureLabel) => (eff) => Effect.acquireUseRelease(Effect.sync(() => performance.mark(`${meaureLabel}:start`)), () => eff, () => Effect.sync(() => {
28
+ performance.mark(`${meaureLabel}:end`);
29
+ performance.measure(meaureLabel, `${meaureLabel}:start`, `${meaureLabel}:end`);
30
+ }));
23
31
  //# sourceMappingURL=Effect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Effect.js","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,cAAc,eAAe,CAAA;AAE7B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAI,OAAU,EAAE,GAAG,IAAW,EAAuB,EAAE,CACxE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,OAAU,EAAE,GAAG,IAAW,EAAuB,EAAE,CAC5E,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,OAAU,EAAE,GAAG,IAAW,EAAuB,EAAE,CAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA;AAEJ,sCAAsC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAU,GAA2B,EAA0B,EAAE,CAChG,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;IAChC,IAAI,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAED,MAAM,UAAU,GACd,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAA;IAEnH,OAAO,QAAQ,CAAC,YAAY,UAAU,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9D,CAAC,CAAC,CAAA;AAEJ,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"}
1
+ {"version":3,"file":"Effect.js","sourceRoot":"","sources":["../../src/effect/Effect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from 'effect/Stream';
2
+ import type { Chunk } from 'effect';
3
+ import { Effect, Stream } from 'effect';
4
+ export declare const tapLog: <R, E, A>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>;
5
+ export declare const tapChunk: <R1, E1, A, Z>(f: (a: Chunk.Chunk<A>) => Effect.Effect<Z, E1, R1>) => <R, E>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E1 | E, R1 | R>;
6
+ //# sourceMappingURL=Stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stream.d.ts","sourceRoot":"","sources":["../../src/effect/Stream.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAE7B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,eAAO,MAAM,MAAM,oBAAqB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CACU,CAAA;AAEhG,eAAO,MAAM,QAAQ,wBACG,WAAW,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,kBACpD,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAMlE,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from 'effect/Stream';
2
+ import { Effect, pipe, Stream } from 'effect';
3
+ export const tapLog = (stream) => tapChunk(Effect.forEach((_) => Effect.succeed(console.log(_))))(stream);
4
+ export const tapChunk = (f) => (self) => Stream.mapChunksEffect(self, (chunks) => pipe(f(chunks), Effect.map(() => chunks)));
5
+ //# sourceMappingURL=Stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stream.js","sourceRoot":"","sources":["../../src/effect/Stream.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAG7B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAU,MAA8B,EAA0B,EAAE,CACxF,QAAQ,CAAwB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhG,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAe,CAAkD,EAAE,EAAE,CACrE,CAAO,IAA4B,EAAoC,EAAE,CACvE,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CACtC,IAAI,CACF,CAAC,CAAC,MAAM,CAAC,EACT,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CACzB,CACF,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { Deferred, Effect } from 'effect';
2
+ export declare const withLock: (lockName: string, options?: Omit<LockOptions, 'signal'>) => <Ctx, E, A>(eff: Effect.Effect<A, E, Ctx>) => Effect.Effect<A | void, E, Ctx>;
3
+ export declare const waitForDeferredLock: (deferred: Deferred.Deferred<void>, lockName: string) => Effect.Effect<void, never, never>;
4
+ //# sourceMappingURL=WebLock.d.ts.map
@@ -0,0 +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,aACR,MAAM,YAAY,KAAK,WAAW,EAAE,QAAQ,CAAC,sBACvC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAG,aAAa,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,CAyBtE,CAAA;AAEN,eAAO,MAAM,mBAAmB,aAAc,iBAAiB,CAAC,IAAI,CAAC,YAAY,MAAM,sCAWnF,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { Deferred, Effect, Runtime } from 'effect';
2
+ // See https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API
3
+ export const withLock = (lockName, options) => (eff) => Effect.gen(function* ($) {
4
+ const runtime = yield* $(Effect.runtime());
5
+ const exit = yield* $(Effect.tryPromise({
6
+ try: (signal) => {
7
+ // NOTE The 'signal' and 'ifAvailable' options cannot be used together.
8
+ const requestOptions = options?.ifAvailable === true ? options : { ...options, signal };
9
+ return navigator.locks.request(lockName, requestOptions, async (lock) => {
10
+ if (lock === null)
11
+ return;
12
+ // TODO also propagate Effect interruption to the execution
13
+ return Runtime.runPromiseExit(runtime)(eff);
14
+ });
15
+ },
16
+ catch: (err) => err,
17
+ }));
18
+ if (exit._tag === 'Failure') {
19
+ return yield* $(Effect.failCause(exit.cause));
20
+ }
21
+ else {
22
+ return exit.value;
23
+ }
24
+ });
25
+ export const waitForDeferredLock = (deferred, lockName) => Effect.async((cb, signal) => {
26
+ navigator.locks.request(lockName, { signal, mode: 'exclusive', ifAvailable: false }, async (_lock) => {
27
+ // immediately continuing calling Effect since we have the lock
28
+ cb(Effect.unit);
29
+ // the code below is still running
30
+ // holding lock until deferred is resolved
31
+ await Effect.runPromise(Deferred.await(deferred));
32
+ });
33
+ });
34
+ //# sourceMappingURL=WebLock.js.map
@@ -0,0 +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,CAAC,QAAgB,EAAE,OAAqC,EAAE,EAAE,CAC5D,CAAY,GAA6B,EAAmC,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IACrB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAO,CAAC,CAAA;IAE/C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CACnB,MAAM,CAAC,UAAU,CAAqB;QACpC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;YACd,uEAAuE;YACvE,MAAM,cAAc,GAAG,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAA;YACvF,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtE,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAM;gBAEzB,2DAA2D;gBAC3D,OAAO,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAA;YAC7C,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAe;KAChC,CAAC,CACH,CAAA;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;AACH,CAAC,CAAC,CAAA;AAEN,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAiC,EAAE,QAAgB,EAAE,EAAE,CACzF,MAAM,CAAC,KAAK,CAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;IAChC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACnG,+DAA+D;QAC/D,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAEf,kCAAkC;QAElC,0CAA0C;QAC1C,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,9 +1,13 @@
1
1
  import '../global.js';
2
- export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime, Scheduler, FiberRef, FiberRefs, FiberRefsPatch, Deferred, Metric, MetricState, Request, Tracer, Context, Data, Either, Brand, Hash, Equal, Chunk, Duration, ReadonlyArray, ReadonlyRecord, SortedMap, HashMap, HashSet, MutableHashSet, Option, Layer, Stream, Channel, SubscriptionRef, pipe, identity, Match, } from 'effect';
3
- export { Schema, TreeFormatter, AST as SchemaAST, Pretty as SchemaPretty } from '@effect/schema';
2
+ export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime, Scheduler, FiberRef, FiberRefs, FiberRefsPatch, Deferred, Metric, MetricState, Request, Tracer, Context, Data, Either, Brand, Hash, Equal, Chunk, Duration, ReadonlyArray, ReadonlyRecord, SortedMap, HashMap, HashSet, MutableHashSet, Option, Layer, Channel, SubscriptionRef, pipe, identity, Match, } from 'effect';
3
+ export * as Stream from './Stream.js';
4
+ export { Schema, TreeFormatter, AST as SchemaAST, Pretty as SchemaPretty, Serializable } from '@effect/schema';
4
5
  export * as OtelTracer from '@effect/opentelemetry/Tracer';
6
+ export { Transferable, FileSystem, Worker, WorkerError, WorkerRunner, Terminal } from '@effect/platform';
7
+ export { BrowserWorker, BrowserWorkerRunner } from '@effect/platform-browser';
5
8
  export * as Effect from './Effect.js';
6
9
  export * as Schedule from './Schedule.js';
7
10
  export * from './Error.js';
8
11
  export * as ServiceContext from './ServiceContext.js';
12
+ export * as WebLock from './WebLock.js';
9
13
  //# sourceMappingURL=index.d.ts.map
@@ -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,SAAS,EACT,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,aAAa,EACb,cAAc,EACd,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,KAAK,GACN,MAAM,QAAQ,CAAA;AAEf,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAChG,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAA;AAE1D,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,cAAc,YAAY,CAAA;AAC1B,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA"}
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,SAAS,EACT,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,aAAa,EACb,cAAc,EACd,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,MAAM,EACN,KAAK,EACL,OAAO,EACP,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,KAAK,GACN,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,IAAI,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC9G,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAA;AAE1D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACxG,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,cAAc,YAAY,CAAA;AAC1B,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA"}
@@ -1,9 +1,13 @@
1
1
  import '../global.js';
2
- export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime, Scheduler, FiberRef, FiberRefs, FiberRefsPatch, Deferred, Metric, MetricState, Request, Tracer, Context, Data, Either, Brand, Hash, Equal, Chunk, Duration, ReadonlyArray, ReadonlyRecord, SortedMap, HashMap, HashSet, MutableHashSet, Option, Layer, Stream, Channel, SubscriptionRef, pipe, identity, Match, } from 'effect';
3
- export { Schema, TreeFormatter, AST as SchemaAST, Pretty as SchemaPretty } from '@effect/schema';
2
+ export { Scope, Ref, SynchronizedRef, Queue, Fiber, FiberId, RuntimeFlags, PubSub, Exit, Cause, Runtime, Scheduler, FiberRef, FiberRefs, FiberRefsPatch, Deferred, Metric, MetricState, Request, Tracer, Context, Data, Either, Brand, Hash, Equal, Chunk, Duration, ReadonlyArray, ReadonlyRecord, SortedMap, HashMap, HashSet, MutableHashSet, Option, Layer, Channel, SubscriptionRef, pipe, identity, Match, } from 'effect';
3
+ export * as Stream from './Stream.js';
4
+ export { Schema, TreeFormatter, AST as SchemaAST, Pretty as SchemaPretty, Serializable } from '@effect/schema';
4
5
  export * as OtelTracer from '@effect/opentelemetry/Tracer';
6
+ export { Transferable, FileSystem, Worker, WorkerError, WorkerRunner, Terminal } from '@effect/platform';
7
+ export { BrowserWorker, BrowserWorkerRunner } from '@effect/platform-browser';
5
8
  export * as Effect from './Effect.js';
6
9
  export * as Schedule from './Schedule.js';
7
10
  export * from './Error.js';
8
11
  export * as ServiceContext from './ServiceContext.js';
12
+ export * as WebLock from './WebLock.js';
9
13
  //# sourceMappingURL=index.js.map
@@ -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,SAAS,EACT,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,aAAa,EACb,cAAc,EACd,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,KAAK,GACN,MAAM,QAAQ,CAAA;AAEf,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAChG,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAA;AAE1D,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,cAAc,YAAY,CAAA;AAC1B,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA"}
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,SAAS,EACT,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,aAAa,EACb,cAAc,EACd,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,MAAM,EACN,KAAK,EACL,OAAO,EACP,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,KAAK,GACN,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,IAAI,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC9G,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAA;AAE1D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACxG,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,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.46-dev.4",
3
+ "version": "0.0.47-dev.0",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "exports": {
@@ -32,17 +32,20 @@
32
32
  }
33
33
  },
34
34
  "dependencies": {
35
- "@effect/opentelemetry": "^0.31.16",
36
- "@effect/schema": "0.64.3",
35
+ "@effect/experimental": "^0.14.0",
36
+ "@effect/platform": "0.48.15",
37
+ "@effect/platform-browser": "0.31.15",
38
+ "@effect/opentelemetry": "^0.31.21",
39
+ "@effect/schema": "0.64.11",
37
40
  "@opentelemetry/api": "^1.8.0",
38
- "date-fns": "^3.4.0",
39
- "effect": "2.4.6",
41
+ "date-fns": "^3.6.0",
42
+ "effect": "2.4.11",
40
43
  "otel-websocket-exporter": "^0.0.27",
41
44
  "pretty-bytes": "^6.1.1",
42
- "effect-db-schema": "0.0.46-dev.4"
45
+ "effect-db-schema": "0.0.47-dev.0"
43
46
  },
44
47
  "devDependencies": {
45
- "@types/node": "^20.11.27",
48
+ "@types/node": "^20.11.30",
46
49
  "@types/web": "^0.0.142"
47
50
  },
48
51
  "publishConfig": {
@@ -1,7 +1,9 @@
1
- import type { Context } from 'effect'
2
- import { Cause, Effect, pipe } from 'effect'
1
+ import type { Context, Duration } from 'effect'
2
+ import { Cause, Deferred, Effect, pipe } from 'effect'
3
+ import type { LazyArg } from 'effect/Function'
3
4
 
4
5
  import { isNonEmptyString } from '../index.js'
6
+ import { UnknownError } from './Error.js'
5
7
 
6
8
  export * from 'effect/Effect'
7
9
 
@@ -43,3 +45,44 @@ export const debugLogEnv = (msg?: string): Effect.Effect<Context.Context<never>>
43
45
  Effect.context<never>(),
44
46
  Effect.tap((env) => log(msg ?? 'debugLogEnv', env)),
45
47
  )
48
+
49
+ export const timeoutDie =
50
+ <E1>(options: { onTimeout: LazyArg<E1>; duration: Duration.DurationInput }) =>
51
+ <R, E, A>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
52
+ Effect.orDie(Effect.timeoutFail(options)(self))
53
+
54
+ export const timeoutDieMsg =
55
+ (options: { error: string; duration: Duration.DurationInput }) =>
56
+ <R, E, A>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
57
+ Effect.orDie(
58
+ Effect.timeoutFail({ onTimeout: () => new UnknownError({ error: options.error }), duration: options.duration })(
59
+ self,
60
+ ),
61
+ )
62
+
63
+ export const toForkedDeferred = <R, E, A>(
64
+ eff: Effect.Effect<A, E, R>,
65
+ ): Effect.Effect<Deferred.Deferred<A, E>, never, R> =>
66
+ pipe(
67
+ Deferred.make<A, E>(),
68
+ Effect.tap((deferred) =>
69
+ pipe(
70
+ Effect.exit(eff),
71
+ Effect.flatMap((ex) => Deferred.done(deferred, ex)),
72
+ Effect.forkDaemon,
73
+ ),
74
+ ),
75
+ )
76
+
77
+ export const withPerformanceMeasure =
78
+ (meaureLabel: string) =>
79
+ <R, E, A>(eff: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
80
+ Effect.acquireUseRelease(
81
+ Effect.sync(() => performance.mark(`${meaureLabel}:start`)),
82
+ () => eff,
83
+ () =>
84
+ Effect.sync(() => {
85
+ performance.mark(`${meaureLabel}:end`)
86
+ performance.measure(meaureLabel, `${meaureLabel}:start`, `${meaureLabel}:end`)
87
+ }),
88
+ )
@@ -0,0 +1,17 @@
1
+ export * from 'effect/Stream'
2
+
3
+ import type { Chunk } from 'effect'
4
+ import { Effect, pipe, Stream } from 'effect'
5
+
6
+ export const tapLog = <R, E, A>(stream: Stream.Stream<A, E, R>): Stream.Stream<A, E, R> =>
7
+ tapChunk<never, never, A, void>(Effect.forEach((_) => Effect.succeed(console.log(_))))(stream)
8
+
9
+ export const tapChunk =
10
+ <R1, E1, A, Z>(f: (a: Chunk.Chunk<A>) => Effect.Effect<Z, E1, R1>) =>
11
+ <R, E>(self: Stream.Stream<A, E, R>): Stream.Stream<A, E1 | E, R1 | R> =>
12
+ Stream.mapChunksEffect(self, (chunks) =>
13
+ pipe(
14
+ f(chunks),
15
+ Effect.map(() => chunks),
16
+ ),
17
+ )
@@ -0,0 +1,45 @@
1
+ import type { Exit } from 'effect'
2
+ import { Deferred, Effect, Runtime } from 'effect'
3
+
4
+ // See https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API
5
+ export const withLock =
6
+ (lockName: string, options?: Omit<LockOptions, 'signal'>) =>
7
+ <Ctx, E, A>(eff: Effect.Effect<A, E, Ctx>): Effect.Effect<A | void, E, Ctx> =>
8
+ Effect.gen(function* ($) {
9
+ const runtime = yield* $(Effect.runtime<Ctx>())
10
+
11
+ const exit = yield* $(
12
+ Effect.tryPromise<Exit.Exit<A, E>, E>({
13
+ try: (signal) => {
14
+ // NOTE The 'signal' and 'ifAvailable' options cannot be used together.
15
+ const requestOptions = options?.ifAvailable === true ? options : { ...options, signal }
16
+ return navigator.locks.request(lockName, requestOptions, async (lock) => {
17
+ if (lock === null) return
18
+
19
+ // TODO also propagate Effect interruption to the execution
20
+ return Runtime.runPromiseExit(runtime)(eff)
21
+ })
22
+ },
23
+ catch: (err) => err as any as E,
24
+ }),
25
+ )
26
+
27
+ if (exit._tag === 'Failure') {
28
+ return yield* $(Effect.failCause(exit.cause))
29
+ } else {
30
+ return exit.value
31
+ }
32
+ })
33
+
34
+ export const waitForDeferredLock = (deferred: Deferred.Deferred<void>, lockName: string) =>
35
+ Effect.async<void>((cb, signal) => {
36
+ navigator.locks.request(lockName, { signal, mode: 'exclusive', ifAvailable: false }, async (_lock) => {
37
+ // immediately continuing calling Effect since we have the lock
38
+ cb(Effect.unit)
39
+
40
+ // the code below is still running
41
+
42
+ // holding lock until deferred is resolved
43
+ await Effect.runPromise(Deferred.await(deferred))
44
+ })
45
+ })
@@ -37,7 +37,6 @@ export {
37
37
  MutableHashSet,
38
38
  Option,
39
39
  Layer,
40
- Stream,
41
40
  Channel,
42
41
  SubscriptionRef,
43
42
  pipe,
@@ -45,10 +44,16 @@ export {
45
44
  Match,
46
45
  } from 'effect'
47
46
 
48
- export { Schema, TreeFormatter, AST as SchemaAST, Pretty as SchemaPretty } from '@effect/schema'
47
+ export * as Stream from './Stream.js'
48
+
49
+ export { Schema, TreeFormatter, AST as SchemaAST, Pretty as SchemaPretty, Serializable } from '@effect/schema'
49
50
  export * as OtelTracer from '@effect/opentelemetry/Tracer'
50
51
 
52
+ export { Transferable, FileSystem, Worker, WorkerError, WorkerRunner, Terminal } from '@effect/platform'
53
+ export { BrowserWorker, BrowserWorkerRunner } from '@effect/platform-browser'
54
+
51
55
  export * as Effect from './Effect.js'
52
56
  export * as Schedule from './Schedule.js'
53
57
  export * from './Error.js'
54
58
  export * as ServiceContext from './ServiceContext.js'
59
+ export * as WebLock from './WebLock.js'