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.
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +16 -0
- package/dist/Equal.js.map +1 -1
- package/dist/Hash.js +1 -1
- package/dist/Hash.js.map +1 -1
- package/dist/Semaphore.d.ts +1 -1
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +1 -3
- package/dist/Semaphore.js.map +1 -1
- package/dist/unstable/ai/McpServer.d.ts.map +1 -1
- package/dist/unstable/ai/McpServer.js +24 -21
- package/dist/unstable/ai/McpServer.js.map +1 -1
- package/dist/unstable/eventlog/Event.d.ts +0 -6
- package/dist/unstable/eventlog/Event.d.ts.map +1 -1
- package/dist/unstable/eventlog/Event.js +0 -5
- package/dist/unstable/eventlog/Event.js.map +1 -1
- package/dist/unstable/eventlog/EventGroup.d.ts +0 -2
- package/dist/unstable/eventlog/EventGroup.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventGroup.js +0 -2
- package/dist/unstable/eventlog/EventGroup.js.map +1 -1
- package/dist/unstable/eventlog/EventJournal.d.ts +22 -5
- package/dist/unstable/eventlog/EventJournal.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventJournal.js +126 -67
- package/dist/unstable/eventlog/EventJournal.js.map +1 -1
- package/dist/unstable/eventlog/EventLog.d.ts +88 -34
- package/dist/unstable/eventlog/EventLog.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventLog.js +215 -141
- package/dist/unstable/eventlog/EventLog.js.map +1 -1
- package/dist/unstable/eventlog/EventLogEncryption.d.ts +9 -7
- package/dist/unstable/eventlog/EventLogEncryption.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventLogEncryption.js +13 -15
- package/dist/unstable/eventlog/EventLogEncryption.js.map +1 -1
- package/dist/unstable/eventlog/EventLogMessage.d.ts +228 -0
- package/dist/unstable/eventlog/EventLogMessage.d.ts.map +1 -0
- package/dist/unstable/eventlog/EventLogMessage.js +214 -0
- package/dist/unstable/eventlog/EventLogMessage.js.map +1 -0
- package/dist/unstable/eventlog/EventLogRemote.d.ts +109 -194
- package/dist/unstable/eventlog/EventLogRemote.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventLogRemote.js +165 -320
- package/dist/unstable/eventlog/EventLogRemote.js.map +1 -1
- package/dist/unstable/eventlog/EventLogServer.d.ts +25 -47
- package/dist/unstable/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventLogServer.js +127 -198
- package/dist/unstable/eventlog/EventLogServer.js.map +1 -1
- package/dist/unstable/eventlog/EventLogServerEncrypted.d.ts +60 -0
- package/dist/unstable/eventlog/EventLogServerEncrypted.d.ts.map +1 -0
- package/dist/unstable/eventlog/EventLogServerEncrypted.js +166 -0
- package/dist/unstable/eventlog/EventLogServerEncrypted.js.map +1 -0
- package/dist/unstable/eventlog/EventLogServerUnencrypted.d.ts +183 -0
- package/dist/unstable/eventlog/EventLogServerUnencrypted.d.ts.map +1 -0
- package/dist/unstable/eventlog/EventLogServerUnencrypted.js +461 -0
- package/dist/unstable/eventlog/EventLogServerUnencrypted.js.map +1 -0
- package/dist/unstable/eventlog/EventLogSessionAuth.d.ts +117 -0
- package/dist/unstable/eventlog/EventLogSessionAuth.d.ts.map +1 -0
- package/dist/unstable/eventlog/EventLogSessionAuth.js +284 -0
- package/dist/unstable/eventlog/EventLogSessionAuth.js.map +1 -0
- package/dist/unstable/eventlog/{SqlEventLogJournal.d.ts → SqlEventJournal.d.ts} +2 -2
- package/dist/unstable/eventlog/SqlEventJournal.d.ts.map +1 -0
- package/dist/unstable/eventlog/{SqlEventLogJournal.js → SqlEventJournal.js} +20 -14
- package/dist/unstable/eventlog/SqlEventJournal.js.map +1 -0
- package/dist/unstable/eventlog/{SqlEventLogServer.d.ts → SqlEventLogServerEncrypted.d.ts} +5 -5
- package/dist/unstable/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -0
- package/dist/unstable/eventlog/{SqlEventLogServer.js → SqlEventLogServerEncrypted.js} +65 -24
- package/dist/unstable/eventlog/SqlEventLogServerEncrypted.js.map +1 -0
- package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.d.ts +25 -0
- package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -0
- package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js +354 -0
- package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js.map +1 -0
- package/dist/unstable/eventlog/index.d.ts +22 -2
- package/dist/unstable/eventlog/index.d.ts.map +1 -1
- package/dist/unstable/eventlog/index.js +22 -2
- package/dist/unstable/eventlog/index.js.map +1 -1
- package/dist/unstable/eventlog/internal/identityRootSecretDerivation.d.ts +2 -0
- package/dist/unstable/eventlog/internal/identityRootSecretDerivation.d.ts.map +1 -0
- package/dist/unstable/eventlog/internal/identityRootSecretDerivation.js +89 -0
- package/dist/unstable/eventlog/internal/identityRootSecretDerivation.js.map +1 -0
- package/dist/unstable/reactivity/AtomHttpApi.d.ts +1 -2
- package/dist/unstable/reactivity/AtomHttpApi.d.ts.map +1 -1
- package/dist/unstable/reactivity/AtomHttpApi.js +2 -2
- package/dist/unstable/reactivity/AtomHttpApi.js.map +1 -1
- package/dist/unstable/reactivity/AtomRpc.d.ts +1 -2
- package/dist/unstable/reactivity/AtomRpc.d.ts.map +1 -1
- package/dist/unstable/reactivity/AtomRpc.js +3 -3
- package/dist/unstable/reactivity/AtomRpc.js.map +1 -1
- package/dist/unstable/rpc/Rpc.d.ts +25 -4
- package/dist/unstable/rpc/Rpc.d.ts.map +1 -1
- package/dist/unstable/rpc/Rpc.js +26 -0
- package/dist/unstable/rpc/Rpc.js.map +1 -1
- package/dist/unstable/rpc/RpcClient.d.ts +3 -13
- package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
- package/dist/unstable/rpc/RpcClient.js +47 -23
- package/dist/unstable/rpc/RpcClient.js.map +1 -1
- package/dist/unstable/rpc/RpcGroup.d.ts +1 -1
- package/dist/unstable/rpc/RpcGroup.d.ts.map +1 -1
- package/dist/unstable/rpc/RpcMiddleware.d.ts +2 -2
- package/dist/unstable/rpc/RpcMiddleware.d.ts.map +1 -1
- package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
- package/dist/unstable/rpc/RpcServer.js +3 -2
- package/dist/unstable/rpc/RpcServer.js.map +1 -1
- package/dist/unstable/rpc/Utils.d.ts +6 -0
- package/dist/unstable/rpc/Utils.d.ts.map +1 -1
- package/dist/unstable/rpc/Utils.js +44 -0
- package/dist/unstable/rpc/Utils.js.map +1 -1
- package/dist/unstable/schema/Model.d.ts +2 -2
- package/dist/unstable/schema/Model.d.ts.map +1 -1
- package/dist/unstable/schema/Model.js +2 -4
- package/dist/unstable/schema/Model.js.map +1 -1
- package/dist/unstable/schema/VariantSchema.d.ts +1 -1
- package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
- package/dist/unstable/schema/VariantSchema.js +1 -12
- package/dist/unstable/schema/VariantSchema.js.map +1 -1
- package/dist/unstable/workers/Transferable.d.ts +1 -1
- package/dist/unstable/workers/Transferable.d.ts.map +1 -1
- package/dist/unstable/workers/Transferable.js +1 -1
- package/dist/unstable/workers/Transferable.js.map +1 -1
- package/package.json +1 -1
- package/src/Equal.ts +17 -0
- package/src/Hash.ts +2 -2
- package/src/Semaphore.ts +2 -4
- package/src/unstable/ai/McpServer.ts +24 -22
- package/src/unstable/eventlog/Event.ts +0 -8
- package/src/unstable/eventlog/EventGroup.ts +0 -4
- package/src/unstable/eventlog/EventJournal.ts +144 -76
- package/src/unstable/eventlog/EventLog.ts +342 -221
- package/src/unstable/eventlog/EventLogEncryption.ts +16 -30
- package/src/unstable/eventlog/EventLogMessage.ts +277 -0
- package/src/unstable/eventlog/EventLogRemote.ts +261 -408
- package/src/unstable/eventlog/EventLogServer.ts +182 -274
- package/src/unstable/eventlog/EventLogServerEncrypted.ts +206 -0
- package/src/unstable/eventlog/EventLogServerUnencrypted.ts +749 -0
- package/src/unstable/eventlog/EventLogSessionAuth.ts +437 -0
- package/src/unstable/eventlog/{SqlEventLogJournal.ts → SqlEventJournal.ts} +26 -18
- package/src/unstable/eventlog/{SqlEventLogServer.ts → SqlEventLogServerEncrypted.ts} +102 -40
- package/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +500 -0
- package/src/unstable/eventlog/index.ts +27 -2
- package/src/unstable/eventlog/internal/identityRootSecretDerivation.ts +153 -0
- package/src/unstable/reactivity/AtomHttpApi.ts +23 -8
- package/src/unstable/reactivity/AtomRpc.ts +16 -5
- package/src/unstable/rpc/Rpc.ts +42 -4
- package/src/unstable/rpc/RpcClient.ts +59 -24
- package/src/unstable/rpc/RpcGroup.ts +1 -1
- package/src/unstable/rpc/RpcMiddleware.ts +2 -2
- package/src/unstable/rpc/RpcServer.ts +5 -3
- package/src/unstable/rpc/Utils.ts +59 -0
- package/src/unstable/schema/Model.ts +4 -6
- package/src/unstable/schema/VariantSchema.ts +4 -17
- package/src/unstable/workers/Transferable.ts +9 -11
- package/dist/unstable/eventlog/SqlEventLogJournal.d.ts.map +0 -1
- package/dist/unstable/eventlog/SqlEventLogJournal.js.map +0 -1
- package/dist/unstable/eventlog/SqlEventLogServer.d.ts.map +0 -1
- 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
|
|
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=
|
|
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
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
},
|
|
167
|
+
}, Effect.mapError(cause => new EventJournal.EventJournalError({
|
|
165
168
|
cause,
|
|
166
169
|
method: "write"
|
|
167
170
|
}))),
|
|
168
|
-
writeFromRemote: options => writeFromRemote(options).pipe(
|
|
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
|
-
},
|
|
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=
|
|
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
|
|
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<
|
|
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<
|
|
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<
|
|
38
|
-
//# sourceMappingURL=
|
|
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
|
|
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* (
|
|
52
|
-
const
|
|
53
|
-
const table = `${tablePrefix}_${
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
149
|
-
|
|
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(
|
|
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
|
-
|
|
219
|
+
const makeEncryptedScopeKey = (publicKey, storeId) => `${publicKey}/${storeId}`;
|
|
220
|
+
//# sourceMappingURL=SqlEventLogServerEncrypted.js.map
|