@beignet/core 0.0.52 → 0.0.53
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/CHANGELOG.md +11 -0
- package/README.md +53 -1
- package/dist/encryption/index.d.ts +40 -0
- package/dist/encryption/index.d.ts.map +1 -0
- package/dist/encryption/index.js +134 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/server/request-executor.d.ts.map +1 -1
- package/dist/server/request-executor.js +13 -0
- package/dist/server/request-executor.js.map +1 -1
- package/dist/server/use-case-route.d.ts +82 -17
- package/dist/server/use-case-route.d.ts.map +1 -1
- package/dist/server/use-case-route.js +40 -4
- package/dist/server/use-case-route.js.map +1 -1
- package/package.json +5 -1
- package/skills/app-architecture/SKILL.md +22 -1
- package/src/encryption/index.ts +198 -0
- package/src/server/request-executor.ts +19 -0
- package/src/server/use-case-route.ts +234 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-case-route.d.ts","sourceRoot":"","sources":["../../src/server/use-case-route.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-case-route.d.ts","sourceRoot":"","sources":["../../src/server/use-case-route.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,29 @@ import { inferSoleSuccessStatus } from "../contracts/index.js";
|
|
|
6
6
|
*/
|
|
7
7
|
const USE_CASE_TRUSTED_RUN_KEY = Symbol.for("beignet.useCase.trustedRun");
|
|
8
8
|
const USE_CASE_OUTPUT_VALIDATED_KEY = Symbol.for("beignet.useCase.outputValidated");
|
|
9
|
+
function isUseCaseInputValidationFailure(error, useCaseName) {
|
|
10
|
+
if (!(error instanceof Error))
|
|
11
|
+
return false;
|
|
12
|
+
const candidate = error;
|
|
13
|
+
return (candidate.name === "UseCaseValidationError" &&
|
|
14
|
+
candidate.phase === "input" &&
|
|
15
|
+
candidate.useCaseName === useCaseName);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Internal framework error raised when a type-erased binder route produces an
|
|
19
|
+
* input that the bound use case rejects.
|
|
20
|
+
*/
|
|
21
|
+
export class UseCaseRouteInputValidationError extends Error {
|
|
22
|
+
code = "USE_CASE_INPUT_VALIDATION_ERROR";
|
|
23
|
+
contractName;
|
|
24
|
+
useCaseName;
|
|
25
|
+
constructor(args) {
|
|
26
|
+
super(`Default binder input for contract "${args.contractName}" does not satisfy use case "${args.useCaseName}". Add an explicit input mapper.`, { cause: args.cause });
|
|
27
|
+
this.name = "UseCaseRouteInputValidationError";
|
|
28
|
+
this.contractName = args.contractName;
|
|
29
|
+
this.useCaseName = args.useCaseName;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
9
32
|
function isPlainObject(value) {
|
|
10
33
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11
34
|
}
|
|
@@ -93,10 +116,23 @@ export function createUseCaseRouteHandler(contract, def) {
|
|
|
93
116
|
? parts[singleInput.source]
|
|
94
117
|
: defaultBinderInput(parts);
|
|
95
118
|
const run = passSingle && trustedRun ? trustedRun : def.useCase.run;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
119
|
+
try {
|
|
120
|
+
return {
|
|
121
|
+
status,
|
|
122
|
+
body: await run.call(def.useCase, { ctx, input }),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (!def.input &&
|
|
127
|
+
isUseCaseInputValidationFailure(error, def.useCase.name)) {
|
|
128
|
+
throw new UseCaseRouteInputValidationError({
|
|
129
|
+
contractName: contract.name,
|
|
130
|
+
useCaseName: def.useCase.name,
|
|
131
|
+
cause: error,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
100
136
|
};
|
|
101
137
|
return {
|
|
102
138
|
handler,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-case-route.js","sourceRoot":"","sources":["../../src/server/use-case-route.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"use-case-route.js","sourceRoot":"","sources":["../../src/server/use-case-route.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beignet/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.53",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Core framework primitives for Beignet",
|
|
6
6
|
"exports": {
|
|
@@ -33,6 +33,10 @@
|
|
|
33
33
|
"types": "./dist/domain/index.d.ts",
|
|
34
34
|
"default": "./dist/domain/index.js"
|
|
35
35
|
},
|
|
36
|
+
"./encryption": {
|
|
37
|
+
"types": "./dist/encryption/index.d.ts",
|
|
38
|
+
"default": "./dist/encryption/index.js"
|
|
39
|
+
},
|
|
36
40
|
"./errors": {
|
|
37
41
|
"types": "./dist/errors/index.d.ts",
|
|
38
42
|
"default": "./dist/errors/index.js"
|
|
@@ -81,7 +81,10 @@ themselves.
|
|
|
81
81
|
feature data still belongs behind use cases.
|
|
82
82
|
- Server-only React Query prefetch helpers may consume that context for
|
|
83
83
|
hydrated client state. Use them only for direct `{ contract, useCase }` route
|
|
84
|
-
bindings whose
|
|
84
|
+
bindings whose default request input satisfies the use-case input and whose
|
|
85
|
+
use-case output matches the contract success body. When the contract and use
|
|
86
|
+
case use different input shapes or the use case reads validated headers, add
|
|
87
|
+
an explicit route `input` mapper.
|
|
85
88
|
- Server, provider, and infra code may import `@beignet/core/server-only`;
|
|
86
89
|
browser-reachable client helpers may import `@beignet/core/client-only` as
|
|
87
90
|
lint markers when the app uses them.
|
|
@@ -199,6 +202,24 @@ claims that the app explicitly treats as authoritative and current. Keep that
|
|
|
199
202
|
decision behind an app-owned resolver. Never turn caller-supplied tenant IDs or
|
|
200
203
|
unverified session fields directly into `TenantContext`.
|
|
201
204
|
|
|
205
|
+
## Encryption
|
|
206
|
+
|
|
207
|
+
Use `EncryptionPort` from `@beignet/core/encryption` for recoverable server
|
|
208
|
+
secrets. Construct `createEncryption({ key, previousKeys })` in
|
|
209
|
+
`infra/port-wiring.ts` and bind `encryption` in `AppPorts`; workflows call the
|
|
210
|
+
port. Repository adapters may encrypt before writes and decrypt on reads.
|
|
211
|
+
Call `encrypt({ value, context? })` and `decrypt({ value, context? })` with strings;
|
|
212
|
+
context is a stable plain string record derived from the expected purpose,
|
|
213
|
+
authorized tenant, and record. It is authenticated, not authorization.
|
|
214
|
+
|
|
215
|
+
Generate a persistent key once with `beignet encryption key`. Never generate
|
|
216
|
+
keys at startup, expose them to clients, or log plaintext. Keep current and
|
|
217
|
+
previous keys in server secret configuration. For rolling rotation, distribute
|
|
218
|
+
the next key to all readers before switching writes; keep old keys for existing
|
|
219
|
+
records and retained backups. `EncryptionDecryptionError` must fail closed:
|
|
220
|
+
never fall back to plaintext or overwrite unreadable data. See the encryption
|
|
221
|
+
concept page for re-encryption tasks, recovery, and KMS adapter boundaries.
|
|
222
|
+
|
|
202
223
|
## Workflows
|
|
203
224
|
|
|
204
225
|
Feature-owned workflow definitions belong under the feature:
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import "../server-only.js";
|
|
2
|
+
|
|
3
|
+
/** Non-secret, authenticated metadata. Supply the same expected context on reads. */
|
|
4
|
+
export type EncryptionContext = Readonly<Record<string, string>>;
|
|
5
|
+
|
|
6
|
+
/** Options shared by string encryption and decryption. */
|
|
7
|
+
export interface EncryptionValueOptions {
|
|
8
|
+
/** Plaintext for encrypt; the complete encrypted value for decrypt. */
|
|
9
|
+
value: string;
|
|
10
|
+
/** Bind the value to its purpose, tenant, or record. This is not authorization. */
|
|
11
|
+
context?: EncryptionContext;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Server-side authenticated string encryption. */
|
|
15
|
+
export interface EncryptionPort {
|
|
16
|
+
/** Encrypt a string; persist the complete returned value. */
|
|
17
|
+
encrypt(options: EncryptionValueOptions): Promise<string>;
|
|
18
|
+
/** Authenticate and decrypt a value with the same expected context. */
|
|
19
|
+
decrypt(options: EncryptionValueOptions): Promise<string>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Configuration for the built-in AES-256-GCM implementation. */
|
|
23
|
+
export interface CreateEncryptionOptions {
|
|
24
|
+
/** A base64: prefixed, canonical Base64 encoding of 32 random bytes. */
|
|
25
|
+
key: string;
|
|
26
|
+
/** Decryption-only keys in the same format. New writes always use key. */
|
|
27
|
+
previousKeys?: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Malformed, unauthenticated, or undecryptable ciphertext. Contains no input. */
|
|
31
|
+
export class EncryptionDecryptionError extends Error {
|
|
32
|
+
/** Stable error name, independent of the decryption failure's cause. */
|
|
33
|
+
readonly name = "EncryptionDecryptionError";
|
|
34
|
+
|
|
35
|
+
constructor() {
|
|
36
|
+
super("Unable to decrypt encrypted value.");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const envelopePrefix = "beignet:enc:v1:";
|
|
41
|
+
const ivLength = 12;
|
|
42
|
+
const tagLength = 16;
|
|
43
|
+
const encoder = new TextEncoder();
|
|
44
|
+
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
45
|
+
|
|
46
|
+
function encodeBase64(bytes: Uint8Array): string {
|
|
47
|
+
// Bound each spread so large values do not overflow the argument stack.
|
|
48
|
+
const chunks: string[] = [];
|
|
49
|
+
for (let offset = 0; offset < bytes.length; offset += 8192) {
|
|
50
|
+
chunks.push(String.fromCharCode(...bytes.subarray(offset, offset + 8192)));
|
|
51
|
+
}
|
|
52
|
+
return btoa(chunks.join(""));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function decodeBase64(value: string): Uint8Array<ArrayBuffer> {
|
|
56
|
+
if (value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) {
|
|
57
|
+
throw new Error("Invalid Base64 encoding.");
|
|
58
|
+
}
|
|
59
|
+
const bytes = Uint8Array.from(atob(value), (character) =>
|
|
60
|
+
character.charCodeAt(0),
|
|
61
|
+
);
|
|
62
|
+
if (encodeBase64(bytes) !== value)
|
|
63
|
+
throw new Error("Noncanonical Base64 encoding.");
|
|
64
|
+
return bytes;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function decodeKey(value: string, label: string): Uint8Array<ArrayBuffer> {
|
|
68
|
+
try {
|
|
69
|
+
if (
|
|
70
|
+
typeof value !== "string" ||
|
|
71
|
+
value.length !== 51 ||
|
|
72
|
+
!value.startsWith("base64:")
|
|
73
|
+
)
|
|
74
|
+
throw new Error();
|
|
75
|
+
const bytes = decodeBase64(value.slice(7));
|
|
76
|
+
if (bytes.length !== 32) throw new Error();
|
|
77
|
+
return bytes;
|
|
78
|
+
} catch {
|
|
79
|
+
throw new TypeError(
|
|
80
|
+
`${label} must be base64: followed by the Base64 encoding of 32 bytes. Use generateEncryptionKey().`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function authenticatedData(
|
|
86
|
+
context: EncryptionContext | undefined,
|
|
87
|
+
): Uint8Array<ArrayBuffer> {
|
|
88
|
+
if (
|
|
89
|
+
context !== undefined &&
|
|
90
|
+
(context === null ||
|
|
91
|
+
typeof context !== "object" ||
|
|
92
|
+
(Object.getPrototypeOf(context) !== Object.prototype &&
|
|
93
|
+
Object.getPrototypeOf(context) !== null))
|
|
94
|
+
) {
|
|
95
|
+
throw new TypeError(
|
|
96
|
+
"Encryption context must be a plain record of strings.",
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
const entries = Object.entries(context ?? {}).sort(([left], [right]) =>
|
|
100
|
+
left < right ? -1 : left > right ? 1 : 0,
|
|
101
|
+
);
|
|
102
|
+
if (entries.some(([, value]) => typeof value !== "string")) {
|
|
103
|
+
throw new TypeError("Encryption context values must be strings.");
|
|
104
|
+
}
|
|
105
|
+
return encoder.encode(JSON.stringify([envelopePrefix, entries]));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Generate a new 256-bit key. Store it in a server secret store; never log it. */
|
|
109
|
+
export function generateEncryptionKey(): string {
|
|
110
|
+
return `base64:${encodeBase64(crypto.getRandomValues(new Uint8Array(32)))}`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Create authenticated string encryption using Web Crypto AES-256-GCM.
|
|
115
|
+
* Configuration is validated synchronously. Each write uses a random 96-bit IV
|
|
116
|
+
* and a 128-bit authentication tag. Previous keys are used only for reads.
|
|
117
|
+
* No environment variables are read and no plaintext, keys, or context are logged.
|
|
118
|
+
*/
|
|
119
|
+
export function createEncryption(
|
|
120
|
+
options: CreateEncryptionOptions,
|
|
121
|
+
): EncryptionPort {
|
|
122
|
+
const current = decodeKey(options?.key, "Encryption key");
|
|
123
|
+
if (
|
|
124
|
+
options.previousKeys !== undefined &&
|
|
125
|
+
!Array.isArray(options.previousKeys)
|
|
126
|
+
) {
|
|
127
|
+
throw new TypeError("Encryption previousKeys must be an array of keys.");
|
|
128
|
+
}
|
|
129
|
+
const rawKeys = [
|
|
130
|
+
current,
|
|
131
|
+
...Array.from(options.previousKeys ?? [], (key, index) =>
|
|
132
|
+
decodeKey(key, `Encryption previousKeys[${index}]`),
|
|
133
|
+
),
|
|
134
|
+
];
|
|
135
|
+
const importedKeys: Array<Promise<CryptoKey> | undefined> = [];
|
|
136
|
+
const getKey = (index: number): Promise<CryptoKey> => {
|
|
137
|
+
const existing = importedKeys[index];
|
|
138
|
+
if (existing) return existing;
|
|
139
|
+
const imported = crypto.subtle.importKey(
|
|
140
|
+
"raw",
|
|
141
|
+
rawKeys[index],
|
|
142
|
+
"AES-GCM",
|
|
143
|
+
false,
|
|
144
|
+
["encrypt", "decrypt"],
|
|
145
|
+
);
|
|
146
|
+
importedKeys[index] = imported;
|
|
147
|
+
return imported;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
async encrypt({ value, context }) {
|
|
152
|
+
if (typeof value !== "string")
|
|
153
|
+
throw new TypeError("Encryption value must be a string.");
|
|
154
|
+
const additionalData = authenticatedData(context);
|
|
155
|
+
const iv = crypto.getRandomValues(new Uint8Array(ivLength));
|
|
156
|
+
const ciphertext = new Uint8Array(
|
|
157
|
+
await crypto.subtle.encrypt(
|
|
158
|
+
{ name: "AES-GCM", iv, additionalData, tagLength: tagLength * 8 },
|
|
159
|
+
await getKey(0),
|
|
160
|
+
// JSON preserves all JavaScript strings, including lone UTF-16 surrogates.
|
|
161
|
+
encoder.encode(JSON.stringify(value)),
|
|
162
|
+
),
|
|
163
|
+
);
|
|
164
|
+
const envelope = new Uint8Array(iv.length + ciphertext.length);
|
|
165
|
+
envelope.set(iv);
|
|
166
|
+
envelope.set(ciphertext, iv.length);
|
|
167
|
+
return `${envelopePrefix}${encodeBase64(envelope)}`;
|
|
168
|
+
},
|
|
169
|
+
async decrypt(options) {
|
|
170
|
+
try {
|
|
171
|
+
const { value, context } = options;
|
|
172
|
+
if (typeof value !== "string" || !value.startsWith(envelopePrefix))
|
|
173
|
+
throw new Error();
|
|
174
|
+
const envelope = decodeBase64(value.slice(envelopePrefix.length));
|
|
175
|
+
if (envelope.length < ivLength + tagLength + 2) throw new Error();
|
|
176
|
+
const additionalData = authenticatedData(context);
|
|
177
|
+
const iv = envelope.slice(0, ivLength);
|
|
178
|
+
const ciphertext = envelope.slice(ivLength);
|
|
179
|
+
for (let index = 0; index < rawKeys.length; index++) {
|
|
180
|
+
try {
|
|
181
|
+
const plaintext = await crypto.subtle.decrypt(
|
|
182
|
+
{ name: "AES-GCM", iv, additionalData, tagLength: tagLength * 8 },
|
|
183
|
+
await getKey(index),
|
|
184
|
+
ciphertext,
|
|
185
|
+
);
|
|
186
|
+
const parsed: unknown = JSON.parse(decoder.decode(plaintext));
|
|
187
|
+
if (typeof parsed === "string") return parsed;
|
|
188
|
+
} catch {
|
|
189
|
+
// Try only the configured key ring; never return unauthenticated data.
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
} catch {
|
|
193
|
+
// All decryption failures share one non-sensitive public error.
|
|
194
|
+
}
|
|
195
|
+
throw new EncryptionDecryptionError();
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
@@ -83,6 +83,7 @@ import {
|
|
|
83
83
|
} from "./route-matching.js";
|
|
84
84
|
import type { TrustedRequestInfo } from "./trusted-proxy.js";
|
|
85
85
|
import { InvalidRequestUrlError } from "./trusted-proxy-internal.js";
|
|
86
|
+
import { UseCaseRouteInputValidationError } from "./use-case-route.js";
|
|
86
87
|
|
|
87
88
|
function withoutHeadResponseBody(
|
|
88
89
|
response: HttpResponse,
|
|
@@ -282,6 +283,24 @@ export function createRequestExecutor<
|
|
|
282
283
|
};
|
|
283
284
|
}
|
|
284
285
|
|
|
286
|
+
if (currentError instanceof UseCaseRouteInputValidationError) {
|
|
287
|
+
return {
|
|
288
|
+
ctx,
|
|
289
|
+
response: errorResponse(
|
|
290
|
+
500,
|
|
291
|
+
currentError.code,
|
|
292
|
+
currentError.message,
|
|
293
|
+
{
|
|
294
|
+
contractName: currentError.contractName,
|
|
295
|
+
useCaseName: currentError.useCaseName,
|
|
296
|
+
location: "useCaseInput",
|
|
297
|
+
},
|
|
298
|
+
),
|
|
299
|
+
error: currentError,
|
|
300
|
+
owner: "framework",
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
285
304
|
if (currentError instanceof InvalidRequestUrlError) {
|
|
286
305
|
return {
|
|
287
306
|
ctx,
|