@livestore/utils 0.4.0-dev.2 → 0.4.0-dev.20
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/NoopTracer.d.ts.map +1 -1
- package/dist/NoopTracer.js +1 -0
- package/dist/NoopTracer.js.map +1 -1
- package/dist/browser/Opfs/Opfs.d.ts +51 -0
- package/dist/browser/Opfs/Opfs.d.ts.map +1 -0
- package/dist/browser/Opfs/Opfs.js +345 -0
- package/dist/browser/Opfs/Opfs.js.map +1 -0
- package/dist/browser/Opfs/debug-utils.d.ts +20 -0
- package/dist/browser/Opfs/debug-utils.d.ts.map +1 -0
- package/dist/browser/Opfs/debug-utils.js +94 -0
- package/dist/browser/Opfs/debug-utils.js.map +1 -0
- package/dist/browser/Opfs/mod.d.ts +4 -0
- package/dist/browser/Opfs/mod.d.ts.map +1 -0
- package/dist/browser/Opfs/mod.js +4 -0
- package/dist/browser/Opfs/mod.js.map +1 -0
- package/dist/browser/Opfs/utils.d.ts +68 -0
- package/dist/browser/Opfs/utils.d.ts.map +1 -0
- package/dist/browser/Opfs/utils.js +206 -0
- package/dist/browser/Opfs/utils.js.map +1 -0
- package/dist/browser/QuotaExceededError.d.ts +59 -0
- package/dist/browser/QuotaExceededError.d.ts.map +1 -0
- package/dist/browser/QuotaExceededError.js +2 -0
- package/dist/browser/QuotaExceededError.js.map +1 -0
- package/dist/browser/WebChannelBrowser.d.ts +22 -0
- package/dist/browser/WebChannelBrowser.d.ts.map +1 -0
- package/dist/browser/WebChannelBrowser.js +76 -0
- package/dist/browser/WebChannelBrowser.js.map +1 -0
- package/dist/browser/WebError.d.ts +425 -0
- package/dist/browser/WebError.d.ts.map +1 -0
- package/dist/browser/WebError.js +414 -0
- package/dist/browser/WebError.js.map +1 -0
- package/dist/browser/WebError.test.d.ts +2 -0
- package/dist/browser/WebError.test.d.ts.map +1 -0
- package/dist/browser/WebError.test.js +46 -0
- package/dist/browser/WebError.test.js.map +1 -0
- package/dist/browser/WebLock.d.ts.map +1 -0
- package/dist/browser/WebLock.js.map +1 -0
- package/dist/{browser.d.ts → browser/detect.d.ts} +1 -1
- package/dist/browser/detect.d.ts.map +1 -0
- package/dist/{browser.js → browser/detect.js} +1 -1
- package/dist/browser/detect.js.map +1 -0
- package/dist/browser/mod.d.ts +8 -0
- package/dist/browser/mod.d.ts.map +1 -0
- package/dist/browser/mod.js +8 -0
- package/dist/browser/mod.js.map +1 -0
- package/dist/effect/Debug.d.ts +38 -0
- package/dist/effect/Debug.d.ts.map +1 -0
- package/dist/effect/Debug.js +287 -0
- package/dist/effect/Debug.js.map +1 -0
- package/dist/effect/Effect.d.ts +9 -3
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +4 -2
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/Error.d.ts +1 -1
- package/dist/effect/Error.js.map +1 -1
- package/dist/effect/Logger.d.ts +4 -1
- package/dist/effect/Logger.d.ts.map +1 -1
- package/dist/effect/Logger.js +12 -3
- package/dist/effect/Logger.js.map +1 -1
- package/dist/effect/OtelTracer.d.ts +5 -0
- package/dist/effect/OtelTracer.d.ts.map +1 -0
- package/dist/effect/OtelTracer.js +8 -0
- package/dist/effect/OtelTracer.js.map +1 -0
- package/dist/effect/RpcClient.d.ts +32 -0
- package/dist/effect/RpcClient.d.ts.map +1 -0
- package/dist/effect/RpcClient.js +149 -0
- package/dist/effect/RpcClient.js.map +1 -0
- package/dist/effect/Schema/index.d.ts +2 -2
- package/dist/effect/Schema/index.d.ts.map +1 -1
- package/dist/effect/Schema/index.js +12 -2
- package/dist/effect/Schema/index.js.map +1 -1
- package/dist/effect/Stream.d.ts +73 -2
- package/dist/effect/Stream.d.ts.map +1 -1
- package/dist/effect/Stream.js +68 -1
- package/dist/effect/Stream.js.map +1 -1
- package/dist/effect/Stream.test.d.ts +2 -0
- package/dist/effect/Stream.test.d.ts.map +1 -0
- package/dist/effect/Stream.test.js +84 -0
- package/dist/effect/Stream.test.js.map +1 -0
- package/dist/effect/SubscriptionRef.d.ts +2 -2
- package/dist/effect/SubscriptionRef.d.ts.map +1 -1
- package/dist/effect/SubscriptionRef.js +6 -1
- package/dist/effect/SubscriptionRef.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.d.ts +2 -21
- package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
- package/dist/effect/WebChannel/WebChannel.js +5 -81
- package/dist/effect/WebChannel/WebChannel.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.test.js +1 -1
- package/dist/effect/WebChannel/WebChannel.test.js.map +1 -1
- package/dist/effect/WebChannel/common.d.ts +1 -1
- package/dist/effect/WebChannel/common.d.ts.map +1 -1
- package/dist/effect/WebSocket.d.ts.map +1 -1
- package/dist/effect/WebSocket.js +12 -12
- package/dist/effect/WebSocket.js.map +1 -1
- package/dist/effect/mod.d.ts +32 -0
- package/dist/effect/mod.d.ts.map +1 -0
- package/dist/effect/mod.js +35 -0
- package/dist/effect/mod.js.map +1 -0
- package/dist/global.d.ts +1 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js.map +1 -1
- package/dist/misc.js +1 -1
- package/dist/misc.js.map +1 -1
- package/dist/mod.d.ts +3 -1
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +5 -1
- package/dist/mod.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js +66 -10
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +177 -3
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +14 -5
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +7 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +13 -3
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +16 -0
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js +98 -2
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
- package/dist/node/mod.d.ts +8 -2
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +11 -3
- package/dist/node/mod.js.map +1 -1
- package/dist/qr.d.ts +38 -0
- package/dist/qr.d.ts.map +1 -0
- package/dist/qr.js +109 -0
- package/dist/qr.js.map +1 -0
- package/package.json +54 -44
- package/src/NoopTracer.ts +1 -0
- package/src/browser/Opfs/Opfs.ts +428 -0
- package/src/browser/Opfs/debug-utils.ts +151 -0
- package/src/browser/Opfs/mod.ts +3 -0
- package/src/browser/Opfs/utils.ts +270 -0
- package/src/browser/QuotaExceededError.ts +59 -0
- package/src/browser/WebChannelBrowser.ts +131 -0
- package/src/browser/WebError.test.ts +66 -0
- package/src/browser/WebError.ts +599 -0
- package/src/browser/mod.ts +8 -0
- package/src/effect/Debug.ts +375 -0
- package/src/effect/Effect.ts +31 -4
- package/src/effect/Error.ts +1 -1
- package/src/effect/Logger.ts +14 -4
- package/src/effect/OtelTracer.ts +11 -0
- package/src/effect/RpcClient.ts +212 -0
- package/src/effect/Schema/index.ts +17 -3
- package/src/effect/Stream.test.ts +127 -0
- package/src/effect/Stream.ts +111 -2
- package/src/effect/SubscriptionRef.ts +14 -2
- package/src/effect/WebChannel/WebChannel.test.ts +1 -1
- package/src/effect/WebChannel/WebChannel.ts +13 -135
- package/src/effect/WebChannel/common.ts +1 -1
- package/src/effect/WebSocket.ts +11 -10
- package/src/effect/{index.ts → mod.ts} +42 -15
- package/src/global.ts +1 -0
- package/src/misc.ts +1 -1
- package/src/mod.ts +10 -1
- package/src/node/ChildProcessRunner/ChildProcessRunner.ts +71 -10
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +258 -3
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +14 -1
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +16 -3
- package/src/node/ChildProcessRunner/ChildProcessWorker.ts +111 -3
- package/src/node/mod.ts +13 -6
- package/src/qr.ts +125 -0
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js.map +0 -1
- package/dist/effect/Schema/msgpack.d.ts +0 -3
- package/dist/effect/Schema/msgpack.d.ts.map +0 -1
- package/dist/effect/Schema/msgpack.js +0 -7
- package/dist/effect/Schema/msgpack.js.map +0 -1
- package/dist/effect/WebLock.d.ts.map +0 -1
- package/dist/effect/WebLock.js.map +0 -1
- package/dist/effect/index.d.ts +0 -27
- package/dist/effect/index.d.ts.map +0 -1
- package/dist/effect/index.js +0 -31
- package/dist/effect/index.js.map +0 -1
- package/src/effect/Schema/msgpack.ts +0 -8
- /package/dist/{effect → browser}/WebLock.d.ts +0 -0
- /package/dist/{effect → browser}/WebLock.js +0 -0
- /package/src/{effect → browser}/WebLock.ts +0 -0
- /package/src/{browser.ts → browser/detect.ts} +0 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
export * from '@effect/rpc/RpcClient';
|
|
2
|
+
import { Socket } from '@effect/platform';
|
|
3
|
+
import { RpcClient, RpcClientError, RpcSerialization } from '@effect/rpc';
|
|
4
|
+
import { Protocol } from '@effect/rpc/RpcClient';
|
|
5
|
+
import { constPing } from '@effect/rpc/RpcMessage';
|
|
6
|
+
import { Cause, Deferred, Effect, Layer, Option, Schedule } from 'effect';
|
|
7
|
+
import { constVoid, identity } from 'effect/Function';
|
|
8
|
+
import * as SubscriptionRef from "./SubscriptionRef.js";
|
|
9
|
+
// This is based on `makeProtocolSocket` / `layerProtocolSocket` from `@effect/rpc` in order to:
|
|
10
|
+
// - Add a `isConnected` subscription ref to track the connection state
|
|
11
|
+
// - Add a ping schedule to the socket
|
|
12
|
+
// - Add a retry schedule to the socket
|
|
13
|
+
export const layerProtocolSocketWithIsConnected = (options) => Layer.scoped(Protocol, makeProtocolSocketWithIsConnected(options));
|
|
14
|
+
export const makeProtocolSocketWithIsConnected = (options) => Protocol.make(Effect.fnUntraced(function* (writeResponse) {
|
|
15
|
+
const socket = yield* Socket.Socket;
|
|
16
|
+
const serialization = yield* RpcSerialization.RpcSerialization;
|
|
17
|
+
const write = yield* socket.writer;
|
|
18
|
+
const parser = serialization.unsafeMake();
|
|
19
|
+
const pinger = yield* makePinger(write(parser.encode(constPing)), options?.pingSchedule);
|
|
20
|
+
yield* Effect.suspend(() => {
|
|
21
|
+
// We rely on the heartbeat watchdog while streaming arbitrarily long payloads.
|
|
22
|
+
// Reset the timer as soon as _any_ frame arrives so that large batches which
|
|
23
|
+
// don't contain explicit `Pong` messages don't trigger the open-timeout defect.
|
|
24
|
+
// (The actual pong handler still calls `onPong()` to resolve manual pings.)
|
|
25
|
+
// CHANGED: don't reset parser on every message
|
|
26
|
+
// parser = serialization.unsafeMake()
|
|
27
|
+
pinger.reset();
|
|
28
|
+
return socket
|
|
29
|
+
.runRaw((message) => {
|
|
30
|
+
try {
|
|
31
|
+
const responses = parser.decode(message);
|
|
32
|
+
if (responses.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
let i = 0;
|
|
35
|
+
return Effect.whileLoop({
|
|
36
|
+
while: () => i < responses.length,
|
|
37
|
+
body: () => {
|
|
38
|
+
const response = responses[i++];
|
|
39
|
+
// Keep extending the watchdog for each data frame to avoid
|
|
40
|
+
// disconnecting mid-stream when the server is busy sending batches.
|
|
41
|
+
pinger.reset();
|
|
42
|
+
if (response._tag === 'Pong') {
|
|
43
|
+
pinger.onPong();
|
|
44
|
+
}
|
|
45
|
+
return writeResponse(response).pipe(
|
|
46
|
+
// CHANGED: set isConnected to true on pong
|
|
47
|
+
Effect.tap(Effect.fn(function* () {
|
|
48
|
+
if (options?.isConnected !== undefined) {
|
|
49
|
+
yield* SubscriptionRef.set(options.isConnected, true);
|
|
50
|
+
}
|
|
51
|
+
})));
|
|
52
|
+
},
|
|
53
|
+
step: constVoid,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (defect) {
|
|
57
|
+
return writeResponse({
|
|
58
|
+
_tag: 'ClientProtocolError',
|
|
59
|
+
error: new RpcClientError.RpcClientError({
|
|
60
|
+
reason: 'Protocol',
|
|
61
|
+
message: 'Error decoding message',
|
|
62
|
+
cause: Cause.fail(defect),
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
.pipe(Effect.raceFirst(Effect.zipRight(pinger.timeout, Effect.fail(new Socket.SocketGenericError({
|
|
68
|
+
reason: 'OpenTimeout',
|
|
69
|
+
cause: new Error('ping timeout'),
|
|
70
|
+
})))));
|
|
71
|
+
}).pipe(Effect.zipRight(Effect.fail(new Socket.SocketCloseError({
|
|
72
|
+
reason: 'Close',
|
|
73
|
+
code: 1000,
|
|
74
|
+
closeReason: 'Closing connection',
|
|
75
|
+
}))), Effect.tapErrorCause(Effect.fn(function* (cause) {
|
|
76
|
+
// CHANGED: set isConnected to false on error
|
|
77
|
+
if (options?.isConnected !== undefined) {
|
|
78
|
+
yield* SubscriptionRef.set(options.isConnected, false);
|
|
79
|
+
}
|
|
80
|
+
const error = Cause.failureOption(cause);
|
|
81
|
+
if (options?.retryTransientErrors &&
|
|
82
|
+
Option.isSome(error) &&
|
|
83
|
+
(error.value.reason === 'Open' || error.value.reason === 'OpenTimeout')) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// yield* Effect.logError('Error in socket', cause)
|
|
87
|
+
return yield* writeResponse({
|
|
88
|
+
_tag: 'ClientProtocolError',
|
|
89
|
+
error: new RpcClientError.RpcClientError({
|
|
90
|
+
reason: 'Protocol',
|
|
91
|
+
message: 'Error in socket',
|
|
92
|
+
cause: Cause.squash(cause),
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
95
|
+
})),
|
|
96
|
+
// CHANGED: make configurable via schedule
|
|
97
|
+
options?.retryTransientErrors ? Effect.retry(options.retryTransientErrors) : identity, Effect.annotateLogs({
|
|
98
|
+
module: 'RpcClient',
|
|
99
|
+
method: 'makeProtocolSocket',
|
|
100
|
+
}), Effect.interruptible, Effect.ignore, // Errors are already handled
|
|
101
|
+
Effect.provide(Layer.setUnhandledErrorLogLevel(Option.none())), Effect.forkScoped);
|
|
102
|
+
return {
|
|
103
|
+
send: (request) => {
|
|
104
|
+
const encoded = parser.encode(request);
|
|
105
|
+
if (encoded === undefined)
|
|
106
|
+
return Effect.void;
|
|
107
|
+
return Effect.orDie(write(encoded));
|
|
108
|
+
},
|
|
109
|
+
supportsAck: true,
|
|
110
|
+
supportsTransferables: false,
|
|
111
|
+
pinger,
|
|
112
|
+
};
|
|
113
|
+
}));
|
|
114
|
+
export const SocketPinger = Effect.map(RpcClient.Protocol, (protocol) => protocol.pinger);
|
|
115
|
+
const makePinger = Effect.fnUntraced(function* (writePing, pingSchedule = Schedule.spaced(10000).pipe(Schedule.addDelay(() => 5000))) {
|
|
116
|
+
// CHANGED: add manual ping deferreds
|
|
117
|
+
const manualPingDeferreds = new Set();
|
|
118
|
+
let recievedPong = true;
|
|
119
|
+
const latch = Effect.unsafeMakeLatch();
|
|
120
|
+
const reset = () => {
|
|
121
|
+
recievedPong = true;
|
|
122
|
+
latch.unsafeClose();
|
|
123
|
+
};
|
|
124
|
+
const onPong = () => {
|
|
125
|
+
recievedPong = true;
|
|
126
|
+
// CHANGED: mark all manual ping deferreds as done
|
|
127
|
+
for (const deferred of manualPingDeferreds) {
|
|
128
|
+
Deferred.unsafeDone(deferred, Effect.void);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
yield* Effect.suspend(() => {
|
|
132
|
+
// Starting new ping
|
|
133
|
+
if (!recievedPong)
|
|
134
|
+
return latch.open;
|
|
135
|
+
recievedPong = false;
|
|
136
|
+
return writePing;
|
|
137
|
+
}).pipe(
|
|
138
|
+
// CHANGED: make configurable via schedule
|
|
139
|
+
Effect.schedule(pingSchedule), Effect.ignore, Effect.forever, Effect.interruptible, Effect.forkScoped);
|
|
140
|
+
// CHANGED: add manual ping
|
|
141
|
+
const ping = Effect.gen(function* () {
|
|
142
|
+
const deferred = yield* Deferred.make();
|
|
143
|
+
manualPingDeferreds.add(deferred);
|
|
144
|
+
yield* deferred;
|
|
145
|
+
manualPingDeferreds.delete(deferred);
|
|
146
|
+
});
|
|
147
|
+
return { timeout: latch.await, reset, onPong, ping };
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=RpcClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcClient.js","sourceRoot":"","sources":["../../src/effect/RpcClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { SchemaAST } from 'effect';
|
|
2
1
|
import { Effect, Schema } from 'effect';
|
|
3
2
|
import type { ParseError } from 'effect/ParseResult';
|
|
4
3
|
import type { ParseOptions } from 'effect/SchemaAST';
|
|
4
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
5
5
|
export * from 'effect/Schema';
|
|
6
6
|
export * from './debug-diff.ts';
|
|
7
|
-
export * from './msgpack.ts';
|
|
8
7
|
export declare const hash: (schema: Schema.Schema<any>) => number;
|
|
8
|
+
export declare const getResolvedPropertySignatures: (schema: Schema.Schema.AnyNoContext) => ReadonlyArray<SchemaAST.PropertySignature>;
|
|
9
9
|
export declare const encodeWithTransferables: <A, I, R>(schema: Schema.Schema<A, I, R>, options?: ParseOptions | undefined) => (a: A, overrideOptions?: ParseOptions | undefined) => Effect.Effect<[I, Transferable[]], ParseError, R>;
|
|
10
10
|
export declare const decodeSyncDebug: <A, I>(schema: Schema.Schema<A, I, never>, options?: SchemaAST.ParseOptions) => (i: I, overrideOptions?: SchemaAST.ParseOptions) => A;
|
|
11
11
|
export declare const encodeSyncDebug: <A, I>(schema: Schema.Schema<A, I, never>, options?: SchemaAST.ParseOptions) => (a: A, overrideOptions?: SchemaAST.ParseOptions) => I;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/effect/Schema/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/effect/Schema/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAI7C,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAK/B,eAAO,MAAM,IAAI,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAS9C,CAAA;AAUD,eAAO,MAAM,6BAA6B,GACxC,QAAQ,MAAM,CAAC,MAAM,CAAC,YAAY,KACjC,aAAa,CAAC,SAAS,CAAC,iBAAiB,CAG3C,CAAA;AAED,eAAO,MAAM,uBAAuB,GACjC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,YAAY,GAAG,SAAS,MAC3E,GAAG,CAAC,EAAE,kBAAkB,YAAY,GAAG,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAShG,CAAA;AAEN,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAClC,OAAO,CAAC,EAAE,SAAS,CAAC,YAAY,KAC7B,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,YAAY,KAAK,CAOxD,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAClC,OAAO,CAAC,EAAE,SAAS,CAAC,YAAY,KAC7B,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,YAAY,KAAK,CAOxD,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAIhF,CAAA;AAEJ,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAqC,CAAA;AAExG,MAAM,WAAW,SAAU,SAAQ,aAAa,CAAC,SAAS,CAAC;CAAG;AAC9D,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB;AACD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAAA;AAEjF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAOL,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Transferable } from '@effect/platform';
|
|
2
2
|
import { Effect, Hash, ParseResult, Schema } from 'effect';
|
|
3
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
3
4
|
import { shouldNeverHappen } from "../../mod.js";
|
|
4
5
|
export * from 'effect/Schema';
|
|
5
6
|
export * from "./debug-diff.js";
|
|
6
|
-
export * from "./msgpack.js";
|
|
7
7
|
// NOTE this is a temporary workaround until Effect schema has a better way to hash schemas
|
|
8
8
|
// https://github.com/Effect-TS/effect/issues/2719
|
|
9
9
|
// TODO remove this once the issue is resolved
|
|
@@ -16,6 +16,16 @@ export const hash = (schema) => {
|
|
|
16
16
|
return Hash.hash(schema.ast.toString());
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
|
+
const resolveStructAst = (ast) => {
|
|
20
|
+
if (SchemaAST.isTransformation(ast)) {
|
|
21
|
+
return resolveStructAst(ast.from);
|
|
22
|
+
}
|
|
23
|
+
return ast;
|
|
24
|
+
};
|
|
25
|
+
export const getResolvedPropertySignatures = (schema) => {
|
|
26
|
+
const resolvedAst = resolveStructAst(schema.ast);
|
|
27
|
+
return SchemaAST.getPropertySignatures(resolvedAst);
|
|
28
|
+
};
|
|
19
29
|
export const encodeWithTransferables = (schema, options) => (a, overrideOptions) => Effect.gen(function* () {
|
|
20
30
|
const collector = yield* Transferable.makeCollector;
|
|
21
31
|
const encoded = yield* Schema.encode(schema, options)(a, overrideOptions).pipe(Effect.provideService(Transferable.Collector, collector));
|
|
@@ -44,5 +54,5 @@ export const swap = (schema) => Schema.transformOrFail(Schema.typeSchema(schema)
|
|
|
44
54
|
encode: ParseResult.decode(schema),
|
|
45
55
|
});
|
|
46
56
|
export const Base64FromUint8Array = swap(Schema.Uint8ArrayFromBase64);
|
|
47
|
-
export const JsonValue = Schema.Union(Schema.String, Schema.Number, Schema.Boolean, Schema.Null, Schema.Array(Schema.suspend(() => JsonValue)), Schema.Record({ key: Schema.String, value: Schema.suspend(() => JsonValue) })).annotations({
|
|
57
|
+
export const JsonValue = Schema.Union(Schema.String, Schema.Number, Schema.Boolean, Schema.Null, Schema.Array(Schema.suspend(() => JsonValue)), Schema.Record({ key: Schema.String, value: Schema.suspend(() => JsonValue) })).annotations({ identifier: 'JsonValue' });
|
|
48
58
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/effect/Schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/effect/Schema/index.ts"],"names":[],"mappings":"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"}
|
package/dist/effect/Stream.d.ts
CHANGED
|
@@ -1,10 +1,81 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/useIterableCallbackReturn: Biome bug */
|
|
1
2
|
export * from 'effect/Stream';
|
|
2
|
-
import type
|
|
3
|
-
import { Effect, Stream } from 'effect';
|
|
3
|
+
import { type Cause, Chunk, Effect, Option, Stream } from 'effect';
|
|
4
4
|
export declare const tapLog: <R, E, A>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>;
|
|
5
5
|
export declare const tapSync: <A>(tapFn: (a: A) => unknown) => <R, E>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>;
|
|
6
6
|
export declare const tapLogWithLabel: (label: string) => <R, E, A>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>;
|
|
7
7
|
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>;
|
|
8
8
|
export declare const skipRepeated: <A>(isEqual?: (prevEl: A, newEl: A) => boolean) => <R, E>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>;
|
|
9
9
|
export declare const skipRepeated_: <R, E, A>(stream: Stream.Stream<A, E, R>, isEqual?: (prevEl: A, newEl: A) => boolean) => Stream.Stream<A, E, R>;
|
|
10
|
+
/**
|
|
11
|
+
* Returns the first element of the stream or `None` if the stream is empty.
|
|
12
|
+
* It's different than `Stream.runHead` which runs the stream to completion.
|
|
13
|
+
* */
|
|
14
|
+
export declare const runFirst: <A, E, R>(stream: Stream.Stream<A, E, R>) => Effect.Effect<Option.Option<A>, E, R>;
|
|
15
|
+
/**
|
|
16
|
+
* Returns the first element of the stream or throws a `NoSuchElementException` if the stream is empty.
|
|
17
|
+
* It's different than `Stream.runHead` which runs the stream to completion.
|
|
18
|
+
* */
|
|
19
|
+
export declare const runFirstUnsafe: <A, E, R>(stream: Stream.Stream<A, E, R>) => Effect.Effect<A, Cause.NoSuchElementException | E, R>;
|
|
20
|
+
export declare const runCollectReadonlyArray: <A, E, R>(stream: Stream.Stream<A, E, R>) => Effect.Effect<readonly A[], E, R>;
|
|
21
|
+
/**
|
|
22
|
+
* Concatenates two streams where the second stream has access to the last element
|
|
23
|
+
* of the first stream as an `Option`. If the first stream is empty, the callback
|
|
24
|
+
* receives `Option.none()`.
|
|
25
|
+
*
|
|
26
|
+
* @param stream - The first stream to consume
|
|
27
|
+
* @param getStream2 - Function that receives the last element from the first stream
|
|
28
|
+
* and returns the second stream to concatenate
|
|
29
|
+
* @returns A new stream containing all elements from both streams
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* // Direct usage
|
|
34
|
+
* const result = concatWithLastElement(
|
|
35
|
+
* Stream.make(1, 2, 3),
|
|
36
|
+
* lastElement => lastElement.pipe(
|
|
37
|
+
* Option.match({
|
|
38
|
+
* onNone: () => Stream.make('empty'),
|
|
39
|
+
* onSome: last => Stream.make(`last-was-${last}`)
|
|
40
|
+
* })
|
|
41
|
+
* )
|
|
42
|
+
* )
|
|
43
|
+
*
|
|
44
|
+
* // Piped usage
|
|
45
|
+
* const result = Stream.make(1, 2, 3).pipe(
|
|
46
|
+
* concatWithLastElement(lastElement =>
|
|
47
|
+
* Stream.make(lastElement.pipe(Option.getOrElse(() => 0)) * 10)
|
|
48
|
+
* )
|
|
49
|
+
* )
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare const concatWithLastElement: {
|
|
53
|
+
<A1, A2, E2, R2>(getStream2: (lastElement: Option.Option<A1>) => Stream.Stream<A2, E2, R2>): <E1, R1>(stream: Stream.Stream<A1, E1, R1>) => Stream.Stream<A1 | A2, E1 | E2, R1 | R2>;
|
|
54
|
+
<A1, E1, R1, A2, E2, R2>(stream: Stream.Stream<A1, E1, R1>, getStream2: (lastElement: Option.Option<A1>) => Stream.Stream<A2, E2, R2>): Stream.Stream<A1 | A2, E1 | E2, R1 | R2>;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Emits a default value if the stream is empty, otherwise passes through all elements.
|
|
58
|
+
* Uses `concatWithLastElement` internally to detect if the stream was empty.
|
|
59
|
+
*
|
|
60
|
+
* @param fallbackValue - The value to emit if the stream is empty
|
|
61
|
+
* @returns A dual function that can be used in pipe or direct call
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* // Direct usage
|
|
66
|
+
* const result = emitIfEmpty(Stream.empty, 'default')
|
|
67
|
+
* // Emits: 'default'
|
|
68
|
+
*
|
|
69
|
+
* // Piped usage
|
|
70
|
+
* const result = Stream.make(1, 2, 3).pipe(emitIfEmpty('fallback'))
|
|
71
|
+
* // Emits: 1, 2, 3
|
|
72
|
+
*
|
|
73
|
+
* const empty = Stream.empty.pipe(emitIfEmpty('fallback'))
|
|
74
|
+
* // Emits: 'fallback'
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare const emitIfEmpty: {
|
|
78
|
+
<A>(fallbackValue: A): <E, R>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>;
|
|
79
|
+
<A, E, R>(stream: Stream.Stream<A, E, R>, fallbackValue: A): Stream.Stream<A, E, R>;
|
|
80
|
+
};
|
|
10
81
|
//# sourceMappingURL=Stream.d.ts.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"Stream.d.ts","sourceRoot":"","sources":["../../src/effect/Stream.ts"],"names":[],"mappings":"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"}
|
package/dist/effect/Stream.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/useIterableCallbackReturn: Biome bug */
|
|
1
2
|
export * from 'effect/Stream';
|
|
2
|
-
import { Effect, Option, pipe, Ref, Stream } from 'effect';
|
|
3
|
+
import { Chunk, Effect, Option, pipe, Ref, Stream } from 'effect';
|
|
4
|
+
import { dual } from 'effect/Function';
|
|
3
5
|
export const tapLog = (stream) => tapChunk(Effect.forEach((_) => Effect.succeed(console.log(_))))(stream);
|
|
4
6
|
export const tapSync = (tapFn) => (stream) => Stream.tap(stream, (a) => Effect.sync(() => tapFn(a)));
|
|
5
7
|
export const tapLogWithLabel = (label) => (stream) => tapChunk(Effect.forEach((_) => Effect.succeed(console.log(label, _))))(stream);
|
|
@@ -14,4 +16,69 @@ export const skipRepeated_ = (stream, isEqual = isIdentity) => pipe(Ref.make(Opt
|
|
|
14
16
|
return Effect.succeed(false);
|
|
15
17
|
}
|
|
16
18
|
}))))));
|
|
19
|
+
/**
|
|
20
|
+
* Returns the first element of the stream or `None` if the stream is empty.
|
|
21
|
+
* It's different than `Stream.runHead` which runs the stream to completion.
|
|
22
|
+
* */
|
|
23
|
+
export const runFirst = (stream) => stream.pipe(Stream.take(1), Stream.runCollect, Effect.map(Chunk.head));
|
|
24
|
+
/**
|
|
25
|
+
* Returns the first element of the stream or throws a `NoSuchElementException` if the stream is empty.
|
|
26
|
+
* It's different than `Stream.runHead` which runs the stream to completion.
|
|
27
|
+
* */
|
|
28
|
+
export const runFirstUnsafe = (stream) => runFirst(stream).pipe(Effect.flatten);
|
|
29
|
+
export const runCollectReadonlyArray = (stream) => stream.pipe(Stream.runCollect, Effect.map(Chunk.toReadonlyArray));
|
|
30
|
+
/**
|
|
31
|
+
* Concatenates two streams where the second stream has access to the last element
|
|
32
|
+
* of the first stream as an `Option`. If the first stream is empty, the callback
|
|
33
|
+
* receives `Option.none()`.
|
|
34
|
+
*
|
|
35
|
+
* @param stream - The first stream to consume
|
|
36
|
+
* @param getStream2 - Function that receives the last element from the first stream
|
|
37
|
+
* and returns the second stream to concatenate
|
|
38
|
+
* @returns A new stream containing all elements from both streams
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* // Direct usage
|
|
43
|
+
* const result = concatWithLastElement(
|
|
44
|
+
* Stream.make(1, 2, 3),
|
|
45
|
+
* lastElement => lastElement.pipe(
|
|
46
|
+
* Option.match({
|
|
47
|
+
* onNone: () => Stream.make('empty'),
|
|
48
|
+
* onSome: last => Stream.make(`last-was-${last}`)
|
|
49
|
+
* })
|
|
50
|
+
* )
|
|
51
|
+
* )
|
|
52
|
+
*
|
|
53
|
+
* // Piped usage
|
|
54
|
+
* const result = Stream.make(1, 2, 3).pipe(
|
|
55
|
+
* concatWithLastElement(lastElement =>
|
|
56
|
+
* Stream.make(lastElement.pipe(Option.getOrElse(() => 0)) * 10)
|
|
57
|
+
* )
|
|
58
|
+
* )
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export const concatWithLastElement = dual(2, (stream1, getStream2) => pipe(Ref.make(Option.none()), Stream.fromEffect, Stream.flatMap((lastRef) => pipe(stream1, Stream.tap((value) => Ref.set(lastRef, Option.some(value))), Stream.concat(pipe(Ref.get(lastRef), Effect.map(getStream2), Stream.unwrap))))));
|
|
62
|
+
/**
|
|
63
|
+
* Emits a default value if the stream is empty, otherwise passes through all elements.
|
|
64
|
+
* Uses `concatWithLastElement` internally to detect if the stream was empty.
|
|
65
|
+
*
|
|
66
|
+
* @param fallbackValue - The value to emit if the stream is empty
|
|
67
|
+
* @returns A dual function that can be used in pipe or direct call
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* // Direct usage
|
|
72
|
+
* const result = emitIfEmpty(Stream.empty, 'default')
|
|
73
|
+
* // Emits: 'default'
|
|
74
|
+
*
|
|
75
|
+
* // Piped usage
|
|
76
|
+
* const result = Stream.make(1, 2, 3).pipe(emitIfEmpty('fallback'))
|
|
77
|
+
* // Emits: 1, 2, 3
|
|
78
|
+
*
|
|
79
|
+
* const empty = Stream.empty.pipe(emitIfEmpty('fallback'))
|
|
80
|
+
* // Emits: 'fallback'
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export const emitIfEmpty = dual(2, (stream, fallbackValue) => concatWithLastElement(stream, (lastElement) => lastElement._tag === 'None' ? Stream.make(fallbackValue) : Stream.empty));
|
|
17
84
|
//# sourceMappingURL=Stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stream.js","sourceRoot":"","sources":["../../src/effect/Stream.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"Stream.js","sourceRoot":"","sources":["../../src/effect/Stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stream.test.d.ts","sourceRoot":"","sources":["../../src/effect/Stream.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Effect, Option, Stream } from 'effect';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { concatWithLastElement, runCollectReadonlyArray } from "./Stream.js";
|
|
4
|
+
describe('concatWithLastElement', () => {
|
|
5
|
+
it('should concatenate streams with access to last element of first stream', async () => {
|
|
6
|
+
const stream1 = Stream.make(1, 2, 3);
|
|
7
|
+
const result = concatWithLastElement(stream1, (lastElement) => lastElement.pipe(Option.match({
|
|
8
|
+
onNone: () => Stream.make('no-previous'),
|
|
9
|
+
onSome: (last) => Stream.make(`last-was-${last}`, 'continuing'),
|
|
10
|
+
})));
|
|
11
|
+
const collected = await Effect.runPromise(runCollectReadonlyArray(result));
|
|
12
|
+
expect(collected).toEqual([1, 2, 3, 'last-was-3', 'continuing']);
|
|
13
|
+
});
|
|
14
|
+
it('should handle empty first stream', async () => {
|
|
15
|
+
const stream1 = Stream.empty;
|
|
16
|
+
const result = concatWithLastElement(stream1, (lastElement) => lastElement.pipe(Option.match({
|
|
17
|
+
onNone: () => Stream.make('no-previous-element'),
|
|
18
|
+
onSome: (last) => Stream.make(`last-was-${last}`),
|
|
19
|
+
})));
|
|
20
|
+
const collected = await Effect.runPromise(runCollectReadonlyArray(result));
|
|
21
|
+
expect(collected).toEqual(['no-previous-element']);
|
|
22
|
+
});
|
|
23
|
+
it('should handle single element first stream', async () => {
|
|
24
|
+
const stream1 = Stream.make('single');
|
|
25
|
+
const result = concatWithLastElement(stream1, (lastElement) => lastElement.pipe(Option.match({
|
|
26
|
+
onNone: () => Stream.make('unexpected'),
|
|
27
|
+
onSome: (last) => Stream.make(`after-${last}`),
|
|
28
|
+
})));
|
|
29
|
+
const collected = await Effect.runPromise(runCollectReadonlyArray(result));
|
|
30
|
+
expect(collected).toEqual(['single', 'after-single']);
|
|
31
|
+
});
|
|
32
|
+
it('should handle empty second stream', async () => {
|
|
33
|
+
const stream1 = Stream.make(1, 2, 3);
|
|
34
|
+
const result = concatWithLastElement(stream1, () => Stream.empty);
|
|
35
|
+
const collected = await Effect.runPromise(runCollectReadonlyArray(result));
|
|
36
|
+
expect(collected).toEqual([1, 2, 3]);
|
|
37
|
+
});
|
|
38
|
+
it('should preserve error handling from first stream', async () => {
|
|
39
|
+
const stream1 = Stream.fail('first-error');
|
|
40
|
+
const result = concatWithLastElement(stream1, () => Stream.make('should-not-reach'));
|
|
41
|
+
const outcome = await Effect.runPromise(Effect.either(runCollectReadonlyArray(result)));
|
|
42
|
+
expect(outcome._tag).toBe('Left');
|
|
43
|
+
if (outcome._tag === 'Left') {
|
|
44
|
+
expect(outcome.left).toBe('first-error');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('should preserve error handling from second stream', async () => {
|
|
48
|
+
const stream1 = Stream.make(1, 2);
|
|
49
|
+
const result = concatWithLastElement(stream1, () => Stream.fail('second-error'));
|
|
50
|
+
const outcome = await Effect.runPromise(Effect.either(runCollectReadonlyArray(result)));
|
|
51
|
+
expect(outcome._tag).toBe('Left');
|
|
52
|
+
if (outcome._tag === 'Left') {
|
|
53
|
+
expect(outcome.left).toBe('second-error');
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
it('should work with different types in streams', async () => {
|
|
57
|
+
const stream1 = Stream.make(1, 2, 3);
|
|
58
|
+
const result = concatWithLastElement(stream1, (lastElement) => lastElement.pipe(Option.match({
|
|
59
|
+
onNone: () => Stream.make('no-number'),
|
|
60
|
+
onSome: (last) => Stream.make(last * 10, last * 100),
|
|
61
|
+
})));
|
|
62
|
+
const collected = await Effect.runPromise(runCollectReadonlyArray(result));
|
|
63
|
+
expect(collected).toEqual([1, 2, 3, 30, 300]);
|
|
64
|
+
});
|
|
65
|
+
it('should handle async effects in streams', async () => {
|
|
66
|
+
const stream1 = Stream.fromEffect(Effect.succeed('async-value'));
|
|
67
|
+
const result = concatWithLastElement(stream1, (lastElement) => lastElement.pipe(Option.match({
|
|
68
|
+
onNone: () => Stream.fromEffect(Effect.succeed('no-async')),
|
|
69
|
+
onSome: (last) => Stream.fromEffect(Effect.succeed(`processed-${last}`)),
|
|
70
|
+
})));
|
|
71
|
+
const collected = await Effect.runPromise(runCollectReadonlyArray(result));
|
|
72
|
+
expect(collected).toEqual(['async-value', 'processed-async-value']);
|
|
73
|
+
});
|
|
74
|
+
it('should work with dual function - piped style', async () => {
|
|
75
|
+
const stream1 = Stream.make('a', 'b', 'c');
|
|
76
|
+
const result = stream1.pipe(concatWithLastElement((lastElement) => lastElement.pipe(Option.match({
|
|
77
|
+
onNone: () => Stream.make('no-last'),
|
|
78
|
+
onSome: (last) => Stream.make(`last-${last}`, 'done'),
|
|
79
|
+
}))));
|
|
80
|
+
const collected = await Effect.runPromise(runCollectReadonlyArray(result));
|
|
81
|
+
expect(collected).toEqual(['a', 'b', 'c', 'last-c', 'done']);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=Stream.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stream.test.js","sourceRoot":"","sources":["../../src/effect/Stream.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Effect } from 'effect';
|
|
1
|
+
import { Effect, Stream, SubscriptionRef } from 'effect';
|
|
3
2
|
import type { Predicate, Refinement } from 'effect/Predicate';
|
|
4
3
|
export * from 'effect/SubscriptionRef';
|
|
5
4
|
export declare const waitUntil: {
|
|
@@ -8,4 +7,5 @@ export declare const waitUntil: {
|
|
|
8
7
|
<A, B extends A>(sref: SubscriptionRef.SubscriptionRef<A>, refinement: Refinement<NoInfer<A>, B>): Effect.Effect<B, never, never>;
|
|
9
8
|
<A, B extends A>(sref: SubscriptionRef.SubscriptionRef<A>, predicate: Predicate<B>): Effect.Effect<A, never, never>;
|
|
10
9
|
};
|
|
10
|
+
export declare const fromStream: <A>(stream: Stream.Stream<A>, initialValue: A) => Effect.Effect<SubscriptionRef.SubscriptionRef<A>, never, import("effect/Scope").Scope>;
|
|
11
11
|
//# sourceMappingURL=SubscriptionRef.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionRef.d.ts","sourceRoot":"","sources":["../../src/effect/SubscriptionRef.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"SubscriptionRef.d.ts","sourceRoot":"","sources":["../../src/effect/SubscriptionRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAQ,MAAM,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7D,cAAc,wBAAwB,CAAA;AAEtC,eAAO,MAAM,SAAS,EAAE;IACtB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EACb,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GACpC,CAAC,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC/E,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EACb,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GACtB,CAAC,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC/E,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EACb,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,EACxC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GACpC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACjC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAGpH,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,2FAWnE,CAAA"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import { Chunk, Effect, pipe, Stream } from 'effect';
|
|
1
|
+
import { Chunk, Effect, pipe, Stream, SubscriptionRef } from 'effect';
|
|
2
2
|
import { dual } from 'effect/Function';
|
|
3
3
|
export * from 'effect/SubscriptionRef';
|
|
4
4
|
export const waitUntil = dual(2, (sref, predicate) => pipe(sref.changes, Stream.filter(predicate), Stream.take(1), Stream.runCollect, Effect.map(Chunk.unsafeHead)));
|
|
5
|
+
export const fromStream = (stream, initialValue) => Effect.gen(function* () {
|
|
6
|
+
const sref = yield* SubscriptionRef.make(initialValue);
|
|
7
|
+
yield* stream.pipe(Stream.tap((a) => SubscriptionRef.set(sref, a)), Stream.runDrain, Effect.forkScoped);
|
|
8
|
+
return sref;
|
|
9
|
+
});
|
|
5
10
|
//# sourceMappingURL=SubscriptionRef.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionRef.js","sourceRoot":"","sources":["../../src/effect/SubscriptionRef.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SubscriptionRef.js","sourceRoot":"","sources":["../../src/effect/SubscriptionRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGtC,cAAc,wBAAwB,CAAA;AAEtC,MAAM,CAAC,MAAM,SAAS,GAYlB,IAAI,CAAC,CAAC,EAAE,CAAI,IAAwC,EAAE,SAA4B,EAAE,EAAE,CACxF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAC9G,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,MAAwB,EAAE,YAAe,EAAE,EAAE,CACzE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAEtD,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAChB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAC/C,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,UAAU,CAClB,CAAA;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA"}
|
|
@@ -5,25 +5,6 @@ import * as Schema from '../Schema/index.ts';
|
|
|
5
5
|
import { type InputSchema, type WebChannel } from './common.ts';
|
|
6
6
|
export declare const shutdown: <MsgListen, MsgSend>(webChannel: WebChannel<MsgListen, MsgSend>) => Effect.Effect<void>;
|
|
7
7
|
export declare const noopChannel: <MsgListen, MsgSend>() => Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>;
|
|
8
|
-
/** Only works in browser environments */
|
|
9
|
-
export declare const broadcastChannel: <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({ channelName, schema: inputSchema, }: {
|
|
10
|
-
channelName: string;
|
|
11
|
-
schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>;
|
|
12
|
-
}) => Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>;
|
|
13
|
-
/**
|
|
14
|
-
* NOTE the `listenName` and `sendName` is needed for cases where both sides are using the same window
|
|
15
|
-
* e.g. for a browser extension, so we need a way to know for which side a message is intended for.
|
|
16
|
-
*/
|
|
17
|
-
export declare const windowChannel: <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({ listenWindow, sendWindow, targetOrigin, ids, schema: inputSchema, }: {
|
|
18
|
-
listenWindow: Window;
|
|
19
|
-
sendWindow: Window;
|
|
20
|
-
targetOrigin?: string;
|
|
21
|
-
ids: {
|
|
22
|
-
own: string;
|
|
23
|
-
other: string;
|
|
24
|
-
};
|
|
25
|
-
schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>;
|
|
26
|
-
}) => Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>;
|
|
27
8
|
export declare const messagePortChannel: <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>(args: {
|
|
28
9
|
port: MessagePort;
|
|
29
10
|
schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>;
|
|
@@ -65,7 +46,7 @@ export declare const queueChannelProxy: <MsgListen, MsgSend>({ schema: inputSche
|
|
|
65
46
|
/**
|
|
66
47
|
* Eagerly starts listening to a channel by buffering incoming messages in a queue.
|
|
67
48
|
*/
|
|
68
|
-
export declare const toOpenChannel: (channel: WebChannel<
|
|
49
|
+
export declare const toOpenChannel: <MsgListen, MsgSend>(channel: WebChannel<MsgListen, MsgSend>, options?: {
|
|
69
50
|
/**
|
|
70
51
|
* Sends a heartbeat message to the other end of the channel every `interval`.
|
|
71
52
|
* If the other end doesn't respond within `timeout` milliseconds, the channel is shutdown.
|
|
@@ -74,6 +55,6 @@ export declare const toOpenChannel: (channel: WebChannel<any, any>, options?: {
|
|
|
74
55
|
interval: DurationInput;
|
|
75
56
|
timeout: DurationInput;
|
|
76
57
|
};
|
|
77
|
-
}) => Effect.Effect<WebChannel<
|
|
58
|
+
}) => Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>;
|
|
78
59
|
export declare const sendDebugPing: (channel: WebChannel<any, any>) => Effect.Effect<void, import("effect/ParseResult").ParseError, never>;
|
|
79
60
|
//# sourceMappingURL=WebChannel.d.ts.map
|