effect 4.0.0-beta.44 → 4.0.0-beta.45

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 (151) hide show
  1. package/dist/Equal.d.ts.map +1 -1
  2. package/dist/Equal.js +16 -0
  3. package/dist/Equal.js.map +1 -1
  4. package/dist/Hash.js +1 -1
  5. package/dist/Hash.js.map +1 -1
  6. package/dist/Semaphore.d.ts +1 -1
  7. package/dist/Semaphore.d.ts.map +1 -1
  8. package/dist/Semaphore.js +1 -3
  9. package/dist/Semaphore.js.map +1 -1
  10. package/dist/unstable/ai/McpServer.d.ts.map +1 -1
  11. package/dist/unstable/ai/McpServer.js +24 -21
  12. package/dist/unstable/ai/McpServer.js.map +1 -1
  13. package/dist/unstable/eventlog/Event.d.ts +0 -6
  14. package/dist/unstable/eventlog/Event.d.ts.map +1 -1
  15. package/dist/unstable/eventlog/Event.js +0 -5
  16. package/dist/unstable/eventlog/Event.js.map +1 -1
  17. package/dist/unstable/eventlog/EventGroup.d.ts +0 -2
  18. package/dist/unstable/eventlog/EventGroup.d.ts.map +1 -1
  19. package/dist/unstable/eventlog/EventGroup.js +0 -2
  20. package/dist/unstable/eventlog/EventGroup.js.map +1 -1
  21. package/dist/unstable/eventlog/EventJournal.d.ts +22 -5
  22. package/dist/unstable/eventlog/EventJournal.d.ts.map +1 -1
  23. package/dist/unstable/eventlog/EventJournal.js +126 -67
  24. package/dist/unstable/eventlog/EventJournal.js.map +1 -1
  25. package/dist/unstable/eventlog/EventLog.d.ts +88 -34
  26. package/dist/unstable/eventlog/EventLog.d.ts.map +1 -1
  27. package/dist/unstable/eventlog/EventLog.js +215 -141
  28. package/dist/unstable/eventlog/EventLog.js.map +1 -1
  29. package/dist/unstable/eventlog/EventLogEncryption.d.ts +9 -7
  30. package/dist/unstable/eventlog/EventLogEncryption.d.ts.map +1 -1
  31. package/dist/unstable/eventlog/EventLogEncryption.js +13 -15
  32. package/dist/unstable/eventlog/EventLogEncryption.js.map +1 -1
  33. package/dist/unstable/eventlog/EventLogMessage.d.ts +228 -0
  34. package/dist/unstable/eventlog/EventLogMessage.d.ts.map +1 -0
  35. package/dist/unstable/eventlog/EventLogMessage.js +214 -0
  36. package/dist/unstable/eventlog/EventLogMessage.js.map +1 -0
  37. package/dist/unstable/eventlog/EventLogRemote.d.ts +109 -194
  38. package/dist/unstable/eventlog/EventLogRemote.d.ts.map +1 -1
  39. package/dist/unstable/eventlog/EventLogRemote.js +165 -320
  40. package/dist/unstable/eventlog/EventLogRemote.js.map +1 -1
  41. package/dist/unstable/eventlog/EventLogServer.d.ts +25 -47
  42. package/dist/unstable/eventlog/EventLogServer.d.ts.map +1 -1
  43. package/dist/unstable/eventlog/EventLogServer.js +127 -198
  44. package/dist/unstable/eventlog/EventLogServer.js.map +1 -1
  45. package/dist/unstable/eventlog/EventLogServerEncrypted.d.ts +60 -0
  46. package/dist/unstable/eventlog/EventLogServerEncrypted.d.ts.map +1 -0
  47. package/dist/unstable/eventlog/EventLogServerEncrypted.js +166 -0
  48. package/dist/unstable/eventlog/EventLogServerEncrypted.js.map +1 -0
  49. package/dist/unstable/eventlog/EventLogServerUnencrypted.d.ts +183 -0
  50. package/dist/unstable/eventlog/EventLogServerUnencrypted.d.ts.map +1 -0
  51. package/dist/unstable/eventlog/EventLogServerUnencrypted.js +461 -0
  52. package/dist/unstable/eventlog/EventLogServerUnencrypted.js.map +1 -0
  53. package/dist/unstable/eventlog/EventLogSessionAuth.d.ts +117 -0
  54. package/dist/unstable/eventlog/EventLogSessionAuth.d.ts.map +1 -0
  55. package/dist/unstable/eventlog/EventLogSessionAuth.js +284 -0
  56. package/dist/unstable/eventlog/EventLogSessionAuth.js.map +1 -0
  57. package/dist/unstable/eventlog/{SqlEventLogJournal.d.ts → SqlEventJournal.d.ts} +2 -2
  58. package/dist/unstable/eventlog/SqlEventJournal.d.ts.map +1 -0
  59. package/dist/unstable/eventlog/{SqlEventLogJournal.js → SqlEventJournal.js} +20 -14
  60. package/dist/unstable/eventlog/SqlEventJournal.js.map +1 -0
  61. package/dist/unstable/eventlog/{SqlEventLogServer.d.ts → SqlEventLogServerEncrypted.d.ts} +5 -5
  62. package/dist/unstable/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -0
  63. package/dist/unstable/eventlog/{SqlEventLogServer.js → SqlEventLogServerEncrypted.js} +65 -24
  64. package/dist/unstable/eventlog/SqlEventLogServerEncrypted.js.map +1 -0
  65. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.d.ts +25 -0
  66. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -0
  67. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js +354 -0
  68. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js.map +1 -0
  69. package/dist/unstable/eventlog/index.d.ts +22 -2
  70. package/dist/unstable/eventlog/index.d.ts.map +1 -1
  71. package/dist/unstable/eventlog/index.js +22 -2
  72. package/dist/unstable/eventlog/index.js.map +1 -1
  73. package/dist/unstable/eventlog/internal/identityRootSecretDerivation.d.ts +2 -0
  74. package/dist/unstable/eventlog/internal/identityRootSecretDerivation.d.ts.map +1 -0
  75. package/dist/unstable/eventlog/internal/identityRootSecretDerivation.js +89 -0
  76. package/dist/unstable/eventlog/internal/identityRootSecretDerivation.js.map +1 -0
  77. package/dist/unstable/reactivity/AtomHttpApi.d.ts +1 -2
  78. package/dist/unstable/reactivity/AtomHttpApi.d.ts.map +1 -1
  79. package/dist/unstable/reactivity/AtomHttpApi.js +2 -2
  80. package/dist/unstable/reactivity/AtomHttpApi.js.map +1 -1
  81. package/dist/unstable/reactivity/AtomRpc.d.ts +1 -2
  82. package/dist/unstable/reactivity/AtomRpc.d.ts.map +1 -1
  83. package/dist/unstable/reactivity/AtomRpc.js +3 -3
  84. package/dist/unstable/reactivity/AtomRpc.js.map +1 -1
  85. package/dist/unstable/rpc/Rpc.d.ts +25 -4
  86. package/dist/unstable/rpc/Rpc.d.ts.map +1 -1
  87. package/dist/unstable/rpc/Rpc.js +26 -0
  88. package/dist/unstable/rpc/Rpc.js.map +1 -1
  89. package/dist/unstable/rpc/RpcClient.d.ts +3 -13
  90. package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
  91. package/dist/unstable/rpc/RpcClient.js +47 -23
  92. package/dist/unstable/rpc/RpcClient.js.map +1 -1
  93. package/dist/unstable/rpc/RpcGroup.d.ts +1 -1
  94. package/dist/unstable/rpc/RpcGroup.d.ts.map +1 -1
  95. package/dist/unstable/rpc/RpcMiddleware.d.ts +2 -2
  96. package/dist/unstable/rpc/RpcMiddleware.d.ts.map +1 -1
  97. package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
  98. package/dist/unstable/rpc/RpcServer.js +3 -2
  99. package/dist/unstable/rpc/RpcServer.js.map +1 -1
  100. package/dist/unstable/rpc/Utils.d.ts +6 -0
  101. package/dist/unstable/rpc/Utils.d.ts.map +1 -1
  102. package/dist/unstable/rpc/Utils.js +44 -0
  103. package/dist/unstable/rpc/Utils.js.map +1 -1
  104. package/dist/unstable/schema/Model.d.ts +2 -2
  105. package/dist/unstable/schema/Model.d.ts.map +1 -1
  106. package/dist/unstable/schema/Model.js +2 -4
  107. package/dist/unstable/schema/Model.js.map +1 -1
  108. package/dist/unstable/schema/VariantSchema.d.ts +1 -1
  109. package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
  110. package/dist/unstable/schema/VariantSchema.js +1 -12
  111. package/dist/unstable/schema/VariantSchema.js.map +1 -1
  112. package/dist/unstable/workers/Transferable.d.ts +1 -1
  113. package/dist/unstable/workers/Transferable.d.ts.map +1 -1
  114. package/dist/unstable/workers/Transferable.js +1 -1
  115. package/dist/unstable/workers/Transferable.js.map +1 -1
  116. package/package.json +1 -1
  117. package/src/Equal.ts +17 -0
  118. package/src/Hash.ts +2 -2
  119. package/src/Semaphore.ts +2 -4
  120. package/src/unstable/ai/McpServer.ts +24 -22
  121. package/src/unstable/eventlog/Event.ts +0 -8
  122. package/src/unstable/eventlog/EventGroup.ts +0 -4
  123. package/src/unstable/eventlog/EventJournal.ts +144 -76
  124. package/src/unstable/eventlog/EventLog.ts +342 -221
  125. package/src/unstable/eventlog/EventLogEncryption.ts +16 -30
  126. package/src/unstable/eventlog/EventLogMessage.ts +277 -0
  127. package/src/unstable/eventlog/EventLogRemote.ts +261 -408
  128. package/src/unstable/eventlog/EventLogServer.ts +182 -274
  129. package/src/unstable/eventlog/EventLogServerEncrypted.ts +206 -0
  130. package/src/unstable/eventlog/EventLogServerUnencrypted.ts +749 -0
  131. package/src/unstable/eventlog/EventLogSessionAuth.ts +437 -0
  132. package/src/unstable/eventlog/{SqlEventLogJournal.ts → SqlEventJournal.ts} +26 -18
  133. package/src/unstable/eventlog/{SqlEventLogServer.ts → SqlEventLogServerEncrypted.ts} +102 -40
  134. package/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +500 -0
  135. package/src/unstable/eventlog/index.ts +27 -2
  136. package/src/unstable/eventlog/internal/identityRootSecretDerivation.ts +153 -0
  137. package/src/unstable/reactivity/AtomHttpApi.ts +23 -8
  138. package/src/unstable/reactivity/AtomRpc.ts +16 -5
  139. package/src/unstable/rpc/Rpc.ts +42 -4
  140. package/src/unstable/rpc/RpcClient.ts +59 -24
  141. package/src/unstable/rpc/RpcGroup.ts +1 -1
  142. package/src/unstable/rpc/RpcMiddleware.ts +2 -2
  143. package/src/unstable/rpc/RpcServer.ts +5 -3
  144. package/src/unstable/rpc/Utils.ts +59 -0
  145. package/src/unstable/schema/Model.ts +4 -6
  146. package/src/unstable/schema/VariantSchema.ts +4 -17
  147. package/src/unstable/workers/Transferable.ts +9 -11
  148. package/dist/unstable/eventlog/SqlEventLogJournal.d.ts.map +0 -1
  149. package/dist/unstable/eventlog/SqlEventLogJournal.js.map +0 -1
  150. package/dist/unstable/eventlog/SqlEventLogServer.d.ts.map +0 -1
  151. package/dist/unstable/eventlog/SqlEventLogServer.js.map +0 -1
