liminal 0.17.0 → 0.17.1

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 (287) hide show
  1. package/Accumulator.ts +97 -0
  2. package/Actor.ts +118 -0
  3. package/Audition.ts +105 -0
  4. package/CHANGELOG.md +2 -212
  5. package/Client.ts +560 -0
  6. package/ClientHandle.ts +39 -0
  7. package/F.ts +18 -0
  8. package/Method.ts +39 -0
  9. package/Protocol.ts +142 -0
  10. package/Send.ts +8 -0
  11. package/_constants.ts +1 -0
  12. package/_types.ts +27 -0
  13. package/_util/Mutex.ts +13 -0
  14. package/_util/phantom.ts +1 -0
  15. package/dist/Accumulator.d.ts +22 -0
  16. package/dist/Accumulator.js +33 -0
  17. package/dist/Accumulator.js.map +1 -0
  18. package/dist/Actor.d.ts +30 -0
  19. package/dist/Actor.js +31 -0
  20. package/dist/Actor.js.map +1 -0
  21. package/dist/Audition.d.ts +18 -0
  22. package/dist/Audition.js +27 -0
  23. package/dist/Audition.js.map +1 -0
  24. package/dist/Client.d.ts +65 -0
  25. package/dist/Client.js +248 -0
  26. package/dist/Client.js.map +1 -0
  27. package/dist/ClientHandle.d.ts +18 -0
  28. package/dist/ClientHandle.js +10 -0
  29. package/dist/ClientHandle.js.map +1 -0
  30. package/dist/F.d.ts +13 -0
  31. package/dist/F.js +4 -0
  32. package/dist/F.js.map +1 -0
  33. package/dist/Method.d.ts +23 -0
  34. package/dist/Method.js +4 -0
  35. package/dist/Method.js.map +1 -0
  36. package/dist/Protocol.d.ts +96 -0
  37. package/dist/Protocol.js +13 -0
  38. package/dist/Protocol.js.map +1 -0
  39. package/dist/Send.d.ts +3 -0
  40. package/dist/Send.js +2 -0
  41. package/dist/Send.js.map +1 -0
  42. package/dist/_constants.d.ts +1 -0
  43. package/dist/_constants.js +2 -0
  44. package/dist/_constants.js.map +1 -0
  45. package/dist/_types.d.ts +22 -0
  46. package/dist/_types.js +2 -0
  47. package/dist/_types.js.map +1 -0
  48. package/dist/_util/Mutex.d.ts +7 -0
  49. package/dist/_util/Mutex.js +9 -0
  50. package/dist/_util/Mutex.js.map +1 -0
  51. package/dist/_util/phantom.d.ts +3 -0
  52. package/dist/_util/phantom.js +2 -0
  53. package/dist/_util/phantom.js.map +1 -0
  54. package/dist/errors.d.ts +20 -0
  55. package/dist/errors.js +13 -0
  56. package/dist/errors.js.map +1 -0
  57. package/dist/experimental/BranchLive.d.ts +3 -0
  58. package/dist/experimental/BranchLive.js +5 -0
  59. package/dist/experimental/BranchLive.js.map +1 -0
  60. package/dist/experimental/L/L.d.ts +11 -0
  61. package/dist/experimental/L/L.js +12 -0
  62. package/dist/experimental/L/L.js.map +1 -0
  63. package/dist/experimental/L/append.d.ts +3 -0
  64. package/dist/experimental/L/append.js +4 -0
  65. package/dist/experimental/L/append.js.map +1 -0
  66. package/dist/experimental/L/assistant.d.ts +3 -0
  67. package/dist/experimental/L/assistant.js +13 -0
  68. package/dist/experimental/L/assistant.js.map +1 -0
  69. package/dist/experimental/L/assistantSchema.d.ts +3 -0
  70. package/dist/experimental/L/assistantSchema.js +13 -0
  71. package/dist/experimental/L/assistantSchema.js.map +1 -0
  72. package/dist/experimental/L/assistantStream.d.ts +3 -0
  73. package/dist/experimental/L/assistantStream.js +5 -0
  74. package/dist/experimental/L/assistantStream.js.map +1 -0
  75. package/dist/experimental/L/branch.d.ts +2 -0
  76. package/dist/experimental/L/branch.js +4 -0
  77. package/dist/experimental/L/branch.js.map +1 -0
  78. package/dist/experimental/L/clear.d.ts +3 -0
  79. package/dist/experimental/L/clear.js +7 -0
  80. package/dist/experimental/L/clear.js.map +1 -0
  81. package/dist/experimental/L/history.d.ts +3 -0
  82. package/dist/experimental/L/history.js +4 -0
  83. package/dist/experimental/L/history.js.map +1 -0
  84. package/dist/experimental/L/init.d.ts +3 -0
  85. package/dist/experimental/L/init.js +4 -0
  86. package/dist/experimental/L/init.js.map +1 -0
  87. package/dist/experimental/L/matrix.d.ts +10 -0
  88. package/dist/experimental/L/matrix.js +6 -0
  89. package/dist/experimental/L/matrix.js.map +1 -0
  90. package/dist/experimental/L/system.d.ts +1 -0
  91. package/dist/experimental/L/system.js +4 -0
  92. package/dist/experimental/L/system.js.map +1 -0
  93. package/dist/experimental/L/user.d.ts +1 -0
  94. package/dist/experimental/L/user.js +6 -0
  95. package/dist/experimental/L/user.js.map +1 -0
  96. package/dist/experimental/Loader.d.ts +16 -0
  97. package/dist/experimental/Loader.js +20 -0
  98. package/dist/experimental/Loader.js.map +1 -0
  99. package/dist/experimental/TaggedTemplateFunction.d.ts +11 -0
  100. package/dist/experimental/TaggedTemplateFunction.js +14 -0
  101. package/dist/experimental/TaggedTemplateFunction.js.map +1 -0
  102. package/dist/experimental/Template.d.ts +32 -0
  103. package/dist/experimental/Template.js +58 -0
  104. package/dist/experimental/Template.js.map +1 -0
  105. package/dist/experimental/index.d.ts +4 -0
  106. package/dist/experimental/index.js +5 -0
  107. package/dist/experimental/index.js.map +1 -0
  108. package/dist/index.d.ts +9 -7
  109. package/dist/index.js +9 -7
  110. package/dist/index.js.map +1 -1
  111. package/dist/tsconfig.tsbuildinfo +1 -1
  112. package/errors.ts +14 -0
  113. package/experimental/BranchLive.ts +6 -0
  114. package/experimental/L/L.ts +11 -0
  115. package/experimental/L/append.ts +12 -0
  116. package/experimental/L/assistant.ts +16 -0
  117. package/experimental/L/assistantSchema.ts +18 -0
  118. package/experimental/L/assistantStream.ts +9 -0
  119. package/experimental/L/branch.ts +5 -0
  120. package/experimental/L/clear.ts +7 -0
  121. package/experimental/L/history.ts +4 -0
  122. package/experimental/L/init.ts +4 -0
  123. package/experimental/L/matrix.ts +26 -0
  124. package/experimental/L/system.ts +5 -0
  125. package/experimental/L/user.ts +10 -0
  126. package/experimental/Loader.ts +35 -0
  127. package/experimental/TaggedTemplateFunction.ts +44 -0
  128. package/experimental/Template.ts +93 -0
  129. package/experimental/index.ts +4 -0
  130. package/index.ts +9 -7
  131. package/package.json +21 -30
  132. package/tsconfig.json +9 -0
  133. package/Digest.ts +0 -30
  134. package/Envelope.ts +0 -16
  135. package/F/F.ts +0 -1
  136. package/L/L.ts +0 -20
  137. package/L/append.ts +0 -14
  138. package/L/assistant.ts +0 -30
  139. package/L/assistantSchema.ts +0 -61
  140. package/L/assistantStream.ts +0 -22
  141. package/L/branch.ts +0 -20
  142. package/L/clear.ts +0 -14
  143. package/L/disable.ts +0 -13
  144. package/L/enable.ts +0 -24
  145. package/L/events.ts +0 -11
  146. package/L/json.ts +0 -12
  147. package/L/line.ts +0 -22
  148. package/L/listen.ts +0 -26
  149. package/L/messages.ts +0 -10
  150. package/L/prev.ts +0 -4
  151. package/L/provide.ts +0 -10
  152. package/L/self.ts +0 -5
  153. package/L/send.ts +0 -56
  154. package/L/system.ts +0 -25
  155. package/L/thread.ts +0 -16
  156. package/L/toolkit.ts +0 -14
  157. package/L/user.test.ts +0 -33
  158. package/L/user.ts +0 -32
  159. package/LEvent.ts +0 -33
  160. package/Thread.ts +0 -67
  161. package/dist/Digest.d.ts +0 -17
  162. package/dist/Digest.js +0 -7
  163. package/dist/Digest.js.map +0 -1
  164. package/dist/Envelope.d.ts +0 -13
  165. package/dist/Envelope.js +0 -2
  166. package/dist/Envelope.js.map +0 -1
  167. package/dist/F/F.d.ts +0 -1
  168. package/dist/F/F.js +0 -2
  169. package/dist/F/F.js.map +0 -1
  170. package/dist/L/L.d.ts +0 -20
  171. package/dist/L/L.js +0 -21
  172. package/dist/L/L.js.map +0 -1
  173. package/dist/L/append.d.ts +0 -5
  174. package/dist/L/append.js +0 -10
  175. package/dist/L/append.js.map +0 -1
  176. package/dist/L/assistant.d.ts +0 -6
  177. package/dist/L/assistant.js +0 -26
  178. package/dist/L/assistant.js.map +0 -1
  179. package/dist/L/assistantSchema.d.ts +0 -13
  180. package/dist/L/assistantSchema.js +0 -44
  181. package/dist/L/assistantSchema.js.map +0 -1
  182. package/dist/L/assistantStream.d.ts +0 -7
  183. package/dist/L/assistantStream.js +0 -17
  184. package/dist/L/assistantStream.js.map +0 -1
  185. package/dist/L/branch.d.ts +0 -3
  186. package/dist/L/branch.js +0 -19
  187. package/dist/L/branch.js.map +0 -1
  188. package/dist/L/clear.d.ts +0 -5
  189. package/dist/L/clear.js +0 -12
  190. package/dist/L/clear.js.map +0 -1
  191. package/dist/L/disable.d.ts +0 -4
  192. package/dist/L/disable.js +0 -10
  193. package/dist/L/disable.js.map +0 -1
  194. package/dist/L/enable.d.ts +0 -5
  195. package/dist/L/enable.js +0 -13
  196. package/dist/L/enable.js.map +0 -1
  197. package/dist/L/events.d.ts +0 -5
  198. package/dist/L/events.js +0 -6
  199. package/dist/L/events.js.map +0 -1
  200. package/dist/L/json.d.ts +0 -5
  201. package/dist/L/json.js +0 -8
  202. package/dist/L/json.js.map +0 -1
  203. package/dist/L/line.d.ts +0 -5
  204. package/dist/L/line.js +0 -11
  205. package/dist/L/line.js.map +0 -1
  206. package/dist/L/listen.d.ts +0 -7
  207. package/dist/L/listen.js +0 -14
  208. package/dist/L/listen.js.map +0 -1
  209. package/dist/L/messages.d.ts +0 -5
  210. package/dist/L/messages.js +0 -5
  211. package/dist/L/messages.js.map +0 -1
  212. package/dist/L/prev.d.ts +0 -5
  213. package/dist/L/prev.js +0 -5
  214. package/dist/L/prev.js.map +0 -1
  215. package/dist/L/provide.d.ts +0 -3
  216. package/dist/L/provide.js +0 -4
  217. package/dist/L/provide.js.map +0 -1
  218. package/dist/L/self.d.ts +0 -3
  219. package/dist/L/self.js +0 -4
  220. package/dist/L/self.js.map +0 -1
  221. package/dist/L/send.d.ts +0 -6
  222. package/dist/L/send.js +0 -34
  223. package/dist/L/send.js.map +0 -1
  224. package/dist/L/system.d.ts +0 -5
  225. package/dist/L/system.js +0 -14
  226. package/dist/L/system.js.map +0 -1
  227. package/dist/L/thread.d.ts +0 -3
  228. package/dist/L/thread.js +0 -15
  229. package/dist/L/thread.js.map +0 -1
  230. package/dist/L/toolkit.d.ts +0 -4
  231. package/dist/L/toolkit.js +0 -9
  232. package/dist/L/toolkit.js.map +0 -1
  233. package/dist/L/user.d.ts +0 -6
  234. package/dist/L/user.js +0 -13
  235. package/dist/L/user.js.map +0 -1
  236. package/dist/L/user.test.d.ts +0 -1
  237. package/dist/L/user.test.js.map +0 -1
  238. package/dist/LEvent.d.ts +0 -154
  239. package/dist/LEvent.js +0 -19
  240. package/dist/LEvent.js.map +0 -1
  241. package/dist/Thread.d.ts +0 -52
  242. package/dist/Thread.js +0 -32
  243. package/dist/Thread.js.map +0 -1
  244. package/dist/patterns/Debate.d.ts +0 -1
  245. package/dist/patterns/Debate.js +0 -3
  246. package/dist/patterns/Debate.js.map +0 -1
  247. package/dist/patterns/Model.d.ts +0 -6
  248. package/dist/patterns/Model.js +0 -14
  249. package/dist/patterns/Model.js.map +0 -1
  250. package/dist/patterns/Route.d.ts +0 -3
  251. package/dist/patterns/Route.js +0 -14
  252. package/dist/patterns/Route.js.map +0 -1
  253. package/dist/util/JsonValue.d.ts +0 -8
  254. package/dist/util/JsonValue.js +0 -109
  255. package/dist/util/JsonValue.js.map +0 -1
  256. package/dist/util/NeverTool.d.ts +0 -3
  257. package/dist/util/NeverTool.js +0 -3
  258. package/dist/util/NeverTool.js.map +0 -1
  259. package/dist/util/Taggable.d.ts +0 -6
  260. package/dist/util/Taggable.js +0 -13
  261. package/dist/util/Taggable.js.map +0 -1
  262. package/dist/util/extract.d.ts +0 -3
  263. package/dist/util/extract.js +0 -2
  264. package/dist/util/extract.js.map +0 -1
  265. package/dist/util/messageCodec.d.ts +0 -98
  266. package/dist/util/messageCodec.js +0 -5
  267. package/dist/util/messageCodec.js.map +0 -1
  268. package/dist/util/normalizeRaw.d.ts +0 -4
  269. package/dist/util/normalizeRaw.js +0 -75
  270. package/dist/util/normalizeRaw.js.map +0 -1
  271. package/dist/util/prefix.d.ts +0 -1
  272. package/dist/util/prefix.js +0 -2
  273. package/dist/util/prefix.js.map +0 -1
  274. package/dist/util/raw.d.ts +0 -6
  275. package/dist/util/raw.js +0 -5
  276. package/dist/util/raw.js.map +0 -1
  277. package/patterns/Debate.ts +0 -2
  278. package/patterns/Model.ts +0 -29
  279. package/patterns/Route.ts +0 -25
  280. package/util/JsonValue.ts +0 -144
  281. package/util/NeverTool.ts +0 -10
  282. package/util/Taggable.ts +0 -33
  283. package/util/extract.ts +0 -7
  284. package/util/messageCodec.ts +0 -5
  285. package/util/normalizeRaw.ts +0 -93
  286. package/util/prefix.ts +0 -1
  287. package/util/raw.ts +0 -27
