@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
@@ -0,0 +1,155 @@
1
+ // Fork of effect/Subscribable.ts which makes Subscribable yieldable
2
+
3
+ /**
4
+ * @since 2.0.0
5
+ */
6
+
7
+ import type { SubscriptionRef } from 'effect'
8
+ import { Effect, Effectable, Readable, Stream } from 'effect'
9
+ import { dual } from 'effect/Function'
10
+ import { hasProperty } from 'effect/Predicate'
11
+
12
+ /**
13
+ * @since 2.0.0
14
+ * @category type ids
15
+ */
16
+ export const TypeId: unique symbol = Symbol.for('effect/Subscribable')
17
+
18
+ /**
19
+ * @since 2.0.0
20
+ * @category type ids
21
+ */
22
+ export type TypeId = typeof TypeId
23
+
24
+ /**
25
+ * @since 2.0.0
26
+ * @category models
27
+ */
28
+ export interface Subscribable<A, E = never, R = never> extends Readable.Readable<A, E, R>, Effect.Effect<A, E, R> {
29
+ readonly [TypeId]: TypeId
30
+ readonly changes: Stream.Stream<A, E, R>
31
+ }
32
+
33
+ /**
34
+ * @since 2.0.0
35
+ * @category refinements
36
+ */
37
+ export const isSubscribable = (u: unknown): u is Subscribable<unknown, unknown, unknown> => hasProperty(u, TypeId)
38
+
39
+ // const Proto: Omit<Subscribable<any>, 'get' | 'changes'> = {
40
+ // [Readable.TypeId]: Readable.TypeId,
41
+ // [TypeId]: TypeId,
42
+ // pipe() {
43
+ // return pipeArguments(this, arguments)
44
+ // },
45
+ // }
46
+
47
+ class SubscribableImpl<in out A> extends Effectable.Class<A> implements Subscribable<A> {
48
+ // @ts-expect-error type symbol
49
+ readonly [TypeId] = TypeId
50
+ // @ts-expect-error type symbol
51
+ readonly [Readable.TypeId] = Readable.TypeId
52
+ constructor(
53
+ readonly get: Effect.Effect<A>,
54
+ readonly changes: Stream.Stream<A>,
55
+ ) {
56
+ super()
57
+ }
58
+ // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
59
+ commit() {
60
+ return this.get
61
+ }
62
+ }
63
+
64
+ /**
65
+ * @since 2.0.0
66
+ * @category constructors
67
+ */
68
+ // export const make = <A, E, R>(options: {
69
+ // readonly get: Effect.Effect<A, E, R>
70
+ // readonly changes: Stream.Stream<A, E, R>
71
+ // }): Subscribable<A, E, R> => Object.assign(Object.create(Proto), options)
72
+
73
+ export const make = <A, E, R>(options: {
74
+ readonly get: Effect.Effect<A, E, R>
75
+ readonly changes: Stream.Stream<A, E, R>
76
+ }): Subscribable<A, E, R> => new SubscribableImpl(options.get as any, options.changes as any) as Subscribable<A, E, R>
77
+
78
+ export const fromSubscriptionRef = <A>(ref: SubscriptionRef.SubscriptionRef<A>): Subscribable<A> =>
79
+ make({
80
+ get: ref.get,
81
+ changes: ref.changes,
82
+ })
83
+
84
+ /**
85
+ * @since 2.0.0
86
+ * @category combinators
87
+ */
88
+ export const map: {
89
+ /**
90
+ * @since 2.0.0
91
+ * @category combinators
92
+ */
93
+ <A, B>(f: (a: NoInfer<A>) => B): <E, R>(fa: Subscribable<A, E, R>) => Subscribable<B, E, R>
94
+ /**
95
+ * @since 2.0.0
96
+ * @category combinators
97
+ */
98
+ <A, E, R, B>(self: Subscribable<A, E, R>, f: (a: NoInfer<A>) => B): Subscribable<B, E, R>
99
+ } = dual(
100
+ 2,
101
+ <A, E, R, B>(self: Subscribable<A, E, R>, f: (a: NoInfer<A>) => B): Subscribable<B, E, R> =>
102
+ make({
103
+ get: Effect.map(self.get, f),
104
+ changes: Stream.map(self.changes, f),
105
+ }),
106
+ )
107
+
108
+ /**
109
+ * @since 2.0.0
110
+ * @category combinators
111
+ */
112
+ export const mapEffect: {
113
+ /**
114
+ * @since 2.0.0
115
+ * @category combinators
116
+ */
117
+ <A, B, E2, R2>(
118
+ f: (a: NoInfer<A>) => Effect.Effect<B, E2, R2>,
119
+ ): <E, R>(fa: Subscribable<A, E, R>) => Subscribable<B, E | E2, R | R2>
120
+ /**
121
+ * @since 2.0.0
122
+ * @category combinators
123
+ */
124
+ <A, E, R, B, E2, R2>(
125
+ self: Subscribable<A, E, R>,
126
+ f: (a: NoInfer<A>) => Effect.Effect<B, E2, R2>,
127
+ ): Subscribable<B, E | E2, R | R2>
128
+ } = dual(
129
+ 2,
130
+ <A, E, R, B, E2, R2>(
131
+ self: Subscribable<A, E, R>,
132
+ f: (a: NoInfer<A>) => Effect.Effect<B, E2, R2>,
133
+ ): Subscribable<B, E | E2, R | R2> =>
134
+ make({
135
+ get: Effect.flatMap(self.get, f),
136
+ changes: Stream.mapEffect(self.changes, f),
137
+ }),
138
+ )
139
+
140
+ /**
141
+ * @since 2.0.0
142
+ * @category constructors
143
+ */
144
+ export const unwrap = <A, E, R, E1, R1>(
145
+ effect: Effect.Effect<Subscribable<A, E, R>, E1, R1>,
146
+ ): Subscribable<A, E | E1, R | R1> =>
147
+ make({
148
+ get: Effect.flatMap(effect, (s) => s.get),
149
+ changes: Stream.unwrap(Effect.map(effect, (s) => s.changes)),
150
+ })
151
+
152
+ export const never = make({
153
+ get: Effect.never,
154
+ changes: Stream.never,
155
+ })
@@ -0,0 +1,106 @@
1
+ import * as Vitest from '@effect/vitest'
2
+ import { Effect, Schema, Stream } from 'effect'
3
+ import { JSDOM } from 'jsdom'
4
+
5
+ import * as WebChannel from './WebChannel.js'
6
+
7
+ Vitest.describe('WebChannel', () => {
8
+ Vitest.describe('windowChannel', () => {
9
+ Vitest.scopedLive('should work with 2 windows', () =>
10
+ Effect.gen(function* () {
11
+ const windowA = new JSDOM().window as unknown as globalThis.Window
12
+ const windowB = new JSDOM().window as unknown as globalThis.Window
13
+
14
+ const codeSideA = Effect.gen(function* () {
15
+ const channelToB = yield* WebChannel.windowChannel({
16
+ listenWindow: windowA,
17
+ sendWindow: windowB,
18
+ ids: { own: 'a', other: 'b' },
19
+ schema: Schema.Number,
20
+ })
21
+
22
+ const msgFromBFiber = yield* channelToB.listen.pipe(
23
+ Stream.flatten(),
24
+ Stream.runHead,
25
+ Effect.flatten,
26
+ Effect.fork,
27
+ )
28
+
29
+ yield* channelToB.send(1)
30
+
31
+ Vitest.expect(yield* msgFromBFiber).toEqual(2)
32
+ })
33
+
34
+ const codeSideB = Effect.gen(function* () {
35
+ const channelToA = yield* WebChannel.windowChannel({
36
+ listenWindow: windowB,
37
+ sendWindow: windowA,
38
+ ids: { own: 'b', other: 'a' },
39
+ schema: Schema.Number,
40
+ })
41
+
42
+ const msgFromAFiber = yield* channelToA.listen.pipe(
43
+ Stream.flatten(),
44
+ Stream.runHead,
45
+ Effect.flatten,
46
+ Effect.fork,
47
+ )
48
+
49
+ yield* channelToA.send(2)
50
+
51
+ Vitest.expect(yield* msgFromAFiber).toEqual(1)
52
+ })
53
+
54
+ yield* Effect.all([codeSideA, codeSideB], { concurrency: 'unbounded' })
55
+ }),
56
+ )
57
+
58
+ Vitest.scopedLive('should work with the same window', () =>
59
+ Effect.gen(function* () {
60
+ const window = new JSDOM().window as unknown as globalThis.Window
61
+
62
+ const codeSideA = Effect.gen(function* () {
63
+ const channelToB = yield* WebChannel.windowChannel({
64
+ listenWindow: window,
65
+ sendWindow: window,
66
+ ids: { own: 'a', other: 'b' },
67
+ schema: Schema.Number,
68
+ })
69
+
70
+ const msgFromBFiber = yield* channelToB.listen.pipe(
71
+ Stream.flatten(),
72
+ Stream.runHead,
73
+ Effect.flatten,
74
+ Effect.fork,
75
+ )
76
+
77
+ yield* channelToB.send(1)
78
+
79
+ Vitest.expect(yield* msgFromBFiber).toEqual(2)
80
+ })
81
+
82
+ const codeSideB = Effect.gen(function* () {
83
+ const channelToA = yield* WebChannel.windowChannel({
84
+ listenWindow: window,
85
+ sendWindow: window,
86
+ ids: { own: 'b', other: 'a' },
87
+ schema: Schema.Number,
88
+ })
89
+
90
+ const msgFromAFiber = yield* channelToA.listen.pipe(
91
+ Stream.flatten(),
92
+ Stream.runHead,
93
+ Effect.flatten,
94
+ Effect.fork,
95
+ )
96
+
97
+ yield* channelToA.send(2)
98
+
99
+ Vitest.expect(yield* msgFromAFiber).toEqual(1)
100
+ })
101
+
102
+ yield* Effect.all([codeSideA, codeSideB], { concurrency: 'unbounded' })
103
+ }),
104
+ )
105
+ })
106
+ })