@@ -0,0 +1,284 @@
1
+ /**
2
+ * @since 4.0.0
3
+ */
4
+ import * as Data from "../../Data.js";
5
+ import * as Effect from "../../Effect.js";
6
+ const textEncoder = /*#__PURE__*/new TextEncoder();
7
+ const textDecoder = /*#__PURE__*/new TextDecoder("utf-8", {
8
+ fatal: true
9
+ });
10
+ const constLengthPrefixBytes = 4;
11
+ /**
12
+ * @since 4.0.0
13
+ * @category constants
14
+ */
15
+ export const AuthPayloadContext = "eventlog-auth-v1";
16
+ /**
17
+ * @since 4.0.0
18
+ * @category constants
19
+ */
20
+ export const Ed25519PublicKeyLength = 32;
21
+ /**
22
+ * @since 4.0.0
23
+ * @category constants
24
+ */
25
+ export const Ed25519SignatureLength = 64;
26
+ /**
27
+ * @since 4.0.0
28
+ * @category constants
29
+ */
30
+ export const SessionAuthChallengeLength = 32;
31
+ /**
32
+ * @since 4.0.0
33
+ * @category constants
34
+ */
35
+ export const SessionAuthChallengeTimeToLiveMillis = 30_000;
36
+ /**
37
+ * @since 4.0.0
38
+ * @category errors
39
+ */
40
+ export class EventLogSessionAuthError extends /*#__PURE__*/Data.TaggedError("EventLogSessionAuthError") {}
41
+ const toArrayBuffer = data => {
42
+ const copy = new Uint8Array(data.byteLength);
43
+ copy.set(data);
44
+ return copy.buffer;
45
+ };
46
+ const decodeUtf8 = bytes => Effect.try({
47
+ try: () => textDecoder.decode(bytes),
48
+ catch: cause => new EventLogSessionAuthError({
49
+ reason: "InvalidPayload",
50
+ message: "Session auth payload contains invalid UTF-8 bytes",
51
+ cause
52
+ })
53
+ });
54
+ const assertSigningPublicKeyLength = signingPublicKey => {
55
+ if (signingPublicKey.byteLength === Ed25519PublicKeyLength) return Effect.void;
56
+ return Effect.fail(new EventLogSessionAuthError({
57
+ reason: "InvalidSigningPublicKeyLength",
58
+ message: `Expected signingPublicKey length to be ${Ed25519PublicKeyLength} bytes, received ${signingPublicKey.byteLength}`
59
+ }));
60
+ };
61
+ const assertSignatureLength = signature => {
62
+ if (signature.byteLength === Ed25519SignatureLength) return Effect.void;
63
+ return Effect.fail(new EventLogSessionAuthError({
64
+ reason: "InvalidSignatureLength",
65
+ message: `Expected signature length to be ${Ed25519SignatureLength} bytes, received ${signature.byteLength}`
66
+ }));
67
+ };
68
+ const getSubtle = /*#__PURE__*/Effect.suspend(() => {
69
+ const subtle = globalThis.crypto?.subtle;
70
+ if (subtle === undefined) {
71
+ return Effect.fail(new EventLogSessionAuthError({
72
+ reason: "CryptoUnavailable",
73
+ message: "globalThis.crypto.subtle is not available"
74
+ }));
75
+ }
76
+ return Effect.succeed(subtle);
77
+ });
78
+ const getCrypto = /*#__PURE__*/Effect.suspend(() => {
79
+ const crypto = globalThis.crypto;
80
+ if (crypto === undefined) {
81
+ return Effect.fail(new EventLogSessionAuthError({
82
+ reason: "CryptoUnavailable",
83
+ message: "globalThis.crypto is not available"
84
+ }));
85
+ }
86
+ return Effect.succeed(crypto);
87
+ });
88
+ const writeLength = (target, offset, length) => {
89
+ if (length < 0 || length > 0xffff_ffff) {
90
+ return Effect.fail(new EventLogSessionAuthError({
91
+ reason: "InvalidPayload",
92
+ message: `Invalid canonical field length: ${length}`
93
+ }));
94
+ }
95
+ target[offset] = length >>> 24 & 0xff;
96
+ target[offset + 1] = length >>> 16 & 0xff;
97
+ target[offset + 2] = length >>> 8 & 0xff;
98
+ target[offset + 3] = length & 0xff;
99
+ return Effect.succeed(offset + constLengthPrefixBytes);
100
+ };
101
+ const readLength = (source, offset) => (source[offset] << 24 | source[offset + 1] << 16 | source[offset + 2] << 8 | source[offset + 3]) >>> 0;
102
+ const readField = (payload, state) => {
103
+ if (state.offset + constLengthPrefixBytes > payload.byteLength) {
104
+ return Effect.fail(new EventLogSessionAuthError({
105
+ reason: "InvalidPayload",
106
+ message: "Session auth payload is truncated before field length"
107
+ }));
108
+ }
109
+ const length = readLength(payload, state.offset);
110
+ state.offset += constLengthPrefixBytes;
111
+ if (state.offset + length > payload.byteLength) {
112
+ return Effect.fail(new EventLogSessionAuthError({
113
+ reason: "InvalidPayload",
114
+ message: "Session auth payload is truncated inside a field"
115
+ }));
116
+ }
117
+ const field = payload.slice(state.offset, state.offset + length);
118
+ state.offset += length;
119
+ return Effect.succeed(field);
120
+ };
121
+ const bytesToHex = bytes => {
122
+ let hex = "";
123
+ for (const byte of bytes) {
124
+ hex += byte.toString(16).padStart(2, "0");
125
+ }
126
+ return hex;
127
+ };
128
+ const encodeRemoteIdField = remoteId => typeof remoteId === "string" ? textEncoder.encode(remoteId) : textEncoder.encode(bytesToHex(remoteId));
129
+ /**
130
+ * Canonical payload format uses ordered big-endian length-prefixed fields:
131
+ *
132
+ * 1. context (fixed: eventlog-auth-v1)
133
+ * 2. remoteId
134
+ * 3. challenge bytes
135
+ * 4. publicKey
136
+ * 5. signingPublicKey bytes
137
+ *
138
+ * @since 4.0.0
139
+ * @category encoding
140
+ */
141
+ export const encodeSessionAuthPayload = /*#__PURE__*/Effect.fnUntraced(function* (payload) {
142
+ yield* assertSigningPublicKeyLength(payload.signingPublicKey);
143
+ const fields = [textEncoder.encode(AuthPayloadContext), encodeRemoteIdField(payload.remoteId), payload.challenge, textEncoder.encode(payload.publicKey), payload.signingPublicKey];
144
+ const totalLength = fields.reduce((total, field) => total + constLengthPrefixBytes + field.byteLength, 0);
145
+ const encoded = new Uint8Array(totalLength);
146
+ let offset = 0;
147
+ for (const field of fields) {
148
+ offset = yield* writeLength(encoded, offset, field.byteLength);
149
+ encoded.set(field, offset);
150
+ offset += field.byteLength;
151
+ }
152
+ return encoded;
153
+ });
154
+ /**
155
+ * @since 4.0.0
156
+ * @category encoding
157
+ */
158
+ export const decodeSessionAuthPayload = /*#__PURE__*/Effect.fnUntraced(function* (payload) {
159
+ const state = {
160
+ offset: 0
161
+ };
162
+ const context = yield* decodeUtf8(yield* readField(payload, state));
163
+ if (context !== AuthPayloadContext) {
164
+ return yield* new EventLogSessionAuthError({
165
+ reason: "InvalidContext",
166
+ message: `Invalid session auth payload context: ${context}`
167
+ });
168
+ }
169
+ const remoteId = yield* decodeUtf8(yield* readField(payload, state));
170
+ const challenge = yield* readField(payload, state);
171
+ const publicKey = yield* decodeUtf8(yield* readField(payload, state));
172
+ const signingPublicKey = yield* readField(payload, state);
173
+ yield* assertSigningPublicKeyLength(signingPublicKey);
174
+ if (state.offset !== payload.byteLength) {
175
+ return yield* new EventLogSessionAuthError({
176
+ reason: "InvalidPayload",
177
+ message: "Session auth payload contains trailing bytes"
178
+ });
179
+ }
180
+ return {
181
+ remoteId,
182
+ challenge,
183
+ publicKey,
184
+ signingPublicKey
185
+ };
186
+ });
187
+ /**
188
+ * @since 4.0.0
189
+ * @category signing
190
+ */
191
+ export const signSessionAuthPayloadBytes = /*#__PURE__*/Effect.fnUntraced(function* (options) {
192
+ yield* decodeSessionAuthPayload(options.payload);
193
+ const subtle = yield* getSubtle;
194
+ let privateKey = yield* Effect.tryPromise({
195
+ try: () => subtle.importKey("pkcs8", toArrayBuffer(options.signingPrivateKey), "Ed25519", false, ["sign"]),
196
+ catch: cause => new EventLogSessionAuthError({
197
+ reason: "InvalidSigningPrivateKey",
198
+ message: "Failed to import Ed25519 signing private key (expected PKCS#8 bytes)",
199
+ cause
200
+ })
201
+ });
202
+ const signature = yield* Effect.tryPromise({
203
+ try: () => subtle.sign("Ed25519", privateKey, toArrayBuffer(options.payload)),
204
+ catch: cause => new EventLogSessionAuthError({
205
+ reason: "CryptoFailure",
206
+ message: "Failed to sign canonical session auth payload",
207
+ cause
208
+ })
209
+ });
210
+ return new Uint8Array(signature);
211
+ });
212
+ /**
213
+ * @since 4.0.0
214
+ * @category verification
215
+ */
216
+ export const verifySessionAuthPayloadBytes = /*#__PURE__*/Effect.fnUntraced(function* (options) {
217
+ yield* decodeSessionAuthPayload(options.payload);
218
+ yield* assertSigningPublicKeyLength(options.signingPublicKey);
219
+ yield* assertSignatureLength(options.signature);
220
+ const subtle = yield* getSubtle;
221
+ const publicKey = yield* Effect.tryPromise({
222
+ try: () => subtle.importKey("raw", toArrayBuffer(options.signingPublicKey), "Ed25519", false, ["verify"]),
223
+ catch: cause => new EventLogSessionAuthError({
224
+ reason: "InvalidSigningPublicKeyLength",
225
+ message: "Failed to import Ed25519 signing public key",
226
+ cause
227
+ })
228
+ });
229
+ return yield* Effect.tryPromise({
230
+ try: () => subtle.verify("Ed25519", publicKey, toArrayBuffer(options.signature), toArrayBuffer(options.payload)),
231
+ catch: cause => new EventLogSessionAuthError({
232
+ reason: "CryptoFailure",
233
+ message: "Failed to verify canonical session auth payload signature",
234
+ cause
235
+ })
236
+ });
237
+ });
238
+ /**
239
+ * @since 4.0.0
240
+ * @category signing
241
+ */
242
+ export const signSessionAuthPayload = options => encodeSessionAuthPayload(options).pipe(Effect.flatMap(payload => signSessionAuthPayloadBytes({
243
+ payload,
244
+ signingPrivateKey: options.signingPrivateKey
245
+ })));
246
+ /**
247
+ * @since 4.0.0
248
+ * @category verification
249
+ */
250
+ export const verifySessionAuthPayload = options => encodeSessionAuthPayload(options).pipe(Effect.flatMap(payload => verifySessionAuthPayloadBytes({
251
+ payload,
252
+ signingPublicKey: options.signingPublicKey,
253
+ signature: options.signature
254
+ })));
255
+ /**
256
+ * @since 4.0.0
257
+ * @category challenge
258
+ */
259
+ export const makeSessionAuthChallenge = /*#__PURE__*/Effect.gen(function* () {
260
+ const crypto = yield* getCrypto;
261
+ const challenge = new Uint8Array(SessionAuthChallengeLength);
262
+ crypto.getRandomValues(challenge);
263
+ return challenge;
264
+ });
265
+ /**
266
+ * @since 4.0.0
267
+ * @category verification
268
+ */
269
+ export const verifySessionAuthenticateRequest = /*#__PURE__*/Effect.fnUntraced(function* (options) {
270
+ if (options.algorithm !== "Ed25519") {
271
+ return yield* new EventLogSessionAuthError({
272
+ reason: "InvalidAlgorithm",
273
+ message: `Unsupported session auth algorithm: ${options.algorithm}`
274
+ });
275
+ }
276
+ return yield* verifySessionAuthPayload({
277
+ remoteId: options.remoteId,
278
+ challenge: options.challenge,
279
+ publicKey: options.publicKey,
280
+ signingPublicKey: options.signingPublicKey,
281
+ signature: options.signature
282
+ });
283
+ });
284
+ //# sourceMappingURL=EventLogSessionAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventLogSessionAuth.js","names":["Data","Effect","textEncoder","TextEncoder","textDecoder","TextDecoder","fatal","constLengthPrefixBytes","AuthPayloadContext","Ed25519PublicKeyLength","Ed25519SignatureLength","SessionAuthChallengeLength","SessionAuthChallengeTimeToLiveMillis","EventLogSessionAuthError","TaggedError","toArrayBuffer","data","copy","Uint8Array","byteLength","set","buffer","decodeUtf8","bytes","try","decode","catch","cause","reason","message","assertSigningPublicKeyLength","signingPublicKey","void","fail","assertSignatureLength","signature","getSubtle","suspend","subtle","globalThis","crypto","undefined","succeed","getCrypto","writeLength","target","offset","length","readLength","source","readField","payload","state","field","slice","bytesToHex","hex","byte","toString","padStart","encodeRemoteIdField","remoteId","encode","encodeSessionAuthPayload","fnUntraced","fields","challenge","publicKey","totalLength","reduce","total","encoded","decodeSessionAuthPayload","context","signSessionAuthPayloadBytes","options","privateKey","tryPromise","importKey","signingPrivateKey","sign","verifySessionAuthPayloadBytes","verify","signSessionAuthPayload","pipe","flatMap","verifySessionAuthPayload","makeSessionAuthChallenge","gen","getRandomValues","verifySessionAuthenticateRequest","algorithm"],"sources":["../../../src/unstable/eventlog/EventLogSessionAuth.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import * as Effect from "../../Effect.ts";
2
2
  import * as Layer from "../../Layer.ts";
