@livestore/utils 0.3.0-dev.3 → 0.3.0-dev.31

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 (144) 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 +75 -0
  33. package/dist/effect/Subscribable.d.ts.map +1 -0
  34. package/dist/effect/Subscribable.js +76 -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} +32 -14
  38. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -0
  39. package/dist/effect/WebChannel/WebChannel.js +283 -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 +7 -3
  69. package/dist/effect/index.js.map +1 -1
  70. package/dist/env.d.ts +2 -0
  71. package/dist/env.d.ts.map +1 -1
  72. package/dist/env.js +8 -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 -3
  101. package/dist/node/mod.d.ts.map +1 -1
  102. package/dist/node/mod.js +37 -10
  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 +63 -40
  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 +150 -0
  118. package/src/effect/WebChannel/WebChannel.test.ts +106 -0
  119. package/src/effect/WebChannel/WebChannel.ts +477 -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 +16 -1
  126. package/src/env.ts +11 -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 +49 -11
  134. package/tmp/pack.tgz +0 -0
  135. package/tsconfig.json +1 -1
  136. package/dist/effect/WebChannel.d.ts.map +0 -1
  137. package/dist/effect/WebChannel.js +0 -162
  138. package/dist/effect/WebChannel.js.map +0 -1
  139. package/dist/nanoid/index.browser.d.ts +0 -2
  140. package/dist/nanoid/index.browser.d.ts.map +0 -1
  141. package/dist/nanoid/index.browser.js +0 -3
  142. package/dist/nanoid/index.browser.js.map +0 -1
  143. package/src/effect/WebChannel.ts +0 -290
  144. package/src/nanoid/index.browser.ts +0 -2
package/src/node/mod.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import * as http from 'node:http'
2
+
1
3
  import * as OtelNodeSdk from '@effect/opentelemetry/NodeSdk'
2
4
  import type * as otel from '@opentelemetry/api'
3
5
  import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
@@ -8,14 +10,14 @@ import { Config, Effect, Layer } from 'effect'
8
10
  import type { ParentSpan } from 'effect/Tracer'
9
11
 
10
12
  import { tapCauseLogPretty } from '../effect/Effect.js'
11
- import type { OtelTracer } from '../effect/index.js'
13
+ import { OtelTracer, UnknownError } from '../effect/index.js'
14
+ import { makeNoopTracer } from '../NoopTracer.js'
12
15
 
13
16
  // import { tapCauseLogPretty } from '../effect/Effect.js'
14
17
 
15
18
  export * as Cli from '@effect/cli'
16
- export * as PlatformBun from '@effect/platform-bun'
17
19
  export * as PlatformNode from '@effect/platform-node'
18
- export * as SocketServer from '@effect/experimental/SocketServer'
20
+ export * as SocketServer from '@effect/platform/SocketServer'
19
21
  export * as OtelResource from '@effect/opentelemetry/Resource'
20
22
 
