@layervai/qurl 0.3.1 → 0.5.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.
Files changed (72) hide show
  1. package/README.md +261 -11
  2. package/dist/cjs/client.d.ts +22 -12
  3. package/dist/cjs/client.js +675 -100
  4. package/dist/cjs/errors.d.ts +11 -11
  5. package/dist/cjs/errors.js +25 -20
  6. package/dist/cjs/index.d.ts +1 -1
  7. package/dist/cjs/internal.d.ts +4 -0
  8. package/dist/cjs/internal.js +16 -0
  9. package/dist/cjs/node/deployment.d.ts +44 -0
  10. package/dist/cjs/node/deployment.js +167 -0
  11. package/dist/cjs/node/native-udp.d.ts +35 -0
  12. package/dist/cjs/node/native-udp.js +294 -0
  13. package/dist/cjs/node/nhp-wire.d.ts +35 -0
  14. package/dist/cjs/node/nhp-wire.js +261 -0
  15. package/dist/cjs/node/portal-opener.d.ts +114 -0
  16. package/dist/cjs/node/portal-opener.js +1070 -0
  17. package/dist/cjs/node/qv2.d.ts +38 -0
  18. package/dist/cjs/node/qv2.js +292 -0
  19. package/dist/cjs/node/strict-json.d.ts +12 -0
  20. package/dist/cjs/node/strict-json.js +174 -0
  21. package/dist/cjs/node.d.ts +3 -0
  22. package/dist/cjs/node.js +18 -0
  23. package/dist/cjs/types.d.ts +17 -20
  24. package/dist/cjs/version.d.ts +1 -1
  25. package/dist/cjs/version.js +1 -1
  26. package/dist/esm/client.d.ts +22 -12
  27. package/dist/esm/client.d.ts.map +1 -1
  28. package/dist/esm/client.js +673 -98
  29. package/dist/esm/client.js.map +1 -1
  30. package/dist/esm/errors.d.ts +11 -11
  31. package/dist/esm/errors.d.ts.map +1 -1
  32. package/dist/esm/errors.js +25 -20
  33. package/dist/esm/errors.js.map +1 -1
  34. package/dist/esm/index.d.ts +1 -1
  35. package/dist/esm/index.d.ts.map +1 -1
  36. package/dist/esm/internal.d.ts +5 -0
  37. package/dist/esm/internal.d.ts.map +1 -0
  38. package/dist/esm/internal.js +14 -0
  39. package/dist/esm/internal.js.map +1 -0
  40. package/dist/esm/node/deployment.d.ts +45 -0
  41. package/dist/esm/node/deployment.d.ts.map +1 -0
  42. package/dist/esm/node/deployment.js +163 -0
  43. package/dist/esm/node/deployment.js.map +1 -0
  44. package/dist/esm/node/native-udp.d.ts +36 -0
  45. package/dist/esm/node/native-udp.d.ts.map +1 -0
  46. package/dist/esm/node/native-udp.js +291 -0
  47. package/dist/esm/node/native-udp.js.map +1 -0
  48. package/dist/esm/node/nhp-wire.d.ts +36 -0
  49. package/dist/esm/node/nhp-wire.d.ts.map +1 -0
  50. package/dist/esm/node/nhp-wire.js +257 -0
  51. package/dist/esm/node/nhp-wire.js.map +1 -0
  52. package/dist/esm/node/portal-opener.d.ts +115 -0
  53. package/dist/esm/node/portal-opener.d.ts.map +1 -0
  54. package/dist/esm/node/portal-opener.js +1053 -0
  55. package/dist/esm/node/portal-opener.js.map +1 -0
  56. package/dist/esm/node/qv2.d.ts +39 -0
  57. package/dist/esm/node/qv2.d.ts.map +1 -0
  58. package/dist/esm/node/qv2.js +286 -0
  59. package/dist/esm/node/qv2.js.map +1 -0
  60. package/dist/esm/node/strict-json.d.ts +13 -0
  61. package/dist/esm/node/strict-json.d.ts.map +1 -0
  62. package/dist/esm/node/strict-json.js +171 -0
  63. package/dist/esm/node/strict-json.js.map +1 -0
  64. package/dist/esm/node.d.ts +4 -0
  65. package/dist/esm/node.d.ts.map +1 -0
  66. package/dist/esm/node.js +2 -0
  67. package/dist/esm/node.js.map +1 -0
  68. package/dist/esm/types.d.ts +17 -20
  69. package/dist/esm/types.d.ts.map +1 -1
  70. package/dist/esm/version.d.ts +1 -1
  71. package/dist/esm/version.js +1 -1
  72. package/package.json +26 -7