package/Protocol.ts ADDED
@@ -0,0 +1,142 @@
1
+ import { Schema as S } from "effect"
2
+
3
+ import type { FieldsRecord } from "./_types.ts"
4
+ import type { MethodDefinition } from "./Method.ts"
5
+
6
+ export declare namespace Call {
7
+ export namespace Payload {
8
+ export type Type<MethodDefinitions extends Record<string, MethodDefinition.Any>> = {
9
+ readonly _tag: "Call.Payload"
10
+
11
+ readonly id: number
12
+
13
+ readonly payload: {
14
+ [K in keyof MethodDefinitions]: {
15
+ readonly _tag: K
16
+ readonly value: S.Struct<MethodDefinitions[K]["payload"]>["Type"]
17
+ }
18
+ }[keyof MethodDefinitions]
19
+ }
20
+
21
+ export type Encoded<MethodDefinitions extends Record<string, MethodDefinition.Any>> = {
22
+ readonly _tag: "Call.Payload"
23
+
24
+ readonly id: number
25
+
26
+ readonly payload: {
27
+ [K in keyof MethodDefinitions]: {
28
+ readonly _tag: K
29
+ readonly value: S.Struct<MethodDefinitions[K]["payload"]>["Encoded"]
30
+ }
31
+ }[keyof MethodDefinitions]
32
+ }
33
+ }
34
+
35
+ export namespace Success {
36
+ export type Type<MethodDefinitions extends Record<string, MethodDefinition.Any>> = {
37
+ readonly _tag: "Call.Success"
38
+
39
+ readonly id: number
40
+
41
+ readonly value: {
42
+ readonly [K in keyof MethodDefinitions]: {
43
+ readonly _tag: K
44
+ readonly value: MethodDefinitions[K]["success"]["Type"]
45
+ }
46
+ }[keyof MethodDefinitions]
47
+ }
48
+
49
+ export type Encoded<MethodDefinitions extends Record<string, MethodDefinition.Any>> = {
50
+ readonly _tag: "Call.Success"
51
+
52
+ readonly id: number
53
+
54
+ readonly value: {
55
+ readonly [K in keyof MethodDefinitions]: {
56
+ readonly _tag: K
57
+ readonly value: MethodDefinitions[K]["success"]["Encoded"]
58
+ }
59
+ }[keyof MethodDefinitions]
60
+ }
61
+ }
62
+
63
+ export namespace Failure {
64
+ export type Type<MethodDefinitions extends Record<string, MethodDefinition.Any>> = {
65
+ readonly _tag: "Call.Failure"
66
+
67
+ readonly id: number
68
+
69
+ readonly cause: {
70
+ readonly [K in keyof MethodDefinitions]: {
71
+ readonly _tag: K
72
+ readonly value: MethodDefinitions[K]["failure"]["Type"]
73
+ }
74
+ }[keyof MethodDefinitions]
75
+ }
76
+
77
+ export type Encoded<MethodDefinitions extends Record<string, MethodDefinition.Any>> = {
78
+ readonly _tag: "Call.Failure"
79
+
80
+ readonly id: number
81
+
82
+ readonly cause: {
83
+ readonly [K in keyof MethodDefinitions]: {
84
+ readonly _tag: K
85
+ readonly value: MethodDefinitions[K]["failure"]["Encoded"]
86
+ }
87
+ }[keyof MethodDefinitions]
88
+ }
89
+ }
90
+ }
91
+
92
+ export declare namespace Event {
93
+ export type Type<EventDefinitions extends FieldsRecord> = {
94
+ readonly _tag: "Event"
95
+
96
+ readonly event: FieldsRecord.TaggedMember.Type<EventDefinitions>
97
+ }
98
+
99
+ export type Encoded<EventDefinitions extends FieldsRecord> = {
100
+ readonly _tag: "Event"
101
+
102
+ readonly event: FieldsRecord.TaggedMember.Encoded<EventDefinitions>
103
+ }
104
+ }
105
+
106
+ export const Audition = {
107
+ Success: S.TaggedStruct("Audition.Success", {}),
108
+ Failure: S.TaggedStruct("Audition.Failure", {
109
+ expected: S.String,
110
+ actual: S.String,
111
+ }),
112
+ }
113
+
114
+ export const Disconnect = S.TaggedStruct("Disconnect", {})
115
+
116
+ export const TransportFailure = S.TaggedStruct("TransportFailure", {
117
+ cause: S.Unknown,
118
+ })
119
+
120
+ export declare namespace Actor {
121
+ export type Type<
122
+ MethodDefinitions extends Record<string, MethodDefinition.Any>,
123
+ EventDefinitions extends FieldsRecord,
124
+ > =
125
+ | typeof Audition.Success.Type
126
+ | typeof Audition.Failure.Type
127
+ | Call.Success.Type<MethodDefinitions>
128
+ | Call.Failure.Type<MethodDefinitions>
129
+ | Event.Type<EventDefinitions>
130
+ | typeof Disconnect.Type
131
+
132
+ export type Encoded<
133
+ MethodDefinitions extends Record<string, MethodDefinition.Any>,
134
+ EventDefinitions extends FieldsRecord,
135
+ > =
136
+ | typeof Audition.Success.Encoded
137
+ | typeof Audition.Failure.Encoded
138
+ | Call.Success.Encoded<MethodDefinitions>
139
+ | Call.Failure.Encoded<MethodDefinitions>
140
+ | Event.Encoded<EventDefinitions>
141
+ | typeof Disconnect.Encoded
142
+ }
package/Send.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { Schema as S, ParseResult, Effect } from "effect"
2
+
3
+ import type { FieldsRecord } from "./_types.ts"
4
+
5
+ export type Send<ActorSelf, EventDefinitions extends FieldsRecord> = <K extends keyof EventDefinitions>(
6
+ tag: K,
7
+ payload: S.Struct<EventDefinitions[K]>["Type"],
8
+ ) => Effect.Effect<void, ParseResult.ParseError, ActorSelf>
package/_constants.ts ADDED
@@ -0,0 +1 @@
1
+ export const SecWebSocketProtocol = "Sec-WebSocket-Protocol" as const
package/_types.ts ADDED
@@ -0,0 +1,27 @@
1
+ import { Schema as S } from "effect"
2
+
3
+ export type SchemaAll = S.Schema<any, any> | S.Schema<any, never> | S.Schema<never, any> | S.Schema<never, never>
4
+
5
+ export type PropertySignatureAll<Key extends PropertyKey = PropertyKey> =
6
+ | S.PropertySignature<S.PropertySignature.Token, any, Key, S.PropertySignature.Token, any, boolean>
7
+ | S.PropertySignature<S.PropertySignature.Token, never, Key, S.PropertySignature.Token, any, boolean>
8
+ | S.PropertySignature<S.PropertySignature.Token, any, Key, S.PropertySignature.Token, never, boolean>
9
+ | S.PropertySignature<S.PropertySignature.Token, never, Key, S.PropertySignature.Token, never, boolean>
10
+
11
+ export type Field = SchemaAll | PropertySignatureAll
12
+
13
+ export type Fields = { readonly [x: keyof any]: Field }
14
+
15
+ export type FieldsRecord = Record<string, Fields>
16
+
17
+ export declare namespace FieldsRecord {
18
+ export namespace TaggedMember {
19
+ export type Type<T extends FieldsRecord, K extends keyof T = keyof T> = {
20
+ [K_ in K]: { readonly _tag: K_ } & S.Struct<T[K_]>["Type"]
21
+ }[K]
22
+
23
+ export type Encoded<T extends FieldsRecord, K extends keyof T = keyof T> = {
24
+ [K_ in K]: { readonly _tag: K_ } & S.Struct<T[K_]>["Encoded"]
25
+ }[K]
26
+ }
27
+ }
package/_util/Mutex.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { Context, Effect, Layer } from "effect"
2
+
3
+ export class Mutex extends Context.Tag("liminal/Mutex")<
4
+ Mutex,
5
+ <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
6
+ >() {}
7
+
8
+ export const layer = Effect.gen(function* () {
9
+ const mutex = yield* Effect.makeSemaphore(1)
10
+ return mutex.withPermits(1)
11
+ }).pipe(Layer.effect(Mutex))
12
+
13
+ export const task = <A, E, R>(effect: Effect.Effect<A, E, R>) => Mutex.pipe(Effect.flatMap((f) => f(effect)))
@@ -0,0 +1 @@
1
+ export const phantom = {} as { "": never }
@@ -0,0 +1,22 @@
1
+ import { Types, Option, Ref, PubSub, Stream, Effect, Context, Layer } from "effect";
2
+ declare const TypeId: "~liminal/Accumulator";
3
+ export interface Service<State> {
4
+ readonly ref: Ref.Ref<State>;
5
+ readonly pubsub: PubSub.PubSub<State>;
6
+ }
7
+ export interface AccumulatorLayerConfig<Item, E, R, State, E2, R2, E3, R3> {
8
+ readonly source: Stream.Stream<Item, E, R>;
9
+ readonly reduce: (item: Item) => (state: State) => Effect.Effect<State, E2, R2>;
10
+ readonly initial: (item: Item) => Effect.Effect<Option.Option<State>, E3, R3>;
11
+ }
12
+ export type Reduce<State, Item, K extends Types.Tags<Item> = Types.Tags<Item>, E = never, R = never> = (item: Types.ExtractTag<Item, K>) => (accumulator: State) => Effect.Effect<State, E, R>;
13
+ export interface Accumulator<Self, Id extends string, State> extends Context.Tag<Self, Service<State>> {
14
+ new (_: never): Context.TagClassShape<Id, Service<State>>;
15
+ readonly [TypeId]: typeof TypeId;
16
+ readonly get: Effect.Effect<State, never, Self>;
17
+ readonly stream: Stream.Stream<State, never, Self>;
18
+ readonly reducer: <Item>() => <K extends Types.Tags<Item>, E, R>(_tag: K, f: Reduce<State, Item, K, E, R>) => Reduce<State, Item, K, E, R>;
19
+ readonly layer: <Item, E, R, E2, R2, E3, R3>(config: AccumulatorLayerConfig<Item, E, R, State, E2, R2, E3, R3>) => Layer.Layer<Self, E | E2 | E3, R | R2 | R3>;
20
+ }
21
+ export declare const Service: <Self, State>() => <Id extends string>(id: Id) => Accumulator<Self, Id, State>;
22
+ export {};
@@ -0,0 +1,33 @@
1
+ import { Deferred, Types, Option, Ref, PubSub, Stream, Effect, Context, Layer } from "effect";
2
+ const TypeId = "~liminal/Accumulator";
3
+ export const Service = () => (id) => {
4
+ const tag = Context.Tag(id)();
5
+ const get = tag.pipe(Effect.map(({ ref }) => ref), Effect.flatMap(Ref.get));
6
+ const stream = tag.pipe(Effect.map(({ pubsub }) => Stream.fromPubSub(pubsub)), Stream.unwrap);
7
+ const reducer = () => (_tag, f) => f;
8
+ const layer = ({ source, initial, reduce, }) => Effect.gen(function* () {
9
+ const semaphore = yield* Effect.makeSemaphore(1);
10
+ const deferred = yield* Deferred.make();
11
+ const pubsub = yield* PubSub.unbounded({ replay: 1 });
12
+ yield* source.pipe(Stream.runForEach(Effect.fn(function* (item) {
13
+ if (!(yield* Deferred.isDone(deferred))) {
14
+ const match = yield* initial(item);
15
+ if (Option.isSome(match)) {
16
+ const { value } = match;
17
+ yield* Deferred.succeed(deferred, value);
18
+ }
19
+ return;
20
+ }
21
+ const current = yield* Ref.get(ref);
22
+ const reduced = yield* reduce(item)(current);
23
+ yield* Ref.set(ref, reduced);
24
+ yield* pubsub.publish(reduced);
25
+ }, semaphore.withPermits(1))), Effect.forkScoped);
26
+ const initial_ = yield* Deferred.await(deferred);
27
+ const ref = yield* Ref.make(initial_);
28
+ yield* pubsub.publish(initial_);
29
+ return { ref, pubsub };
30
+ }).pipe(Layer.scoped(tag));
31
+ return Object.assign(tag, { [TypeId]: TypeId, get, stream, reducer, layer });
32
+ };
33
+ //# sourceMappingURL=Accumulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accumulator.js","sourceRoot":"","sources":["../Accumulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Context, Schema as S, Effect } from "effect";
2
+ import type { FieldsRecord, Fields } from "./_types.ts";
3
+ import type * as ActorClient from "./Client.ts";
4
+ import type * as ClientHandle from "./ClientHandle.ts";
5
+ import type { MethodDefinition } from "./Method.ts";
6
+ import * as Method from "./Method.ts";
7
+ import type { Send } from "./Send.ts";
8
+ export declare const TypeId: "~liminal/Actor";
9
+ export interface Service<ActorSelf, NameA, AttachmentFields extends Fields, EventDefinitions extends FieldsRecord> {
10
+ readonly name: NameA;
11
+ readonly currentClient: ClientHandle.ClientHandle<ActorSelf, AttachmentFields, EventDefinitions>;
12
+ readonly clients: ReadonlySet<ClientHandle.ClientHandle<ActorSelf, AttachmentFields, EventDefinitions>>;
13
+ }
14
+ export interface ActorDefinition<NameA, AttachmentFields extends Fields, ClientSelf, ClientId extends string, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> {
15
+ readonly name: S.Schema<NameA, string>;
16
+ readonly attachments: AttachmentFields;
17
+ readonly client: ActorClient.Client<ClientSelf, ClientId, MethodDefinitions, EventDefinitions>;
18
+ }
19
+ export interface Actor<ActorSelf, ActorId extends string, NameA, AttachmentFields extends Fields, ActorClientSelf, ActorClientId extends string, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> extends Context.Tag<ActorSelf, Service<ActorSelf, NameA, AttachmentFields, EventDefinitions>> {
20
+ new (_: never): Context.TagClassShape<ActorId, Service<ActorSelf, NameA, AttachmentFields, EventDefinitions>>;
21
+ readonly [TypeId]: typeof TypeId;
22
+ readonly definition: ActorDefinition<NameA, AttachmentFields, ActorClientSelf, ActorClientId, MethodDefinitions, EventDefinitions>;
23
+ readonly schema: {
24
+ readonly attachments: S.Schema<S.Struct<AttachmentFields>["Type"], S.Struct<AttachmentFields>["Encoded"]>;
25
+ };
26
+ readonly sendAll: Send<ActorSelf, EventDefinitions>;
27
+ readonly evict: Effect.Effect<void, never, ActorSelf>;
28
+ readonly handler: <K extends keyof MethodDefinitions, R>(tag: K, f: Method.Handler<MethodDefinitions[K], R>) => Method.Handler<MethodDefinitions[K], R>;
29
+ }
30
+ export declare const Service: <ActorSelf>() => <ActorId extends string, NameA, AttachmentFields extends Fields, ClientSelf, ClientId extends string, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord>(id: ActorId, definition: ActorDefinition<NameA, AttachmentFields, ClientSelf, ClientId, MethodDefinitions, EventDefinitions>) => Actor<ActorSelf, ActorId, NameA, AttachmentFields, ClientSelf, ClientId, MethodDefinitions, EventDefinitions>;
package/dist/Actor.js ADDED
@@ -0,0 +1,31 @@
1
+ import { Context, Schema as S, Effect } from "effect";
2
+ import * as Method from "./Method.js";
3
+ export const TypeId = "~liminal/Actor";
4
+ export const Service = () => (id, definition) => {
5
+ const tag = Context.Tag(id)();
6
+ const sendAll = Effect.fnUntraced(function* (key, payload) {
7
+ const { clients } = yield* tag;
8
+ yield* Effect.forEach(clients, (client) => client.send(key, payload), {
9
+ concurrency: "unbounded",
10
+ });
11
+ });
12
+ // TODO: more eviction
13
+ const evict = Effect.gen(function* () {
14
+ const { clients } = yield* tag;
15
+ for (const client of clients) {
16
+ yield* client.disconnect;
17
+ }
18
+ });
19
+ const handler = (_tag, f) => f;
20
+ return Object.assign(tag, {
21
+ [TypeId]: TypeId,
22
+ definition,
23
+ schema: {
24
+ attachments: S.Struct(definition.attachments),
25
+ },
26
+ sendAll,
27
+ evict,
28
+ handler,
29
+ });
30
+ };
31
+ //# sourceMappingURL=Actor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Actor.js","sourceRoot":"","sources":["../Actor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAMrD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAGrC,MAAM,CAAC,MAAM,MAAM,GAAG,gBAAyB,CAAA;AA8D/C,MAAM,CAAC,MAAM,OAAO,GAClB,GAAc,EAAE,CAChB,CASE,EAAW,EACX,UAA+G,EACA,EAAE;IACjH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAA4E,CAAA;IAEvG,MAAM,OAAO,GAAsC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO;QAC1F,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAA;QAC9B,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE;YACpE,WAAW,EAAE,WAAW;SACzB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,sBAAsB;IACtB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAA;QAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAA;QAC1B,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,CACd,IAAO,EACP,CAA0C,EACD,EAAE,CAAC,CAAC,CAAA;IAE/C,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACxB,CAAC,MAAM,CAAC,EAAE,MAAM;QAChB,UAAU;QACV,MAAM,EAAE;YACN,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAU;SACvD;QACD,OAAO;QACP,KAAK;QACL,OAAO;KACR,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { Pipeable, Stream } from "effect";
2
+ import type { FieldsRecord } from "./_types.ts";
3
+ import type { F } from "./F.ts";
4
+ import type * as Method from "./Method.ts";
5
+ import * as Client from "./Client.ts";
6
+ import { type ClientError } from "./errors.ts";
7
+ declare const TypeId: "~liminal/Audition";
8
+ export interface Audition<ClientSelf, MethodDefinitions extends Record<string, Method.MethodDefinition.Any>, Event> extends Pipeable.Pipeable {
9
+ readonly [TypeId]: typeof TypeId;
10
+ readonly events: Stream.Stream<Event, ClientError, ClientSelf>;
11
+ readonly f: F<ClientSelf, MethodDefinitions>;
12
+ }
13
+ export declare const empty: Audition<never, never, never>;
14
+ export declare const add: {
15
+ <ClientSelf, ClientId extends string, ClientMethodDefinitions extends Record<string, Method.MethodDefinition.Any>, ClientEventDefinitions extends FieldsRecord>(client: Client.Client<ClientSelf, ClientId, ClientMethodDefinitions, ClientEventDefinitions>): <AuditionSelf, AuditionMethodDefinitions extends Record<string, Method.MethodDefinition.Any>, AuditionEvent>(audition: Audition<AuditionSelf, AuditionMethodDefinitions, AuditionEvent>) => Audition<AuditionSelf | ClientSelf, Method.MethodDefinition.Merge<AuditionMethodDefinitions, ClientMethodDefinitions>, AuditionEvent | FieldsRecord.TaggedMember.Type<ClientEventDefinitions>>;
16
+ <AuditionClientSelf, AuditionMethodDefinitions extends Record<string, Method.MethodDefinition.Any>, AuditionEvent, ClientSelf, ClientId extends string, ClientMethodDefinitions extends Record<string, Method.MethodDefinition.Any>, ClientEventDefinitions extends FieldsRecord>(audition: Audition<AuditionClientSelf, AuditionMethodDefinitions, AuditionEvent>, client: Client.Client<ClientSelf, ClientId, ClientMethodDefinitions, ClientEventDefinitions>): Audition<AuditionClientSelf | ClientSelf, Method.MethodDefinition.Merge<AuditionMethodDefinitions, ClientMethodDefinitions>, AuditionEvent | FieldsRecord.TaggedMember.Type<ClientEventDefinitions>>;
17
+ };
18
+ export {};
@@ -0,0 +1,27 @@
1
+ import { Pipeable, Stream, Effect, Function, Console } from "effect";
2
+ import * as Client from "./Client.js";
3
+ import { AuditionError } from "./errors.js";
4
+ const TypeId = "~liminal/Audition";
5
+ export const empty = {
6
+ [TypeId]: TypeId,
7
+ pipe() {
8
+ return Pipeable.pipeArguments(this, arguments);
9
+ },
10
+ events: Stream.fail(AuditionError.make()),
11
+ f: () => () => AuditionError.make(),
12
+ };
13
+ export const add = Function.dual(2, (audition, client) => {
14
+ const f = (method) => (payload) => audition
15
+ .f(method)(payload)
16
+ .pipe(Effect.catchTag("AuditionError", () => client.f(method)(payload)));
17
+ const events = audition.events.pipe(Stream.catchTag("AuditionError", () => Effect.succeed(client.events).pipe(Effect.tap(() => Console.log(`Auditioning ${client.key}`)), Stream.unwrap)));
18
+ return {
19
+ [TypeId]: TypeId,
20
+ pipe() {
21
+ return Pipeable.pipeArguments(this, arguments);
22
+ },
23
+ events,
24
+ f,
25
+ };
26
+ });
27
+ //# sourceMappingURL=Audition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Audition.js","sourceRoot":"","sources":["../Audition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAMpE,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAA;AAE7D,MAAM,MAAM,GAAG,mBAA4B,CAAA;AAW3C,MAAM,CAAC,MAAM,KAAK,GAAkC;IAClD,CAAC,MAAM,CAAC,EAAE,MAAM;IAChB,IAAI;QACF,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAChD,CAAC;IACD,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE;CACpC,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GA+BZ,QAAQ,CAAC,IAAI,CACf,CAAC,EACD,CASE,QAA0E,EAC1E,MAA4F,EAK5F,EAAE;IACF,MAAM,CAAC,GAGH,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1B,QAAQ;SACL,CAAC,CAAC,MAAe,CAAC,CAAC,OAAO,CAAC;SAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAErF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CACjC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAChC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAC1D,MAAM,CAAC,MAAM,CACd,CACF,CACF,CAAA;IAED,OAAO;QACL,CAAC,MAAM,CAAC,EAAE,MAAM;QAChB,IAAI;YACF,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAChD,CAAC;QACD,MAAM;QACN,CAAC;KACF,CAAA;AACH,CAAC,CACF,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { Socket, Worker } from "@effect/platform";
2
+ import { Context, Effect, Layer, RcRef, Scope, Stream, Schema as S } from "effect";
3
+ import type { FieldsRecord } from "./_types.ts";
4
+ import { type ClientError, ConnectionError } from "./errors.ts";
5
+ import { type F } from "./F.ts";
6
+ import type { MethodDefinition } from "./Method.ts";
7
+ import * as Protocol from "./Protocol.ts";
8
+ export declare const TypeId: "~liminal/Client";
9
+ export interface ClientDefinition<MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> {
10
+ readonly methods: MethodDefinitions;
11
+ readonly events: EventDefinitions;
12
+ }
13
+ export interface ReplayConfig {
14
+ readonly mode: "startup" | "all-subscribers";
15
+ readonly limit?: number | undefined;
16
+ }
17
+ export interface TransportSession<ClientSelf, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> {
18
+ readonly events: Stream.Stream<FieldsRecord.TaggedMember.Type<EventDefinitions>, ClientError>;
19
+ readonly f: F<ClientSelf, MethodDefinitions>;
20
+ readonly endEvents: Effect.Effect<void>;
21
+ }
22
+ export type Service<ClientSelf, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> = RcRef.RcRef<TransportSession<ClientSelf, MethodDefinitions, EventDefinitions>, ClientError>;
23
+ export interface Spec<MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> {
24
+ Call: {
25
+ Payload: Protocol.Call.Payload.Type<MethodDefinitions>;
26
+ Success: Protocol.Call.Success.Type<MethodDefinitions>;
27
+ Failure: Protocol.Call.Failure.Type<MethodDefinitions>;
28
+ };
29
+ Event: FieldsRecord.TaggedMember.Type<EventDefinitions>;
30
+ Actor: Protocol.Actor.Type<MethodDefinitions, EventDefinitions>;
31
+ }
32
+ export interface ClientSchema<MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> {
33
+ readonly call: {
34
+ readonly payload: S.Schema<Protocol.Call.Payload.Type<MethodDefinitions>, Protocol.Call.Payload.Encoded<MethodDefinitions>>;
35
+ readonly success: S.Schema<Protocol.Call.Success.Type<MethodDefinitions>, Protocol.Call.Success.Encoded<MethodDefinitions>>;
36
+ readonly failure: S.Schema<Protocol.Call.Failure.Type<MethodDefinitions>, Protocol.Call.Failure.Encoded<MethodDefinitions>>;
37
+ };
38
+ readonly event: S.Schema<Protocol.Event.Type<EventDefinitions>, Protocol.Event.Encoded<EventDefinitions>>;
39
+ readonly actor: S.Schema<Protocol.Actor.Type<MethodDefinitions, EventDefinitions>, Protocol.Actor.Encoded<MethodDefinitions, EventDefinitions>>;
40
+ }
41
+ export interface Client<ClientSelf, ClientId extends string, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> extends Context.Tag<ClientSelf, Service<ClientSelf, MethodDefinitions, EventDefinitions>> {
42
+ new (_: never): Context.TagClassShape<ClientId, Service<ClientSelf, MethodDefinitions, EventDefinitions>>;
43
+ readonly [TypeId]: typeof TypeId;
44
+ readonly definition: ClientDefinition<MethodDefinitions, EventDefinitions>;
45
+ readonly schema: ClientSchema<MethodDefinitions, EventDefinitions>;
46
+ readonly events: Stream.Stream<FieldsRecord.TaggedMember.Type<EventDefinitions>, ClientError, ClientSelf>;
47
+ readonly endEvents: Effect.Effect<void, never, ClientSelf>;
48
+ readonly f: F<ClientSelf, MethodDefinitions>;
49
+ readonly invalidate: Effect.Effect<void, never, ClientSelf>;
50
+ }
51
+ export declare const Service: <ClientSelf>() => <ClientId extends string, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord>(id: ClientId, definition: ClientDefinition<MethodDefinitions, EventDefinitions>) => Client<ClientSelf, ClientId, MethodDefinitions, EventDefinitions>;
52
+ export interface Transport<MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord> {
53
+ readonly listen: (publish: (message: Protocol.Actor.Type<MethodDefinitions, EventDefinitions> | typeof Protocol.TransportFailure.Type) => Effect.Effect<void, never>) => Effect.Effect<void, never, Scope.Scope>;
54
+ readonly send: (v: Protocol.Call.Payload.Type<MethodDefinitions>) => Effect.Effect<void, ConnectionError, never>;
55
+ }
56
+ export declare const layerSocket: <ClientSelf, ClientId extends string, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord>({ client, url, protocols, replay, }: {
57
+ readonly client: Client<ClientSelf, ClientId, MethodDefinitions, EventDefinitions>;
58
+ readonly url?: string | undefined;
59
+ readonly protocols?: string | Array<string> | undefined;
60
+ readonly replay?: ReplayConfig | undefined;
61
+ }) => Layer.Layer<ClientSelf, never, Socket.WebSocketConstructor>;
62
+ export declare const layerWorker: <ClientSelf, ClientId extends string, MethodDefinitions extends Record<string, MethodDefinition.Any>, EventDefinitions extends FieldsRecord>({ client, replay, }: {
63
+ readonly client: Client<ClientSelf, ClientId, MethodDefinitions, EventDefinitions>;
64
+ readonly replay?: ReplayConfig | undefined;
65
+ }) => Layer.Layer<ClientSelf, never, Worker.PlatformWorker | Worker.Spawner>;