3
3
  import * as SqlClient from "../sql/SqlClient.ts";
4
- import type * as SqlError from "../sql/SqlError.ts";
4
+ import * as SqlError from "../sql/SqlError.ts";
5
5
  import * as EventJournal from "./EventJournal.ts";
6
6
  /**
7
7
  * @since 4.0.0
@@ -19,4 +19,4 @@ export declare const layer: (options?: {
19
19
  readonly entryTable?: string;
20
20
  readonly remotesTable?: string;
21
21
  }) => Layer.Layer<EventJournal.EventJournal, SqlError.SqlError, SqlClient.SqlClient>;
22
- //# sourceMappingURL=SqlEventLogJournal.d.ts.map
22
+ //# sourceMappingURL=SqlEventJournal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlEventJournal.d.ts","sourceRoot":"","sources":["../../../src/unstable/eventlog/SqlEventJournal.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAGvC,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAE9C,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAIjD;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,UAAU;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B,KAAG,MAAM,CAAC,MAAM,CACf,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,EACpC,QAAQ,CAAC,QAAQ,EACjB,SAAS,CAAC,SAAS,CA2OjB,CAAA;AAEJ;;;GAGG;AACH,eAAO,MAAM,KAAK,GAAI,UAAU;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B,KAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CACzB,CAAA"}
@@ -7,6 +7,7 @@ import * as Layer from "../../Layer.js";
7
7
  import * as PubSub from "../../PubSub.js";
8
8
  import * as Schema from "../../Schema.js";
9
9
  import * as SqlClient from "../sql/SqlClient.js";
10
+ import * as SqlError from "../sql/SqlError.js";
10
11
  import * as SqlSchema from "../sql/SqlSchema.js";
11
12
  import * as EventJournal from "./EventJournal.js";
12
13
  /**
@@ -120,10 +121,10 @@ export const make = options => Effect.gen(function* () {
120
121
  yield* insertRemotes(remoteRows);
121
122
  }
122
123
  const uncommitted = options.entries.filter(entry => !existingIds.has(entry.entry.idString));
123
- const brackets = options.compact ? yield* options.compact(uncommitted) : [[uncommitted.map(remoteEntry => remoteEntry.entry), uncommitted]];
124
- for (const [compacted] of brackets) {
125
- for (const entry of compacted) {
126
- const conflicts = yield* sql`
124
+ const duplicateEntries = options.entries.filter(entry => existingIds.has(entry.entry.idString)).map(entry => entry.entry);
125
+ const compacted = options.compact ? yield* options.compact(uncommitted) : uncommitted.map(remoteEntry => remoteEntry.entry);
126
+ for (const entry of compacted) {
127
+ const conflicts = yield* sql`
127
128
  SELECT *
128
129
  FROM ${entryTableSql}
129
130
  WHERE event = ${entry.event} AND
@@ -131,12 +132,14 @@ export const make = options => Effect.gen(function* () {
131
132
  timestamp >= ${entry.createdAtMillis}
132
133
  ORDER BY timestamp ASC
133
134
  `.pipe(Effect.flatMap(decodeEntryRows), Effect.map(toEntries));
134
- yield* options.effect({
135
- entry,
136
- conflicts
137
- });
138
- }
135
+ yield* options.effect({
136
+ entry,
137
+ conflicts
138
+ });
139
139
  }
140
+ return {
141
+ duplicateEntries
142
+ };
140
143
  });
141
144
  return EventJournal.EventJournal.of({
142
145
  entries: sql`SELECT * FROM ${entryTableSql} ORDER BY timestamp ASC`.pipe(Effect.flatMap(decodeEntryRows), Effect.map(toEntries), Effect.mapError(cause => new EventJournal.EventJournalError({
@@ -161,11 +164,11 @@ export const make = options => Effect.gen(function* () {
161
164
  const value = yield* effect(entry);
162
165
  yield* PubSub.publish(pubsub, entry);
163
166
  return value;
164
- }, sql.withTransaction, Effect.mapError(cause => new EventJournal.EventJournalError({
167
+ }, Effect.mapError(cause => new EventJournal.EventJournalError({
165
168
  cause,
166
169
  method: "write"
167
170
  }))),
168
- writeFromRemote: options => writeFromRemote(options).pipe(sql.withTransaction, Effect.catchIf(e => e._tag !== "EventJournalError", cause => Effect.fail(new EventJournal.EventJournalError({
171
+ writeFromRemote: options => writeFromRemote(options).pipe(Effect.catchIf(e => e._tag !== "EventJournalError", cause => Effect.fail(new EventJournal.EventJournalError({
169
172
  cause,
170
173
  method: "writeFromRemote"
171
174
  })))),
@@ -177,7 +180,7 @@ export const make = options => Effect.gen(function* () {
177
180
  ORDER BY timestamp ASC
178
181
  `.pipe(Effect.flatMap(decodeEntryRows), Effect.map(toEntries));
179
182
  return yield* f(entries);
180
- }, sql.withTransaction, Effect.mapError(cause => new EventJournal.EventJournalError({
183
+ }, Effect.mapError(cause => new EventJournal.EventJournalError({
181
184
  cause,
182
185
  method: "withRemoteUncommited"
183
186
  }))),
@@ -196,7 +199,10 @@ export const make = options => Effect.gen(function* () {
196
199
  }).pipe(Effect.mapError(cause => new EventJournal.EventJournalError({
197
200
  cause,
198
201
  method: "destroy"
199
- })))
202
+ }))),
203
+ withLock(_storeId) {
204
+ return effect => sql.withTransaction(effect).pipe(Effect.catchIf(SqlError.isSqlError, Effect.die));
205
+ }
200
206
  });
201
207
  });
202
208
  /**
@@ -233,4 +239,4 @@ const RemoteRow = /*#__PURE__*/Schema.Struct({
233
239
  sequence: Schema.Number
234
240
  });