@@ -0,0 +1,114 @@
1
+ import type { NHPMessage } from "./nhp-wire.js";
2
+ import { type PortalDeployment, type ValidatedCell, type ValidatedDeployment } from "./deployment.js";
3
+ import { type NativeExchangeOptions } from "./native-udp.js";
4
+ import { type VerifiedQv2Link } from "./qv2.js";
5
+ export interface CreatePortalOpenerOptions {
6
+ /** Full qv2t1 qURL. The opener re-verifies it before each native open. */
7
+ readonly qurl: string;
8
+ /** Public deployment trust. Omit to load QURL_DEPLOYMENT on the first start. */
9
+ readonly deployment?: PortalDeployment;
10
+ /** Whole-operation deadline for each NHP open. The default is 15 seconds. */
11
+ readonly openTimeoutMs?: number;
12
+ /** Protected-content fetch implementation. Native NHP opening never uses it. */
13
+ readonly fetch?: typeof globalThis.fetch;
14
+ }
15
+ export interface PortalStartOptions {
16
+ readonly signal?: AbortSignal;
17
+ }
18
+ /**
19
+ * Build one request for the exact target selected by `fetch` or
20
+ * `fetchDescendant`. The URL is a disposable copy; the opener pins the final
21
+ * request URL and Host to its SDK-owned target after this function returns.
22
+ */
23
+ export type PortalRequestBuilder = (authenticatedTarget: URL) => RequestInit;
24
+ export interface PortalFetchOptions {
25
+ /** Use `error` for signed requests whose method, target, timestamp, and nonce must not be replayed. */
26
+ readonly redirects?: "follow" | "error";
27
+ }
28
+ export type PortalOpenerState = "new" | "starting" | "ready" | "degraded" | "closed";
29
+ export type PortalOpenerFailureClass = "" | "open_failed" | "target_changed";
30
+ /** Secret-free, nonblocking lifecycle snapshot. */
31
+ export interface PortalOpenerHealth {
32
+ readonly state: PortalOpenerState;
33
+ readonly ready: boolean;
34
+ readonly expiresAt?: Date;
35
+ readonly renewAt?: Date;
36
+ readonly lastOpenSucceededAt?: Date;
37
+ readonly lastFailureClass: PortalOpenerFailureClass;
38
+ readonly consecutiveFailures: number;
39
+ }
40
+ export interface PortalOpener {
41
+ /** Open now and schedule renewal before the admission expires. */
42
+ start(options?: PortalStartOptions): Promise<void>;
43
+ /** Start a fetch at the exact ACK URL. Same-origin redirects follow only when allowed. */
44
+ fetch(init?: RequestInit | PortalRequestBuilder, options?: PortalFetchOptions): Promise<Response>;
45
+ /**
46
+ * Start a fetch below the ACK URL. Each caller value is one raw path segment;
47
+ * the opener validates and escapes each segment before use. The ACK target's
48
+ * query is preserved.
49
+ */
50
+ fetchDescendant(pathSegments: readonly string[], init?: RequestInit | PortalRequestBuilder, options?: PortalFetchOptions): Promise<Response>;
51
+ /** Read local session state. This method does no I/O and exposes no capability. */
52
+ health(): PortalOpenerHealth;
53
+ /** Stop renewal and wipe mutable private-key, visitor-secret, and token buffers. */
54
+ close(): Promise<void>;
55
+ }
56
+ export declare class PortalConfigurationError extends Error {
57
+ constructor(message: string, options?: ErrorOptions);
58
+ }
59
+ export declare class PortalVerificationError extends Error {
60
+ constructor(message: string, options?: ErrorOptions);
61
+ }
62
+ export declare class PortalDenyError extends Error {
63
+ readonly errCode: string;
64
+ constructor(errCode: string);
65
+ }
66
+ export declare class PortalStateError extends Error {
67
+ constructor(message: string, options?: ErrorOptions);
68
+ }
69
+ export declare class PortalOpenerNotStartedError extends PortalStateError {
70
+ constructor();
71
+ }
72
+ export declare class PortalOpenerNotReadyError extends PortalStateError {
73
+ constructor(options?: ErrorOptions);
74
+ }
75
+ export declare class PortalOpenerClosedError extends PortalStateError {
76
+ constructor(options?: ErrorOptions);
77
+ }
78
+ export declare class PortalOpenTimeoutError extends PortalStateError {
79
+ constructor();
80
+ }
81
+ export declare class PortalTargetChangedError extends PortalStateError {
82
+ constructor();
83
+ }
84
+ export declare class PortalRedirectError extends PortalStateError {
85
+ constructor(message?: string, options?: ErrorOptions);
86
+ }
87
+ export declare class PortalTooManyRedirectsError extends PortalStateError {
88
+ constructor();
89
+ }
90
+ export declare class PortalBusyError extends PortalStateError {
91
+ constructor();
92
+ }
93
+ export declare class PortalInvalidReplyError extends PortalStateError {
94
+ constructor(message: string, options?: ErrorOptions);
95
+ }
96
+ interface PortalRuntime {
97
+ readonly knock: (cell: ValidatedCell, key: Uint8Array, body: Uint8Array, options: NativeExchangeOptions) => Promise<NHPMessage>;
98
+ readonly fetch: typeof globalThis.fetch;
99
+ readonly nowNanos: () => bigint;
100
+ readonly nowEpochMs: () => number;
101
+ readonly setTimer: (callback: () => void, delayMs: number) => NodeJS.Timeout;
102
+ readonly clearTimer: (timer: NodeJS.Timeout) => void;
103
+ readonly setDeadlineTimer: (callback: () => void, delayMs: number) => NodeJS.Timeout;
104
+ readonly clearDeadlineTimer: (timer: NodeJS.Timeout) => void;
105
+ }
106
+ export declare function createPortalOpener(options: CreatePortalOpenerOptions): PortalOpener;
107
+ export declare function createPortalOpenerWithRuntime(options: CreatePortalOpenerOptions, runtime: PortalRuntime): PortalOpener;
108
+ declare function validatedCellForLink(link: VerifiedQv2Link, deployment: ValidatedDeployment): ValidatedCell;
109
+ declare function validateSessionToken(value: string, decode?: (part: string) => Buffer): void;
110
+ export declare const portalOpenerTesting: {
111
+ validatedCellForLink: typeof validatedCellForLink;
112
+ validateSessionToken: typeof validateSessionToken;
113
+ };
114
+ export {};