21
23
  export { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
@@ -30,6 +32,41 @@ export * as ChildProcessWorker from './ChildProcessRunner/ChildProcessWorker.js'
30
32
 
31
33
  // export const OtelLiveHttp = (args: any): Layer.Layer<never> => Layer.empty
32
34
 
35
+ export const getFreePort = Effect.async<number, UnknownError>((cb, signal) => {
36
+ const server = http.createServer()
37
+
38
+ signal.addEventListener('abort', () => {
39
+ server.close()
40
+ })
41
+
42
+ // Listen on port 0 to get an available port
43
+ server.listen(0, () => {
44
+ const address = server.address()
45
+
46
+ if (address && typeof address === 'object') {
47
+ const port = address.port
48
+ server.close(() => cb(Effect.succeed(port)))
49
+ } else {
50
+ server.close(() => cb(Effect.fail(new UnknownError({ cause: 'Failed to get a free port' }))))
51
+ }
52
+ })
53
+
54
+ // Error handling in case the server encounters an error
55
+ server.on('error', (err) => {
56
+ server.close(() => cb(Effect.fail(new UnknownError({ cause: err }))))
57
+ })
58
+ })
59
+
60
+ export const OtelLiveDummy: Layer.Layer<OtelTracer.OtelTracer> = Layer.suspend(() => {
61
+ const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, makeNoopTracer())
62
+
63
+ const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(
64
+ Layer.provideMerge(OtelTracerLive),
65
+ ) as any as Layer.Layer<OtelTracer.OtelTracer>
66
+
67
+ return TracingLive
68
+ })
69
+
33
70
  export const OtelLiveHttp = ({
34
71
  serviceName,
35
72
  rootSpanName,
@@ -41,8 +78,7 @@ export const OtelLiveHttp = ({
41
78
  > =>
42
79
  Effect.gen(function* () {
43
80
  const config = yield* Config.all({
44
- exporterUrlTracing: Config.string('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT'),
45
- exporterUrlMracing: Config.string('OTEL_EXPORTER_OTLP_METRICS_ENDPOINT'),
81
+ exporterUrl: Config.string('OTEL_EXPORTER_OTLP_ENDPOINT'),
46
82
  serviceName: serviceName
47
83
  ? Config.succeed(serviceName)
48
84
  : Config.string('OTEL_SERVICE_NAME').pipe(Config.withDefault('overtone-node-utils-default-service')),
@@ -54,7 +90,7 @@ export const OtelLiveHttp = ({
54
90
  const resource = { serviceName: config.serviceName }
55
91
 
56
92
  // METRICS
57
- const metricExporter = new OTLPMetricExporter({ url: config.exporterUrlMracing })
93
+ const metricExporter = new OTLPMetricExporter({ url: `${config.exporterUrl}/v1/metrics` })
58
94
 
59
95
  const metricReader = new PeriodicExportingMetricReader({
60
96
  exporter: metricExporter,
@@ -65,7 +101,9 @@ export const OtelLiveHttp = ({
65
101
  const OtelLive = OtelNodeSdk.layer(() => ({
66
102
  resource,
67
103
  metricReader,
68
- spanProcessor: new BatchSpanProcessor(new OTLPTraceExporter({ url: config.exporterUrlTracing, headers: {} })),
104
+ spanProcessor: new BatchSpanProcessor(
105
+ new OTLPTraceExporter({ url: `${config.exporterUrl}/v1/traces`, headers: {} }),
106
+ ),
69
107
  }))
70
108
 
71
109
  const RootSpanLive = Layer.span(config.rootSpanName, {
@@ -80,12 +118,12 @@ export const logTraceUiUrlForSpan = (printMsg?: (url: string) => string) => (spa
80
118
  getTracingBackendUrl(span).pipe(
81
119
  Effect.tap((url) => {
82
120
  if (url === undefined) {
83
- console.warn('No tracing backend url found')
121
+ return Effect.logWarning('No tracing backend url found')
84
122
  } else {
85
123
  if (printMsg) {
86
- console.log(printMsg(url))
124
+ return Effect.log(printMsg(url))
87
125
  } else {
88
- console.log(`Trace URL: ${url}`)
126
+ return Effect.log(`Trace URL: ${url}`)
89
127
  }
90
128
  }
91
129
  }),
@@ -93,7 +131,7 @@ export const logTraceUiUrlForSpan = (printMsg?: (url: string) => string) => (spa
93
131
 
94
132
  export const getTracingBackendUrl = (span: otel.Span) =>
95
133
  Effect.gen(function* () {
96
- const endpoint = yield* Config.string('TRACING_UI_ENDPOINT').pipe(Config.option, Effect.orDie)
134
+ const endpoint = yield* Config.string('GRAFANA_ENDPOINT').pipe(Config.option, Effect.orDie)
97
135
  if (endpoint._tag === 'None') return
98
136
 
99
137
  const traceId = span.spanContext().traceId
package/tmp/pack.tgz ADDED
Binary file
package/tsconfig.json CHANGED
@@ -6,5 +6,5 @@
6
6
  "tsBuildInfoFile": "./dist/.tsbuildinfo.json"
7
7
  },
8
8
  "include": ["./src"],
9
- "references": [{ "path": "../db-schema"}]
9
+ "references": []
10
10
  }
@@ -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'