@voyant-travel/hono 0.118.0 → 0.118.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.
- package/dist/document-download.d.ts +22 -0
- package/dist/document-download.d.ts.map +1 -1
- package/dist/document-download.js +44 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/observability/request-context.d.ts.map +1 -1
- package/dist/observability/request-context.js +1 -0
- package/package.json +6 -6
|
@@ -17,12 +17,34 @@ export type DocumentDownloadResolverResult = string | {
|
|
|
17
17
|
filename?: string | null;
|
|
18
18
|
} | null | undefined;
|
|
19
19
|
export type DocumentDownloadResolver<TBindings = unknown> = (bindings: TBindings, storageKey: string) => Promise<DocumentDownloadResolverResult> | DocumentDownloadResolverResult;
|
|
20
|
+
export type AuthenticatedR2DocumentDownloadResolver<TBindings = unknown> = (bindings: TBindings, storageKey: string) => string | null;
|
|
21
|
+
export interface AuthenticatedR2DocumentDownloadResolverOptions<TBindings = unknown> {
|
|
22
|
+
/**
|
|
23
|
+
* Absolute application/API origin used for authenticated download URLs.
|
|
24
|
+
* Return `null`/empty when the current deployment cannot expose downloads.
|
|
25
|
+
*/
|
|
26
|
+
apiBaseUrl: string | ((bindings: TBindings) => string | null | undefined);
|
|
27
|
+
/**
|
|
28
|
+
* Authenticated route prefix mounted by the host app. The storage key is
|
|
29
|
+
* appended after this prefix with each path segment encoded independently.
|
|
30
|
+
*
|
|
31
|
+
* Defaults to Voyant's operator document byte route.
|
|
32
|
+
*/
|
|
33
|
+
routePrefix?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Optional R2 bucket binding name to require before returning a URL. Defaults
|
|
36
|
+
* to the operator starter's private document bucket binding.
|
|
37
|
+
*/
|
|
38
|
+
bucketBindingName?: string | null;
|
|
39
|
+
}
|
|
20
40
|
export interface StoredDocumentReference {
|
|
21
41
|
storageKey?: string | null;
|
|
22
42
|
metadata?: unknown;
|
|
23
43
|
filename?: string | null;
|
|
24
44
|
name?: string | null;
|
|
25
45
|
}
|
|
46
|
+
export declare function encodeStorageKeyPath(storageKey: string): string;
|
|
47
|
+
export declare function createAuthenticatedR2DocumentDownloadResolver<TBindings = unknown>(options: AuthenticatedR2DocumentDownloadResolverOptions<TBindings>): AuthenticatedR2DocumentDownloadResolver<TBindings>;
|
|
26
48
|
export declare function resolveStoredDocumentDownload<TBindings = unknown>(reference: StoredDocumentReference, options: {
|
|
27
49
|
bindings: TBindings;
|
|
28
50
|
resolveDocumentDownloadUrl?: DocumentDownloadResolver<TBindings>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-download.d.ts","sourceRoot":"","sources":["../src/document-download.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,wBAAwB,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAAA;AAE/B,MAAM,MAAM,8BAA8B,GACtC,MAAM,GACN;IACE,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,GACD,IAAI,GACJ,SAAS,CAAA;AAEb,MAAM,MAAM,wBAAwB,CAAC,SAAS,GAAG,OAAO,IAAI,CAC1D,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,8BAA8B,CAAC,GAAG,8BAA8B,CAAA;AAE7E,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;
|
|
1
|
+
{"version":3,"file":"document-download.d.ts","sourceRoot":"","sources":["../src/document-download.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,wBAAwB,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAAA;AAE/B,MAAM,MAAM,8BAA8B,GACtC,MAAM,GACN;IACE,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,GACD,IAAI,GACJ,SAAS,CAAA;AAEb,MAAM,MAAM,wBAAwB,CAAC,SAAS,GAAG,OAAO,IAAI,CAC1D,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,8BAA8B,CAAC,GAAG,8BAA8B,CAAA;AAE7E,MAAM,MAAM,uCAAuC,CAAC,SAAS,GAAG,OAAO,IAAI,CACzE,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,MAAM,KACf,MAAM,GAAG,IAAI,CAAA;AAElB,MAAM,WAAW,8CAA8C,CAAC,SAAS,GAAG,OAAO;IACjF;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;IACzE;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAgDD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,wBAAgB,6CAA6C,CAAC,SAAS,GAAG,OAAO,EAC/E,OAAO,EAAE,8CAA8C,CAAC,SAAS,CAAC,GACjE,uCAAuC,CAAC,SAAS,CAAC,CAkBpD;AAuFD,wBAAsB,6BAA6B,CAAC,SAAS,GAAG,OAAO,EACrE,SAAS,EAAE,uBAAuB,EAClC,OAAO,EAAE;IACP,QAAQ,EAAE,SAAS,CAAA;IACnB,0BAA0B,CAAC,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAA;CACjE,GACA,OAAO,CAAC,0BAA0B,CAAC,CA2BrC"}
|
|
@@ -11,6 +11,50 @@ function maybeUrl(value) {
|
|
|
11
11
|
const candidate = maybeString(value);
|
|
12
12
|
return candidate && /^https?:\/\//i.test(candidate) ? candidate : null;
|
|
13
13
|
}
|
|
14
|
+
function getRecord(value) {
|
|
15
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function resolveApiBaseUrl(value, bindings) {
|
|
21
|
+
const resolved = typeof value === "function" ? value(bindings) : value;
|
|
22
|
+
const trimmed = resolved?.trim();
|
|
23
|
+
return trimmed ? trimmed.replace(/\/+$/, "") : null;
|
|
24
|
+
}
|
|
25
|
+
function normalizeRoutePrefix(routePrefix) {
|
|
26
|
+
const trimmed = routePrefix.trim();
|
|
27
|
+
if (!trimmed)
|
|
28
|
+
return "";
|
|
29
|
+
return `/${trimmed.replace(/^\/+|\/+$/g, "")}`;
|
|
30
|
+
}
|
|
31
|
+
function hasBinding(bindings, bindingName) {
|
|
32
|
+
if (!bindingName)
|
|
33
|
+
return true;
|
|
34
|
+
const record = getRecord(bindings);
|
|
35
|
+
return Boolean(record?.[bindingName]);
|
|
36
|
+
}
|
|
37
|
+
export function encodeStorageKeyPath(storageKey) {
|
|
38
|
+
return storageKey
|
|
39
|
+
.split("/")
|
|
40
|
+
.map((segment) => encodeURIComponent(segment))
|
|
41
|
+
.join("/");
|
|
42
|
+
}
|
|
43
|
+
export function createAuthenticatedR2DocumentDownloadResolver(options) {
|
|
44
|
+
const routePrefix = normalizeRoutePrefix(options.routePrefix ?? "/v1/admin/documents/files");
|
|
45
|
+
const bucketBindingName = options.bucketBindingName === undefined ? "DOCUMENTS_BUCKET" : options.bucketBindingName;
|
|
46
|
+
return (bindings, storageKey) => {
|
|
47
|
+
if (!hasBinding(bindings, bucketBindingName)) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const apiBaseUrl = resolveApiBaseUrl(options.apiBaseUrl, bindings);
|
|
51
|
+
if (!apiBaseUrl) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const keyPath = encodeStorageKeyPath(storageKey);
|
|
55
|
+
return `${apiBaseUrl}${routePrefix}/${keyPath}`;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
14
58
|
function maybeIsoString(value) {
|
|
15
59
|
return maybeString(value);
|
|
16
60
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ export { mountApp } from "./app.js";
|
|
|
4
4
|
export type { SessionAuthContext } from "./auth/index.js";
|
|
5
5
|
export { constantTimeEqual, extractBearerToken, generateNumericCode, randomBytesHex, requireUserId, sha256Base64Url, sha256Hex, unsignCookie, verifySession, } from "./auth/index.js";
|
|
6
6
|
export { type CreateAppConfig, createApp } from "./create-app.js";
|
|
7
|
-
export type { DocumentDownloadEnvelope, DocumentDownloadResolution, DocumentDownloadResolver, DocumentDownloadResolverResult, StoredDocumentReference, } from "./document-download.js";
|
|
8
|
-
export { resolveStoredDocumentDownload } from "./document-download.js";
|
|
7
|
+
export type { AuthenticatedR2DocumentDownloadResolver, AuthenticatedR2DocumentDownloadResolverOptions, DocumentDownloadEnvelope, DocumentDownloadResolution, DocumentDownloadResolver, DocumentDownloadResolverResult, StoredDocumentReference, } from "./document-download.js";
|
|
8
|
+
export { createAuthenticatedR2DocumentDownloadResolver, encodeStorageKeyPath, resolveStoredDocumentDownload, } from "./document-download.js";
|
|
9
9
|
export { createLazyRouteHandler, type LazyHonoRoutes, type LazyRoutesLoader, mountLazyRoutePaths, mountLazyRoutesAt, } from "./lazy-routes.js";
|
|
10
10
|
export { createPathDbSelector, type PathDbSelectorOptions } from "./lib/db-selector.js";
|
|
11
11
|
export { clientIpKey, consoleLoggerProvider, cors, DEFAULT_IDEMPOTENCY_TTL_MS, db, enforceRateLimit, errorBoundary, handleApiError, type IdempotencyKeyOptions, idempotencyKey, isStaffRbacEnforced, LIVE_LIMITS, logger, purgeExpiredIdempotencyKeys, rateLimit, requestId, requireActor, requireAuth, requirePermission, } from "./middleware/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACjE,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,GACxB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { assembleAnonymousPaths } from "./anonymous-paths.js";
|
|
|
2
2
|
export { mountApp } from "./app.js";
|
|
3
3
|
export { constantTimeEqual, extractBearerToken, generateNumericCode, randomBytesHex, requireUserId, sha256Base64Url, sha256Hex, unsignCookie, verifySession, } from "./auth/index.js";
|
|
4
4
|
export { createApp } from "./create-app.js";
|
|
5
|
-
export { resolveStoredDocumentDownload } from "./document-download.js";
|
|
5
|
+
export { createAuthenticatedR2DocumentDownloadResolver, encodeStorageKeyPath, resolveStoredDocumentDownload, } from "./document-download.js";
|
|
6
6
|
export { createLazyRouteHandler, mountLazyRoutePaths, mountLazyRoutesAt, } from "./lazy-routes.js";
|
|
7
7
|
export { createPathDbSelector } from "./lib/db-selector.js";
|
|
8
8
|
export { clientIpKey, consoleLoggerProvider, cors, DEFAULT_IDEMPOTENCY_TTL_MS, db, enforceRateLimit, errorBoundary, handleApiError, idempotencyKey, isStaffRbacEnforced, LIVE_LIMITS, logger, purgeExpiredIdempotencyKeys, rateLimit, requestId, requireActor, requireAuth, requirePermission, } from "./middleware/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/observability/request-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/observability/request-context.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAMjD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyant-travel/hono",
|
|
3
|
-
"version": "0.118.
|
|
3
|
+
"version": "0.118.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -133,8 +133,8 @@
|
|
|
133
133
|
"dependencies": {
|
|
134
134
|
"@hono/zod-openapi": "^1.4.0",
|
|
135
135
|
"drizzle-orm": "^0.45.2",
|
|
136
|
-
"hono": "^4.12.
|
|
137
|
-
"zod": "^4.3
|
|
136
|
+
"hono": "^4.12.25",
|
|
137
|
+
"zod": "^4.4.3",
|
|
138
138
|
"@voyant-travel/core": "^0.111.0",
|
|
139
139
|
"@voyant-travel/db": "^0.109.4",
|
|
140
140
|
"@voyant-travel/storage": "^0.106.0",
|
|
@@ -143,9 +143,9 @@
|
|
|
143
143
|
"@voyant-travel/workflows": "^0.111.10"
|
|
144
144
|
},
|
|
145
145
|
"devDependencies": {
|
|
146
|
-
"@cloudflare/workers-types": "^4.
|
|
147
|
-
"typescript": "^6.0.
|
|
148
|
-
"vitest": "^4.1.
|
|
146
|
+
"@cloudflare/workers-types": "^4.20260628.1",
|
|
147
|
+
"typescript": "^6.0.3",
|
|
148
|
+
"vitest": "^4.1.9",
|
|
149
149
|
"@voyant-travel/voyant-typescript-config": "^0.1.0",
|
|
150
150
|
"@voyant-travel/workflows-orchestrator": "^0.111.10"
|
|
151
151
|
},
|