@livestore/utils 0.3.0-dev.5 → 0.3.0-dev.51

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 (150) 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 +10 -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} +39 -17
  38. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -0
  39. package/dist/effect/WebChannel/WebChannel.js +300 -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 +29 -1
  50. package/dist/effect/WebChannel/common.d.ts.map +1 -1
  51. package/dist/effect/WebChannel/common.js +26 -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 +6 -3
  67. package/dist/effect/index.d.ts.map +1 -1
  68. package/dist/effect/index.js +9 -5
  69. package/dist/effect/index.js.map +1 -1
  70. package/dist/env.d.ts +4 -1
  71. package/dist/env.d.ts.map +1 -1
  72. package/dist/env.js +7 -12
  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 -5
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +0 -8
  79. package/dist/index.js.map +1 -1
  80. package/dist/misc.d.ts +3 -0
  81. package/dist/misc.d.ts.map +1 -1
  82. package/dist/misc.js +23 -0
  83. package/dist/misc.js.map +1 -1
  84. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -1
  85. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
  86. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +21 -11
  87. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
  88. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +2 -0
  89. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +1 -0
  90. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +39 -0
  91. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +1 -0
  92. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +75 -0
  93. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +1 -0
  94. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +62 -0
  95. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +1 -0
  96. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +2 -0
  97. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +1 -0
  98. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +42 -0
  99. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +1 -0
  100. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +1 -4
  101. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
  102. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +1 -4
  103. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
  104. package/dist/node/mod.d.ts +4 -16
  105. package/dist/node/mod.d.ts.map +1 -1
  106. package/dist/node/mod.js +25 -69
  107. package/dist/node/mod.js.map +1 -1
  108. package/dist/object/index.d.ts.map +1 -1
  109. package/dist/object/omit.d.ts.map +1 -1
  110. package/dist/object/pick.d.ts.map +1 -1
  111. package/dist/promise.d.ts.map +1 -1
  112. package/dist/set.d.ts.map +1 -1
  113. package/dist/string.d.ts.map +1 -1
  114. package/dist/time.d.ts.map +1 -1
  115. package/package.json +59 -51
  116. package/src/bun/mod.ts +13 -0
  117. package/src/effect/BucketQueue.ts +33 -6
  118. package/src/effect/Effect.ts +33 -20
  119. package/src/effect/Logger.ts +23 -1
  120. package/src/effect/Schema/index.ts +27 -0
  121. package/src/effect/Subscribable.ts +155 -0
  122. package/src/effect/WebChannel/WebChannel.test.ts +106 -0
  123. package/src/effect/WebChannel/WebChannel.ts +502 -0
  124. package/src/effect/WebChannel/broadcastChannelWithAck.ts +86 -83
  125. package/src/effect/WebChannel/common.ts +61 -2
  126. package/src/effect/WebChannel/mod.ts +3 -0
  127. package/src/effect/WebSocket.test.ts +15 -0
  128. package/src/effect/WebSocket.ts +75 -36
  129. package/src/effect/index.ts +34 -2
  130. package/src/env.ts +9 -13
  131. package/src/index.ts +6 -12
  132. package/src/misc.ts +31 -0
  133. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +40 -29
  134. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +52 -0
  135. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +65 -0
  136. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +53 -0
  137. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +3 -6
  138. package/src/node/mod.ts +32 -94
  139. package/dist/effect/WebChannel.d.ts.map +0 -1
  140. package/dist/effect/WebChannel.js +0 -175
  141. package/dist/effect/WebChannel.js.map +0 -1
  142. package/dist/nanoid/index.browser.d.ts +0 -2
  143. package/dist/nanoid/index.browser.d.ts.map +0 -1
  144. package/dist/nanoid/index.browser.js +0 -3
  145. package/dist/nanoid/index.browser.js.map +0 -1
  146. package/src/effect/WebChannel.ts +0 -305
  147. package/src/nanoid/index.browser.ts +0 -2
  148. package/tmp/effect-deferred-repro.ts +0 -29
  149. package/tmp/effect-semaphore-repro.ts +0 -93
  150. package/tsconfig.json +0 -10
