@beignet/core 0.0.34 → 0.0.36
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 +23 -0
- package/README.md +145 -15
- package/dist/agent-capabilities/index.d.ts +197 -0
- package/dist/agent-capabilities/index.d.ts.map +1 -0
- package/dist/agent-capabilities/index.js +282 -0
- package/dist/agent-capabilities/index.js.map +1 -0
- package/dist/application/index.d.ts +2 -2
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +13 -3
- package/dist/application/index.js.map +1 -1
- package/dist/client/client.d.ts +2 -0
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +33 -16
- package/dist/client/client.js.map +1 -1
- package/dist/contracts/contract-builder.d.ts +5 -3
- package/dist/contracts/contract-builder.d.ts.map +1 -1
- package/dist/contracts/contract-builder.js +3 -12
- package/dist/contracts/contract-builder.js.map +1 -1
- package/dist/contracts/contract-group.d.ts +2 -2
- package/dist/contracts/contract-group.d.ts.map +1 -1
- package/dist/contracts/contract-group.js +2 -1
- package/dist/contracts/contract-group.js.map +1 -1
- package/dist/contracts/metadata.d.ts +3 -0
- package/dist/contracts/metadata.d.ts.map +1 -0
- package/dist/contracts/metadata.js +14 -0
- package/dist/contracts/metadata.js.map +1 -0
- package/dist/contracts/types.d.ts +20 -0
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/contracts/types.js.map +1 -1
- package/dist/events/index.d.ts +4 -4
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +5 -5
- package/dist/events/index.js.map +1 -1
- package/dist/idempotency/index.d.ts.map +1 -1
- package/dist/idempotency/index.js +14 -9
- package/dist/idempotency/index.js.map +1 -1
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +10 -4
- package/dist/jobs/index.js.map +1 -1
- package/dist/openapi/index.js +15 -8
- package/dist/openapi/index.js.map +1 -1
- package/dist/ports/auth.d.ts +2 -0
- package/dist/ports/auth.d.ts.map +1 -1
- package/dist/ports/auth.js +2 -0
- package/dist/ports/auth.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/provider.d.ts +9 -1
- package/dist/providers/provider.d.ts.map +1 -1
- package/dist/providers/provider.js.map +1 -1
- package/dist/schedules/index.d.ts +6 -13
- package/dist/schedules/index.d.ts.map +1 -1
- package/dist/schedules/index.js +24 -44
- package/dist/schedules/index.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/request-executor.d.ts +72 -0
- package/dist/server/request-executor.d.ts.map +1 -0
- package/dist/server/request-executor.js +781 -0
- package/dist/server/request-executor.js.map +1 -0
- package/dist/server/request-preparation.d.ts +39 -0
- package/dist/server/request-preparation.d.ts.map +1 -0
- package/dist/server/request-preparation.js +248 -0
- package/dist/server/request-preparation.js.map +1 -0
- package/dist/server/response-finalization.d.ts +34 -0
- package/dist/server/response-finalization.d.ts.map +1 -0
- package/dist/server/response-finalization.js +279 -0
- package/dist/server/response-finalization.js.map +1 -0
- package/dist/server/route-definitions.d.ts +139 -0
- package/dist/server/route-definitions.d.ts.map +1 -0
- package/dist/server/route-definitions.js +94 -0
- package/dist/server/route-definitions.js.map +1 -0
- package/dist/server/route-matching.d.ts +15 -0
- package/dist/server/route-matching.d.ts.map +1 -0
- package/dist/server/route-matching.js +46 -0
- package/dist/server/route-matching.js.map +1 -0
- package/dist/server/server.d.ts +6 -147
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +29 -1350
- package/dist/server/server.js.map +1 -1
- package/dist/server/use-case-route.d.ts +1 -1
- package/dist/tracing/index.d.ts +1 -1
- package/dist/tracing/index.d.ts.map +1 -1
- package/dist/tracing/index.js.map +1 -1
- package/dist/uploads/client.js +4 -7
- package/dist/uploads/client.js.map +1 -1
- package/dist/uploads/index.d.ts.map +1 -1
- package/dist/uploads/index.js +59 -12
- package/dist/uploads/index.js.map +1 -1
- package/package.json +5 -1
- package/skills/app-architecture/SKILL.md +27 -1
- package/src/agent-capabilities/index.ts +643 -0
- package/src/application/index.ts +19 -5
- package/src/client/client.ts +41 -17
- package/src/contracts/contract-builder.ts +8 -16
- package/src/contracts/contract-group.ts +4 -6
- package/src/contracts/metadata.ts +20 -0
- package/src/contracts/types.ts +39 -0
- package/src/events/index.ts +16 -20
- package/src/idempotency/index.ts +17 -9
- package/src/jobs/index.ts +8 -3
- package/src/openapi/index.ts +24 -12
- package/src/ports/auth.ts +2 -0
- package/src/providers/index.ts +1 -0
- package/src/providers/provider.ts +17 -2
- package/src/schedules/index.ts +57 -63
- package/src/server/index.ts +4 -2
- package/src/server/request-executor.ts +1170 -0
- package/src/server/request-preparation.ts +409 -0
- package/src/server/response-finalization.ts +385 -0
- package/src/server/route-definitions.ts +338 -0
- package/src/server/route-matching.ts +64 -0
- package/src/server/server.ts +63 -2139
- package/src/server/use-case-route.ts +1 -1
- package/src/tracing/index.ts +1 -0
- package/src/uploads/client.ts +4 -7
- package/src/uploads/index.ts +70 -12
|
@@ -258,7 +258,7 @@ type HooksOf<E> = E extends { hooks: infer H extends readonly unknown[] }
|
|
|
258
258
|
|
|
259
259
|
/**
|
|
260
260
|
* Per-element binder validation applied where route tuples are inferred, such
|
|
261
|
-
* as `defineRouteGroup
|
|
261
|
+
* as an app-bound `defineRouteGroup({ ... })`, so contract/use-case mismatches are
|
|
262
262
|
* reported on the individual route literal.
|
|
263
263
|
*/
|
|
264
264
|
export type ValidatedRouteInput<Ctx, E> = E extends {
|
package/src/tracing/index.ts
CHANGED
package/src/uploads/client.ts
CHANGED
|
@@ -688,7 +688,7 @@ async function requestJson<Result>(args: {
|
|
|
688
688
|
|
|
689
689
|
const body = await parseJsonBody(response, args);
|
|
690
690
|
if (!response.ok) {
|
|
691
|
-
const envelope =
|
|
691
|
+
const envelope = uploadErrorBody(body);
|
|
692
692
|
throw new UploadClientError({
|
|
693
693
|
operation: args.operation,
|
|
694
694
|
uploadName: args.uploadName,
|
|
@@ -725,17 +725,14 @@ async function parseJsonBody(
|
|
|
725
725
|
}
|
|
726
726
|
}
|
|
727
727
|
|
|
728
|
-
function
|
|
728
|
+
function uploadErrorBody(
|
|
729
729
|
body: unknown,
|
|
730
730
|
): { code?: string; message?: string; details?: unknown } | undefined {
|
|
731
|
-
if (typeof body !== "object" || body === null
|
|
731
|
+
if (typeof body !== "object" || body === null) {
|
|
732
732
|
return undefined;
|
|
733
733
|
}
|
|
734
734
|
|
|
735
|
-
const
|
|
736
|
-
if (typeof error !== "object" || error === null) return undefined;
|
|
737
|
-
|
|
738
|
-
const errorRecord = error as Record<string, unknown>;
|
|
735
|
+
const errorRecord = body as Record<string, unknown>;
|
|
739
736
|
|
|
740
737
|
return {
|
|
741
738
|
code: typeof errorRecord.code === "string" ? errorRecord.code : undefined,
|
package/src/uploads/index.ts
CHANGED
|
@@ -1166,12 +1166,23 @@ export function createUploadRouter<Ctx>(
|
|
|
1166
1166
|
);
|
|
1167
1167
|
}
|
|
1168
1168
|
|
|
1169
|
-
|
|
1169
|
+
const multipartContext = {
|
|
1170
1170
|
uploadName: requestOptions.uploadName,
|
|
1171
1171
|
action: "upload",
|
|
1172
1172
|
maxBytes: requestLimits.multipartMaxBytes,
|
|
1173
|
-
}
|
|
1174
|
-
const
|
|
1173
|
+
} as const;
|
|
1174
|
+
const multipartBody = await readLimitedRequestBytes(
|
|
1175
|
+
request,
|
|
1176
|
+
multipartContext,
|
|
1177
|
+
);
|
|
1178
|
+
const multipartHeaders = new Headers(request.headers);
|
|
1179
|
+
multipartHeaders.delete("content-length");
|
|
1180
|
+
const formData = await new Request(request.url, {
|
|
1181
|
+
method: request.method,
|
|
1182
|
+
headers: multipartHeaders,
|
|
1183
|
+
body: multipartBody,
|
|
1184
|
+
signal: request.signal,
|
|
1185
|
+
}).formData();
|
|
1175
1186
|
return jsonResponse(
|
|
1176
1187
|
await upload(requestOptions.uploadName, {
|
|
1177
1188
|
formData,
|
|
@@ -1240,6 +1251,57 @@ function assertUploadContentLengthWithinLimit(
|
|
|
1240
1251
|
}
|
|
1241
1252
|
}
|
|
1242
1253
|
|
|
1254
|
+
async function readLimitedRequestBytes(
|
|
1255
|
+
request: Request,
|
|
1256
|
+
context: {
|
|
1257
|
+
uploadName: string;
|
|
1258
|
+
action: "upload";
|
|
1259
|
+
maxBytes: number;
|
|
1260
|
+
},
|
|
1261
|
+
): Promise<ArrayBuffer> {
|
|
1262
|
+
assertUploadContentLengthWithinLimit(request.headers, context);
|
|
1263
|
+
|
|
1264
|
+
if (!request.body) return new ArrayBuffer(0);
|
|
1265
|
+
|
|
1266
|
+
const reader = request.body.getReader();
|
|
1267
|
+
const chunks: Uint8Array[] = [];
|
|
1268
|
+
let actualBytes = 0;
|
|
1269
|
+
|
|
1270
|
+
try {
|
|
1271
|
+
while (true) {
|
|
1272
|
+
const result = await reader.read();
|
|
1273
|
+
if (result.done) break;
|
|
1274
|
+
actualBytes += result.value.byteLength;
|
|
1275
|
+
if (actualBytes > context.maxBytes) {
|
|
1276
|
+
try {
|
|
1277
|
+
await reader.cancel();
|
|
1278
|
+
} catch {
|
|
1279
|
+
// Preserve the size-limit error when the request source rejects cancellation.
|
|
1280
|
+
}
|
|
1281
|
+
throw new UploadBodyTooLargeError({
|
|
1282
|
+
message: `Upload "${context.uploadName}" ${context.action} body is too large.`,
|
|
1283
|
+
details: {
|
|
1284
|
+
maxBytes: context.maxBytes,
|
|
1285
|
+
actualBytes,
|
|
1286
|
+
},
|
|
1287
|
+
});
|
|
1288
|
+
}
|
|
1289
|
+
chunks.push(result.value);
|
|
1290
|
+
}
|
|
1291
|
+
} finally {
|
|
1292
|
+
reader.releaseLock();
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
const body = new ArrayBuffer(actualBytes);
|
|
1296
|
+
const bytes = new Uint8Array(body);
|
|
1297
|
+
let offset = 0;
|
|
1298
|
+
for (const chunk of chunks) {
|
|
1299
|
+
bytes.set(chunk, offset);
|
|
1300
|
+
offset += chunk.byteLength;
|
|
1301
|
+
}
|
|
1302
|
+
return body;
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1243
1305
|
async function readLimitedRequestText(
|
|
1244
1306
|
request: Request,
|
|
1245
1307
|
context: {
|
|
@@ -2000,11 +2062,9 @@ function uploadErrorResponse(error: unknown): Response {
|
|
|
2000
2062
|
if (error instanceof UploadError) {
|
|
2001
2063
|
return jsonResponse(
|
|
2002
2064
|
{
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
...(error.details !== undefined ? { details: error.details } : {}),
|
|
2007
|
-
},
|
|
2065
|
+
code: error.code,
|
|
2066
|
+
message: error.message,
|
|
2067
|
+
...(error.details !== undefined ? { details: error.details } : {}),
|
|
2008
2068
|
},
|
|
2009
2069
|
{ status: error.status },
|
|
2010
2070
|
);
|
|
@@ -2012,10 +2072,8 @@ function uploadErrorResponse(error: unknown): Response {
|
|
|
2012
2072
|
|
|
2013
2073
|
return jsonResponse(
|
|
2014
2074
|
{
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
message: "Internal server error",
|
|
2018
|
-
},
|
|
2075
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
2076
|
+
message: "Internal server error",
|
|
2019
2077
|
},
|
|
2020
2078
|
{ status: 500 },
|
|
2021
2079
|
);
|