@livestore/utils 0.3.0-dev.4 → 0.3.0-dev.40

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.
Files changed (145) hide show
  1. package/dist/.tsbuildinfo.json +1 -1
  2. package/dist/Deferred.d.ts.map +1 -1
  3. package/dist/base64.d.ts.map +1 -1
  4. package/dist/bun/mod.d.ts +5 -0
  5. package/dist/bun/mod.d.ts.map +1 -0
  6. package/dist/bun/mod.js +9 -0
  7. package/dist/bun/mod.js.map +1 -0
  8. package/dist/cuid/cuid.browser.d.ts.map +1 -1
  9. package/dist/cuid/cuid.node.d.ts.map +1 -1
  10. package/dist/effect/BucketQueue.d.ts +15 -2
  11. package/dist/effect/BucketQueue.d.ts.map +1 -1
  12. package/dist/effect/BucketQueue.js +24 -6
  13. package/dist/effect/BucketQueue.js.map +1 -1
  14. package/dist/effect/Effect.d.ts +4 -2
  15. package/dist/effect/Effect.d.ts.map +1 -1
  16. package/dist/effect/Effect.js +21 -18
  17. package/dist/effect/Effect.js.map +1 -1
  18. package/dist/effect/Logger.d.ts +2 -0
  19. package/dist/effect/Logger.d.ts.map +1 -1
  20. package/dist/effect/Logger.js +16 -1
  21. package/dist/effect/Logger.js.map +1 -1
  22. package/dist/effect/Scheduler.d.ts.map +1 -1
  23. package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
  24. package/dist/effect/Schema/index.d.ts +3 -0
  25. package/dist/effect/Schema/index.d.ts.map +1 -1
  26. package/dist/effect/Schema/index.js +19 -0
  27. package/dist/effect/Schema/index.js.map +1 -1
  28. package/dist/effect/Schema/msgpack.d.ts +1 -1
  29. package/dist/effect/Schema/msgpack.d.ts.map +1 -1
  30. package/dist/effect/ServiceContext.d.ts.map +1 -1
  31. package/dist/effect/Stream.d.ts.map +1 -1
  32. package/dist/effect/Subscribable.d.ts +76 -0
  33. package/dist/effect/Subscribable.d.ts.map +1 -0
  34. package/dist/effect/Subscribable.js +80 -0
  35. package/dist/effect/Subscribable.js.map +1 -0
  36. package/dist/effect/TaskTracing.d.ts.map +1 -1
  37. package/dist/effect/{WebChannel.d.ts → WebChannel/WebChannel.d.ts} +29 -16
  38. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -0
  39. package/dist/effect/WebChannel/WebChannel.js +264 -0
  40. package/dist/effect/WebChannel/WebChannel.js.map +1 -0
  41. package/dist/effect/WebChannel/WebChannel.test.d.ts +2 -0
  42. package/dist/effect/WebChannel/WebChannel.test.d.ts.map +1 -0
  43. package/dist/effect/WebChannel/WebChannel.test.js +62 -0
  44. package/dist/effect/WebChannel/WebChannel.test.js.map +1 -0
  45. package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts +5 -6
  46. package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
  47. package/dist/effect/WebChannel/broadcastChannelWithAck.js +12 -9
  48. package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
  49. package/dist/effect/WebChannel/common.d.ts +16 -1
  50. package/dist/effect/WebChannel/common.d.ts.map +1 -1
  51. package/dist/effect/WebChannel/common.js +19 -1
  52. package/dist/effect/WebChannel/common.js.map +1 -1
  53. package/dist/effect/WebChannel/mod.d.ts +4 -0
  54. package/dist/effect/WebChannel/mod.d.ts.map +1 -0
  55. package/dist/effect/WebChannel/mod.js +4 -0
  56. package/dist/effect/WebChannel/mod.js.map +1 -0
  57. package/dist/effect/WebLock.d.ts.map +1 -1
  58. package/dist/effect/WebSocket.d.ts +3 -2
  59. package/dist/effect/WebSocket.d.ts.map +1 -1
  60. package/dist/effect/WebSocket.js +45 -19
  61. package/dist/effect/WebSocket.js.map +1 -1
  62. package/dist/effect/WebSocket.test.d.ts +2 -0
  63. package/dist/effect/WebSocket.test.d.ts.map +1 -0
  64. package/dist/effect/WebSocket.test.js +11 -0
  65. package/dist/effect/WebSocket.test.js.map +1 -0
  66. package/dist/effect/index.d.ts +5 -3
  67. package/dist/effect/index.d.ts.map +1 -1
  68. package/dist/effect/index.js +8 -5
  69. package/dist/effect/index.js.map +1 -1
  70. package/dist/env.d.ts +4 -0
  71. package/dist/env.d.ts.map +1 -1
  72. package/dist/env.js +10 -0
  73. package/dist/env.js.map +1 -1
  74. package/dist/fast-deep-equal.d.ts.map +1 -1
  75. package/dist/guards.d.ts.map +1 -1
  76. package/dist/index.d.ts +6 -4
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/misc.d.ts.map +1 -1
  80. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -1
  81. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
  82. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +21 -11
  83. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
  84. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +2 -0
  85. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +1 -0
  86. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +39 -0
  87. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +1 -0
  88. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +75 -0
  89. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +1 -0
  90. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +62 -0
  91. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +1 -0
  92. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +2 -0
  93. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +1 -0
  94. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +42 -0
  95. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +1 -0
  96. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +1 -4
  97. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
  98. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +1 -4
  99. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
  100. package/dist/node/mod.d.ts +4 -16
  101. package/dist/node/mod.d.ts.map +1 -1
  102. package/dist/node/mod.js +25 -69
  103. package/dist/node/mod.js.map +1 -1
  104. package/dist/object/index.d.ts.map +1 -1
  105. package/dist/object/omit.d.ts.map +1 -1
  106. package/dist/object/pick.d.ts.map +1 -1
  107. package/dist/promise.d.ts.map +1 -1
  108. package/dist/set.d.ts.map +1 -1
  109. package/dist/string.d.ts.map +1 -1
  110. package/dist/time.d.ts.map +1 -1
  111. package/package.json +59 -51
  112. package/src/bun/mod.ts +12 -0
  113. package/src/effect/BucketQueue.ts +33 -6
  114. package/src/effect/Effect.ts +33 -20
  115. package/src/effect/Logger.ts +23 -1
  116. package/src/effect/Schema/index.ts +27 -0
  117. package/src/effect/Subscribable.ts +155 -0
  118. package/src/effect/WebChannel/WebChannel.test.ts +106 -0
  119. package/src/effect/WebChannel/WebChannel.ts +438 -0
  120. package/src/effect/WebChannel/broadcastChannelWithAck.ts +86 -83
  121. package/src/effect/WebChannel/common.ts +49 -2
  122. package/src/effect/WebChannel/mod.ts +3 -0
  123. package/src/effect/WebSocket.test.ts +15 -0
  124. package/src/effect/WebSocket.ts +75 -36
  125. package/src/effect/index.ts +18 -2
  126. package/src/env.ts +15 -0
  127. package/src/index.ts +6 -2
  128. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +40 -29
  129. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +52 -0
  130. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +65 -0
  131. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +53 -0
  132. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +3 -6
  133. package/src/node/mod.ts +32 -94
  134. package/dist/effect/WebChannel.d.ts.map +0 -1
  135. package/dist/effect/WebChannel.js +0 -162
  136. package/dist/effect/WebChannel.js.map +0 -1
  137. package/dist/nanoid/index.browser.d.ts +0 -2
  138. package/dist/nanoid/index.browser.d.ts.map +0 -1
  139. package/dist/nanoid/index.browser.js +0 -3
  140. package/dist/nanoid/index.browser.js.map +0 -1
  141. package/src/effect/WebChannel.ts +0 -290
  142. package/src/nanoid/index.browser.ts +0 -2
  143. package/tmp/effect-deferred-repro.ts +0 -29
  144. package/tmp/effect-semaphore-repro.ts +0 -93
  145. package/tsconfig.json +0 -10