@@ -1,305 +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 noopChannel = <MsgListen, MsgSend>(): Effect.Effect<WebChannel<MsgListen, MsgSend>> =>
13
- Effect.gen(function* () {
14
- return {
15
- [WebChannelSymbol]: WebChannelSymbol,
16
- send: () => Effect.void,
17
- listen: Stream.never,
18
- closedDeferred: yield* Deferred.make<void>(),
19
- schema: {
20
- listen: Schema.Any,
21
- send: Schema.Any,
22
- } as any,
23
- supportsTransferables: false,
24
- }
25
- })
26
-
27
- export const broadcastChannel = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({
28
- channelName,
29
- schema: inputSchema,
30
- }: {
31
- channelName: string
32
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
33
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope> =>
34
- Effect.gen(function* () {
35
- const schema = mapSchema(inputSchema)
36
-
37
- const channel = new BroadcastChannel(channelName)
38
-
39
- yield* Effect.addFinalizer(() => Effect.try(() => channel.close()).pipe(Effect.ignoreLogged))
40
-
41
- const send = (message: MsgSend) =>
42
- Effect.gen(function* () {
43
- const messageEncoded = yield* Schema.encode(schema.send)(message)
44
- channel.postMessage(messageEncoded)
45
- })
46
-
47
- // TODO also listen to `messageerror` in parallel
48
- const listen = Stream.fromEventListener<MessageEvent>(channel, 'message').pipe(
49
- Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)),
50
- )
51
-
52
- const closedDeferred = yield* Deferred.make<void>()
53
- const supportsTransferables = false
54
-
55
- return {
56
- [WebChannelSymbol]: WebChannelSymbol,
57
- send,
58
- listen,
59
- closedDeferred,
60
- schema,
61
- supportsTransferables,
62
- }
63
- }).pipe(Effect.withSpan(`WebChannel:broadcastChannel(${channelName})`))
64
-
65
- export const windowChannel = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({
66
- window,
67
- targetOrigin = '*',
68
- schema: inputSchema,
69
- }: {
70
- window: Window
71
- targetOrigin?: string
72
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
73
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope> =>
74
- Effect.gen(function* () {
75
- const schema = mapSchema(inputSchema)
76
-
77
- const send = (message: MsgSend) =>
78
- Effect.gen(function* () {
79
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(schema.send)(message)
80
- window.postMessage(messageEncoded, targetOrigin, transferables)
81
- })
82
-
83
- const listen = Stream.fromEventListener<MessageEvent>(window, 'message').pipe(
84
- Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)),
85
- )
86
-
87
- const closedDeferred = yield* Deferred.make<void>()
88
- const supportsTransferables = true
89
-
90
- return {
91
- [WebChannelSymbol]: WebChannelSymbol,
92
- send,
93
- listen,
94
- closedDeferred,
95
- schema,
96
- supportsTransferables,
97
- }
98
- }).pipe(Effect.withSpan(`WebChannel:windowChannel`))
99
-
100
- export const messagePortChannel: {
101
- <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>(args: {
102
- port: MessagePort
103
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
104
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>
105
- } = ({ port, schema: inputSchema }) =>
106
- Effect.gen(function* () {
107
- const schema = mapSchema(inputSchema)
108
-
109
- const send = (message: any) =>
110
- Effect.gen(function* () {
111
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(schema.send)(message)
112
- port.postMessage(messageEncoded, transferables)
113
- })
114
-
115
- const listen = Stream.fromEventListener<MessageEvent>(port, 'message').pipe(
116
- Stream.map((_) => Schema.decodeEither(schema.listen)(_.data)),
117
- )
118
-
119
- port.start()
120
-
121
- const closedDeferred = yield* Deferred.make<void>()
122
- const supportsTransferables = true
123
-
124
- yield* Effect.addFinalizer(() => Effect.try(() => port.close()).pipe(Effect.ignoreLogged))
125
-
126
- return {
127
- [WebChannelSymbol]: WebChannelSymbol,
128
- send,
129
- listen,
130
- closedDeferred,
131
- schema,
132
- supportsTransferables,
133
- }
134
- }).pipe(Effect.withSpan(`WebChannel:messagePortChannel`))
135
-
136
- export const messagePortChannelWithAck: {
137
- <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>(args: {
138
- port: MessagePort
139
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
140
- }): Effect.Effect<WebChannel<MsgListen, MsgSend>, never, Scope.Scope>
141
- } = ({ port, schema: inputSchema }) =>
142
- Effect.gen(function* () {
143
- const schema = mapSchema(inputSchema)
144
-
145
- type RequestId = string
146
- const requestAckMap = new Map<RequestId, Deferred.Deferred<void>>()
147
-
148
- const ChannelRequest = Schema.TaggedStruct('ChannelRequest', {
149
- id: Schema.String,
150
- payload: Schema.Union(schema.listen, schema.send),
151
- })
152
- const ChannelRequestAck = Schema.TaggedStruct('ChannelRequestAck', {
153
- reqId: Schema.String,
154
- })
155
- const ChannelMessage = Schema.Union(ChannelRequest, ChannelRequestAck)
156
- type ChannelMessage = typeof ChannelMessage.Type
157
-
158
- const send = (message: any) =>
159
- Effect.gen(function* () {
160
- const id = crypto.randomUUID()
161
- const [messageEncoded, transferables] = yield* Schema.encodeWithTransferables(ChannelMessage)({
162
- _tag: 'ChannelRequest',
163
- id,
164
- payload: message,
165
- })
166
-
167
- const ack = yield* Deferred.make<void>()
168
- requestAckMap.set(id, ack)
169
-
170
- port.postMessage(messageEncoded, transferables)
171
-
172
- yield* ack
173
-
174
- requestAckMap.delete(id)
175
- })
176
-
177
- const listen = Stream.fromEventListener<MessageEvent>(port, 'message').pipe(
178
- Stream.map((_) => Schema.decodeEither(ChannelMessage)(_.data)),
179
- Stream.tap((msg) =>
180
- Effect.gen(function* () {
181
- if (msg._tag === 'Right') {
182
- if (msg.right._tag === 'ChannelRequestAck') {
183
- yield* Deferred.succeed(requestAckMap.get(msg.right.reqId)!, void 0)
184
- } else if (msg.right._tag === 'ChannelRequest') {
185
- port.postMessage(Schema.encodeSync(ChannelMessage)({ _tag: 'ChannelRequestAck', reqId: msg.right.id }))
186
- }
187
- }
188
- }),
189
- ),
190
- Stream.filterMap((msg) =>
191
- msg._tag === 'Left'
192
- ? Option.some(msg as any)
193
- : msg.right._tag === 'ChannelRequest'
194
- ? Option.some(Either.right(msg.right.payload))
195
- : Option.none(),
196
- ),
197
- )
198
-
199
- port.start()
200
-
201
- const closedDeferred = yield* Deferred.make<void>()
202
- const supportsTransferables = true
203
-
204
- yield* Effect.addFinalizer(() => Effect.try(() => port.close()).pipe(Effect.ignoreLogged))
205
-
206
- return {
207
- [WebChannelSymbol]: WebChannelSymbol,
208
- send,
209
- listen,
210
- closedDeferred,
211
- schema,
212
- supportsTransferables,
213
- }
214
- }).pipe(Effect.withSpan(`WebChannel:messagePortChannelWithAck`))
215
-
216
- export type InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded> =
217
- | Schema.Schema<MsgListen | MsgSend, MsgListenEncoded | MsgSendEncoded>
218
- | {
219
- listen: Schema.Schema<MsgListen, MsgListenEncoded>
220
- send: Schema.Schema<MsgSend, MsgSendEncoded>
221
- }
222
-
223
- export const mapSchema = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>(
224
- schema: InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>,
225
- ): {
226
- listen: Schema.Schema<MsgListen, MsgListenEncoded>
227
- send: Schema.Schema<MsgSend, MsgSendEncoded>
228
- } =>
229
- Predicate.hasProperty(schema, 'send') && Predicate.hasProperty(schema, 'listen')
230
- ? { send: schema.send, listen: schema.listen }
231
- : ({ send: schema, listen: schema } as any)
232
-
233
- export type QueueChannelProxy<MsgListen, MsgSend> = {
234
- /** Only meant to be used externally */
235
- webChannel: WebChannel<MsgListen, MsgSend>
236
- /**
237
- * Meant to be listened to (e.g. via `Stream.fromQueue`) for messages that have been sent
238
- * via `webChannel.send()`.
239
- */
240
- sendQueue: Queue.Dequeue<MsgSend>
241
- /**
242
- * Meant to be pushed to (e.g. via `Queue.offer`) for messages that will be received
243
- * via `webChannel.listen()`.
244
- */
245
- listenQueue: Queue.Enqueue<MsgListen>
246
- }
247
-
248
- /**
249
- * From the outside the `sendQueue` is only accessible read-only,
250
- * and the `listenQueue` is only accessible write-only.
251
- */
252
- export const queueChannelProxy = <MsgListen, MsgSend>({
253
- schema: inputSchema,
254
- }: {
255
- schema:
256
- | Schema.Schema<MsgListen | MsgSend, any>
257
- | { listen: Schema.Schema<MsgListen, any>; send: Schema.Schema<MsgSend, any> }
258
- }): Effect.Effect<QueueChannelProxy<MsgListen, MsgSend>, never, Scope.Scope> =>
259
- Effect.gen(function* () {
260
- const sendQueue = yield* Queue.unbounded<MsgSend>().pipe(Effect.acquireRelease(Queue.shutdown))
261
- const listenQueue = yield* Queue.unbounded<MsgListen>().pipe(Effect.acquireRelease(Queue.shutdown))
262
-
263
- const send = (message: MsgSend) => Queue.offer(sendQueue, message)
264
-
265
- const listen = Stream.fromQueue(listenQueue).pipe(Stream.map(Either.right))
266
-
267
- const closedDeferred = yield* Deferred.make<void>()
268
- const supportsTransferables = true
269
-
270
- const schema = mapSchema(inputSchema)
271
-
272
- const webChannel = {
273
- [WebChannelSymbol]: WebChannelSymbol,
274
- send,
275
- listen,
276
- closedDeferred,
277
- schema,
278
- supportsTransferables,
279
- }
280
-
281
- return { webChannel, sendQueue, listenQueue }
282
- })
283
-
284
- // export const proxy = <MsgListen, MsgSend>({
285
- // originWebChannel,
286
- // proxyWebChannel,
287
- // }: {
288
- // originWebChannel: WebChannel<MsgListen, MsgSend>
289
- // proxyWebChannel: QueueChannelProxy<MsgListen, MsgSend>
290
- // }) =>
291
- // Effect.gen(function* () {
292
- // const proxyListen = originWebChannel.listen.pipe(
293
- // Stream.flatten(),
294
- // Stream.tap((_) => Queue.offer(proxyWebChannel.listenQueue, _)),
295
- // Stream.runDrain,
296
- // )
297
-
298
- // const proxySend = proxyWebChannel.sendQueue.pipe(
299
- // Stream.fromQueue,
300
- // Stream.tap(originWebChannel.send),
301
- // Stream.runDrain,
302
- // )
303
-
304
- // yield* Effect.all([proxyListen, proxySend], { concurrency: 2 })
305
- // })
@@ -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
- })
@@ -1,93 +0,0 @@
1
- /// <reference lib="es2024" />
2
- import * as NodePlatform from '@effect/platform-node'
3
- import { Deferred, Effect, FiberSet, Logger, Ref, Scheduler } from 'effect'
4
-
5
- const main = Effect.gen(function* () {
6
- const semaphore = yield* Effect.makeSemaphore(1)
7
-
8
- const fiberset = yield* FiberSet.make()
9
-
10
- // setInterval(() => {
11
- // // semaphore.release(1)
12
- // }, 1_000_000)
13
-
14
- const stateRef = yield* Ref.make<'open' | 'closed'>('open')
15
-
16
- // let counter = 0
17
- // const nextExpectedCounter = 0
18
- // const def = Promise.withResolvers()
19
-
20
- const finished = yield* Deferred.make<void>()
21
-
22
- const MAX = 100
23
-
24
- const doWorkWithSemaphore = (counter: number) =>
25
- Effect.gen(function* () {
26
- // yield* Effect.log(`doWorkWithSemaphore: ${counter} - waiting for semaphore`)
27
- // yield* semaphore.take(1)
28
- // if (counter !== nextExpectedCounter) {
29
- // throw new Error(`Expected counter ${nextExpectedCounter} but got ${counter}`)
30
- // }
31
- // nextExpectedCounter = counter + 1
32
- yield* Effect.log(`doWorkWithSemaphore: ${counter} - got semaphore`)
33
- // setTimeout(() => {}, 120)
34
- yield* Effect.sleep(40)
35
- // yield* Effect.yieldNow()
36
- yield* Effect.log(`doWorkWithSemaphore: ${counter} - releasing semaphore`)
37
- yield* Ref.set(stateRef, 'open')
38
- yield* semaphore.release(1)
39
-
40
- if (counter === MAX - 1) {
41
- yield* Deferred.succeed(finished, undefined)
42
- // def.resolve(undefined)
43
- }
44
- }).pipe(Effect.scoped)
45
-
46
- for (let i = 0; i < MAX; i++) {
47
- yield* doWorkWithSemaphore(i).pipe(FiberSet.run(fiberset))
48
- // yield* Effect.sleep(20)
49
- yield* Effect.gen(function* () {
50
- const state = yield* Ref.get(stateRef)
51
- if (state === 'open') {
52
- yield* Effect.logWarning(`loop: ${i} - semaphore is open, taking`)
53
- } else {
54
- yield* Effect.log(`loop: ${i} - semaphore is closed, waiting`)
55
- }
56
-
57
- yield* semaphore.take(1)
58
- yield* Ref.set(stateRef, 'closed')
59
-
60
- yield* doWorkWithSemaphore(i).pipe(Effect.fork)
61
-
62
- const sleepTime = Math.random() * 40
63
- yield* Effect.log(`loop: ${i} - sleeping for ${sleepTime}ms`)
64
- yield* Effect.sleep(sleepTime)
65
-
66
- // yield* Effect.yieldNow()
67
- }).pipe(FiberSet.run(fiberset))
68
- }
69
-
70
- // yield* Effect.never
71
-
72
- yield* finished
73
- // yield* Effect.promise(() => def.promise)
74
- // console.log('finished')
75
- })
76
-
77
- export const messageChannel = (shouldYield: Scheduler.Scheduler['shouldYield'] = Scheduler.defaultShouldYield) =>
78
- Scheduler.makeBatched((task) => {
79
- const messageChannel = new MessageChannel()
80
-
81
- messageChannel.port1.postMessage(undefined)
82
-
83
- // eslint-disable-next-line unicorn/prefer-add-event-listener
84
- messageChannel.port2.onmessage = task
85
- }, shouldYield)
86
-
87
- main.pipe(
88
- Effect.scoped,
89
- Effect.provide(Logger.pretty),
90
- Effect.tapErrorCause(Effect.logError),
91
- Effect.withScheduler(messageChannel()),
92
- NodePlatform.NodeRuntime.runMain,
93
- )
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "rootDir": "./src",
5
- "outDir": "./dist",
6
- "tsBuildInfoFile": "./dist/.tsbuildinfo.json"
7
- },
8
- "include": ["./src"],
9
- "references": [{ "path": "../db-schema"}]
10
- }