@aphexcms/cms-core 9.8.0 → 9.9.0
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/api/organizations.d.ts +2 -1
- package/dist/api/organizations.d.ts.map +1 -1
- package/dist/api/organizations.js +2 -1
- package/dist/api/schemas/jobs.d.ts +15 -0
- package/dist/api/schemas/jobs.d.ts.map +1 -0
- package/dist/api/schemas/jobs.js +17 -0
- package/dist/api/schemas/user.d.ts.map +1 -1
- package/dist/api/schemas/user.js +6 -2
- package/dist/auth/account-deletion.d.ts +35 -0
- package/dist/auth/account-deletion.d.ts.map +1 -0
- package/dist/auth/account-deletion.js +65 -0
- package/dist/auth/bootstrap.d.ts +104 -0
- package/dist/auth/bootstrap.d.ts.map +1 -0
- package/dist/auth/bootstrap.js +164 -0
- package/dist/auth/instance-state.d.ts +13 -0
- package/dist/auth/instance-state.d.ts.map +1 -0
- package/dist/auth/instance-state.js +30 -0
- package/dist/auth/invitation-status.d.ts +25 -0
- package/dist/auth/invitation-status.d.ts.map +1 -0
- package/dist/auth/invitation-status.js +41 -0
- package/dist/auth/sign-up-policy.d.ts +62 -0
- package/dist/auth/sign-up-policy.d.ts.map +1 -0
- package/dist/auth/sign-up-policy.js +120 -0
- package/dist/components/admin/ActivityView.svelte +263 -13
- package/dist/components/admin/ActivityView.svelte.d.ts +10 -1
- package/dist/components/admin/ActivityView.svelte.d.ts.map +1 -1
- package/dist/db/interfaces/events.d.ts +29 -2
- package/dist/db/interfaces/events.d.ts.map +1 -1
- package/dist/db/interfaces/index.d.ts +1 -0
- package/dist/db/interfaces/index.d.ts.map +1 -1
- package/dist/db/interfaces/index.js +1 -0
- package/dist/db/interfaces/instance.d.ts +29 -0
- package/dist/db/interfaces/instance.d.ts.map +1 -1
- package/dist/db/interfaces/instance.js +8 -1
- package/dist/events/built-in-consumers.d.ts +20 -0
- package/dist/events/built-in-consumers.d.ts.map +1 -0
- package/dist/events/built-in-consumers.js +49 -0
- package/dist/events/catalog.d.ts +16 -0
- package/dist/events/catalog.d.ts.map +1 -1
- package/dist/events/catalog.js +17 -0
- package/dist/events/consumer.d.ts +14 -0
- package/dist/events/consumer.d.ts.map +1 -1
- package/dist/events/consumer.js +1 -0
- package/dist/events/emit.d.ts +23 -0
- package/dist/events/emit.d.ts.map +1 -1
- package/dist/events/emit.js +32 -1
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +2 -0
- package/dist/field-validation/utils.d.ts +27 -4
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +78 -10
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/jobs/run-batch.d.ts +7 -1
- package/dist/jobs/run-batch.d.ts.map +1 -1
- package/dist/jobs/run-batch.js +3 -1
- package/dist/lib/api/organizations.d.ts +2 -1
- package/dist/lib/api/organizations.d.ts.map +1 -1
- package/dist/lib/api/organizations.js +2 -1
- package/dist/lib/api/organizations.js.map +1 -1
- package/dist/lib/api/schemas/api-keys.d.ts +4 -4
- package/dist/lib/api/schemas/jobs.d.ts +15 -0
- package/dist/lib/api/schemas/jobs.d.ts.map +1 -0
- package/dist/lib/api/schemas/jobs.js +18 -0
- package/dist/lib/api/schemas/jobs.js.map +1 -0
- package/dist/lib/api/schemas/user.d.ts.map +1 -1
- package/dist/lib/api/schemas/user.js +6 -2
- package/dist/lib/api/schemas/user.js.map +1 -1
- package/dist/lib/auth/account-deletion.d.ts +35 -0
- package/dist/lib/auth/account-deletion.d.ts.map +1 -0
- package/dist/lib/auth/account-deletion.js +66 -0
- package/dist/lib/auth/account-deletion.js.map +1 -0
- package/dist/lib/auth/bootstrap.d.ts +104 -0
- package/dist/lib/auth/bootstrap.d.ts.map +1 -0
- package/dist/lib/auth/bootstrap.js +165 -0
- package/dist/lib/auth/bootstrap.js.map +1 -0
- package/dist/lib/auth/instance-state.d.ts +13 -0
- package/dist/lib/auth/instance-state.d.ts.map +1 -0
- package/dist/lib/auth/instance-state.js +31 -0
- package/dist/lib/auth/instance-state.js.map +1 -0
- package/dist/lib/auth/invitation-status.d.ts +25 -0
- package/dist/lib/auth/invitation-status.d.ts.map +1 -0
- package/dist/lib/auth/invitation-status.js +42 -0
- package/dist/lib/auth/invitation-status.js.map +1 -0
- package/dist/lib/auth/sign-up-policy.d.ts +62 -0
- package/dist/lib/auth/sign-up-policy.d.ts.map +1 -0
- package/dist/lib/auth/sign-up-policy.js +121 -0
- package/dist/lib/auth/sign-up-policy.js.map +1 -0
- package/dist/lib/db/interfaces/events.d.ts +29 -2
- package/dist/lib/db/interfaces/events.d.ts.map +1 -1
- package/dist/lib/db/interfaces/index.d.ts +1 -0
- package/dist/lib/db/interfaces/index.d.ts.map +1 -1
- package/dist/lib/db/interfaces/index.js +1 -0
- package/dist/lib/db/interfaces/index.js.map +1 -1
- package/dist/lib/db/interfaces/instance.d.ts +29 -0
- package/dist/lib/db/interfaces/instance.d.ts.map +1 -1
- package/dist/lib/db/interfaces/instance.js +8 -1
- package/dist/lib/db/interfaces/instance.js.map +1 -1
- package/dist/lib/events/built-in-consumers.d.ts +20 -0
- package/dist/lib/events/built-in-consumers.d.ts.map +1 -0
- package/dist/lib/events/built-in-consumers.js +50 -0
- package/dist/lib/events/built-in-consumers.js.map +1 -0
- package/dist/lib/events/catalog.d.ts +16 -0
- package/dist/lib/events/catalog.d.ts.map +1 -1
- package/dist/lib/events/catalog.js +17 -0
- package/dist/lib/events/catalog.js.map +1 -1
- package/dist/lib/events/consumer.d.ts +14 -0
- package/dist/lib/events/consumer.d.ts.map +1 -1
- package/dist/lib/events/consumer.js +1 -0
- package/dist/lib/events/consumer.js.map +1 -1
- package/dist/lib/events/emit.d.ts +23 -0
- package/dist/lib/events/emit.d.ts.map +1 -1
- package/dist/lib/events/emit.js +32 -1
- package/dist/lib/events/emit.js.map +1 -1
- package/dist/lib/events/index.d.ts +2 -0
- package/dist/lib/events/index.d.ts.map +1 -1
- package/dist/lib/events/index.js +2 -0
- package/dist/lib/events/index.js.map +1 -1
- package/dist/lib/field-validation/utils.d.ts +27 -4
- package/dist/lib/field-validation/utils.d.ts.map +1 -1
- package/dist/lib/field-validation/utils.js +78 -10
- package/dist/lib/field-validation/utils.js.map +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +3 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/jobs/run-batch.d.ts +7 -1
- package/dist/lib/jobs/run-batch.d.ts.map +1 -1
- package/dist/lib/jobs/run-batch.js +3 -1
- package/dist/lib/jobs/run-batch.js.map +1 -1
- package/dist/lib/local-api/collection-api.d.ts +42 -1
- package/dist/lib/local-api/collection-api.d.ts.map +1 -1
- package/dist/lib/local-api/collection-api.js +68 -8
- package/dist/lib/local-api/collection-api.js.map +1 -1
- package/dist/lib/local-api/index.d.ts +1 -1
- package/dist/lib/local-api/index.d.ts.map +1 -1
- package/dist/lib/local-api/index.js +1 -1
- package/dist/lib/local-api/index.js.map +1 -1
- package/dist/lib/plugins/resolver.d.ts.map +1 -1
- package/dist/lib/plugins/resolver.js +7 -1
- package/dist/lib/plugins/resolver.js.map +1 -1
- package/dist/lib/server/api/rate-limit.d.ts +38 -0
- package/dist/lib/server/api/rate-limit.d.ts.map +1 -0
- package/dist/lib/server/api/rate-limit.js +71 -0
- package/dist/lib/server/api/rate-limit.js.map +1 -0
- package/dist/lib/server/api/routes/agent-change-sets.js +1 -1
- package/dist/lib/server/api/routes/agent-change-sets.js.map +1 -1
- package/dist/lib/server/api/routes/document-versions.js +1 -1
- package/dist/lib/server/api/routes/document-versions.js.map +1 -1
- package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents-by-id.js +11 -2
- package/dist/lib/server/api/routes/documents-by-id.js.map +1 -1
- package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents-publish.js +11 -1
- package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
- package/dist/lib/server/api/routes/documents.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents.js +10 -0
- package/dist/lib/server/api/routes/documents.js.map +1 -1
- package/dist/lib/server/api/routes/jobs.d.ts.map +1 -1
- package/dist/lib/server/api/routes/jobs.js +174 -20
- package/dist/lib/server/api/routes/jobs.js.map +1 -1
- package/dist/lib/server/api/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/lib/server/api/routes/organizations-by-id.js +61 -3
- package/dist/lib/server/api/routes/organizations-by-id.js.map +1 -1
- package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/lib/server/api/routes/organizations-invitations.js +31 -2
- package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -1
- package/dist/lib/server/api/routes/resolve-organization-names.d.ts +17 -0
- package/dist/lib/server/api/routes/resolve-organization-names.d.ts.map +1 -0
- package/dist/lib/server/api/routes/resolve-organization-names.js +26 -0
- package/dist/lib/server/api/routes/resolve-organization-names.js.map +1 -0
- package/dist/lib/server/api/routes/user.d.ts +0 -8
- package/dist/lib/server/api/routes/user.d.ts.map +1 -1
- package/dist/lib/server/api/routes/user.js +144 -0
- package/dist/lib/server/api/routes/user.js.map +1 -1
- package/dist/lib/server/index.d.ts +6 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +9 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/services/references-service.d.ts +1 -1
- package/dist/lib/services/references-service.d.ts.map +1 -1
- package/dist/lib/types/capabilities.d.ts +14 -0
- package/dist/lib/types/capabilities.d.ts.map +1 -1
- package/dist/lib/types/capabilities.js +37 -18
- package/dist/lib/types/capabilities.js.map +1 -1
- package/dist/lib/types/events.d.ts +27 -4
- package/dist/lib/types/events.d.ts.map +1 -1
- package/dist/lib/utils/fetch-remote-file.d.ts.map +1 -1
- package/dist/lib/utils/fetch-remote-file.js +32 -3
- package/dist/lib/utils/fetch-remote-file.js.map +1 -1
- package/dist/local-api/collection-api.d.ts +42 -1
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/collection-api.js +68 -8
- package/dist/local-api/index.d.ts +1 -1
- package/dist/local-api/index.d.ts.map +1 -1
- package/dist/local-api/index.js +1 -1
- package/dist/plugins/resolver.d.ts.map +1 -1
- package/dist/plugins/resolver.js +7 -1
- package/dist/server/api/rate-limit.d.ts +38 -0
- package/dist/server/api/rate-limit.d.ts.map +1 -0
- package/dist/server/api/rate-limit.js +70 -0
- package/dist/server/api/routes/agent-change-sets.js +1 -1
- package/dist/server/api/routes/document-versions.js +1 -1
- package/dist/server/api/routes/documents-by-id.d.ts.map +1 -1
- package/dist/server/api/routes/documents-by-id.js +11 -2
- package/dist/server/api/routes/documents-publish.d.ts.map +1 -1
- package/dist/server/api/routes/documents-publish.js +11 -1
- package/dist/server/api/routes/documents.d.ts.map +1 -1
- package/dist/server/api/routes/documents.js +10 -0
- package/dist/server/api/routes/jobs.d.ts.map +1 -1
- package/dist/server/api/routes/jobs.js +174 -20
- package/dist/server/api/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/server/api/routes/organizations-by-id.js +61 -3
- package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/server/api/routes/organizations-invitations.js +31 -2
- package/dist/server/api/routes/resolve-organization-names.d.ts +17 -0
- package/dist/server/api/routes/resolve-organization-names.d.ts.map +1 -0
- package/dist/server/api/routes/resolve-organization-names.js +25 -0
- package/dist/server/api/routes/user.d.ts +0 -8
- package/dist/server/api/routes/user.d.ts.map +1 -1
- package/dist/server/api/routes/user.js +144 -0
- package/dist/server/index.d.ts +6 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +9 -1
- package/dist/services/references-service.d.ts +1 -1
- package/dist/services/references-service.d.ts.map +1 -1
- package/dist/types/capabilities.d.ts +14 -0
- package/dist/types/capabilities.d.ts.map +1 -1
- package/dist/types/capabilities.js +37 -18
- package/dist/types/events.d.ts +27 -4
- package/dist/types/events.d.ts.map +1 -1
- package/dist/utils/fetch-remote-file.d.ts.map +1 -1
- package/dist/utils/fetch-remote-file.js +32 -3
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/lib/types/capabilities.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/lib/types/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -113,17 +113,23 @@ export interface Page<T> {
|
|
|
113
113
|
limit: number;
|
|
114
114
|
offset: number;
|
|
115
115
|
}
|
|
116
|
-
/**
|
|
116
|
+
/**
|
|
117
|
+
* Query for the read-only event history. Newest first.
|
|
118
|
+
*
|
|
119
|
+
* Omit `organizationId` to read across every organization — the instance-wide view.
|
|
120
|
+
* Only two callers may do that: the worker (which has override access by construction)
|
|
121
|
+
* and a super admin in the admin history view. Anything request-scoped must pass an id.
|
|
122
|
+
*/
|
|
117
123
|
export interface ListEventsOptions {
|
|
118
|
-
organizationId
|
|
124
|
+
organizationId?: string;
|
|
119
125
|
/** Filter by exact event type (e.g. `document.published`). */
|
|
120
126
|
type?: string;
|
|
121
127
|
limit?: number;
|
|
122
128
|
offset?: number;
|
|
123
129
|
}
|
|
124
|
-
/** Query for the read-only job history. Newest first. */
|
|
130
|
+
/** Query for the read-only job history. Newest first. Omitting `organizationId` reads instance-wide — see `ListEventsOptions`. */
|
|
125
131
|
export interface ListJobsOptions {
|
|
126
|
-
organizationId
|
|
132
|
+
organizationId?: string;
|
|
127
133
|
/** Filter by one status or several (e.g. only `failed`). */
|
|
128
134
|
status?: JobStatus | JobStatus[];
|
|
129
135
|
/** Filter by exact job type. */
|
|
@@ -131,4 +137,21 @@ export interface ListJobsOptions {
|
|
|
131
137
|
limit?: number;
|
|
132
138
|
offset?: number;
|
|
133
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* The relay's backlog, as a health signal.
|
|
142
|
+
*
|
|
143
|
+
* This is the one number that distinguishes "nothing happened" from "nothing is being
|
|
144
|
+
* processed". Jobs and events both look quiet-but-healthy when no worker is calling
|
|
145
|
+
* `POST /api/internal/workers/run`; a growing outbox backlog is the only place that
|
|
146
|
+
* shows up, because emission still writes rows that nobody is draining.
|
|
147
|
+
*
|
|
148
|
+
* `oldestPendingAt` matters more than `pending`: a big count that is seconds old is a
|
|
149
|
+
* busy instance, while a single row an hour old means the relay has stopped.
|
|
150
|
+
*/
|
|
151
|
+
export interface OutboxHealth {
|
|
152
|
+
/** Rows with `processedAt IS NULL`. */
|
|
153
|
+
pending: number;
|
|
154
|
+
/** `createdAt` of the oldest unprocessed row, or null when the backlog is empty. */
|
|
155
|
+
oldestPendingAt: Date | null;
|
|
156
|
+
}
|
|
134
157
|
//# sourceMappingURL=events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/lib/types/events.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/lib/types/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-remote-file.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/fetch-remote-file.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch-remote-file.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/fetch-remote-file.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AA6EtD,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;sBAGsB;AACtB,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0EtE"}
|
|
@@ -11,7 +11,35 @@
|
|
|
11
11
|
// that gets validated and the address that gets connected to must be the exact same one.
|
|
12
12
|
import { lookup } from 'node:dns/promises';
|
|
13
13
|
import net from 'node:net';
|
|
14
|
-
|
|
14
|
+
// Loading `undici` is deferred, and Node's own dispatcher is forced into place first. That
|
|
15
|
+
// ordering is the whole point of this function, and getting it wrong breaks something far away:
|
|
16
|
+
//
|
|
17
|
+
// Node's built-in fetch and the userland `undici` package share one slot —
|
|
18
|
+
// `globalThis[Symbol.for('undici.globalDispatcher.1')]` — and whoever writes it first wins.
|
|
19
|
+
// Importing `undici` claims that slot if it's still empty, and on Node 24+ the *built-in* fetch
|
|
20
|
+
// then routes through this bundled userland copy (as a `Dispatcher1Wrapper`). Its stricter
|
|
21
|
+
// `processHeader` rejects an explicit `content-length`, which the S3 client sets on every PUT — so
|
|
22
|
+
// merely importing this module killed every S3/R2 upload in the process with "invalid
|
|
23
|
+
// content-length header".
|
|
24
|
+
//
|
|
25
|
+
// The slot is non-configurable once set, and Node caches its wrapper internally, so this can't be
|
|
26
|
+
// undone after the fact: writing the symbol back (even to `undefined`) leaves fetch broken. The
|
|
27
|
+
// only fix is to not lose the race. A `data:` fetch resolves entirely in-process — no socket, no
|
|
28
|
+
// DNS — and is enough to make Node install its dispatcher, after which undici's import leaves the
|
|
29
|
+
// slot alone and both work.
|
|
30
|
+
//
|
|
31
|
+
// This module hangs off the `/server` barrel (server/index.ts → mcp/tools → here), so with a
|
|
32
|
+
// static `import` every Aphex app broke its own uploads at boot. It only showed in production:
|
|
33
|
+
// `vite dev` loads SSR modules lazily, so a real request usually primed Node's dispatcher first,
|
|
34
|
+
// while a production build imports the graph eagerly at startup and undici gets there first.
|
|
35
|
+
let undiciPromise;
|
|
36
|
+
function loadUndici() {
|
|
37
|
+
undiciPromise ??= (async () => {
|
|
38
|
+
await fetch('data:text/plain,0').catch(() => undefined);
|
|
39
|
+
return import('undici');
|
|
40
|
+
})();
|
|
41
|
+
return undiciPromise;
|
|
42
|
+
}
|
|
15
43
|
export const MAX_REMOTE_FILE_BYTES = 10 * 1024 * 1024; // matches the API's global JSON body cap
|
|
16
44
|
const FETCH_TIMEOUT_MS = 10_000;
|
|
17
45
|
const MAX_REDIRECTS = 5;
|
|
@@ -79,7 +107,7 @@ async function resolvePinnedHost(hostname) {
|
|
|
79
107
|
* whatever hostname undici asks it to resolve, it hands back this exact IP, so the socket that
|
|
80
108
|
* actually opens is guaranteed to be the one that passed `isPrivateOrReservedIp`. The hostname
|
|
81
109
|
* itself still flows through normally for the Host header and TLS SNI/cert validation. */
|
|
82
|
-
function pinnedDispatcher(host) {
|
|
110
|
+
function pinnedDispatcher(Agent, host) {
|
|
83
111
|
return new Agent({
|
|
84
112
|
connect: {
|
|
85
113
|
lookup: (_hostname, options, callback) => {
|
|
@@ -94,6 +122,7 @@ function pinnedDispatcher(host) {
|
|
|
94
122
|
* hop), a request timeout, and a streamed size cap (not just a Content-Length check, since that
|
|
95
123
|
* header can lie). */
|
|
96
124
|
export async function fetchRemoteFile(url) {
|
|
125
|
+
const { Agent, fetch: undiciFetch } = await loadUndici();
|
|
97
126
|
let current = url;
|
|
98
127
|
for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
|
|
99
128
|
const parsed = new URL(current);
|
|
@@ -112,7 +141,7 @@ export async function fetchRemoteFile(url) {
|
|
|
112
141
|
res = await undiciFetch(current, {
|
|
113
142
|
redirect: 'manual',
|
|
114
143
|
signal: controller.signal,
|
|
115
|
-
dispatcher: pinnedDispatcher(pinnedHost),
|
|
144
|
+
dispatcher: pinnedDispatcher(Agent, pinnedHost),
|
|
116
145
|
headers: REQUEST_HEADERS
|
|
117
146
|
});
|
|
118
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-remote-file.js","sourceRoot":"","sources":["../../../src/lib/utils/fetch-remote-file.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8FAA8F;AAC9F,6FAA6F;AAC7F,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,+FAA+F;AAC/F,0FAA0F;AAC1F,+FAA+F;AAC/F,8FAA8F;AAC9F,yFAAyF;AACzF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-remote-file.js","sourceRoot":"","sources":["../../../src/lib/utils/fetch-remote-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import type { Document } from '../types/document.js';
|
|
|
8
8
|
import type { LocalAPIContext } from './types.js';
|
|
9
9
|
import type { SchemaType } from '../types/schemas.js';
|
|
10
10
|
import { PermissionChecker } from './permissions.js';
|
|
11
|
-
import { type DocumentValidationResult } from '../field-validation/utils.js';
|
|
11
|
+
import { type DocumentValidationResult, type FieldErrors } from '../field-validation/utils.js';
|
|
12
12
|
import type { Job } from '../types/events.js';
|
|
13
13
|
/**
|
|
14
14
|
* Result from create/update operations that includes validation
|
|
@@ -25,6 +25,22 @@ export interface DocumentResult<T> {
|
|
|
25
25
|
export declare class SingletonOperationError extends Error {
|
|
26
26
|
constructor(message: string);
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Thrown when a write is rejected as *malformed* — a field the schema never
|
|
30
|
+
* declared, or a value of the wrong shape. The caller sent bad data, so this is
|
|
31
|
+
* a 400, not a 500.
|
|
32
|
+
*
|
|
33
|
+
* It exists as a type because the alternative was route handlers sniffing
|
|
34
|
+
* `error.message.includes('validation errors')`, which the structural message
|
|
35
|
+
* ("Invalid document data - …") doesn't match — so every rejected payload was
|
|
36
|
+
* reported to HTTP and MCP clients as a server error. Carries the structured
|
|
37
|
+
* `errors` so a handler (or an agent) can name the offending fields without
|
|
38
|
+
* parsing prose.
|
|
39
|
+
*/
|
|
40
|
+
export declare class DocumentValidationError extends Error {
|
|
41
|
+
readonly errors: FieldErrors[];
|
|
42
|
+
constructor(message: string, errors: FieldErrors[]);
|
|
43
|
+
}
|
|
28
44
|
/**
|
|
29
45
|
* Subset of CollectionAPI methods that are valid on a singleton schema.
|
|
30
46
|
* Codegen emits this type for singleton entries in the Collections interface
|
|
@@ -92,6 +108,31 @@ export declare class CollectionAPI<T = Document> {
|
|
|
92
108
|
find(context: LocalAPIContext, options?: FindOptions<T>): Promise<FindResult<T>>;
|
|
93
109
|
private resolveHiddenReadFields;
|
|
94
110
|
private resolveHiddenWriteFields;
|
|
111
|
+
/**
|
|
112
|
+
* Fetch a document by ID, scoped to this collection.
|
|
113
|
+
*
|
|
114
|
+
* Every permission check here is evaluated against `this.collectionName`, but
|
|
115
|
+
* document IDs are globally unique — so a lookup that matched on ID alone let a
|
|
116
|
+
* caller authorised for one collection read or mutate a known ID belonging to a
|
|
117
|
+
* restricted one, through the Local API, GraphQL, or MCP alike.
|
|
118
|
+
*
|
|
119
|
+
* A type mismatch is reported as "not found" rather than "forbidden" on purpose:
|
|
120
|
+
* the caller has no permission to learn that the ID exists elsewhere.
|
|
121
|
+
*
|
|
122
|
+
* Deliberately *not* used for reference lookups in `publish`, which resolve
|
|
123
|
+
* documents of arbitrary types by design.
|
|
124
|
+
*/
|
|
125
|
+
/**
|
|
126
|
+
* Reject a write whose payload is malformed, draft or not.
|
|
127
|
+
*
|
|
128
|
+
* Drafts skip *content* validation on purpose — you must be able to save
|
|
129
|
+
* half-finished work. But "incomplete" and "malformed" are different
|
|
130
|
+
* questions: a missing title is a draft, a string where an array belongs (or a
|
|
131
|
+
* field the schema never declared) is corruption, and letting it through means
|
|
132
|
+
* it's already in storage by the time anyone validates at publish.
|
|
133
|
+
*/
|
|
134
|
+
private assertStructurallyValid;
|
|
135
|
+
private findOwnDocById;
|
|
95
136
|
/**
|
|
96
137
|
* Find a single document by ID
|
|
97
138
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-api.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/collection-api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,
|
|
1
|
+
{"version":3,"file":"collection-api.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/collection-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -75,6 +75,26 @@ export class SingletonOperationError extends Error {
|
|
|
75
75
|
this.name = 'SingletonOperationError';
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Thrown when a write is rejected as *malformed* — a field the schema never
|
|
80
|
+
* declared, or a value of the wrong shape. The caller sent bad data, so this is
|
|
81
|
+
* a 400, not a 500.
|
|
82
|
+
*
|
|
83
|
+
* It exists as a type because the alternative was route handlers sniffing
|
|
84
|
+
* `error.message.includes('validation errors')`, which the structural message
|
|
85
|
+
* ("Invalid document data - …") doesn't match — so every rejected payload was
|
|
86
|
+
* reported to HTTP and MCP clients as a server error. Carries the structured
|
|
87
|
+
* `errors` so a handler (or an agent) can name the offending fields without
|
|
88
|
+
* parsing prose.
|
|
89
|
+
*/
|
|
90
|
+
export class DocumentValidationError extends Error {
|
|
91
|
+
errors;
|
|
92
|
+
constructor(message, errors) {
|
|
93
|
+
super(message);
|
|
94
|
+
this.errors = errors;
|
|
95
|
+
this.name = 'DocumentValidationError';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
78
98
|
/**
|
|
79
99
|
* Collection API - provides type-safe operations for a single collection
|
|
80
100
|
* Generic type T represents the document type for this collection
|
|
@@ -229,6 +249,43 @@ export class CollectionAPI {
|
|
|
229
249
|
return EMPTY_SET;
|
|
230
250
|
return hiddenWriteFields(this._schema, context.auth);
|
|
231
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Fetch a document by ID, scoped to this collection.
|
|
254
|
+
*
|
|
255
|
+
* Every permission check here is evaluated against `this.collectionName`, but
|
|
256
|
+
* document IDs are globally unique — so a lookup that matched on ID alone let a
|
|
257
|
+
* caller authorised for one collection read or mutate a known ID belonging to a
|
|
258
|
+
* restricted one, through the Local API, GraphQL, or MCP alike.
|
|
259
|
+
*
|
|
260
|
+
* A type mismatch is reported as "not found" rather than "forbidden" on purpose:
|
|
261
|
+
* the caller has no permission to learn that the ID exists elsewhere.
|
|
262
|
+
*
|
|
263
|
+
* Deliberately *not* used for reference lookups in `publish`, which resolve
|
|
264
|
+
* documents of arbitrary types by design.
|
|
265
|
+
*/
|
|
266
|
+
/**
|
|
267
|
+
* Reject a write whose payload is malformed, draft or not.
|
|
268
|
+
*
|
|
269
|
+
* Drafts skip *content* validation on purpose — you must be able to save
|
|
270
|
+
* half-finished work. But "incomplete" and "malformed" are different
|
|
271
|
+
* questions: a missing title is a draft, a string where an array belongs (or a
|
|
272
|
+
* field the schema never declared) is corruption, and letting it through means
|
|
273
|
+
* it's already in storage by the time anyone validates at publish.
|
|
274
|
+
*/
|
|
275
|
+
assertStructurallyValid(result) {
|
|
276
|
+
if (result.structuralErrors.length === 0)
|
|
277
|
+
return;
|
|
278
|
+
const detail = result.structuralErrors
|
|
279
|
+
.map((e) => `${e.field}: ${e.errors.join(', ')}`)
|
|
280
|
+
.join('; ');
|
|
281
|
+
throw new DocumentValidationError(`Invalid document data - ${detail}`, result.structuralErrors);
|
|
282
|
+
}
|
|
283
|
+
async findOwnDocById(organizationId, id, options) {
|
|
284
|
+
const doc = await this.databaseAdapter.findByDocIdAdvanced(organizationId, id, options);
|
|
285
|
+
if (!doc || doc.type !== this.collectionName)
|
|
286
|
+
return null;
|
|
287
|
+
return doc;
|
|
288
|
+
}
|
|
232
289
|
/**
|
|
233
290
|
* Find a single document by ID
|
|
234
291
|
*
|
|
@@ -259,7 +316,7 @@ export class CollectionAPI {
|
|
|
259
316
|
const orgIds = await this.hierarchyService.getOrgIdsWithChildren(context.organizationId);
|
|
260
317
|
findOptions.filterOrganizationIds = orgIds;
|
|
261
318
|
}
|
|
262
|
-
const result = await this.
|
|
319
|
+
const result = await this.findOwnDocById(context.organizationId, id, findOptions);
|
|
263
320
|
if (!result) {
|
|
264
321
|
return null;
|
|
265
322
|
}
|
|
@@ -318,6 +375,7 @@ export class CollectionAPI {
|
|
|
318
375
|
validation: {
|
|
319
376
|
isValid: true,
|
|
320
377
|
errors: [],
|
|
378
|
+
structuralErrors: [],
|
|
321
379
|
normalizedData: existing
|
|
322
380
|
}
|
|
323
381
|
};
|
|
@@ -342,6 +400,7 @@ export class CollectionAPI {
|
|
|
342
400
|
// Validate and normalize data (dates converted to ISO). The document context
|
|
343
401
|
// for cross-field validators is built inside validateDocumentData.
|
|
344
402
|
const validationResult = await validateDocumentData(this._schema, hookedData);
|
|
403
|
+
this.assertStructurallyValid(validationResult);
|
|
345
404
|
if (options?.publish) {
|
|
346
405
|
await this.permissions.canPublish(context, this.collectionName);
|
|
347
406
|
// Block publish if validation fails
|
|
@@ -450,7 +509,7 @@ export class CollectionAPI {
|
|
|
450
509
|
// Fetch the doc first so ownership policies have access to the target.
|
|
451
510
|
// A missing doc still returns null below; capability/role rules stay
|
|
452
511
|
// unaffected by the reorder.
|
|
453
|
-
const existingDoc = await this.
|
|
512
|
+
const existingDoc = await this.findOwnDocById(context.organizationId, id);
|
|
454
513
|
if (!existingDoc) {
|
|
455
514
|
return null;
|
|
456
515
|
}
|
|
@@ -482,6 +541,7 @@ export class CollectionAPI {
|
|
|
482
541
|
});
|
|
483
542
|
// Validate and normalize the merged data
|
|
484
543
|
const validationResult = await validateDocumentData(this._schema, hookedData);
|
|
544
|
+
this.assertStructurallyValid(validationResult);
|
|
485
545
|
// Update draft with normalized data (dates in ISO format)
|
|
486
546
|
// Use VersionService for atomic save + version creation if available
|
|
487
547
|
// RevisionConflictError propagates un-swallowed — a stale caller (a second
|
|
@@ -544,7 +604,7 @@ export class CollectionAPI {
|
|
|
544
604
|
// Fetch the target so ownership policies have a doc to inspect. For
|
|
545
605
|
// role/capability rules this extra read is a small cost; ergonomic
|
|
546
606
|
// wins outweigh it for operations that are rare by nature.
|
|
547
|
-
const existing = await this.
|
|
607
|
+
const existing = await this.findOwnDocById(context.organizationId, id);
|
|
548
608
|
if (!existing)
|
|
549
609
|
return false;
|
|
550
610
|
await this.permissions.canDelete(context, this.collectionName, existing);
|
|
@@ -584,7 +644,7 @@ export class CollectionAPI {
|
|
|
584
644
|
async publish(context, id, options) {
|
|
585
645
|
// Fetch first so policies can inspect the target. Order matters here:
|
|
586
646
|
// 404s beat 403s for missing docs.
|
|
587
|
-
const document = await this.
|
|
647
|
+
const document = await this.findOwnDocById(context.organizationId, id);
|
|
588
648
|
if (!document || !document.draftData) {
|
|
589
649
|
throw new Error('Document not found or has no draft content to publish');
|
|
590
650
|
}
|
|
@@ -646,7 +706,7 @@ export class CollectionAPI {
|
|
|
646
706
|
*/
|
|
647
707
|
async unpublish(context, id, options) {
|
|
648
708
|
// Fetch target for policy inspection before mutating.
|
|
649
|
-
const existing = await this.
|
|
709
|
+
const existing = await this.findOwnDocById(context.organizationId, id);
|
|
650
710
|
if (!existing)
|
|
651
711
|
return null;
|
|
652
712
|
await this.permissions.canUnpublish(context, this.collectionName, existing);
|
|
@@ -708,7 +768,7 @@ export class CollectionAPI {
|
|
|
708
768
|
* so a document has at most one pending schedule (rescheduling can't double-publish).
|
|
709
769
|
*/
|
|
710
770
|
async schedulePublish(context, id, runAt) {
|
|
711
|
-
const document = await this.
|
|
771
|
+
const document = await this.findOwnDocById(context.organizationId, id);
|
|
712
772
|
if (!document)
|
|
713
773
|
throw new Error('Document not found');
|
|
714
774
|
await this.permissions.canPublish(context, this.collectionName, document);
|
|
@@ -725,7 +785,7 @@ export class CollectionAPI {
|
|
|
725
785
|
}
|
|
726
786
|
/** Schedule an unpublish for a future `runAt`. Permission-checked now; replaces any existing pending schedule. */
|
|
727
787
|
async scheduleUnpublish(context, id, runAt) {
|
|
728
|
-
const document = await this.
|
|
788
|
+
const document = await this.findOwnDocById(context.organizationId, id);
|
|
729
789
|
if (!document)
|
|
730
790
|
throw new Error('Document not found');
|
|
731
791
|
await this.permissions.canUnpublish(context, this.collectionName, document);
|
|
@@ -747,7 +807,7 @@ export class CollectionAPI {
|
|
|
747
807
|
}
|
|
748
808
|
/** Cancel all pending scheduled publish/unpublish jobs for a document. Returns how many were cancelled. */
|
|
749
809
|
async cancelScheduled(context, id) {
|
|
750
|
-
const document = await this.
|
|
810
|
+
const document = await this.findOwnDocById(context.organizationId, id);
|
|
751
811
|
if (!document)
|
|
752
812
|
throw new Error('Document not found');
|
|
753
813
|
await this.permissions.canPublish(context, this.collectionName, document);
|
|
@@ -149,7 +149,7 @@ export declare function createLocalAPI(config: CMSConfig, userAdapter: DatabaseA
|
|
|
149
149
|
* ```
|
|
150
150
|
*/
|
|
151
151
|
export declare function getLocalAPI(): LocalAPI;
|
|
152
|
-
export { CollectionAPI, SingletonOperationError, type DocumentResult, type SingletonCollection } from './collection-api.js';
|
|
152
|
+
export { CollectionAPI, SingletonOperationError, DocumentValidationError, type DocumentResult, type SingletonCollection } from './collection-api.js';
|
|
153
153
|
export { PermissionChecker, PermissionError } from './permissions.js';
|
|
154
154
|
export type { LocalAPIContext, CreateOptions, UpdateOptions } from './types.js';
|
|
155
155
|
export { authToContext, requireAuth, systemContext } from './auth-helpers.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/index.ts"],"names":[],"mappings":"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"}
|
package/dist/local-api/index.js
CHANGED
|
@@ -270,6 +270,6 @@ export function getLocalAPI() {
|
|
|
270
270
|
return localAPIInstance;
|
|
271
271
|
}
|
|
272
272
|
// Re-export types and classes for convenience
|
|
273
|
-
export { CollectionAPI, SingletonOperationError } from './collection-api.js';
|
|
273
|
+
export { CollectionAPI, SingletonOperationError, DocumentValidationError } from './collection-api.js';
|
|
274
274
|
export { PermissionChecker, PermissionError } from './permissions.js';
|
|
275
275
|
export { authToContext, requireAuth, systemContext } from './auth-helpers.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/lib/plugins/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,YAAY,EACZ,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAGN,KAAK,oBAAoB,EACzB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/lib/plugins/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,YAAY,EACZ,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAGN,KAAK,oBAAoB,EACzB,MAAM,uBAAuB,CAAC;AAG/B,KAAK,MAAM,CAAC,CAAC,SAAS,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE;IAAE,UAAU,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC;AAEzE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,yEAAyE;IACzE,WAAW,IAAI,UAAU,EAAE,CAAC;IAC5B,6EAA6E;IAC7E,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC;IAC3D,gDAAgD;IAChD,YAAY,IAAI,eAAe,EAAE,CAAC;IAClC,8DAA8D;IAC9D,YAAY,IAAI,MAAM,EAAE,CAAC;IACzB;oEACgE;IAChE,iBAAiB,IAAI,oBAAoB,EAAE,CAAC;IAC5C,sFAAsF;IACtF,eAAe,CAAC,IAAI,EAAE;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,cAAc,CAAC,EAAE,OAAO,CAAC;KACzB,GAAG,kBAAkB,EAAE,CAAC;IACzB,mDAAmD;IACnD,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,aAAa,EAAE,CAAC;IAC1F,sEAAsE;IACtE,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IAC9D,+DAA+D;IAC/D,oBAAoB,IAAI,YAAY,EAAE,CAAC;IACvC,8DAA8D;IAC9D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;IAChE;;;;OAIG;IACH,WAAW,IAAI,aAAa,CAAC;IAC7B,gHAAgH;IAChH,cAAc,IAAI,iBAAiB,EAAE,CAAC;IACtC,mFAAmF;IACnF,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAC;IAC1D;;;;;OAKG;IACH,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,aAAa,EAAE,CAAC;CAC7F;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,SAAS,EAAO,GAAG,YAAY,CA+G1E"}
|
package/dist/plugins/resolver.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { defineCapability, mergeCapabilityCatalog } from '../types/capabilities.js';
|
|
2
|
+
import { BUILT_IN_EVENT_CONSUMERS } from '../events/built-in-consumers.js';
|
|
2
3
|
export function createPartResolver(plugins = []) {
|
|
3
|
-
|
|
4
|
+
// Core's own consumers come first, so a plugin declaring the same id collides in the
|
|
5
|
+
// duplicate check below rather than silently shadowing erasure.
|
|
6
|
+
const allParts = [
|
|
7
|
+
...BUILT_IN_EVENT_CONSUMERS,
|
|
8
|
+
...plugins.flatMap((p) => p.parts ?? [])
|
|
9
|
+
];
|
|
4
10
|
// Duplicate-id validation, per extension point. Parts without an id (schema,
|
|
5
11
|
// capabilities, field-component) are exempt.
|
|
6
12
|
const seen = new Map();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface RateLimitRule {
|
|
2
|
+
/** Window length in milliseconds. */
|
|
3
|
+
windowMs: number;
|
|
4
|
+
/** Requests allowed per window. */
|
|
5
|
+
max: number;
|
|
6
|
+
}
|
|
7
|
+
export interface RateLimitResult {
|
|
8
|
+
allowed: boolean;
|
|
9
|
+
/** Seconds until the current window rolls over — for a `Retry-After` header. */
|
|
10
|
+
retryAfterSeconds: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A named bucket of windows.
|
|
14
|
+
*
|
|
15
|
+
* Entries are swept lazily on write rather than on a timer: an interval would keep a
|
|
16
|
+
* reference alive for the process's whole life (and in a test run, past the end of the
|
|
17
|
+
* suite), and the map only grows when requests are arriving anyway.
|
|
18
|
+
*/
|
|
19
|
+
export declare class RateLimiter {
|
|
20
|
+
private rule;
|
|
21
|
+
private windows;
|
|
22
|
+
private lastSweep;
|
|
23
|
+
constructor(rule: RateLimitRule);
|
|
24
|
+
/** Count one request against `key`, and say whether it may proceed. */
|
|
25
|
+
check(key: string): RateLimitResult;
|
|
26
|
+
/** Drop windows that have already rolled over. Runs at most once per window length. */
|
|
27
|
+
private sweep;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Best-effort client address for rate-limit keying.
|
|
31
|
+
*
|
|
32
|
+
* `x-forwarded-for` is caller-supplied and trivially spoofed unless a trusted proxy sets it,
|
|
33
|
+
* so an IP bucket alone is not a control — it's the half that stops casual abuse. Pair it
|
|
34
|
+
* with a bucket on something the attacker can't rotate freely (the target email address) so
|
|
35
|
+
* the limit still bites when the address is forged.
|
|
36
|
+
*/
|
|
37
|
+
export declare function clientAddress(headers: Headers): string;
|
|
38
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/lib/server/api/rate-limit.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,aAAa;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IAIX,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAK;gBAEF,IAAI,EAAE,aAAa;IAEvC,uEAAuE;IACvE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IAkBnC,uFAAuF;IACvF,OAAO,CAAC,KAAK;CAOb;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAKtD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// A small fixed-window rate limiter for the unauthenticated endpoints cms-core exposes.
|
|
2
|
+
//
|
|
3
|
+
// Why this exists at all: the auth provider rate-limits its *own* HTTP endpoints, but the
|
|
4
|
+
// CMS facades (`POST /api/user/request-password-reset`, `/reset-password`) call the provider
|
|
5
|
+
// server-side. Better Auth's limiter — like its other request-shaped guards — only engages
|
|
6
|
+
// for calls that arrived over HTTP with a `ctx.request`, so an in-process call sails past it.
|
|
7
|
+
// The facades were therefore completely unthrottled: an email-sending endpoint and a
|
|
8
|
+
// token-checking endpoint, both reachable by anyone.
|
|
9
|
+
//
|
|
10
|
+
// Scope, stated plainly: this is per-process memory. Behind N app instances the effective
|
|
11
|
+
// limit is N× what's configured, and a restart forgets every window. That is a real
|
|
12
|
+
// weakening, and a deployment that needs a hard guarantee should put a limiter in front of
|
|
13
|
+
// the app or back this with the shared cache. It is still worth having — it turns "unlimited"
|
|
14
|
+
// into "bounded per instance", which is the difference between an email bomb and a nuisance.
|
|
15
|
+
/**
|
|
16
|
+
* A named bucket of windows.
|
|
17
|
+
*
|
|
18
|
+
* Entries are swept lazily on write rather than on a timer: an interval would keep a
|
|
19
|
+
* reference alive for the process's whole life (and in a test run, past the end of the
|
|
20
|
+
* suite), and the map only grows when requests are arriving anyway.
|
|
21
|
+
*/
|
|
22
|
+
export class RateLimiter {
|
|
23
|
+
rule;
|
|
24
|
+
windows = new Map();
|
|
25
|
+
lastSweep = 0;
|
|
26
|
+
constructor(rule) {
|
|
27
|
+
this.rule = rule;
|
|
28
|
+
}
|
|
29
|
+
/** Count one request against `key`, and say whether it may proceed. */
|
|
30
|
+
check(key) {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
this.sweep(now);
|
|
33
|
+
const existing = this.windows.get(key);
|
|
34
|
+
if (!existing || now - existing.startedAt >= this.rule.windowMs) {
|
|
35
|
+
this.windows.set(key, { startedAt: now, count: 1 });
|
|
36
|
+
return { allowed: true, retryAfterSeconds: 0 };
|
|
37
|
+
}
|
|
38
|
+
existing.count += 1;
|
|
39
|
+
if (existing.count <= this.rule.max) {
|
|
40
|
+
return { allowed: true, retryAfterSeconds: 0 };
|
|
41
|
+
}
|
|
42
|
+
const remaining = this.rule.windowMs - (now - existing.startedAt);
|
|
43
|
+
return { allowed: false, retryAfterSeconds: Math.max(1, Math.ceil(remaining / 1000)) };
|
|
44
|
+
}
|
|
45
|
+
/** Drop windows that have already rolled over. Runs at most once per window length. */
|
|
46
|
+
sweep(now) {
|
|
47
|
+
if (now - this.lastSweep < this.rule.windowMs)
|
|
48
|
+
return;
|
|
49
|
+
this.lastSweep = now;
|
|
50
|
+
for (const [key, window] of this.windows) {
|
|
51
|
+
if (now - window.startedAt >= this.rule.windowMs)
|
|
52
|
+
this.windows.delete(key);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Best-effort client address for rate-limit keying.
|
|
58
|
+
*
|
|
59
|
+
* `x-forwarded-for` is caller-supplied and trivially spoofed unless a trusted proxy sets it,
|
|
60
|
+
* so an IP bucket alone is not a control — it's the half that stops casual abuse. Pair it
|
|
61
|
+
* with a bucket on something the attacker can't rotate freely (the target email address) so
|
|
62
|
+
* the limit still bites when the address is forged.
|
|
63
|
+
*/
|
|
64
|
+
export function clientAddress(headers) {
|
|
65
|
+
const forwarded = headers.get('x-forwarded-for');
|
|
66
|
+
// Left-most entry is the original client; the rest are proxies that appended themselves.
|
|
67
|
+
if (forwarded)
|
|
68
|
+
return forwarded.split(',')[0]?.trim() || 'unknown';
|
|
69
|
+
return headers.get('x-real-ip')?.trim() || 'unknown';
|
|
70
|
+
}
|