package/src/node/mod.ts CHANGED
@@ -1,26 +1,13 @@
1
- import * as OtelNodeSdk from '@effect/opentelemetry/NodeSdk'
2
- import type * as otel from '@opentelemetry/api'
3
- import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
4
- import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
5
- import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
6
- import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
7
- import { Config, Effect, Layer } from 'effect'
8
- import type { ParentSpan } from 'effect/Tracer'
1
+ import * as http from 'node:http'
9
2
 
10
- import { tapCauseLogPretty } from '../effect/Effect.js'
11
- import type { OtelTracer } from '../effect/index.js'
3
+ import { Effect, Layer } from 'effect'
12
4
 
13
- // import { tapCauseLogPretty } from '../effect/Effect.js'
5
+ import { OtelTracer, UnknownError } from '../effect/index.js'
6
+ import { makeNoopTracer } from '../NoopTracer.js'
14
7
 
15
8
  export * as Cli from '@effect/cli'
16
- export * as PlatformBun from '@effect/platform-bun'
17
9
  export * as PlatformNode from '@effect/platform-node'
18
- export * as SocketServer from '@effect/experimental/SocketServer'
19
- export * as OtelResource from '@effect/opentelemetry/Resource'
20
-
21
- export { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
22
- export { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
23
- export * as OtelNodeSdk from '@effect/opentelemetry/NodeSdk'
10
+ export * as SocketServer from '@effect/platform/SocketServer'
24
11
 
25
12
  export * as ChildProcessRunner from './ChildProcessRunner/ChildProcessRunner.js'
26
13
  export * as ChildProcessWorker from './ChildProcessRunner/ChildProcessWorker.js'
@@ -30,86 +17,37 @@ export * as ChildProcessWorker from './ChildProcessRunner/ChildProcessWorker.js'
30
17
 
31
18
  // export const OtelLiveHttp = (args: any): Layer.Layer<never> => Layer.empty
32
19
 
33
- export const OtelLiveHttp = ({
34
- serviceName,
35
- rootSpanName,
36
- skipLogUrl,
37
- }: { serviceName?: string; rootSpanName?: string; skipLogUrl?: boolean } = {}): Layer.Layer<
38
- OtelTracer.OtelTracer | ParentSpan,
39
- never,
40
- never
41
- > =>
42
- Effect.gen(function* () {
43
- const config = yield* Config.all({
44
- exporterUrlTracing: Config.string('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT'),
45
- exporterUrlMracing: Config.string('OTEL_EXPORTER_OTLP_METRICS_ENDPOINT'),
46
- serviceName: serviceName
47
- ? Config.succeed(serviceName)
48
- : Config.string('OTEL_SERVICE_NAME').pipe(Config.withDefault('overtone-node-utils-default-service')),
49
- rootSpanName: rootSpanName
50
- ? Config.succeed(rootSpanName)
51
- : Config.string('OTEL_ROOT_SPAN_NAME').pipe(Config.withDefault('RootSpan')),
52
- }).pipe(tapCauseLogPretty, Effect.orDie)
53
-
54
- const resource = { serviceName: config.serviceName }
55
-
56
- // METRICS
57
- const metricExporter = new OTLPMetricExporter({ url: config.exporterUrlMracing })
58
-
59
- const metricReader = new PeriodicExportingMetricReader({
60
- exporter: metricExporter,
61
- exportIntervalMillis: 1000,
62
- })
63
-
64
- // TRACING
65
- const OtelLive = OtelNodeSdk.layer(() => ({
66
- resource,
67
- metricReader,
68
- spanProcessor: new BatchSpanProcessor(new OTLPTraceExporter({ url: config.exporterUrlTracing, headers: {} })),
69
- }))
20
+ export const getFreePort = Effect.async<number, UnknownError>((cb, signal) => {
21
+ const server = http.createServer()
70
22
 
71
- const RootSpanLive = Layer.span(config.rootSpanName, {
72
- attributes: { config },
73
- onEnd: skipLogUrl ? undefined : (span: any) => logTraceUiUrlForSpan()(span.span),
74
- })
75
-
76
- return RootSpanLive.pipe(Layer.provideMerge(OtelLive))
77
- }).pipe(Layer.unwrapEffect) as any
23
+ signal.addEventListener('abort', () => {
24
+ server.close()
25
+ })
78
26
 
79
- export const logTraceUiUrlForSpan = (printMsg?: (url: string) => string) => (span: otel.Span) =>
80
- getTracingBackendUrl(span).pipe(
81
- Effect.tap((url) => {
82
- if (url === undefined) {
83
- console.warn('No tracing backend url found')
84
- } else {
85
- if (printMsg) {
86
- console.log(printMsg(url))
87
- } else {
88
- console.log(`Trace URL: ${url}`)
89
- }
90
- }
91
- }),
92
- )
27
+ // Listen on port 0 to get an available port
28
+ server.listen(0, () => {
29
+ const address = server.address()
93
30
 
94
- export const getTracingBackendUrl = (span: otel.Span) =>
95
- Effect.gen(function* () {
96
- const endpoint = yield* Config.string('TRACING_UI_ENDPOINT').pipe(Config.option, Effect.orDie)
97
- if (endpoint._tag === 'None') return
31
+ if (address && typeof address === 'object') {
32
+ const port = address.port
33
+ server.close(() => cb(Effect.succeed(port)))
34
+ } else {
35
+ server.close(() => cb(Effect.fail(new UnknownError({ cause: 'Failed to get a free port' }))))
36
+ }
37
+ })
98
38
 
99
- const traceId = span.spanContext().traceId
39
+ // Error handling in case the server encounters an error
40
+ server.on('error', (err) => {
41
+ server.close(() => cb(Effect.fail(new UnknownError({ cause: err }))))
42
+ })
43
+ })
100
44
 
101
- // Grafana + Tempo
45
+ export const OtelLiveDummy: Layer.Layer<OtelTracer.OtelTracer> = Layer.suspend(() => {
46
+ const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, makeNoopTracer())
102
47
 
103
- const grafanaEndpoint = endpoint.value
104
- const searchParams = new URLSearchParams({
105
- orgId: '1',
106
- left: JSON.stringify({
107
- datasource: 'tempo',
108
- queries: [{ query: traceId, queryType: 'traceql', refId: 'A' }],
109
- range: { from: 'now-1h', to: 'now' },
110
- }),
111
- })
48
+ const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(
49
+ Layer.provideMerge(OtelTracerLive),
50
+ ) as any as Layer.Layer<OtelTracer.OtelTracer>
112
51
 
113
- // TODO make dynamic via env var
114
- return `${grafanaEndpoint}/explore?${searchParams.toString()}`
115
- })
52
+ return TracingLive
53
+ })
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebChannel.d.ts","sourceRoot":"","sources":["../../src/effect/WebChannel.ts"],"names":[],"mappings":"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"}
@@ -1,162 +0,0 @@
1
- import { Deferred, Effect, Either, Option, Predicate, Queue } from 'effect';
2
- import * as Schema from './Schema/index.js';
3
- import * as Stream from './Stream.js';
4
- import { WebChannelSymbol } from './WebChannel/common.js';
5
- export * from './WebChannel/broadcastChannelWithAck.js';
6
- export * from './WebChannel/common.js';
7
- export const broadcastChannel = ({ channelName, schema: inputSchema, }) => Effect.gen(function* () {
8
- const schema = mapSchema(inputSchema);
9
- const channel = new BroadcastChannel(channelName);
10
- yield* Effect.addFinalizer(() => Effect.try(() => channel.close()).pipe(Effect.ignoreLogged));
11
- const send = (message) => Effect.gen(function* () {
12
- const messageEncoded = yield* Schema.encode(schema.send)(message);
13
- channel.postMessage(messageEncoded);
14
- });
15
- // TODO also listen to `messageerror` in parallel
16
- const listen = Stream.fromEventListener(channel, 'message').pipe(Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)));
17
- const closedDeferred = yield* Deferred.make();
18
- const supportsTransferables = false;
19
- return {
20
- [WebChannelSymbol]: WebChannelSymbol,
21
- send,
22
- listen,
23
- closedDeferred,
24
- schema,
25
- supportsTransferables,
26
- };
27
- }).pipe(Effect.withSpan(`WebChannel:broadcastChannel(${channelName})`));
28
- export const windowChannel = ({ window, targetOrigin = '*', schema: inputSchema, }) => Effect.gen(function* () {
29
- const schema = mapSchema(inputSchema);
30
- const send = (message) => Effect.gen(function* () {
31
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(schema.send)(message);
32
- window.postMessage(messageEncoded, targetOrigin, transferables);
33
- });
34
- const listen = Stream.fromEventListener(window, 'message').pipe(Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)));
35
- const closedDeferred = yield* Deferred.make();
36
- const supportsTransferables = true;
37
- return {
38
- [WebChannelSymbol]: WebChannelSymbol,
39
- send,
40
- listen,
41
- closedDeferred,
42
- schema,
43
- supportsTransferables,
44
- };
45
- }).pipe(Effect.withSpan(`WebChannel:windowChannel`));
46
- export const messagePortChannel = ({ port, schema: inputSchema }) => Effect.gen(function* () {
47
- const schema = mapSchema(inputSchema);
48
- const send = (message) => Effect.gen(function* () {
49
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(schema.send)(message);
50
- port.postMessage(messageEncoded, transferables);
51
- });
52
- const listen = Stream.fromEventListener(port, 'message').pipe(Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)));
53
- port.start();
54
- const closedDeferred = yield* Deferred.make();
55
- const supportsTransferables = true;
56
- yield* Effect.addFinalizer(() => Effect.try(() => port.close()).pipe(Effect.ignoreLogged));
57
- return {
58
- [WebChannelSymbol]: WebChannelSymbol,
59
- send,
60
- listen,
61
- closedDeferred,
62
- schema,
63
- supportsTransferables,
64
- };
65
- }).pipe(Effect.withSpan(`WebChannel:messagePortChannel`));
66
- export const messagePortChannelWithAck = ({ port, schema: inputSchema }) => Effect.gen(function* () {
67
- const schema = mapSchema(inputSchema);
68
- const requestAckMap = new Map();
69
- const ChannelRequest = Schema.TaggedStruct('ChannelRequest', {
70
- id: Schema.String,
71
- payload: Schema.Union(schema.listen, schema.send),
72
- });
73
- const ChannelRequestAck = Schema.TaggedStruct('ChannelRequestAck', {
74
- reqId: Schema.String,
75
- });
76
- const ChannelMessage = Schema.Union(ChannelRequest, ChannelRequestAck);
77
- const send = (message) => Effect.gen(function* () {
78
- const id = crypto.randomUUID();
79
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(ChannelMessage)({
80
- _tag: 'ChannelRequest',
81
- id,
82
- payload: message,
83
- });
84
- const ack = yield* Deferred.make();
85
- requestAckMap.set(id, ack);
86
- port.postMessage(messageEncoded, transferables);
87
- yield* ack;
88
- requestAckMap.delete(id);
89
- });
90
- const listen = Stream.fromEventListener(port, 'message').pipe(Stream.map((_) => Schema.decodeEither(ChannelMessage)(_.data)), Stream.tap((msg) => Effect.gen(function* () {
91
- if (msg._tag === 'Right') {
92
- if (msg.right._tag === 'ChannelRequestAck') {
93
- yield* Deferred.succeed(requestAckMap.get(msg.right.reqId), void 0);
94
- }
95
- else if (msg.right._tag === 'ChannelRequest') {
96
- port.postMessage(Schema.encodeSync(ChannelMessage)({ _tag: 'ChannelRequestAck', reqId: msg.right.id }));
97
- }
98
- }
99
- })), Stream.filterMap((msg) => msg._tag === 'Left'
100
- ? Option.some(msg)
101
- : msg.right._tag === 'ChannelRequest'
102
- ? Option.some(Either.right(msg.right.payload))
103
- : Option.none()));
104
- port.start();
105
- const closedDeferred = yield* Deferred.make();
106
- const supportsTransferables = true;
107
- yield* Effect.addFinalizer(() => Effect.try(() => port.close()).pipe(Effect.ignoreLogged));
108
- return {
109
- [WebChannelSymbol]: WebChannelSymbol,
110
- send,
111
- listen,
112
- closedDeferred,
113
- schema,
114
- supportsTransferables,
115
- };
116
- }).pipe(Effect.withSpan(`WebChannel:messagePortChannelWithAck`));
117
- export const mapSchema = (schema) => Predicate.hasProperty(schema, 'send') && Predicate.hasProperty(schema, 'listen')
118
- ? { send: schema.send, listen: schema.listen }
119
- : { send: schema, listen: schema };
120
- /**
121
- * From the outside the `sendQueue` is only accessible read-only,
122
- * and the `listenQueue` is only accessible write-only.
123
- */
124
- export const queueChannelProxy = ({ schema: inputSchema, }) => Effect.gen(function* () {
125
- const sendQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
126
- const listenQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
127
- const send = (message) => Queue.offer(sendQueue, message);
128
- const listen = Stream.fromQueue(listenQueue).pipe(Stream.map(Either.right));
129
- const closedDeferred = yield* Deferred.make();
130
- const supportsTransferables = true;
131
- const schema = mapSchema(inputSchema);
132
- const webChannel = {
133
- [WebChannelSymbol]: WebChannelSymbol,
134
- send,
135
- listen,
136
- closedDeferred,
137
- schema,
138
- supportsTransferables,
139
- };
140
- return { webChannel, sendQueue, listenQueue };
141
- });
142
- // export const proxy = <MsgListen, MsgSend>({
143
- // originWebChannel,
144
- // proxyWebChannel,
145
- // }: {
146
- // originWebChannel: WebChannel<MsgListen, MsgSend>
147
- // proxyWebChannel: QueueChannelProxy<MsgListen, MsgSend>
148
- // }) =>
149
- // Effect.gen(function* () {
150
- // const proxyListen = originWebChannel.listen.pipe(
151
- // Stream.flatten(),
152
- // Stream.tap((_) => Queue.offer(proxyWebChannel.listenQueue, _)),
153
- // Stream.runDrain,
154
- // )
155
- // const proxySend = proxyWebChannel.sendQueue.pipe(
156
- // Stream.fromQueue,
157
- // Stream.tap(originWebChannel.send),
158
- // Stream.runDrain,
159
- // )
160
- // yield* Effect.all([proxyListen, proxySend], { concurrency: 2 })
161
- // })
162
- //# sourceMappingURL=WebChannel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebChannel.js","sourceRoot":"","sources":["../../src/effect/WebChannel.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export { nanoid } from 'nanoid/index.browser.js';
2
- //# sourceMappingURL=index.browser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../../src/nanoid/index.browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA"}
@@ -1,3 +0,0 @@
1
- // @ts-expect-error TODO
2
- export { nanoid } from 'nanoid/index.browser.js';
3
- //# sourceMappingURL=index.browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../src/nanoid/index.browser.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA"}
@@ -1,290 +0,0 @@
1
- import type { Scope } from 'effect'
2
- import { Deferred, Effect, Either, Option, Predicate, Queue } from 'effect'
3
-
4
- import * as Schema from './Schema/index.js'
5
- import * as Stream from './Stream.js'
6
- import { type WebChannel, WebChannelSymbol } from './WebChannel/common.js'
7
-
8
- export * from './WebChannel/broadcastChannelWithAck.js'
9
-
10
- export * from './WebChannel/common.js'
11
-
12
- export const broadcastChannel = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({
13
- channelName,
14
- schema: inputSchema,
15
- }: {
16
- channelName: string
17
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
18
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope> =>
19
- Effect.gen(function* () {
20
- const schema = mapSchema(inputSchema)
21
-
22
- const channel = new BroadcastChannel(channelName)
23
-
24
- yield* Effect.addFinalizer(() => Effect.try(() => channel.close()).pipe(Effect.ignoreLogged))
25
-
26
- const send = (message: MsgSend) =>
27
- Effect.gen(function* () {
28
- const messageEncoded = yield* Schema.encode(schema.send)(message)
29
- channel.postMessage(messageEncoded)
30
- })
31
-
32
- // TODO also listen to `messageerror` in parallel
33
- const listen = Stream.fromEventListener<MessageEvent>(channel, 'message').pipe(
34
- Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)),
35
- )
36
-
37
- const closedDeferred = yield* Deferred.make<void>()
38
- const supportsTransferables = false
39
-
40
- return {
41
- [WebChannelSymbol]: WebChannelSymbol,
42
- send,
43
- listen,
44
- closedDeferred,
45
- schema,
46
- supportsTransferables,
47
- }
48
- }).pipe(Effect.withSpan(`WebChannel:broadcastChannel(${channelName})`))
49
-
50
- export const windowChannel = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({
51
- window,
52
- targetOrigin = '*',
53
- schema: inputSchema,
54
- }: {
55
- window: Window
56
- targetOrigin?: string
57
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
58
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope> =>
59
- Effect.gen(function* () {
60
- const schema = mapSchema(inputSchema)
61
-
62
- const send = (message: MsgSend) =>
63
- Effect.gen(function* () {
64
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(schema.send)(message)
65
- window.postMessage(messageEncoded, targetOrigin, transferables)
66
- })
67
-
68
- const listen = Stream.fromEventListener<MessageEvent>(window, 'message').pipe(
69
- Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)),
70
- )
71
-
72
- const closedDeferred = yield* Deferred.make<void>()
73
- const supportsTransferables = true
74
-
75
- return {
76
- [WebChannelSymbol]: WebChannelSymbol,
77
- send,
78
- listen,
79
- closedDeferred,
80
- schema,
81
- supportsTransferables,
82
- }
83
- }).pipe(Effect.withSpan(`WebChannel:windowChannel`))
84
-
85
- export const messagePortChannel: {
86
- <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>(args: {
87
- port: MessagePort
88
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
89
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>
90
- } = ({ port, schema: inputSchema }) =>
91
- Effect.gen(function* () {
92
- const schema = mapSchema(inputSchema)
93
-
94
- const send = (message: any) =>
95
- Effect.gen(function* () {
96
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(schema.send)(message)
97
- port.postMessage(messageEncoded, transferables)
98
- })
99
-
100
- const listen = Stream.fromEventListener<MessageEvent>(port, 'message').pipe(
101
- Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)),
102
- )
103
-
104
- port.start()
105
-
106
- const closedDeferred = yield* Deferred.make<void>()
107
- const supportsTransferables = true
108
-
109
- yield* Effect.addFinalizer(() => Effect.try(() => port.close()).pipe(Effect.ignoreLogged))
110
-
111
- return {
112
- [WebChannelSymbol]: WebChannelSymbol,
113
- send,
114
- listen,
115
- closedDeferred,
116
- schema,
117
- supportsTransferables,
118
- }
119
- }).pipe(Effect.withSpan(`WebChannel:messagePortChannel`))
120
-
121
- export const messagePortChannelWithAck: {
122
- <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>(args: {
123
- port: MessagePort
124
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
125
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>
126
- } = ({ port, schema: inputSchema }) =>
127
- Effect.gen(function* () {
128
- const schema = mapSchema(inputSchema)
129
-
130
- type RequestId = string
131
- const requestAckMap = new Map<RequestId, Deferred.Deferred<void>>()
132
-
133
- const ChannelRequest = Schema.TaggedStruct('ChannelRequest', {
134
- id: Schema.String,
135
- payload: Schema.Union(schema.listen, schema.send),
136
- })
137
- const ChannelRequestAck = Schema.TaggedStruct('ChannelRequestAck', {
138
- reqId: Schema.String,
139
- })
140
- const ChannelMessage = Schema.Union(ChannelRequest, ChannelRequestAck)
141
- type ChannelMessage = typeof ChannelMessage.Type
142
-
143
- const send = (message: any) =>
144
- Effect.gen(function* () {
145
- const id = crypto.randomUUID()
146
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(ChannelMessage)({
147
- _tag: 'ChannelRequest',
148
- id,
149
- payload: message,
150
- })
151
-
152
- const ack = yield* Deferred.make<void>()
153
- requestAckMap.set(id, ack)
154
-
155
- port.postMessage(messageEncoded, transferables)
156
-
157
- yield* ack
158
-
159
- requestAckMap.delete(id)
160
- })
161
-
162
- const listen = Stream.fromEventListener<MessageEvent>(port, 'message').pipe(
163
- Stream.map((_) => Schema.decodeEither(ChannelMessage)(_.data)),
164
- Stream.tap((msg) =>
165
- Effect.gen(function* () {
166
- if (msg._tag === 'Right') {
167
- if (msg.right._tag === 'ChannelRequestAck') {
168
- yield* Deferred.succeed(requestAckMap.get(msg.right.reqId)!, void 0)
169
- } else if (msg.right._tag === 'ChannelRequest') {
170
- port.postMessage(Schema.encodeSync(ChannelMessage)({ _tag: 'ChannelRequestAck', reqId: msg.right.id }))
171
- }
172
- }
173
- }),
174
- ),
175
- Stream.filterMap((msg) =>
176
- msg._tag === 'Left'
177
- ? Option.some(msg as any)
178
- : msg.right._tag === 'ChannelRequest'
179
- ? Option.some(Either.right(msg.right.payload))
180
- : Option.none(),
181
- ),
182
- )
183
-
184
- port.start()
185
-
186
- const closedDeferred = yield* Deferred.make<void>()
187
- const supportsTransferables = true
188
-
189
- yield* Effect.addFinalizer(() => Effect.try(() => port.close()).pipe(Effect.ignoreLogged))
190
-
191
- return {
192
- [WebChannelSymbol]: WebChannelSymbol,
193
- send,
194
- listen,
195
- closedDeferred,
196
- schema,
197
- supportsTransferables,
198
- }
199
- }).pipe(Effect.withSpan(`WebChannel:messagePortChannelWithAck`))
200
-
201
- export type InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded> =
202
- | Schema.Schema<MsgListen | MsgSend, MsgListenEncoded | MsgSendEncoded>
203
- | {
204
- listen: Schema.Schema<MsgListen, MsgListenEncoded>
205
- send: Schema.Schema<MsgSend, MsgSendEncoded>
206
- }
207
-
208
- export const mapSchema = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>(
209
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>,
210
- ): {
211
- listen: Schema.Schema<MsgListen, MsgListenEncoded>
212
- send: Schema.Schema<MsgSend, MsgSendEncoded>
213
- } =>
214
- Predicate.hasProperty(schema, 'send') && Predicate.hasProperty(schema, 'listen')
215
- ? { send: schema.send, listen: schema.listen }
216
- : ({ send: schema, listen: schema } as any)
217
-
218
- export type QueueChannelProxy<MsgListen, MsgSend> = {
219
- /** Only meant to be used externally */
220
- webChannel: WebChannel<MsgListen, MsgSend>
221
- /**
222
- * Meant to be listened to (e.g. via `Stream.fromQueue`) for messages that have been sent
223
- * via `webChannel.send()`.
224
- */
225
- sendQueue: Queue.Dequeue<MsgSend>
226
- /**
227
- * Meant to be pushed to (e.g. via `Queue.offer`) for messages that will be received
228
- * via `webChannel.listen()`.
229
- */
230
- listenQueue: Queue.Enqueue<MsgListen>
231
- }
232
-
233
- /**
234
- * From the outside the `sendQueue` is only accessible read-only,
235
- * and the `listenQueue` is only accessible write-only.
236
- */
237
- export const queueChannelProxy = <MsgListen, MsgSend>({
238
- schema: inputSchema,
239
- }: {
240
- schema:
241
- | Schema.Schema<MsgListen | MsgSend, any>
242
- | { listen: Schema.Schema<MsgListen, any>; send: Schema.Schema<MsgSend, any> }
243
- }): Effect.Effect<QueueChannelProxy<MsgListen, MsgSend>, never, Scope.Scope> =>
244
- Effect.gen(function* () {
245
- const sendQueue = yield* Queue.unbounded<MsgSend>().pipe(Effect.acquireRelease(Queue.shutdown))
246
- const listenQueue = yield* Queue.unbounded<MsgListen>().pipe(Effect.acquireRelease(Queue.shutdown))
247
-
248
- const send = (message: MsgSend) => Queue.offer(sendQueue, message)
249
-
250
- const listen = Stream.fromQueue(listenQueue).pipe(Stream.map(Either.right))
251
-
252
- const closedDeferred = yield* Deferred.make<void>()
253
- const supportsTransferables = true
254
-
255
- const schema = mapSchema(inputSchema)
256
-
257
- const webChannel = {
258
- [WebChannelSymbol]: WebChannelSymbol,
259
- send,
260
- listen,
261
- closedDeferred,
262
- schema,
263
- supportsTransferables,
264
- }
265
-
266
- return { webChannel, sendQueue, listenQueue }
267
- })
268
-
269
- // export const proxy = <MsgListen, MsgSend>({
270
- // originWebChannel,
271
- // proxyWebChannel,
272
- // }: {
273
- // originWebChannel: WebChannel<MsgListen, MsgSend>
274
- // proxyWebChannel: QueueChannelProxy<MsgListen, MsgSend>
275
- // }) =>
276
- // Effect.gen(function* () {
277
- // const proxyListen = originWebChannel.listen.pipe(
278
- // Stream.flatten(),
279
- // Stream.tap((_) => Queue.offer(proxyWebChannel.listenQueue, _)),
280
- // Stream.runDrain,
281
- // )
282
-
283
- // const proxySend = proxyWebChannel.sendQueue.pipe(
284
- // Stream.fromQueue,
285
- // Stream.tap(originWebChannel.send),
286
- // Stream.runDrain,
287
- // )
288
-
289
- // yield* Effect.all([proxyListen, proxySend], { concurrency: 2 })
290
- // })
@@ -1,2 +0,0 @@
1
- // @ts-expect-error TODO
2
- export { nanoid } from 'nanoid/index.browser.js'
@@ -1,29 +0,0 @@
1
- /// <reference lib="es2024" />
2
-
3
- import { Effect, Logger } from 'effect'
4
-
5
- const main = Effect.gen(function* () {
6
- yield* Effect.addFinalizer((_) => Effect.log('finalizer', _))
7
-
8
- // const finished = yield* Deferred.make<void>()
9
-
10
- const def = Promise.withResolvers()
11
-
12
- setTimeout(() => {
13
- def.resolve(undefined)
14
- }, 1000)
15
-
16
- console.log('awaiting')
17
-
18
- // const fiber = yield* Deferred.await(finished).pipe(Effect.fork)
19
- // yield* Fiber.join(fiber)
20
- // yield* finished
21
- yield* Effect.promise(() => def.promise)
22
- console.log('finished')
23
- })
24
-
25
- main
26
- .pipe(Effect.scoped, Effect.provide(Logger.pretty), Effect.tapErrorCause(Effect.logError), Effect.runPromise)
27
- .finally(() => {
28
- console.log('finally')
29
- })