@livestore/utils 0.3.0-dev.8 → 0.3.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.json +1 -1
- package/dist/Deferred.d.ts.map +1 -1
- package/dist/base64.d.ts.map +1 -1
- package/dist/bun/mod.d.ts +5 -0
- package/dist/bun/mod.d.ts.map +1 -0
- package/dist/bun/mod.js +10 -0
- package/dist/bun/mod.js.map +1 -0
- package/dist/cuid/cuid.browser.d.ts.map +1 -1
- package/dist/cuid/cuid.node.d.ts.map +1 -1
- package/dist/effect/BucketQueue.d.ts +15 -2
- package/dist/effect/BucketQueue.d.ts.map +1 -1
- package/dist/effect/BucketQueue.js +24 -6
- package/dist/effect/BucketQueue.js.map +1 -1
- package/dist/effect/Effect.d.ts +4 -2
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +21 -18
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/Logger.d.ts +2 -0
- package/dist/effect/Logger.d.ts.map +1 -1
- package/dist/effect/Logger.js +16 -1
- package/dist/effect/Logger.js.map +1 -1
- package/dist/effect/Scheduler.d.ts.map +1 -1
- package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
- package/dist/effect/Schema/index.d.ts +3 -0
- package/dist/effect/Schema/index.d.ts.map +1 -1
- package/dist/effect/Schema/index.js +19 -0
- package/dist/effect/Schema/index.js.map +1 -1
- package/dist/effect/Schema/msgpack.d.ts +1 -1
- package/dist/effect/Schema/msgpack.d.ts.map +1 -1
- package/dist/effect/ServiceContext.d.ts.map +1 -1
- package/dist/effect/Stream.d.ts.map +1 -1
- package/dist/effect/Subscribable.d.ts +76 -0
- package/dist/effect/Subscribable.d.ts.map +1 -0
- package/dist/effect/Subscribable.js +80 -0
- package/dist/effect/Subscribable.js.map +1 -0
- package/dist/effect/TaskTracing.d.ts.map +1 -1
- package/dist/effect/{WebChannel.d.ts → WebChannel/WebChannel.d.ts} +39 -17
- package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -0
- package/dist/effect/WebChannel/WebChannel.js +300 -0
- package/dist/effect/WebChannel/WebChannel.js.map +1 -0
- package/dist/effect/WebChannel/WebChannel.test.d.ts +2 -0
- package/dist/effect/WebChannel/WebChannel.test.d.ts.map +1 -0
- package/dist/effect/WebChannel/WebChannel.test.js +62 -0
- package/dist/effect/WebChannel/WebChannel.test.js.map +1 -0
- package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts +5 -6
- package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
- package/dist/effect/WebChannel/broadcastChannelWithAck.js +12 -9
- package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
- package/dist/effect/WebChannel/common.d.ts +29 -1
- package/dist/effect/WebChannel/common.d.ts.map +1 -1
- package/dist/effect/WebChannel/common.js +26 -1
- package/dist/effect/WebChannel/common.js.map +1 -1
- package/dist/effect/WebChannel/mod.d.ts +4 -0
- package/dist/effect/WebChannel/mod.d.ts.map +1 -0
- package/dist/effect/WebChannel/mod.js +4 -0
- package/dist/effect/WebChannel/mod.js.map +1 -0
- package/dist/effect/WebLock.d.ts.map +1 -1
- package/dist/effect/WebSocket.d.ts +3 -2
- package/dist/effect/WebSocket.d.ts.map +1 -1
- package/dist/effect/WebSocket.js +45 -19
- package/dist/effect/WebSocket.js.map +1 -1
- package/dist/effect/WebSocket.test.d.ts +2 -0
- package/dist/effect/WebSocket.test.d.ts.map +1 -0
- package/dist/effect/WebSocket.test.js +11 -0
- package/dist/effect/WebSocket.test.js.map +1 -0
- package/dist/effect/index.d.ts +6 -3
- package/dist/effect/index.d.ts.map +1 -1
- package/dist/effect/index.js +9 -5
- package/dist/effect/index.js.map +1 -1
- package/dist/env.d.ts +4 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +7 -12
- package/dist/env.js.map +1 -1
- package/dist/fast-deep-equal.d.ts.map +1 -1
- package/dist/guards.d.ts.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -8
- package/dist/index.js.map +1 -1
- package/dist/misc.d.ts +3 -0
- package/dist/misc.d.ts.map +1 -1
- package/dist/misc.js +23 -0
- package/dist/misc.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js +21 -11
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +2 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +1 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +39 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +1 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +75 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +1 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +62 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +1 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +2 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +1 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +42 -0
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +1 -0
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +1 -4
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js +1 -4
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
- package/dist/node/mod.d.ts +3 -16
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +24 -75
- package/dist/node/mod.js.map +1 -1
- package/dist/object/index.d.ts.map +1 -1
- package/dist/object/omit.d.ts.map +1 -1
- package/dist/object/pick.d.ts.map +1 -1
- package/dist/promise.d.ts.map +1 -1
- package/dist/set.d.ts.map +1 -1
- package/dist/string.d.ts.map +1 -1
- package/dist/time.d.ts.map +1 -1
- package/package.json +51 -43
- package/src/bun/mod.ts +13 -0
- package/src/effect/BucketQueue.ts +33 -6
- package/src/effect/Effect.ts +33 -20
- package/src/effect/Logger.ts +23 -1
- package/src/effect/Schema/index.ts +27 -0
- package/src/effect/Subscribable.ts +155 -0
- package/src/effect/WebChannel/WebChannel.test.ts +106 -0
- package/src/effect/WebChannel/WebChannel.ts +502 -0
- package/src/effect/WebChannel/broadcastChannelWithAck.ts +86 -83
- package/src/effect/WebChannel/common.ts +61 -2
- package/src/effect/WebChannel/mod.ts +3 -0
- package/src/effect/WebSocket.test.ts +15 -0
- package/src/effect/WebSocket.ts +75 -36
- package/src/effect/index.ts +33 -2
- package/src/env.ts +9 -13
- package/src/index.ts +6 -12
- package/src/misc.ts +31 -0
- package/src/node/ChildProcessRunner/ChildProcessRunner.ts +40 -29
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +52 -0
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +65 -0
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +53 -0
- package/src/node/ChildProcessRunner/ChildProcessWorker.ts +3 -6
- package/src/node/mod.ts +30 -103
- package/dist/effect/WebChannel.d.ts.map +0 -1
- package/dist/effect/WebChannel.js +0 -175
- package/dist/effect/WebChannel.js.map +0 -1
- package/dist/nanoid/index.browser.d.ts +0 -2
- package/dist/nanoid/index.browser.d.ts.map +0 -1
- package/dist/nanoid/index.browser.js +0 -3
- package/dist/nanoid/index.browser.js.map +0 -1
- package/src/effect/WebChannel.ts +0 -305
- package/src/nanoid/index.browser.ts +0 -2
- package/tmp/effect-deferred-repro.ts +0 -29
- package/tmp/effect-semaphore-repro.ts +0 -93
- package/tsconfig.json +0 -10
package/dist/node/mod.js
CHANGED
|
@@ -1,90 +1,39 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
|
|
5
|
-
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
6
|
-
import { Config, Effect, Layer } from 'effect';
|
|
7
|
-
import { tapCauseLogPretty } from '../effect/Effect.js';
|
|
8
|
-
import { OtelTracer } from '../effect/index.js';
|
|
1
|
+
import * as http from 'node:http';
|
|
2
|
+
import { Effect, Layer } from 'effect';
|
|
3
|
+
import { OtelTracer, UnknownError } from '../effect/index.js';
|
|
9
4
|
import { makeNoopTracer } from '../NoopTracer.js';
|
|
10
|
-
// import { tapCauseLogPretty } from '../effect/Effect.js'
|
|
11
5
|
export * as Cli from '@effect/cli';
|
|
12
|
-
export * as PlatformBun from '@effect/platform-bun';
|
|
13
6
|
export * as PlatformNode from '@effect/platform-node';
|
|
14
|
-
export * as SocketServer from '@effect/
|
|
15
|
-
export * as OtelResource from '@effect/opentelemetry/Resource';
|
|
16
|
-
export { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
17
|
-
export { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
|
|
18
|
-
export * as OtelNodeSdk from '@effect/opentelemetry/NodeSdk';
|
|
7
|
+
export * as SocketServer from '@effect/platform/SocketServer';
|
|
19
8
|
export * as ChildProcessRunner from './ChildProcessRunner/ChildProcessRunner.js';
|
|
20
9
|
export * as ChildProcessWorker from './ChildProcessRunner/ChildProcessWorker.js';
|
|
21
10
|
// Enable debug logging for OpenTelemetry
|
|
22
11
|
// otel.diag.setLogger(new otel.DiagConsoleLogger(), otel.DiagLogLevel.ERROR)
|
|
23
12
|
// export const OtelLiveHttp = (args: any): Layer.Layer<never> => Layer.empty
|
|
24
|
-
export const
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
});
|
|
29
|
-
export const OtelLiveHttp = ({ serviceName, rootSpanName, skipLogUrl, } = {}) => Effect.gen(function* () {
|
|
30
|
-
const config = yield* Config.all({
|
|
31
|
-
exporterUrlTracing: Config.string('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT'),
|
|
32
|
-
exporterUrlMracing: Config.string('OTEL_EXPORTER_OTLP_METRICS_ENDPOINT'),
|
|
33
|
-
serviceName: serviceName
|
|
34
|
-
? Config.succeed(serviceName)
|
|
35
|
-
: Config.string('OTEL_SERVICE_NAME').pipe(Config.withDefault('overtone-node-utils-default-service')),
|
|
36
|
-
rootSpanName: rootSpanName
|
|
37
|
-
? Config.succeed(rootSpanName)
|
|
38
|
-
: Config.string('OTEL_ROOT_SPAN_NAME').pipe(Config.withDefault('RootSpan')),
|
|
39
|
-
}).pipe(tapCauseLogPretty, Effect.orDie);
|
|
40
|
-
const resource = { serviceName: config.serviceName };
|
|
41
|
-
// METRICS
|
|
42
|
-
const metricExporter = new OTLPMetricExporter({ url: config.exporterUrlMracing });
|
|
43
|
-
const metricReader = new PeriodicExportingMetricReader({
|
|
44
|
-
exporter: metricExporter,
|
|
45
|
-
exportIntervalMillis: 1000,
|
|
46
|
-
});
|
|
47
|
-
// TRACING
|
|
48
|
-
const OtelLive = OtelNodeSdk.layer(() => ({
|
|
49
|
-
resource,
|
|
50
|
-
metricReader,
|
|
51
|
-
spanProcessor: new BatchSpanProcessor(new OTLPTraceExporter({ url: config.exporterUrlTracing, headers: {} })),
|
|
52
|
-
}));
|
|
53
|
-
const RootSpanLive = Layer.span(config.rootSpanName, {
|
|
54
|
-
attributes: { config },
|
|
55
|
-
onEnd: skipLogUrl ? undefined : (span) => logTraceUiUrlForSpan()(span.span),
|
|
13
|
+
export const getFreePort = Effect.async((cb, signal) => {
|
|
14
|
+
const server = http.createServer();
|
|
15
|
+
signal.addEventListener('abort', () => {
|
|
16
|
+
server.close();
|
|
56
17
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
else {
|
|
64
|
-
if (printMsg) {
|
|
65
|
-
console.log(printMsg(url));
|
|
18
|
+
// Listen on port 0 to get an available port
|
|
19
|
+
server.listen(0, () => {
|
|
20
|
+
const address = server.address();
|
|
21
|
+
if (address && typeof address === 'object') {
|
|
22
|
+
const port = address.port;
|
|
23
|
+
server.close(() => cb(Effect.succeed(port)));
|
|
66
24
|
}
|
|
67
25
|
else {
|
|
68
|
-
|
|
26
|
+
server.close(() => cb(Effect.fail(new UnknownError({ cause: 'Failed to get a free port' }))));
|
|
69
27
|
}
|
|
70
|
-
}
|
|
71
|
-
}));
|
|
72
|
-
export const getTracingBackendUrl = (span) => Effect.gen(function* () {
|
|
73
|
-
const endpoint = yield* Config.string('TRACING_UI_ENDPOINT').pipe(Config.option, Effect.orDie);
|
|
74
|
-
if (endpoint._tag === 'None')
|
|
75
|
-
return;
|
|
76
|
-
const traceId = span.spanContext().traceId;
|
|
77
|
-
// Grafana + Tempo
|
|
78
|
-
const grafanaEndpoint = endpoint.value;
|
|
79
|
-
const searchParams = new URLSearchParams({
|
|
80
|
-
orgId: '1',
|
|
81
|
-
left: JSON.stringify({
|
|
82
|
-
datasource: 'tempo',
|
|
83
|
-
queries: [{ query: traceId, queryType: 'traceql', refId: 'A' }],
|
|
84
|
-
range: { from: 'now-1h', to: 'now' },
|
|
85
|
-
}),
|
|
86
28
|
});
|
|
87
|
-
//
|
|
88
|
-
|
|
29
|
+
// Error handling in case the server encounters an error
|
|
30
|
+
server.on('error', (err) => {
|
|
31
|
+
server.close(() => cb(Effect.fail(new UnknownError({ cause: err }))));
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
export const OtelLiveDummy = Layer.suspend(() => {
|
|
35
|
+
const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, makeNoopTracer());
|
|
36
|
+
const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(Layer.provideMerge(OtelTracerLive));
|
|
37
|
+
return TracingLive;
|
|
89
38
|
});
|
|
90
39
|
//# sourceMappingURL=mod.js.map
|
package/dist/node/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,YAAY,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,OAAO,KAAK,kBAAkB,MAAM,4CAA4C,CAAA;AAChF,OAAO,KAAK,kBAAkB,MAAM,4CAA4C,CAAA;AAEhF,yCAAyC;AACzC,6EAA6E;AAE7E,6EAA6E;AAE7E,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IAElC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAC,CAAA;IAEF,4CAA4C;IAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;QAEhC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAuC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;IAClF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;IAE7E,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CACvF,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CACU,CAAA;IAE9C,OAAO,WAAW,CAAA;AACpB,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAEA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AAEzB,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE3F,eAAO,MAAM,eAAe,GAAI,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAEA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AAEzB,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE3F,eAAO,MAAM,eAAe,GAAI,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EACrE,KAAK,IAAI,EACT,UAAU,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,KAAK,KAC7D,GAAG,CAAC,IAAI,MAAM,IAAI,GAAG,KAAK,GAG5B,CAAA;AAED,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;AAEjE,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,KAAG,OAAO,CAAC,CAAC,CAAsC,CAAA;AAErH,eAAO,MAAM,mBAAmB,GAAI,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,IAAI,KAAG,GAAG,CAAC,IAAI,MAAM,IAAI,GAAG,CAAC,GAI9F,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omit.d.ts","sourceRoot":"","sources":["../../src/object/omit.ts"],"names":[],"mappings":"AAKA,uEAAuE;AACvE,eAAO,MAAM,IAAI,GAAI,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,SAAS,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"omit.d.ts","sourceRoot":"","sources":["../../src/object/omit.ts"],"names":[],"mappings":"AAKA,uEAAuE;AACvE,eAAO,MAAM,IAAI,GAAI,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,SAAS,MAAM,GAAG,EAC1E,KAAK,GAAG,EACR,MAAM,IAAI,EAAE,KACX,IAAI,CAAC,GAAG,EAAE,IAAI,CAOhB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../src/object/pick.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,CAAA;AACxG,KAAK,WAAW,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;CAAE,CAAA;AAC1D,KAAK,YAAY,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AACrF,KAAK,WAAW,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;AAE3D,eAAO,MAAM,IAAI,GAAI,GAAG,EAAE,IAAI,SAAS,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../src/object/pick.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,CAAA;AACxG,KAAK,WAAW,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;CAAE,CAAA;AAC1D,KAAK,YAAY,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AACrF,KAAK,WAAW,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;AAE3D,eAAO,MAAM,IAAI,GAAI,GAAG,EAAE,IAAI,SAAS,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,IAAI,EAAE,KAAG,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAE,CAK7G,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,GAAG,EAAE,IAAI,SAAS,MAAM,GAAG,EAAE,KAAK,EAC9D,KAAK,GAAG,EACR,MAAM,IAAI,EAAE,EACZ,WAAW,KAAK,KACf,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAE,CAAC,GAAG,KAUtD,CAAA"}
|
package/dist/promise.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,6CACpE,CAAA;AAE3B,eAAO,MAAM,cAAc,GAAU,CAAC,EAAE,GAAG,EACzC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACvB,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KACjD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAG7B,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAU,CAAC,EAAE,GAAG,EAC3C,KAAK,CAAC,EAAE,EACR,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EACvD,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,KACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAI7B,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,CAAC,EAAE,GAAG,EACzC,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,EAC5C,WAAW,MAAM,KAChB,OAAO,CAAC,GAAG,EAAE,CAgBf,CAAA"}
|
package/dist/set.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../src/set.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../src/set.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,WASjD,CAAA"}
|
package/dist/string.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,WAA+C,CAAA;AAC7F,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,WAA+C,CAAA;AAE7F,qEAAqE;AACrE,eAAO,MAAM,MAAM,GAAI,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE,aAAU,KAAG,MAI7C,CAAA"}
|
package/dist/time.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,QAAY,CAAA;AAEnC,eAAO,MAAM,IAAI;;;;;;;CAOhB,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,QAAY,CAAA;AAEnC,eAAO,MAAM,IAAI;;;;;;;CAOhB,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,WAYxC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/utils",
|
|
3
|
-
"version": "0.3.0
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"./dist/global.js"
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
},
|
|
19
19
|
"./nanoid": {
|
|
20
20
|
"types": "./dist/nanoid/index.d.ts",
|
|
21
|
-
"react-native": "./dist/nanoid/index.browser.js",
|
|
22
21
|
"default": "./dist/nanoid/index.js"
|
|
23
22
|
},
|
|
24
23
|
"./effect": {
|
|
@@ -29,13 +28,9 @@
|
|
|
29
28
|
"types": "./dist/node/mod.d.ts",
|
|
30
29
|
"default": "./dist/node/mod.js"
|
|
31
30
|
},
|
|
32
|
-
"./
|
|
33
|
-
"types": "./dist/
|
|
34
|
-
"default": "./dist/
|
|
35
|
-
},
|
|
36
|
-
"./node-vitest-polyfill": {
|
|
37
|
-
"types": "./dist/node-vitest/polyfill.d.ts",
|
|
38
|
-
"default": "./dist/node-vitest/polyfill.js"
|
|
31
|
+
"./bun": {
|
|
32
|
+
"types": "./dist/bun/mod.d.ts",
|
|
33
|
+
"default": "./dist/bun/mod.js"
|
|
39
34
|
}
|
|
40
35
|
},
|
|
41
36
|
"types": "./dist/index.d.ts",
|
|
@@ -53,51 +48,64 @@
|
|
|
53
48
|
"./node": [
|
|
54
49
|
"./dist/node/mod.d.ts"
|
|
55
50
|
],
|
|
56
|
-
"./
|
|
57
|
-
"./dist/
|
|
58
|
-
],
|
|
59
|
-
"./node-vitest-polyfill": [
|
|
60
|
-
"./dist/node-vitest/polyfill.d.ts"
|
|
51
|
+
"./bun": [
|
|
52
|
+
"./dist/bun/mod.d.ts"
|
|
61
53
|
]
|
|
62
54
|
}
|
|
63
55
|
},
|
|
64
56
|
"dependencies": {
|
|
57
|
+
"@standard-schema/spec": "1.0.0",
|
|
65
58
|
"msgpackr": "1.11.2",
|
|
66
|
-
"nanoid": "5.
|
|
67
|
-
"pretty-bytes": "6.1.1"
|
|
68
|
-
"@livestore/db-schema": "0.3.0-dev.8"
|
|
59
|
+
"nanoid": "5.1.3",
|
|
60
|
+
"pretty-bytes": "6.1.1"
|
|
69
61
|
},
|
|
70
62
|
"devDependencies": {
|
|
71
|
-
"@effect/cli": "^0.
|
|
72
|
-
"@effect/
|
|
73
|
-
"@effect/
|
|
74
|
-
"@effect/
|
|
75
|
-
"@effect/platform
|
|
76
|
-
"@effect/platform-
|
|
77
|
-
"@effect/platform-
|
|
78
|
-
"@effect/
|
|
63
|
+
"@effect/cli": "^0.61.4",
|
|
64
|
+
"@effect/cluster": "^0.34.1",
|
|
65
|
+
"@effect/experimental": "^0.46.4",
|
|
66
|
+
"@effect/opentelemetry": "^0.48.4",
|
|
67
|
+
"@effect/platform": "^0.82.4",
|
|
68
|
+
"@effect/platform-browser": "^0.62.4",
|
|
69
|
+
"@effect/platform-bun": "^0.65.1",
|
|
70
|
+
"@effect/platform-node": "^0.81.1",
|
|
71
|
+
"@effect/printer": "^0.43.2",
|
|
72
|
+
"@effect/printer-ansi": "^0.43.2",
|
|
73
|
+
"@effect/rpc": "^0.59.5",
|
|
74
|
+
"@effect/sql": "^0.35.4",
|
|
75
|
+
"@effect/typeclass": "^0.34.2",
|
|
76
|
+
"@effect/vitest": "^0.22.2",
|
|
79
77
|
"@opentelemetry/api": "^1.9.0",
|
|
80
|
-
"@opentelemetry/
|
|
81
|
-
"@
|
|
82
|
-
"@
|
|
83
|
-
"@
|
|
84
|
-
"@
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"vitest": "^2.1.4"
|
|
78
|
+
"@opentelemetry/resources": "^2.0.0",
|
|
79
|
+
"@types/bun": "^1.2.4",
|
|
80
|
+
"@types/jsdom": "^21.1.7",
|
|
81
|
+
"@types/node": "^22.15.17",
|
|
82
|
+
"@types/web": "^0.0.203",
|
|
83
|
+
"effect": "^3.15.2",
|
|
84
|
+
"jsdom": "^26.0.0",
|
|
85
|
+
"vitest": "^3.1.2"
|
|
89
86
|
},
|
|
87
|
+
"files": [
|
|
88
|
+
"package.json",
|
|
89
|
+
"src",
|
|
90
|
+
"dist"
|
|
91
|
+
],
|
|
90
92
|
"peerDependencies": {
|
|
91
|
-
"@effect/cli": "~0.
|
|
92
|
-
"@effect/
|
|
93
|
-
"@effect/
|
|
94
|
-
"@effect/
|
|
95
|
-
"@effect/platform
|
|
96
|
-
"@effect/platform-
|
|
97
|
-
"@effect/platform-
|
|
98
|
-
"@effect/
|
|
93
|
+
"@effect/cli": "~0.61.4",
|
|
94
|
+
"@effect/cluster": "~0.34.1",
|
|
95
|
+
"@effect/experimental": "~0.46.4",
|
|
96
|
+
"@effect/opentelemetry": "~0.48.4",
|
|
97
|
+
"@effect/platform": "~0.82.4",
|
|
98
|
+
"@effect/platform-browser": "~0.62.4",
|
|
99
|
+
"@effect/platform-bun": "~0.65.1",
|
|
100
|
+
"@effect/platform-node": "~0.81.1",
|
|
101
|
+
"@effect/printer": "~0.43.2",
|
|
102
|
+
"@effect/printer-ansi": "~0.43.2",
|
|
103
|
+
"@effect/rpc": "~0.59.5",
|
|
104
|
+
"@effect/sql": "~0.35.4",
|
|
105
|
+
"@effect/typeclass": "~0.34.2",
|
|
99
106
|
"@opentelemetry/api": "~1.9.0",
|
|
100
|
-
"
|
|
107
|
+
"@opentelemetry/resources": "~2.0.0",
|
|
108
|
+
"effect": "~3.15.2"
|
|
101
109
|
},
|
|
102
110
|
"publishConfig": {
|
|
103
111
|
"access": "public"
|
package/src/bun/mod.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { $ } from 'bun'
|
|
2
|
+
import { Effect } from 'effect'
|
|
3
|
+
|
|
4
|
+
export * as PlatformBun from '@effect/platform-bun'
|
|
5
|
+
|
|
6
|
+
// TODO remove in favour of other `cmd` implementation
|
|
7
|
+
export const cmd = (_: string) =>
|
|
8
|
+
Effect.promise(() => {
|
|
9
|
+
console.log(`Running command: ${_}`)
|
|
10
|
+
return $`${{ raw: _ }}`
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export { $ } from 'bun'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Array, STM, TRef } from 'effect'
|
|
1
|
+
import { Array, Effect, STM, TRef } from 'effect'
|
|
2
2
|
|
|
3
3
|
export type BucketQueue<A> = TRef.TRef<A[]>
|
|
4
4
|
|
|
@@ -7,16 +7,43 @@ export const make = <A>(): STM.STM<BucketQueue<A>> => TRef.make<A[]>([])
|
|
|
7
7
|
export const offerAll = <A>(self: BucketQueue<A>, elements: ReadonlyArray<A>) =>
|
|
8
8
|
TRef.update(self, (bucket) => Array.appendAll(bucket, elements))
|
|
9
9
|
|
|
10
|
+
export const replace = <A>(self: BucketQueue<A>, elements: ReadonlyArray<A>) => TRef.set(self, elements as A[])
|
|
11
|
+
|
|
10
12
|
export const clear = <A>(self: BucketQueue<A>) => TRef.set(self, [])
|
|
11
13
|
|
|
12
|
-
export const takeBetween = <A>(
|
|
14
|
+
export const takeBetween = <A>(
|
|
15
|
+
bucket: BucketQueue<A>,
|
|
16
|
+
min: number,
|
|
17
|
+
max: number,
|
|
18
|
+
): STM.STM<ReadonlyArray<A>, never, never> =>
|
|
13
19
|
STM.gen(function* () {
|
|
14
|
-
const
|
|
15
|
-
if (
|
|
20
|
+
const bucketValue = yield* TRef.get(bucket)
|
|
21
|
+
if (bucketValue.length < min) {
|
|
16
22
|
return yield* STM.retry
|
|
17
23
|
} else {
|
|
18
|
-
const elements =
|
|
19
|
-
yield* TRef.set(
|
|
24
|
+
const elements = bucketValue.splice(0, Math.min(max, bucketValue.length))
|
|
25
|
+
yield* TRef.set(bucket, bucketValue)
|
|
20
26
|
return elements
|
|
21
27
|
}
|
|
22
28
|
})
|
|
29
|
+
|
|
30
|
+
export const peekAll = <A>(bucket: BucketQueue<A>) => TRef.get(bucket)
|
|
31
|
+
|
|
32
|
+
/** Returns the elements up to the first element that matches the predicate, the rest is left in the queue
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const [elements, rest] = yield* BucketQueue.takeSplitWhere(bucket, (a) => a > 3)
|
|
37
|
+
* assert.deepStrictEqual(elements, [1, 2, 3])
|
|
38
|
+
* assert.deepStrictEqual(rest, [4, 5, 6])
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export const takeSplitWhere = <A>(bucket: BucketQueue<A>, predicate: (a: A) => boolean) =>
|
|
42
|
+
STM.gen(function* () {
|
|
43
|
+
const bucketValue = yield* TRef.get(bucket)
|
|
44
|
+
const [elements, rest] = Array.splitWhere(bucketValue, predicate)
|
|
45
|
+
yield* TRef.set(bucket, rest)
|
|
46
|
+
return elements
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
export const size = <A>(bucket: BucketQueue<A>) => TRef.get(bucket).pipe(Effect.map((_) => _.length))
|
package/src/effect/Effect.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as OtelTracer from '@effect/opentelemetry/Tracer'
|
|
2
|
-
import type { Context, Duration,
|
|
3
|
-
import { Cause, Deferred, Effect, Fiber, FiberRef, HashSet, Logger, pipe } from 'effect'
|
|
2
|
+
import type { Context, Duration, Stream } from 'effect'
|
|
3
|
+
import { Cause, Deferred, Effect, Fiber, FiberRef, HashSet, Logger, pipe, Scope } from 'effect'
|
|
4
4
|
import type { UnknownException } from 'effect/Cause'
|
|
5
5
|
import { log } from 'effect/Console'
|
|
6
6
|
import type { LazyArg } from 'effect/Function'
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { isPromise } from '../index.js'
|
|
9
9
|
import { UnknownError } from './Error.js'
|
|
10
10
|
|
|
11
11
|
export * from 'effect/Effect'
|
|
@@ -25,6 +25,18 @@ export * from 'effect/Effect'
|
|
|
25
25
|
// console.error(message, ...rest)
|
|
26
26
|
// })
|
|
27
27
|
|
|
28
|
+
/** Same as `Effect.scopeWith` but with a `CloseableScope` instead of a `Scope`. */
|
|
29
|
+
export const scopeWithCloseable = <R, E, A>(
|
|
30
|
+
fn: (scope: Scope.CloseableScope) => Effect.Effect<A, E, R | Scope.Scope>,
|
|
31
|
+
): Effect.Effect<A, E, R | Scope.Scope> =>
|
|
32
|
+
Effect.gen(function* () {
|
|
33
|
+
// const parentScope = yield* Scope.Scope
|
|
34
|
+
// const scope = yield* Scope.fork(parentScope, ExecutionStrategy.sequential)
|
|
35
|
+
const scope = yield* Scope.make()
|
|
36
|
+
yield* Effect.addFinalizer((exit) => Scope.close(scope, exit))
|
|
37
|
+
return yield* fn(scope).pipe(Scope.extend(scope))
|
|
38
|
+
})
|
|
39
|
+
|
|
28
40
|
export const tryAll = <Res>(
|
|
29
41
|
fn: () => Res,
|
|
30
42
|
): Res extends Effect.Effect<infer A, infer E, never>
|
|
@@ -42,17 +54,6 @@ export const tryAll = <Res>(
|
|
|
42
54
|
),
|
|
43
55
|
) as any
|
|
44
56
|
|
|
45
|
-
const getThreadName = () => {
|
|
46
|
-
// @ts-expect-error TODO fix types
|
|
47
|
-
const globalName = globalThis.name
|
|
48
|
-
return isNonEmptyString(globalName)
|
|
49
|
-
? globalName
|
|
50
|
-
: // eslint-disable-next-line unicorn/prefer-global-this
|
|
51
|
-
typeof window === 'object'
|
|
52
|
-
? 'Main Thread'
|
|
53
|
-
: 'unknown-thread'
|
|
54
|
-
}
|
|
55
|
-
|
|
56
57
|
export const acquireReleaseLog = (label: string) =>
|
|
57
58
|
Effect.acquireRelease(Effect.log(`${label} acquire`), (_, ex) => Effect.log(`${label} release`, ex))
|
|
58
59
|
|
|
@@ -76,9 +77,8 @@ export const tapCauseLogPretty = <R, E, A>(eff: Effect.Effect<A, E, R>): Effect.
|
|
|
76
77
|
Effect.catchTag('NoSuchElementException', (_) => Effect.succeed(undefined)),
|
|
77
78
|
)
|
|
78
79
|
|
|
79
|
-
const threadName = getThreadName()
|
|
80
80
|
const firstErrLine = cause.toString().split('\n')[0]
|
|
81
|
-
yield* Effect.logError(
|
|
81
|
+
yield* Effect.logError(firstErrLine, cause).pipe((_) =>
|
|
82
82
|
span === undefined
|
|
83
83
|
? _
|
|
84
84
|
: Effect.annotateLogs({ spanId: span.spanContext().spanId, traceId: span.spanContext().traceId })(_),
|
|
@@ -113,11 +113,11 @@ export const logWarnIfTakesLongerThan =
|
|
|
113
113
|
Effect.gen(function* () {
|
|
114
114
|
const runtime = yield* Effect.runtime<never>()
|
|
115
115
|
|
|
116
|
-
let
|
|
116
|
+
let tookLongerThanTimer = false
|
|
117
117
|
|
|
118
118
|
const timeoutFiber = Effect.sleep(duration).pipe(
|
|
119
119
|
Effect.tap(() => {
|
|
120
|
-
|
|
120
|
+
tookLongerThanTimer = true
|
|
121
121
|
// TODO include span info
|
|
122
122
|
return Effect.logWarning(`${label}: Took longer than ${duration}ms`)
|
|
123
123
|
}),
|
|
@@ -126,9 +126,22 @@ export const logWarnIfTakesLongerThan =
|
|
|
126
126
|
)
|
|
127
127
|
|
|
128
128
|
const start = Date.now()
|
|
129
|
-
const res = yield* eff.pipe(
|
|
129
|
+
const res = yield* eff.pipe(
|
|
130
|
+
Effect.exit,
|
|
131
|
+
Effect.onInterrupt(
|
|
132
|
+
Effect.fn(function* () {
|
|
133
|
+
const end = Date.now()
|
|
134
|
+
|
|
135
|
+
yield* Fiber.interrupt(timeoutFiber)
|
|
136
|
+
|
|
137
|
+
if (tookLongerThanTimer) {
|
|
138
|
+
yield* Effect.logWarning(`${label}: Interrupted after ${end - start}ms`)
|
|
139
|
+
}
|
|
140
|
+
}),
|
|
141
|
+
),
|
|
142
|
+
)
|
|
130
143
|
|
|
131
|
-
if (
|
|
144
|
+
if (tookLongerThanTimer) {
|
|
132
145
|
const end = Date.now()
|
|
133
146
|
yield* Effect.logWarning(`${label}: Actual duration: ${end - start}ms`)
|
|
134
147
|
}
|
package/src/effect/Logger.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Logger } from 'effect'
|
|
1
|
+
import { Cause, HashMap, Logger, LogLevel } from 'effect'
|
|
2
2
|
|
|
3
3
|
export * from 'effect/Logger'
|
|
4
4
|
|
|
@@ -14,4 +14,26 @@ export const prettyWithThread = (threadName: string) =>
|
|
|
14
14
|
Logger.prettyLogger({
|
|
15
15
|
formatDate: (date) => `${defaultDateFormat(date)} ${threadName}`,
|
|
16
16
|
}),
|
|
17
|
+
// consoleLogger(threadName),
|
|
17
18
|
)
|
|
19
|
+
|
|
20
|
+
export const consoleLogger = (threadName: string) =>
|
|
21
|
+
Logger.make(({ message, annotations, date, logLevel, cause }) => {
|
|
22
|
+
const consoleFn =
|
|
23
|
+
logLevel === LogLevel.Debug
|
|
24
|
+
? console.debug
|
|
25
|
+
: logLevel === LogLevel.Info
|
|
26
|
+
? console.info
|
|
27
|
+
: logLevel === LogLevel.Warning
|
|
28
|
+
? console.warn
|
|
29
|
+
: console.error
|
|
30
|
+
|
|
31
|
+
const annotationsObj = Object.fromEntries(HashMap.entries(annotations))
|
|
32
|
+
|
|
33
|
+
const messages = Array.isArray(message) ? message : [message]
|
|
34
|
+
if (Cause.isEmpty(cause) === false) {
|
|
35
|
+
messages.push(Cause.pretty(cause, { renderErrorCause: true }))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
consoleFn(`[${defaultDateFormat(date)} ${threadName}]`, ...messages, annotationsObj)
|
|
39
|
+
})
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { Transferable } from '@effect/platform'
|
|
2
|
+
import type { SchemaAST } from 'effect'
|
|
2
3
|
import { Effect, Hash, ParseResult, Schema } from 'effect'
|
|
3
4
|
import type { ParseError } from 'effect/ParseResult'
|
|
4
5
|
import type { ParseOptions } from 'effect/SchemaAST'
|
|
5
6
|
|
|
7
|
+
import { shouldNeverHappen } from '../../index.js'
|
|
8
|
+
|
|
6
9
|
export * from 'effect/Schema'
|
|
7
10
|
export * from './debug-diff.js'
|
|
8
11
|
export * from './msgpack.js'
|
|
@@ -34,6 +37,30 @@ export const encodeWithTransferables =
|
|
|
34
37
|
return [encoded, collector.unsafeRead() as Transferable[]]
|
|
35
38
|
})
|
|
36
39
|
|
|
40
|
+
export const decodeSyncDebug: <A, I>(
|
|
41
|
+
schema: Schema.Schema<A, I, never>,
|
|
42
|
+
options?: SchemaAST.ParseOptions,
|
|
43
|
+
) => (i: I, overrideOptions?: SchemaAST.ParseOptions) => A = (schema, options) => (input, overrideOptions) => {
|
|
44
|
+
const res = Schema.decodeEither(schema, options)(input, overrideOptions)
|
|
45
|
+
if (res._tag === 'Left') {
|
|
46
|
+
return shouldNeverHappen(`decodeSyncDebug failed:`, res.left)
|
|
47
|
+
} else {
|
|
48
|
+
return res.right
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const encodeSyncDebug: <A, I>(
|
|
53
|
+
schema: Schema.Schema<A, I, never>,
|
|
54
|
+
options?: SchemaAST.ParseOptions,
|
|
55
|
+
) => (a: A, overrideOptions?: SchemaAST.ParseOptions) => I = (schema, options) => (input, overrideOptions) => {
|
|
56
|
+
const res = Schema.encodeEither(schema, options)(input, overrideOptions)
|
|
57
|
+
if (res._tag === 'Left') {
|
|
58
|
+
return shouldNeverHappen(`encodeSyncDebug failed:`, res.left)
|
|
59
|
+
} else {
|
|
60
|
+
return res.right
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
37
64
|
export const swap = <A, I, R>(schema: Schema.Schema<A, I, R>): Schema.Schema<I, A, R> =>
|
|
38
65
|
Schema.transformOrFail(Schema.typeSchema(schema), Schema.encodedSchema(schema), {
|
|
39
66
|
decode: ParseResult.encode(schema),
|