@raybase/api 0.0.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/admin-routes.d.ts +11 -0
  3. package/dist/admin-routes.d.ts.map +1 -0
  4. package/dist/admin-routes.js +208 -0
  5. package/dist/admin-routes.js.map +1 -0
  6. package/dist/api.d.ts +102 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +375 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/auth.d.ts +87 -0
  11. package/dist/auth.d.ts.map +1 -0
  12. package/dist/auth.js +377 -0
  13. package/dist/auth.js.map +1 -0
  14. package/dist/crypto.d.ts +14 -0
  15. package/dist/crypto.d.ts.map +1 -0
  16. package/dist/crypto.js +59 -0
  17. package/dist/crypto.js.map +1 -0
  18. package/dist/errors.d.ts +9 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +26 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/generated/admin-assets.d.ts +5 -0
  23. package/dist/generated/admin-assets.d.ts.map +1 -0
  24. package/dist/generated/admin-assets.js +5 -0
  25. package/dist/generated/admin-assets.js.map +1 -0
  26. package/dist/index.d.ts +6 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/path.d.ts +2 -0
  31. package/dist/path.d.ts.map +1 -0
  32. package/dist/path.js +25 -0
  33. package/dist/path.js.map +1 -0
  34. package/dist/system-tables.d.ts +6 -0
  35. package/dist/system-tables.d.ts.map +1 -0
  36. package/dist/system-tables.js +65 -0
  37. package/dist/system-tables.js.map +1 -0
  38. package/package.json +36 -8
  39. package/skills/raybase-api/SKILL.md +45 -0
  40. package/templates/react-router/app/api/operations.ts +8 -0
  41. package/templates/tanstack-start/src/api/operations.ts +15 -0
  42. package/README.md +0 -3