235
241
  const RemoteRowArray = /*#__PURE__*/Schema.Array(RemoteRow);
236
- //# sourceMappingURL=SqlEventLogJournal.js.map
242
+ //# sourceMappingURL=SqlEventJournal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlEventJournal.js","names":["Uuid","Effect","Layer","PubSub","Schema","SqlClient","SqlError","SqlSchema","EventJournal","make","options","gen","sql","withoutTransforms","entryTable","remotesTable","entryTableSql","remotesTableSql","onDialectOrElse","pg","mysql","mssql","orElse","decodeEntryRows","decodeUnknownEffect","EntryRowArray","toEntries","rows","map","toEntry","insertEntry","void","Request","EntryRow","execute","entry","insert","insertEntries","entries","insertRemotes","RemoteRowArray","pubsub","unbounded","writeFromRemote","fnUntraced","remoteEntry","remoteRows","remote_id","remoteId","entry_id","id","sequence","remoteSequence","existingIds","Set","length","in","pipe","tap","sync","row","add","stringify","toEntryRow","uncommitted","filter","has","idString","duplicateEntries","compacted","compact","conflicts","event","primaryKey","createdAtMillis","flatMap","effect","of","mapError","cause","EventJournalError","method","write","payload","Entry","makeEntryIdUnsafe","disableChecks","value","publish","catchIf","e","_tag","fail","withRemoteUncommited","f","nextRemoteSequence","max","undefined","Number","changes","subscribe","destroy","withLock","_storeId","withTransaction","isSqlError","die","layer","Struct","EntryId","String","primary_key","Uint8Array","timestamp","Array","entryIdMillis","RemoteRow","RemoteId"],"sources":["../../../src/unstable/eventlog/SqlEventJournal.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -7,7 +7,7 @@ import type * as Scope from "../../Scope.ts";
7
7
  import * as SqlClient from "../sql/SqlClient.ts";