package/dist/auth.js ADDED
@@ -0,0 +1,377 @@
1
+ import { actorAuditRef, authUserTableName, nowIso, q, randomId, recordAudit } from "@raybase/core";
2
+ import { ApiHttpError } from "./errors.js";
3
+ import { apiKeyEventsTableName, apiKeysTableName, apiServicePrincipalsTableName } from "./system-tables.js";
4
+ import { extractApiKeyLookupPrefix, generateApiKey, validateApiKeySecret, verifyApiKeyHash } from "./crypto.js";
5
+ import { sha256Hex } from "@raybase/core/internal";
6
+ export function apiKeySecret(env) {
7
+ return validateApiKeySecret(env.RAYBASE_API_KEY_SECRET);
8
+ }
9
+ export async function authenticateApiRequest(ctx, input) {
10
+ const token = bearerToken(ctx.request);
11
+ if (!token)
12
+ throw new ApiHttpError(401, "authentication_required", "Provide an API key as a bearer token.");
13
+ const prefix = extractApiKeyLookupPrefix(token);
14
+ if (!prefix)
15
+ throw new ApiHttpError(401, "invalid_api_key", "API key is invalid.");
16
+ const row = await ctx.control.first(`SELECT * FROM ${q(apiKeysTableName)} WHERE "prefix" = ?`, [prefix]);
17
+ if (!row)
18
+ throw new ApiHttpError(401, "invalid_api_key", "API key is invalid.");
19
+ const secret = apiKeySecret(ctx.env);
20
+ if (!(await verifyApiKeyHash(token, row.hash, secret))) {
21
+ await recordApiKeyEvent(ctx.control, {
22
+ keyId: row.id,
23
+ servicePrincipalId: row.servicePrincipalId,
24
+ ownerUserId: row.ownerUserId,
25
+ event: "auth.invalid_hash",
26
+ requestId: input.requestId,
27
+ metadata: { operationName: input.operationName, route: input.route }
28
+ });
29
+ throw new ApiHttpError(401, "invalid_api_key", "API key is invalid.");
30
+ }
31
+ const now = nowIso();
32
+ if (row.revokedAt)
33
+ throw new ApiHttpError(401, "invalid_api_key", "API key has been revoked.");
34
+ if (row.expiresAt && row.expiresAt <= now)
35
+ throw new ApiHttpError(401, "invalid_api_key", "API key has expired.");
36
+ const servicePrincipal = await ctx.control.first(`SELECT * FROM ${q(apiServicePrincipalsTableName)} WHERE "id" = ?`, [row.servicePrincipalId]);
37
+ if (!servicePrincipal || servicePrincipal.disabledAt) {
38
+ throw new ApiHttpError(401, "invalid_api_key", "API service principal is disabled.");
39
+ }
40
+ const user = await resolveUser(ctx.control, row.ownerUserId);
41
+ if (!user || user.disabled)
42
+ throw new ApiHttpError(401, "invalid_api_key", "API key owner is disabled.");
43
+ const scopes = parseScopes(row.scopesJson);
44
+ const missingScopes = input.scopes.filter((scope) => !scopes.includes(scope));
45
+ if (missingScopes.length) {
46
+ await recordApiKeyEvent(ctx.control, {
47
+ keyId: row.id,
48
+ servicePrincipalId: row.servicePrincipalId,
49
+ ownerUserId: row.ownerUserId,
50
+ event: "auth.invalid_scope",
51
+ requestId: input.requestId,
52
+ metadata: { operationName: input.operationName, route: input.route, missingScopes }
53
+ });
54
+ throw new ApiHttpError(403, "invalid_scope", "API key does not include the required scope.");
55
+ }
56
+ await updateApiKeyLastUsed(ctx.control, ctx.request, row.id);
57
+ return { key: row, servicePrincipal, user, scopes };
58
+ }
59
+ export async function listApiKeys(control) {
60
+ const rows = await control.all(`SELECT * FROM ${q(apiKeysTableName)} ORDER BY "createdAt" DESC LIMIT 500`);
61
+ return rows.map(summarizeApiKey);
62
+ }
63
+ export async function createApiKey(ctx, input, options = {}) {
64
+ const actor = ctx.requireAdmin();
65
+ const name = asNonEmptyString(input.name, "name");
66
+ const ownerUserId = asNonEmptyString(input.ownerUserId, "ownerUserId");
67
+ const owner = await resolveUser(ctx.control, ownerUserId);
68
+ if (!owner || owner.disabled)
69
+ throw new ApiHttpError(400, "invalid_request", "ownerUserId must reference an active Raybase user.");
70
+ const now = nowIso();
71
+ const scopes = normalizeScopes(input.scopes);
72
+ const expiresAt = normalizeExpiry(input.expiresAt, options, now);
73
+ const servicePrincipal = input.servicePrincipalId
74
+ ? await requireServicePrincipal(ctx.control, String(input.servicePrincipalId), ownerUserId)
75
+ : await createServicePrincipal(ctx.control, {
76
+ ownerUserId,
77
+ label: typeof input.principalLabel === "string" && input.principalLabel.trim() ? input.principalLabel.trim() : name,
78
+ description: typeof input.description === "string" ? input.description : null,
79
+ defaultScopes: scopes,
80
+ createdBy: actor.id,
81
+ now
82
+ });
83
+ const material = await generateApiKey({ secret: apiKeySecret(ctx.env), tokenPrefix: options.prefix });
84
+ const row = {
85
+ id: randomId("api_key"),
86
+ name,
87
+ description: typeof input.description === "string" && input.description.trim() ? input.description.trim() : null,
88
+ servicePrincipalId: servicePrincipal.id,
89
+ ownerUserId,
90
+ principalLabel: servicePrincipal.label,
91
+ prefix: material.prefix,
92
+ hash: material.hash,
93
+ scopesJson: JSON.stringify(scopes),
94
+ expiresAt,
95
+ revokedAt: null,
96
+ revokedBy: null,
97
+ revokedReason: null,
98
+ createdBy: actor.id,
99
+ createdAt: now,
100
+ rotatedAt: null,
101
+ lastUsedAt: null,
102
+ lastUsedIpHash: null,
103
+ lastUsedUserAgent: null
104
+ };
105
+ await insertApiKey(ctx.control, row);
106
+ await recordApiKeyEvent(ctx.control, {
107
+ keyId: row.id,
108
+ servicePrincipalId: row.servicePrincipalId,
109
+ ownerUserId: row.ownerUserId,
110
+ event: "key.created",
111
+ actorUserId: actor.id,
112
+ metadata: { scopes, expiresAt }
113
+ });
114
+ await recordAudit(ctx.control, {
115
+ actor: actorAuditRef(actor.id),
116
+ action: "api.key.created",
117
+ target: { type: "raybase_api_key", id: row.id },
118
+ metadata: {
119
+ servicePrincipalId: row.servicePrincipalId,
120
+ ownerUserId: row.ownerUserId,
121
+ scopes,
122
+ expiresAt
123
+ }
124
+ });
125
+ return { key: summarizeApiKey(row), token: material.token };
126
+ }
127
+ export async function rotateApiKey(ctx, keyId, options = {}) {
128
+ const actor = ctx.requireAdmin();
129
+ const existing = await requireApiKey(ctx.control, keyId);
130
+ if (existing.revokedAt) {
131
+ throw new ApiHttpError(409, "invalid_request", "Revoked API keys cannot be rotated.");
132
+ }
133
+ const material = await generateApiKey({ secret: apiKeySecret(ctx.env), tokenPrefix: options.prefix });
134
+ const now = nowIso();
135
+ await ctx.control.run(`UPDATE ${q(apiKeysTableName)}
136
+ SET "prefix" = ?, "hash" = ?, "rotatedAt" = ?, "revokedAt" = NULL, "revokedBy" = NULL, "revokedReason" = NULL
137
+ WHERE "id" = ?`, [material.prefix, material.hash, now, keyId]);
138
+ const next = { ...existing, prefix: material.prefix, hash: material.hash, rotatedAt: now, revokedAt: null, revokedBy: null, revokedReason: null };
139
+ await recordApiKeyEvent(ctx.control, {
140
+ keyId,
141
+ servicePrincipalId: existing.servicePrincipalId,
142
+ ownerUserId: existing.ownerUserId,
143
+ event: "key.rotated",
144
+ actorUserId: actor.id
145
+ });
146
+ await recordAudit(ctx.control, {
147
+ actor: actorAuditRef(actor.id),
148
+ action: "api.key.rotated",
149
+ target: { type: "raybase_api_key", id: keyId },
150
+ metadata: {
151
+ servicePrincipalId: existing.servicePrincipalId,
152
+ ownerUserId: existing.ownerUserId
153
+ }
154
+ });
155
+ return { key: summarizeApiKey(next), token: material.token };
156
+ }
157
+ export async function revokeApiKey(ctx, keyId, reason) {
158
+ const actor = ctx.requireAdmin();
159
+ const existing = await requireApiKey(ctx.control, keyId);
160
+ const now = nowIso();
161
+ const revokedReason = typeof reason === "string" && reason.trim() ? reason.trim() : null;
162
+ await ctx.control.run(`UPDATE ${q(apiKeysTableName)} SET "revokedAt" = ?, "revokedBy" = ?, "revokedReason" = ? WHERE "id" = ?`, [now, actor.id, revokedReason, keyId]);
163
+ const next = { ...existing, revokedAt: now, revokedBy: actor.id, revokedReason };
164
+ await recordApiKeyEvent(ctx.control, {
165
+ keyId,
166
+ servicePrincipalId: existing.servicePrincipalId,
167
+ ownerUserId: existing.ownerUserId,
168
+ event: "key.revoked",
169
+ actorUserId: actor.id,
170
+ metadata: { reason: revokedReason }
171
+ });
172
+ await recordAudit(ctx.control, {
173
+ actor: actorAuditRef(actor.id),
174
+ action: "api.key.revoked",
175
+ target: { type: "raybase_api_key", id: keyId },
176
+ metadata: {
177
+ servicePrincipalId: existing.servicePrincipalId,
178
+ ownerUserId: existing.ownerUserId,
179
+ reason: revokedReason
180
+ }
181
+ });
182
+ return { key: summarizeApiKey(next) };
183
+ }
184
+ export async function deleteApiKey(ctx, keyId) {
185
+ const actor = ctx.requireAdmin();
186
+ const existing = await requireApiKey(ctx.control, keyId);
187
+ await ctx.control.run(`DELETE FROM ${q(apiKeysTableName)} WHERE "id" = ?`, [keyId]);
188
+ await recordApiKeyEvent(ctx.control, {
189
+ keyId,
190
+ servicePrincipalId: existing.servicePrincipalId,
191
+ ownerUserId: existing.ownerUserId,
192
+ event: "key.deleted",
193
+ actorUserId: actor.id
194
+ });
195
+ await recordAudit(ctx.control, {
196
+ actor: actorAuditRef(actor.id),
197
+ action: "api.key.deleted",
198
+ target: { type: "raybase_api_key", id: keyId },
199
+ metadata: {
200
+ servicePrincipalId: existing.servicePrincipalId,
201
+ ownerUserId: existing.ownerUserId
202
+ }
203
+ });
204
+ return { ok: true };
205
+ }
206
+ export async function recordApiKeyEvent(control, input) {
207
+ await control.run(`INSERT INTO ${q(apiKeyEventsTableName)}
208
+ ("id", "keyId", "servicePrincipalId", "ownerUserId", "event", "actorUserId", "requestId", "metadataJson", "createdAt")
209
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
210
+ randomId("api_evt"),
211
+ input.keyId,
212
+ input.servicePrincipalId ?? null,
213
+ input.ownerUserId ?? null,
214
+ input.event,
215
+ input.actorUserId ?? null,
216
+ input.requestId ?? null,
217
+ input.metadata === undefined ? null : JSON.stringify(input.metadata),
218
+ nowIso()
219
+ ]).catch(() => undefined);
220
+ }
221
+ export function summarizeApiKey(row) {
222
+ const { hash: _hash, scopesJson: _scopesJson, ...rest } = row;
223
+ return { ...rest, scopes: parseScopes(row.scopesJson) };
224
+ }
225
+ function bearerToken(request) {
226
+ const header = request.headers.get("authorization") ?? "";
227
+ const match = /^Bearer\s+(.+)$/i.exec(header.trim());
228
+ return match?.[1]?.trim() || null;
229
+ }
230
+ async function resolveUser(control, id) {
231
+ const row = await control.first(`SELECT "id", "email", "name", "operatorRole", "appRoles", "banned" FROM ${q(authUserTableName)} WHERE "id" = ?`, [id]);
232
+ if (!row)
233
+ return null;
234
+ return {
235
+ id: String(row.id),
236
+ email: String(row.email ?? ""),
237
+ name: String(row.name ?? row.email ?? row.id),
238
+ operatorRole: row.operatorRole === "owner" || row.operatorRole === "admin" ? row.operatorRole : null,
239
+ appRoles: parseRoles(row.appRoles),
240
+ disabled: Boolean(row.banned)
241
+ };
242
+ }
243
+ function parseRoles(value) {
244
+ if (Array.isArray(value))
245
+ return normalizeStringArray(value).length ? normalizeStringArray(value) : ["user"];
246
+ if (typeof value !== "string" || !value.trim())
247
+ return ["user"];
248
+ try {
249
+ const parsed = JSON.parse(value);
250
+ if (Array.isArray(parsed))
251
+ return normalizeStringArray(parsed).length ? normalizeStringArray(parsed) : ["user"];
252
+ }
253
+ catch {
254
+ return normalizeStringArray(value.split(",")).length ? normalizeStringArray(value.split(",")) : ["user"];
255
+ }
256
+ return [value];
257
+ }
258
+ function parseScopes(value) {
259
+ if (Array.isArray(value))
260
+ return normalizeStoredScopes(value);
261
+ if (typeof value !== "string" || !value.trim())
262
+ throw invalidStoredScopesError();
263
+ try {
264
+ return normalizeStoredScopes(JSON.parse(value));
265
+ }
266
+ catch {
267
+ return normalizeStoredScopes(value.split(/[,\s]+/));
268
+ }
269
+ }
270
+ function normalizeStoredScopes(value) {
271
+ try {
272
+ return normalizeScopes(value);
273
+ }
274
+ catch {
275
+ throw invalidStoredScopesError();
276
+ }
277
+ }
278
+ function invalidStoredScopesError() {
279
+ return new ApiHttpError(500, "internal_error", "API key scope data is invalid.");
280
+ }
281
+ function normalizeScopes(value) {
282
+ const scopes = normalizeStringArray(Array.isArray(value) ? value : []);
283
+ if (!scopes.length)
284
+ throw new ApiHttpError(400, "invalid_request", "At least one API scope is required.");
285
+ for (const scope of scopes) {
286
+ if (!/^[a-z][a-z0-9_.-]{0,63}:(read|write|delete|[a-z][a-z0-9_.-]{0,31})$/.test(scope)) {
287
+ throw new ApiHttpError(400, "invalid_request", `Invalid API scope: ${scope}`);
288
+ }
289
+ }
290
+ return scopes;
291
+ }
292
+ function normalizeStringArray(value) {
293
+ return Array.from(new Set(value.map((entry) => String(entry ?? "").trim()).filter(Boolean)));
294
+ }
295
+ function asNonEmptyString(value, field) {
296
+ if (typeof value !== "string" || !value.trim())
297
+ throw new ApiHttpError(400, "invalid_request", `${field} is required.`);
298
+ return value.trim();
299
+ }
300
+ function normalizeExpiry(value, options, now) {
301
+ const maxExpiryDays = options.maxExpiryDays ?? 365;
302
+ if (typeof value === "string" && value.trim()) {
303
+ const parsed = new Date(value);
304
+ if (Number.isNaN(parsed.getTime()))
305
+ throw new ApiHttpError(400, "invalid_request", "expiresAt must be an ISO date.");
306
+ const max = Date.parse(now) + maxExpiryDays * 24 * 60 * 60 * 1000;
307
+ if (parsed.getTime() > max)
308
+ throw new ApiHttpError(400, "invalid_request", `expiresAt exceeds the ${maxExpiryDays} day maximum.`);
309
+ return parsed.toISOString();
310
+ }
311
+ const defaultExpiryDays = options.defaultExpiryDays;
312
+ if (!defaultExpiryDays)
313
+ return null;
314
+ const days = Math.min(defaultExpiryDays, maxExpiryDays);
315
+ return new Date(Date.parse(now) + days * 24 * 60 * 60 * 1000).toISOString();
316
+ }
317
+ async function createServicePrincipal(control, input) {
318
+ const row = {
319
+ id: randomId("api_sp"),
320
+ label: input.label,
321
+ description: input.description,
322
+ ownerUserId: input.ownerUserId,
323
+ defaultScopesJson: JSON.stringify(input.defaultScopes),
324
+ disabledAt: null,
325
+ createdBy: input.createdBy,
326
+ createdAt: input.now,
327
+ updatedAt: input.now
328
+ };
329
+ await control.run(`INSERT INTO ${q(apiServicePrincipalsTableName)}
330
+ ("id", "label", "description", "ownerUserId", "defaultScopesJson", "disabledAt", "createdBy", "createdAt", "updatedAt")
331
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [row.id, row.label, row.description, row.ownerUserId, row.defaultScopesJson, row.disabledAt, row.createdBy, row.createdAt, row.updatedAt]);
332
+ return row;
333
+ }
334
+ async function requireServicePrincipal(control, id, ownerUserId) {
335
+ const row = await control.first(`SELECT * FROM ${q(apiServicePrincipalsTableName)} WHERE "id" = ?`, [id]);
336
+ if (!row || row.ownerUserId !== ownerUserId || row.disabledAt) {
337
+ throw new ApiHttpError(400, "invalid_request", "servicePrincipalId must reference an active API service principal for ownerUserId.");
338
+ }
339
+ return row;
340
+ }
341
+ async function requireApiKey(control, keyId) {
342
+ const row = await control.first(`SELECT * FROM ${q(apiKeysTableName)} WHERE "id" = ?`, [keyId]);
343
+ if (!row)
344
+ throw new ApiHttpError(404, "not_found", "API key not found.");
345
+ return row;
346
+ }
347
+ async function insertApiKey(control, row) {
348
+ await control.run(`INSERT INTO ${q(apiKeysTableName)}
349
+ ("id", "name", "description", "servicePrincipalId", "ownerUserId", "principalLabel", "prefix", "hash", "scopesJson", "expiresAt", "revokedAt", "revokedBy", "revokedReason", "createdBy", "createdAt", "rotatedAt", "lastUsedAt", "lastUsedIpHash", "lastUsedUserAgent")
350
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
351
+ row.id,
352
+ row.name,
353
+ row.description,
354
+ row.servicePrincipalId,
355
+ row.ownerUserId,
356
+ row.principalLabel,
357
+ row.prefix,
358
+ row.hash,
359
+ row.scopesJson,
360
+ row.expiresAt,
361
+ row.revokedAt,
362
+ row.revokedBy,
363
+ row.revokedReason,
364
+ row.createdBy,
365
+ row.createdAt,
366
+ row.rotatedAt,
367
+ row.lastUsedAt,
368
+ row.lastUsedIpHash,
369
+ row.lastUsedUserAgent
370
+ ]);
371
+ }
372
+ async function updateApiKeyLastUsed(control, request, keyId) {
373
+ const ip = request.headers.get("cf-connecting-ip") ?? "";
374
+ const userAgent = request.headers.get("user-agent") ?? "";
375
+ await control.run(`UPDATE ${q(apiKeysTableName)} SET "lastUsedAt" = ?, "lastUsedIpHash" = ?, "lastUsedUserAgent" = ? WHERE "id" = ?`, [nowIso(), ip ? await sha256Hex(ip) : null, userAgent.slice(0, 200) || null, keyId]).catch(() => undefined);
376
+ }
377
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type ApiKeyMaterial = {
2
+ token: string;
3
+ prefix: string;
4
+ hash: string;
5
+ };
6
+ export declare function validateApiKeySecret(secret: unknown): string;
7
+ export declare function generateApiKey(input?: {
8
+ secret: string;
9
+ tokenPrefix?: string;
10
+ }): Promise<ApiKeyMaterial>;
11
+ export declare function extractApiKeyLookupPrefix(token: string): string | null;
12
+ export declare function hashApiKey(token: string, secret: string): Promise<string>;
13
+ export declare function verifyApiKeyHash(token: string, expectedHash: string, secret: string): Promise<boolean>;
14
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAIF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAK5D;AAED,wBAAsB,cAAc,CAAC,KAAK,GAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAQ9H;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU/E;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG5G"}
package/dist/crypto.js ADDED
@@ -0,0 +1,59 @@
1
+ import { base64url } from "@raybase/core";
2
+ const encoder = new TextEncoder();
3
+ export function validateApiKeySecret(secret) {
4
+ if (typeof secret !== "string" || secret.length < 32) {
5
+ throw new Error("RAYBASE_API_KEY_SECRET must be at least 32 characters when @raybase/api is enabled.");
6
+ }
7
+ return secret;
8
+ }
9
+ export async function generateApiKey(input = { secret: "" }) {
10
+ const secret = validateApiKeySecret(input.secret);
11
+ const tokenPrefix = normalizeTokenPrefix(input.tokenPrefix);
12
+ const lookup = randomTokenPart(9);
13
+ const keySecret = randomTokenPart(24);
14
+ const prefix = `${tokenPrefix}_${lookup}`;
15
+ const token = `${prefix}_${keySecret}`;
16
+ return { token, prefix, hash: await hashApiKey(token, secret) };
17
+ }
18
+ export function extractApiKeyLookupPrefix(token) {
19
+ const trimmed = token.trim();
20
+ const lastUnderscore = trimmed.lastIndexOf("_");
21
+ if (lastUnderscore <= 0)
22
+ return null;
23
+ return trimmed.slice(0, lastUnderscore);
24
+ }
25
+ export async function hashApiKey(token, secret) {
26
+ const key = await crypto.subtle.importKey("raw", encoder.encode(validateApiKeySecret(secret)), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
27
+ const digest = await crypto.subtle.sign("HMAC", key, encoder.encode(token));
28
+ return hex(new Uint8Array(digest));
29
+ }
30
+ export async function verifyApiKeyHash(token, expectedHash, secret) {
31
+ const actual = await hashApiKey(token, secret);
32
+ return timingSafeEqual(actual, expectedHash);
33
+ }
34
+ function normalizeTokenPrefix(prefix = "rbk_live") {
35
+ const normalized = prefix.trim().replace(/_+$/g, "");
36
+ if (!/^[A-Za-z][A-Za-z0-9_]{2,31}$/.test(normalized)) {
37
+ throw new Error("API key token prefix must start with a letter and contain only letters, numbers, or underscores.");
38
+ }
39
+ return normalized;
40
+ }
41
+ function randomTokenPart(bytes) {
42
+ const raw = new Uint8Array(bytes);
43
+ crypto.getRandomValues(raw);
44
+ return base64url(raw).replace(/_/g, "-");
45
+ }
46
+ function hex(bytes) {
47
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
48
+ }
49
+ function timingSafeEqual(left, right) {
50
+ const leftBytes = encoder.encode(left);
51
+ const rightBytes = encoder.encode(right);
52
+ let diff = leftBytes.length ^ rightBytes.length;
53
+ const length = Math.max(leftBytes.length, rightBytes.length);
54
+ for (let index = 0; index < length; index += 1) {
55
+ diff |= (leftBytes[index] ?? 0) ^ (rightBytes[index] ?? 0);
56
+ }
57
+ return diff === 0;
58
+ }
59
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type ApiErrorCode = "authentication_required" | "invalid_api_key" | "invalid_scope" | "invalid_request" | "policy_denied" | "not_found" | "internal_error";
2
+ export declare class ApiHttpError extends Error {
3
+ readonly status: number;
4
+ readonly code: ApiErrorCode;
5
+ constructor(status: number, code: ApiErrorCode, message: string);
6
+ }
7
+ export declare function apiErrorResponse(error: unknown, requestId: string): Response;
8
+ export declare function errorMessage(error: unknown): string;
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,yBAAyB,GACzB,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,WAAW,GACX,gBAAgB,CAAC;AAErB,qBAAa,YAAa,SAAQ,KAAK;aAEnB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,YAAY;gBADlB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAClC,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAc5E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD"}
package/dist/errors.js ADDED
@@ -0,0 +1,26 @@
1
+ export class ApiHttpError extends Error {
2
+ status;
3
+ code;
4
+ constructor(status, code, message) {
5
+ super(message);
6
+ this.status = status;
7
+ this.code = code;
8
+ this.name = "ApiHttpError";
9
+ }
10
+ }
11
+ export function apiErrorResponse(error, requestId) {
12
+ const apiError = error instanceof ApiHttpError
13
+ ? error
14
+ : new ApiHttpError(500, "internal_error", "The API request could not be completed.");
15
+ return Response.json({
16
+ error: {
17
+ code: apiError.code,
18
+ message: apiError.message,
19
+ requestId
20
+ }
21
+ }, { status: apiError.status });
22
+ }
23
+ export function errorMessage(error) {
24
+ return error instanceof Error ? error.message : String(error);
25
+ }
26
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAEnB;IACA;IAFlB,YACkB,MAAc,EACd,IAAkB,EAClC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAc;QAIlC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,SAAiB;IAChE,MAAM,QAAQ,GAAG,KAAK,YAAY,YAAY;QAC5C,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,yCAAyC,CAAC,CAAC;IACvF,OAAO,QAAQ,CAAC,IAAI,CAClB;QACE,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS;SACV;KACF,EACD,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const adminAssets: {
2
+ js: string;
3
+ css: string;
4
+ };
5
+ //# sourceMappingURL=admin-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-assets.d.ts","sourceRoot":"","sources":["../../src/generated/admin-assets.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;CAGvB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export const adminAssets = {
2
+ "js": "",
3
+ "css": "body {\n margin: 0;\n background: #f7f8f5;\n color: #171a1f;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\n\nmain {\n width: min(1180px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 32px 0 48px;\n}\n\nheader {\n display: flex;\n align-items: end;\n justify-content: space-between;\n gap: 24px;\n margin-bottom: 24px;\n}\n\nh1,\nh2,\np {\n margin: 0;\n}\n\nh1 {\n font-size: 42px;\n line-height: 1;\n}\n\nh2 {\n margin-bottom: 12px;\n font-size: 18px;\n}\n\na,\nbutton {\n border: 1px solid #2c5f4a;\n border-radius: 6px;\n background: #2c5f4a;\n color: #fff;\n font: inherit;\n font-weight: 700;\n padding: 9px 12px;\n text-decoration: none;\n}\n\nbutton:disabled {\n border-color: #b7bdb7;\n background: #dfe3df;\n color: #6b716b;\n}\n\n.eyebrow {\n color: #596159;\n font-size: 13px;\n font-weight: 700;\n letter-spacing: .08em;\n text-transform: uppercase;\n}\n\n.notice,\n.token-panel {\n border: 1px solid #e1c15a;\n border-radius: 8px;\n background: #fff8da;\n padding: 14px;\n margin-bottom: 18px;\n}\n\n.token-panel code {\n display: block;\n margin-top: 8px;\n overflow-wrap: anywhere;\n font-size: 14px;\n}\n\n.layout {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 320px;\n gap: 24px;\n margin-bottom: 28px;\n}\n\n.table {\n display: grid;\n gap: 10px;\n}\n\n.row {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(220px, .9fr) minmax(180px, .8fr) auto;\n align-items: center;\n gap: 16px;\n border: 1px solid #d9ded8;\n border-radius: 8px;\n background: #fff;\n padding: 14px;\n}\n\n.row p,\n.row small,\n.meta small {\n color: #636b63;\n}\n\n.route {\n display: grid;\n gap: 4px;\n}\n\n.route span,\n.scopes span {\n width: fit-content;\n border-radius: 999px;\n background: #e6efea;\n color: #1f513e;\n font-size: 12px;\n font-weight: 800;\n padding: 4px 8px;\n}\n\n.scopes {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.meta,\n.actions {\n display: grid;\n gap: 6px;\n}\n\naside,\nsection {\n min-width: 0;\n}\n\nform {\n display: grid;\n gap: 12px;\n border: 1px solid #d9ded8;\n border-radius: 8px;\n background: #fff;\n padding: 16px;\n}\n\nlabel {\n display: grid;\n gap: 6px;\n color: #3e473e;\n font-size: 13px;\n font-weight: 700;\n}\n\ninput,\ntextarea {\n box-sizing: border-box;\n width: 100%;\n border: 1px solid #cdd3cc;\n border-radius: 6px;\n padding: 9px 10px;\n font: inherit;\n}\n\ntextarea {\n min-height: 82px;\n resize: vertical;\n}\n\n.empty {\n border: 1px dashed #cdd3cc;\n border-radius: 8px;\n padding: 18px;\n color: #636b63;\n}\n\n@media (max-width: 860px) {\n .layout,\n .row {\n grid-template-columns: 1fr;\n }\n}\n"
4
+ };
5
+ //# sourceMappingURL=admin-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-assets.js","sourceRoot":"","sources":["../../src/generated/admin-assets.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,otFAAotF;CAC5tF,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./api.js";
2
+ export * from "./auth.js";
3
+ export * from "./crypto.js";
4
+ export * from "./errors.js";
5
+ export * from "./system-tables.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from "./api.js";
2
+ export * from "./auth.js";
3
+ export * from "./crypto.js";
4
+ export * from "./errors.js";
5
+ export * from "./system-tables.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
package/dist/path.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function matchApiPath(pattern: string, pathname: string): Record<string, string> | null;
2
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAmB7F"}
package/dist/path.js ADDED
@@ -0,0 +1,25 @@
1
+ import { ApiHttpError } from "./errors.js";
2
+ export function matchApiPath(pattern, pathname) {
3
+ const patternParts = pattern.split("/").filter(Boolean);
4
+ const pathParts = pathname.split("/").filter(Boolean);
5
+ if (patternParts.length !== pathParts.length)
6
+ return null;
7
+ const params = {};
8
+ for (let index = 0; index < patternParts.length; index += 1) {
9
+ const patternPart = patternParts[index];
10
+ const pathPart = pathParts[index];
11
+ if (patternPart.startsWith(":")) {
12
+ try {
13
+ params[patternPart.slice(1)] = decodeURIComponent(pathPart);
14
+ }
15
+ catch {
16
+ throw new ApiHttpError(400, "invalid_request", "Path parameter encoding is invalid.");
17
+ }
18
+ }
19
+ else if (patternPart !== pathPart) {
20
+ return null;
21
+ }
22
+ }
23
+ return params;
24
+ }
25
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAgB;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAE,CAAC;QACnC,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,qCAAqC,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type RaybaseSystemTable } from "@raybase/core";
2
+ export declare const apiKeysTableName = "_api_keys";
3
+ export declare const apiServicePrincipalsTableName = "_api_service_principals";
4
+ export declare const apiKeyEventsTableName = "_api_key_events";
5
+ export declare const raybaseApiSystemTables: RaybaseSystemTable[];
6
+ //# sourceMappingURL=system-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-tables.d.ts","sourceRoot":"","sources":["../src/system-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhG,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAC5C,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AACvE,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,EAuEtD,CAAC"}