8
8
  import type * as SqlError from "../sql/SqlError.ts";
9
9
  import * as EventLogEncryption from "./EventLogEncryption.ts";
10
- import * as EventLogServer from "./EventLogServer.ts";
10
+ import * as EventLogServerEncrypted from "./EventLogServerEncrypted.ts";
11
11
  /**
12
12
  * @since 4.0.0
13
13
  * @category constructors
@@ -16,7 +16,7 @@ export declare const makeStorage: (options?: {
16
16
  readonly entryTablePrefix?: string;
17
17
  readonly remoteIdTable?: string;
18
18
  readonly insertBatchSize?: number;
19
- }) => Effect.Effect<EventLogServer.Storage["Service"], SqlError.SqlError, SqlClient.SqlClient | EventLogEncryption.EventLogEncryption | Scope.Scope>;
19
+ }) => Effect.Effect<EventLogServerEncrypted.Storage["Service"], SqlError.SqlError, SqlClient.SqlClient | EventLogEncryption.EventLogEncryption | Scope.Scope>;
20
20
  /**
21
21
  * @since 4.0.0
22
22
  * @category layers
@@ -25,7 +25,7 @@ export declare const layerStorage: (options?: {
25
25
  readonly entryTablePrefix?: string;
26
26
  readonly remoteIdTable?: string;
27
27
  readonly insertBatchSize?: number;
28
- }) => Layer.Layer<EventLogServer.Storage, SqlError.SqlError, SqlClient.SqlClient | EventLogEncryption.EventLogEncryption>;
28
+ }) => Layer.Layer<EventLogServerEncrypted.Storage, SqlError.SqlError, SqlClient.SqlClient | EventLogEncryption.EventLogEncryption>;
29
29
  /**
30
30
  * @since 4.0.0
31
31
  * @category layers
@@ -34,5 +34,5 @@ export declare const layerStorageSubtle: (options?: {
34
34
  readonly entryTablePrefix?: string;
35
35
  readonly remoteIdTable?: string;
36
36
  readonly insertBatchSize?: number;
37
- }) => Layer.Layer<EventLogServer.Storage, SqlError.SqlError, SqlClient.SqlClient>;
38
- //# sourceMappingURL=SqlEventLogServer.d.ts.map
37
+ }) => Layer.Layer<EventLogServerEncrypted.Storage, SqlError.SqlError, SqlClient.SqlClient>;
38
+ //# sourceMappingURL=SqlEventLogServerEncrypted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlEventLogServerEncrypted.d.ts","sourceRoot":"","sources":["../../../src/unstable/eventlog/SqlEventLogServerEncrypted.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,OAAO,KAAK,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAEnD,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,uBAAuB,MAAM,8BAA8B,CAAA;AAEvE;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,UAAU;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC,KAAG,MAAM,CAAC,MAAM,CACf,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,EAC1C,QAAQ,CAAC,QAAQ,EACjB,SAAS,CAAC,SAAS,GAAG,kBAAkB,CAAC,kBAAkB,GAAG,KAAK,CAAC,KAAK,CA6NvE,CAAA;AAqCJ;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU;IACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC,KAAG,KAAK,CAAC,KAAK,CACb,uBAAuB,CAAC,OAAO,EAC/B,QAAQ,CAAC,QAAQ,EACjB,SAAS,CAAC,SAAS,GAAG,kBAAkB,CAAC,kBAAkB,CACW,CAAA;AAExE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU;IAC3C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC,KAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CAGpF,CAAA"}
@@ -4,13 +4,13 @@
4
4
  import * as Effect from "../../Effect.js";
5
5
  import * as Layer from "../../Layer.js";
6
6
  import * as PubSub from "../../PubSub.js";
7
- import * as Queue from "../../Queue.js";
8
7
  import * as RcMap from "../../RcMap.js";
9
8
  import * as Schema from "../../Schema.js";
9
+ import * as Stream from "../../Stream.js";
10
10
  import * as SqlClient from "../sql/SqlClient.js";
11
11
  import { EntryId, makeRemoteIdUnsafe } from "./EventJournal.js";
12
12
  import * as EventLogEncryption from "./EventLogEncryption.js";
13
- import * as EventLogServer from "./EventLogServer.js";
13
+ import * as EventLogServerEncrypted from "./EventLogServerEncrypted.js";
14
14
  /**
15
15
  * @since 4.0.0
16
16
  * @category constructors
@@ -20,8 +20,10 @@ export const makeStorage = options => Effect.gen(function* () {
20
20
  const sql = (yield* SqlClient.SqlClient).withoutTransforms();
21
21
  const tablePrefix = options?.entryTablePrefix ?? "effect_events";
22
22
  const remoteIdTable = options?.remoteIdTable ?? "effect_remote_id";
23
+ const sessionAuthBindingsTable = `${tablePrefix}_session_auth_bindings`;
23
24
  const insertBatchSize = options?.insertBatchSize ?? 200;
24
25
  const remoteIdTableSql = sql(remoteIdTable);
26
+ const sessionAuthBindingsTableSql = sql(sessionAuthBindingsTable);
25
27
  yield* sql.onDialectOrElse({
26
28
  pg: () => sql`
27
29
  CREATE TABLE IF NOT EXISTS ${remoteIdTableSql} (
@@ -40,6 +42,28 @@ export const makeStorage = options => Effect.gen(function* () {
40
42
  remote_id BLOB PRIMARY KEY
41
43
  )`
42
44
  });
45
+ yield* sql.onDialectOrElse({
46
+ pg: () => sql`
47
+ CREATE TABLE IF NOT EXISTS ${sessionAuthBindingsTableSql} (
48
+ public_key TEXT PRIMARY KEY,
49
+ signing_public_key BYTEA NOT NULL
50
+ )`,
51
+ mysql: () => sql`
52
+ CREATE TABLE IF NOT EXISTS ${sessionAuthBindingsTableSql} (
53
+ public_key VARCHAR(191) PRIMARY KEY,
54
+ signing_public_key BINARY(32) NOT NULL
55
+ )`,
56
+ mssql: () => sql`
57
+ CREATE TABLE IF NOT EXISTS ${sessionAuthBindingsTableSql} (
58
+ public_key NVARCHAR(191) PRIMARY KEY,
59
+ signing_public_key VARBINARY(32) NOT NULL
60
+ )`,
61
+ orElse: () => sql`
62
+ CREATE TABLE IF NOT EXISTS ${sessionAuthBindingsTableSql} (
63
+ public_key TEXT PRIMARY KEY,
64
+ signing_public_key BLOB NOT NULL
65
+ )`
66
+ });
43
67
  const remoteId = yield* sql`SELECT remote_id FROM ${remoteIdTableSql}`.pipe(Effect.flatMap(results => {
44
68
  if (results.length > 0) {
45
69
  return Effect.succeed(results[0].remote_id);
@@ -48,9 +72,9 @@ export const makeStorage = options => Effect.gen(function* () {
48
72
  return Effect.as(sql`INSERT INTO ${remoteIdTableSql} (remote_id) VALUES (${created})`, created);
49
73
  }));
50
74
  const resources = yield* RcMap.make({
51
- lookup: Effect.fnUntraced(function* (publicKey) {
52
- const publicKeyHash = (yield* encryptions.sha256String(new TextEncoder().encode(publicKey))).slice(0, 16);
53
- const table = `${tablePrefix}_${publicKeyHash}`;
75
+ lookup: Effect.fnUntraced(function* (scopeKey) {
76
+ const scopeHash = (yield* encryptions.sha256String(new TextEncoder().encode(scopeKey))).slice(0, 16);
77
+ const table = `${tablePrefix}_${scopeHash}`;
54
78
  const tableSql = sql(table);
55
79
  yield* sql.onDialectOrElse({
56
80
  pg: () => sql`
@@ -90,14 +114,33 @@ export const makeStorage = options => Effect.gen(function* () {
90
114
  }),
91
115
  idleTimeToLive: "5 minutes"
92
116
  });
93
- return EventLogServer.Storage.of({
117
+ const getSessionAuthBinding = publicKey => sql`
118
+ SELECT public_key, signing_public_key
119
+ FROM ${sessionAuthBindingsTableSql}
120
+ WHERE public_key = ${publicKey}
121
+ `.pipe(Effect.flatMap(decodeSessionAuthBindings), Effect.map(rows => {
122
+ const row = rows[0];
123
+ return row === undefined ? undefined : row.signing_public_key;
124
+ }), Effect.orDie);
125
+ return EventLogServerEncrypted.Storage.of({
94
126
  getId: Effect.succeed(remoteId),
95
- write: Effect.fnUntraced(function* (publicKey, entries) {
127
+ getOrCreateSessionAuthBinding: Effect.fnUntraced(function* (publicKey, signingPublicKey) {
128
+ const existing = yield* getSessionAuthBinding(publicKey);
129
+ if (existing !== undefined) {
130
+ return existing;
131
+ }
132
+ return yield* sql`
133
+ INSERT INTO ${sessionAuthBindingsTableSql} (public_key, signing_public_key)
134
+ VALUES (${publicKey}, ${signingPublicKey})
135
+ `.pipe(Effect.as(signingPublicKey));
136
+ }, sql.withTransaction, Effect.orDie),
137
+ write: Effect.fnUntraced(function* (publicKey, storeId, entries) {
96
138
  if (entries.length === 0) return [];
139
+ const scopeKey = makeEncryptedScopeKey(publicKey, storeId);
97
140
  const {
98
141
  pubsub,
99
142
  table
100
- } = yield* RcMap.get(resources, publicKey);
143
+ } = yield* RcMap.get(resources, scopeKey);
101
144
  const forInsert = [{
102
145
  ids: [],
103
146
  entries: []
@@ -129,27 +172,18 @@ export const makeStorage = options => Effect.gen(function* () {
129
172
  }
130
173
  return allEntries;
131
174
  }, Effect.orDie, Effect.scoped),
132
- entries: Effect.fnUntraced(function* (publicKey, startSequence) {
133
- const {
134
- table
135
- } = yield* RcMap.get(resources, publicKey);
136
- return yield* sql`SELECT * FROM ${sql(table)} WHERE sequence >= ${startSequence} ORDER BY sequence ASC`.pipe(Effect.flatMap(decodeEntries));
137
- }, Effect.orDie, Effect.scoped),
138
- changes: Effect.fnUntraced(function* (publicKey, startSequence) {
175
+ changes: Effect.fnUntraced(function* (publicKey, storeId, startSequence) {
176
+ const scopeKey = makeEncryptedScopeKey(publicKey, storeId);
139
177
  const {
140
178
  pubsub,
141
179
  table
142
- } = yield* RcMap.get(resources, publicKey);
143
- const queue = yield* Queue.make();
180
+ } = yield* RcMap.get(resources, scopeKey);
144
181
  const subscription = yield* PubSub.subscribe(pubsub);
145
182
  const initial = yield* sql`
146
183
  SELECT * FROM ${sql(table)} WHERE sequence >= ${startSequence} ORDER BY sequence ASC
147
184
  `.pipe(Effect.flatMap(decodeEntries));
148
- yield* Queue.offerAll(queue, initial);
149
- yield* PubSub.takeAll(subscription).pipe(Effect.flatMap(entries => Queue.offerAll(queue, entries.filter(entry => entry.sequence >= startSequence))), Effect.forever, Effect.forkScoped);
150
- yield* Effect.addFinalizer(() => Queue.shutdown(queue));
151
- return Queue.asDequeue(queue);
152
- }, Effect.orDie)
185
+ return Stream.fromArray(initial).pipe(Stream.concat(Stream.fromSubscription(subscription)));
186
+ }, Effect.orDie, Stream.unwrap)
153
187
  });
154
188
  });
155
189
  const EncryptedRemoteEntrySql = /*#__PURE__*/Schema.Struct({
@@ -158,7 +192,12 @@ const EncryptedRemoteEntrySql = /*#__PURE__*/Schema.Struct({
158
192
  entry_id: EntryId,
159
193
  encrypted_entry: Schema.Uint8Array
160
194
  });
195
+ const SessionAuthBindingSql = /*#__PURE__*/Schema.Struct({
196
+ public_key: Schema.String,
197
+ signing_public_key: Schema.Uint8Array
198
+ });
161
199
  const decodeEntryRows = /*#__PURE__*/Schema.decodeUnknownEffect(/*#__PURE__*/Schema.Array(EncryptedRemoteEntrySql));
200
+ const decodeSessionAuthBindingRows = /*#__PURE__*/Schema.decodeUnknownEffect(/*#__PURE__*/Schema.Array(SessionAuthBindingSql));
162
201
  const toEncryptedRemoteEntry = row => ({
163
202
  sequence: row.sequence,
164
203
  iv: row.iv,
@@ -166,14 +205,16 @@ const toEncryptedRemoteEntry = row => ({
166
205
  encryptedEntry: row.encrypted_entry
167
206
  });
168
207
  const decodeEntries = rows => decodeEntryRows(rows).pipe(Effect.map(entries => entries.map(toEncryptedRemoteEntry)));
208
+ const decodeSessionAuthBindings = rows => decodeSessionAuthBindingRows(rows);
169
209
  /**
170
210
  * @since 4.0.0
171
211
  * @category layers
172
212
  */
173
- export const layerStorage = options => Layer.effect(EventLogServer.Storage)(makeStorage(options));
213
+ export const layerStorage = options => Layer.effect(EventLogServerEncrypted.Storage)(makeStorage(options));
174
214
  /**
175
215
  * @since 4.0.0
176
216
  * @category layers
177
217
  */
178
218
  export const layerStorageSubtle = options => layerStorage(options).pipe(Layer.provide(EventLogEncryption.layerSubtle));
179
- //# sourceMappingURL=SqlEventLogServer.js.map
219
+ const makeEncryptedScopeKey = (publicKey, storeId) => `${publicKey}/${storeId}`;
220
+ //# sourceMappingURL=SqlEventLogServerEncrypted.js.map