@orqenix/mesh-transport-http 0.6.0-phase-6

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/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2026 Milo Nguyen and Orqenix contributors
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+
19
+ [Full Apache 2.0 text: include verbatim from https://www.apache.org/licenses/LICENSE-2.0.txt]
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @orqenix/mesh-transport-http
2
+
3
+ HTTP MeshTransport for Orqenix Phase 6.
4
+
5
+ Single POST endpoint `/orqenix/mesh/v1/rpc` with msgpack envelopes (`application/vnd.orqenix.mesh+msgpack`), four mandatory security headers, bounded dedup cache, bounded retry policy, and clean teardown.
6
+
7
+ Built on `@orqenix/mesh-transport-core` (Part 1). See [CR v7.2 Chapter 3](https://github.com/milosaysyolo/Orqenix/tree/main/docs/cr-v7.2/chapter-3-http-transport.md).
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Bounded LRU dedup cache keyed by request.id.
3
+ * Agent note: per CR v7.2 Chapter 3.5, TTL equals request.deadlineMs. O(1) ops.
4
+ */
5
+ import type { MeshResponse } from '@orqenix/mesh-transport-core';
6
+ export interface DedupCacheOptions {
7
+ maxEntries?: number;
8
+ now?: () => number;
9
+ }
10
+ export declare class DedupCache {
11
+ private readonly map;
12
+ private readonly maxEntries;
13
+ private readonly now;
14
+ constructor(opts?: DedupCacheOptions);
15
+ get(id: string): MeshResponse | undefined;
16
+ set(id: string, resp: MeshResponse, ttlMs: number): void;
17
+ size(): number;
18
+ }
19
+ //# sourceMappingURL=dedup-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup-cache.d.ts","sourceRoot":"","sources":["../src/dedup-cache.ts"],"names":[],"mappings":"AACA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAIjE,MAAM,WAAW,iBAAiB;IAAG,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAAE;AAE/E,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,GAAE,iBAAsB;IAKxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IASzC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUxD,IAAI,IAAI,MAAM;CACf"}
@@ -0,0 +1,34 @@
1
+ export class DedupCache {
2
+ map = new Map();
3
+ maxEntries;
4
+ now;
5
+ constructor(opts = {}) {
6
+ this.maxEntries = opts.maxEntries ?? 10_000;
7
+ this.now = opts.now ?? Date.now;
8
+ }
9
+ get(id) {
10
+ const e = this.map.get(id);
11
+ if (!e)
12
+ return undefined;
13
+ if (this.now() >= e.expiresAt) {
14
+ this.map.delete(id);
15
+ return undefined;
16
+ }
17
+ this.map.delete(id);
18
+ this.map.set(id, e);
19
+ return e.resp;
20
+ }
21
+ set(id, resp, ttlMs) {
22
+ if (this.map.has(id))
23
+ this.map.delete(id);
24
+ this.map.set(id, { resp, expiresAt: this.now() + Math.max(0, ttlMs) });
25
+ while (this.map.size > this.maxEntries) {
26
+ const oldest = this.map.keys().next().value;
27
+ if (oldest === undefined)
28
+ break;
29
+ this.map.delete(oldest);
30
+ }
31
+ }
32
+ size() { return this.map.size; }
33
+ }
34
+ //# sourceMappingURL=dedup-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup-cache.js","sourceRoot":"","sources":["../src/dedup-cache.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,UAAU;IACJ,GAAG,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC/B,UAAU,CAAS;IACnB,GAAG,CAAe;IAEnC,YAAY,OAA0B,EAAE;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;QAC5C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO,SAAS,CAAC;QAAC,CAAC;QACzE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,EAAU,EAAE,IAAkB,EAAE,KAAa;QAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC5C,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM;YAChC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,KAAa,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;CACzC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * HTTP header names, content type, and header-versus-body cross-check.
3
+ * Agent note: per CR v7.2 Chapter 3.3, headers duplicate values from the body for
4
+ * defense-in-depth. The server must verify they match and reject mismatches.
5
+ */
6
+ import { type MeshRequest } from '@orqenix/mesh-transport-core';
7
+ export declare const HDR: {
8
+ readonly CAPABILITY: "x-orqenix-capability";
9
+ readonly SCOPE_SIG: "x-orqenix-scope-sig";
10
+ readonly REQUEST_ID: "x-orqenix-request-id";
11
+ readonly DEADLINE_MS: "x-orqenix-deadline-ms";
12
+ readonly TRACEPARENT: "traceparent";
13
+ readonly TRACESTATE: "tracestate";
14
+ };
15
+ export declare const CONTENT_TYPE = "application/vnd.orqenix.mesh+msgpack";
16
+ export declare function b64urlEncode(bytes: Uint8Array | string): string;
17
+ export declare function b64urlDecode(s: string): Uint8Array;
18
+ export declare function buildHeaders(req: MeshRequest, scopeSigB64u: string): Record<string, string>;
19
+ export declare function assertHeadersMatchBody(headers: Record<string, string | string[] | undefined>, req: MeshRequest): void;
20
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../src/headers.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE5F,eAAO,MAAM,GAAG;;;;;;;CAON,CAAC;AAEX,eAAO,MAAM,YAAY,yCAAyC,CAAC;AAEnE,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAG/D;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAGlD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY3F;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EACtD,GAAG,EAAE,WAAW,GACf,IAAI,CAqBN"}
@@ -0,0 +1,61 @@
1
+ // packages/mesh-transport-http/src/headers.ts
2
+ /**
3
+ * HTTP header names, content type, and header-versus-body cross-check.
4
+ * Agent note: per CR v7.2 Chapter 3.3, headers duplicate values from the body for
5
+ * defense-in-depth. The server must verify they match and reject mismatches.
6
+ */
7
+ import { CapabilityError, ErrorCode } from '@orqenix/mesh-transport-core';
8
+ export const HDR = {
9
+ CAPABILITY: 'x-orqenix-capability',
10
+ SCOPE_SIG: 'x-orqenix-scope-sig',
11
+ REQUEST_ID: 'x-orqenix-request-id',
12
+ DEADLINE_MS: 'x-orqenix-deadline-ms',
13
+ TRACEPARENT: 'traceparent',
14
+ TRACESTATE: 'tracestate',
15
+ };
16
+ export const CONTENT_TYPE = 'application/vnd.orqenix.mesh+msgpack';
17
+ export function b64urlEncode(bytes) {
18
+ const buf = typeof bytes === 'string' ? Buffer.from(bytes, 'utf8') : Buffer.from(bytes);
19
+ return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
20
+ }
21
+ export function b64urlDecode(s) {
22
+ const pad = s.length % 4 === 0 ? '' : '='.repeat(4 - (s.length % 4));
23
+ return new Uint8Array(Buffer.from(s.replace(/-/g, '+').replace(/_/g, '/') + pad, 'base64'));
24
+ }
25
+ export function buildHeaders(req, scopeSigB64u) {
26
+ const h = {
27
+ 'content-type': CONTENT_TYPE,
28
+ accept: CONTENT_TYPE,
29
+ [HDR.CAPABILITY]: b64urlEncode(req.capability),
30
+ [HDR.SCOPE_SIG]: scopeSigB64u,
31
+ [HDR.REQUEST_ID]: req.id,
32
+ [HDR.DEADLINE_MS]: String(req.deadlineMs),
33
+ [HDR.TRACEPARENT]: req.trace.traceparent,
34
+ };
35
+ if (req.trace.tracestate)
36
+ h[HDR.TRACESTATE] = req.trace.tracestate;
37
+ return h;
38
+ }
39
+ export function assertHeadersMatchBody(headers, req) {
40
+ const get = (k) => {
41
+ const v = headers[k];
42
+ return Array.isArray(v) ? v[0] : v;
43
+ };
44
+ const hdrId = get(HDR.REQUEST_ID);
45
+ const hdrDeadline = get(HDR.DEADLINE_MS);
46
+ const hdrCap = get(HDR.CAPABILITY);
47
+ if (!hdrId || hdrId !== req.id) {
48
+ throw new CapabilityError('request id header/body mismatch', ErrorCode.ENVELOPE_MISMATCH);
49
+ }
50
+ if (!hdrDeadline || Number(hdrDeadline) !== req.deadlineMs) {
51
+ throw new CapabilityError('deadline header/body mismatch', ErrorCode.ENVELOPE_MISMATCH);
52
+ }
53
+ if (!hdrCap) {
54
+ throw new CapabilityError('missing capability header', ErrorCode.CAP_MISSING);
55
+ }
56
+ const decoded = Buffer.from(b64urlDecode(hdrCap)).toString('utf8');
57
+ if (decoded !== req.capability) {
58
+ throw new CapabilityError('capability header/body mismatch', ErrorCode.ENVELOPE_MISMATCH);
59
+ }
60
+ }
61
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../src/headers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Identity proof seam. Part 2 ships NO-OP implementations.
3
+ * Agent note: Part 6 (gate G40) replaces these with real Ed25519 signing and verification.
4
+ */
5
+ import type { ScopeId } from '@orqenix/mesh-transport-core';
6
+ export interface IdentityVerifier {
7
+ verifyScopeSig(fromScope: ScopeId, requestId: string, toScope: ScopeId, sigB64u: string): Promise<boolean>;
8
+ }
9
+ export declare class NoopIdentityVerifier implements IdentityVerifier {
10
+ verifyScopeSig(): Promise<boolean>;
11
+ }
12
+ export type SignFn = (requestId: string, toScope: ScopeId) => Promise<string>;
13
+ export declare const NoopSigner: SignFn;
14
+ /** Always-false verifier for negative tests. */
15
+ export declare class AlwaysFalseIdentityVerifier implements IdentityVerifier {
16
+ verifyScopeSig(): Promise<boolean>;
17
+ }
18
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AACA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CACZ,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,qBAAa,oBAAqB,YAAW,gBAAgB;IACrD,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAGzC;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE9E,eAAO,MAAM,UAAU,EAAE,MAAiD,CAAC;AAE3E,gDAAgD;AAChD,qBAAa,2BAA4B,YAAW,gBAAgB;IAC5D,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAGzC"}
@@ -0,0 +1,13 @@
1
+ export class NoopIdentityVerifier {
2
+ async verifyScopeSig() {
3
+ return true;
4
+ }
5
+ }
6
+ export const NoopSigner = async () => 'noop-signature-placeholder';
7
+ /** Always-false verifier for negative tests. */
8
+ export class AlwaysFalseIdentityVerifier {
9
+ async verifyScopeSig() {
10
+ return false;
11
+ }
12
+ }
13
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,oBAAoB;IAC/B,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAID,MAAM,CAAC,MAAM,UAAU,GAAW,KAAK,IAAI,EAAE,CAAC,4BAA4B,CAAC;AAE3E,gDAAgD;AAChD,MAAM,OAAO,2BAA2B;IACtC,KAAK,CAAC,cAAc;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export * from './headers.js';
2
+ export * from './identity.js';
3
+ export * from './dedup-cache.js';
4
+ export * from './retry.js';
5
+ export * from './transport.js';
6
+ /** @deprecated Use HttpMeshTransport instead. Will be removed in v0.7. */
7
+ export { HttpMeshTransport as HttpMeshServer } from './transport.js';
8
+ /** @deprecated Use HttpMeshTransport instead. Will be removed in v0.7. */
9
+ export { HttpMeshTransport as HttpMeshClient } from './transport.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAE/B,0EAA0E;AAC1E,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrE,0EAA0E;AAC1E,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from './headers.js';
2
+ export * from './identity.js';
3
+ export * from './dedup-cache.js';
4
+ export * from './retry.js';
5
+ export * from './transport.js';
6
+ /** @deprecated Use HttpMeshTransport instead. Will be removed in v0.7. */
7
+ export { HttpMeshTransport as HttpMeshServer } from './transport.js';
8
+ /** @deprecated Use HttpMeshTransport instead. Will be removed in v0.7. */
9
+ export { HttpMeshTransport as HttpMeshClient } from './transport.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAE/B,0EAA0E;AAC1E,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrE,0EAA0E;AAC1E,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Bounded retry helper for the HTTP client.
3
+ * Agent note: max 2 retries, expo backoff base 100ms jitter [0.5x,1.5x];
4
+ * retry on timeout/error; never retry denied; honor Retry-After; stop at deadline.
5
+ */
6
+ import type { MeshResponse, MeshStatus } from '@orqenix/mesh-transport-core';
7
+ export interface RetryOptions {
8
+ maxRetries?: number;
9
+ baseDelayMs?: number;
10
+ deadlineMs: number;
11
+ signal?: AbortSignal;
12
+ rand?: () => number;
13
+ sleep?: (ms: number) => Promise<void>;
14
+ }
15
+ export type AttemptResult = {
16
+ kind: 'response';
17
+ resp: MeshResponse;
18
+ } | {
19
+ kind: 'retry';
20
+ retryAfterMs?: number;
21
+ } | {
22
+ kind: 'timeout';
23
+ } | {
24
+ kind: 'fatal';
25
+ resp: MeshResponse;
26
+ };
27
+ export declare function shouldRetry(status: MeshStatus): boolean;
28
+ export declare function runWithRetry(attempt: (attemptIndex: number) => Promise<AttemptResult>, opts: RetryOptions): Promise<MeshResponse>;
29
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE1C,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEvD;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,EACzD,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,YAAY,CAAC,CAoCvB"}
package/dist/retry.js ADDED
@@ -0,0 +1,43 @@
1
+ export function shouldRetry(status) {
2
+ return status === 'timeout' || status === 'error';
3
+ }
4
+ export async function runWithRetry(attempt, opts) {
5
+ const maxRetries = opts.maxRetries ?? 2;
6
+ const baseDelayMs = opts.baseDelayMs ?? 100;
7
+ const rand = opts.rand ?? Math.random;
8
+ const sleep = opts.sleep ?? ((ms) => new Promise((res) => setTimeout(res, ms)));
9
+ let lastResp;
10
+ for (let i = 0; i <= maxRetries; i++) {
11
+ if (opts.signal?.aborted)
12
+ return { id: '', status: 'timeout' };
13
+ if (Date.now() >= opts.deadlineMs)
14
+ return lastResp ?? { id: '', status: 'timeout' };
15
+ const result = await attempt(i);
16
+ if (result.kind === 'response') {
17
+ lastResp = result.resp;
18
+ if (result.resp.status === 'ok' || result.resp.status === 'denied')
19
+ return result.resp;
20
+ if (!shouldRetry(result.resp.status))
21
+ return result.resp;
22
+ }
23
+ else if (result.kind === 'fatal') {
24
+ return result.resp;
25
+ }
26
+ else if (result.kind === 'timeout') {
27
+ lastResp = { id: '', status: 'timeout' };
28
+ }
29
+ if (i === maxRetries)
30
+ break;
31
+ const explicit = result.kind === 'retry' ? result.retryAfterMs : undefined;
32
+ const expo = baseDelayMs * Math.pow(2, i);
33
+ const jitter = 0.5 + rand();
34
+ const computed = Math.floor(expo * jitter);
35
+ const delay = explicit ?? computed;
36
+ const remaining = opts.deadlineMs - Date.now();
37
+ if (remaining <= 0)
38
+ break;
39
+ await sleep(Math.min(delay, Math.max(0, remaining)));
40
+ }
41
+ return lastResp ?? { id: '', status: 'timeout' };
42
+ }
43
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type MeshAddress, type MeshRequest, type MeshResponse, type MeshTransport, type PeerInfo, type ScopeId, type SendOpts, type TransportCtx } from '@orqenix/mesh-transport-core';
2
+ import { DedupCache } from './dedup-cache.js';
3
+ import type { IdentityVerifier, SignFn } from './identity.js';
4
+ export interface HttpMeshTransportOptions {
5
+ localScopeId: ScopeId;
6
+ verifier: IdentityVerifier;
7
+ sign: SignFn;
8
+ host?: string;
9
+ port?: number;
10
+ dedup?: DedupCache;
11
+ maxRetries?: number;
12
+ baseDelayMs?: number;
13
+ }
14
+ type Handler = (req: MeshRequest, ctx: TransportCtx) => Promise<MeshResponse>;
15
+ export declare class HttpMeshTransport implements MeshTransport {
16
+ readonly kind: "http";
17
+ readonly localScopeId: ScopeId;
18
+ private readonly verifier;
19
+ private readonly sign;
20
+ private readonly host;
21
+ private readonly desiredPort;
22
+ private readonly dedup;
23
+ private readonly maxRetries;
24
+ private readonly baseDelayMs;
25
+ private lifecycle;
26
+ private server?;
27
+ private readonly sockets;
28
+ private handler?;
29
+ private boundPort;
30
+ constructor(opts: HttpMeshTransportOptions);
31
+ port(): number;
32
+ peers(): PeerInfo[];
33
+ start(): Promise<void>;
34
+ stop(): Promise<void>;
35
+ onRequest(handler: Handler): void;
36
+ private readBody;
37
+ private writeMeshResponse;
38
+ private handleInbound;
39
+ send(target: MeshAddress, req: MeshRequest, opts?: SendOpts): Promise<MeshResponse>;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAYL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,YAAY,EAClB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,OAAO,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAI9E,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,SAAS,CAAK;gBAEV,IAAI,EAAE,wBAAwB;IAW1C,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,QAAQ,EAAE;IAIb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAKnB,QAAQ;IAmBtB,OAAO,CAAC,iBAAiB;YAMX,aAAa;IAiErB,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;CAuD1F"}
@@ -0,0 +1,250 @@
1
+ import http from 'node:http';
2
+ import { request as undiciRequest } from 'undici';
3
+ import { CapabilityError, DeadlineExceeded, ErrorCode, HandlerError, TransportError, TransportLifecycle, decodeRequest, decodeResponse, encodeRequest, encodeResponse, toMeshResponse, } from '@orqenix/mesh-transport-core';
4
+ import { CONTENT_TYPE, HDR, assertHeadersMatchBody, buildHeaders } from './headers.js';
5
+ import { DedupCache } from './dedup-cache.js';
6
+ import { runWithRetry } from './retry.js';
7
+ const PATH = '/orqenix/mesh/v1/rpc';
8
+ export class HttpMeshTransport {
9
+ kind = 'http';
10
+ localScopeId;
11
+ verifier;
12
+ sign;
13
+ host;
14
+ desiredPort;
15
+ dedup;
16
+ maxRetries;
17
+ baseDelayMs;
18
+ lifecycle = new TransportLifecycle();
19
+ server;
20
+ sockets = new Set();
21
+ handler;
22
+ boundPort = 0;
23
+ constructor(opts) {
24
+ this.localScopeId = opts.localScopeId;
25
+ this.verifier = opts.verifier;
26
+ this.sign = opts.sign;
27
+ this.host = opts.host ?? '127.0.0.1';
28
+ this.desiredPort = opts.port ?? 0;
29
+ this.dedup = opts.dedup ?? new DedupCache();
30
+ this.maxRetries = opts.maxRetries ?? 2;
31
+ this.baseDelayMs = opts.baseDelayMs ?? 100;
32
+ }
33
+ port() {
34
+ return this.boundPort;
35
+ }
36
+ peers() {
37
+ return [];
38
+ }
39
+ async start() {
40
+ if (!this.lifecycle.assertCanStart())
41
+ return;
42
+ this.lifecycle.transition('Starting');
43
+ try {
44
+ const server = http.createServer((req, res) => void this.handleInbound(req, res));
45
+ server.on('connection', (s) => {
46
+ this.sockets.add(s);
47
+ s.on('close', () => this.sockets.delete(s));
48
+ });
49
+ await new Promise((resolve, reject) => {
50
+ server.once('error', reject);
51
+ server.listen(this.desiredPort, this.host, () => {
52
+ server.off('error', reject);
53
+ resolve();
54
+ });
55
+ });
56
+ const addr = server.address();
57
+ this.boundPort = addr?.port ?? 0;
58
+ this.server = server;
59
+ this.lifecycle.transition('Running');
60
+ }
61
+ catch (e) {
62
+ this.lifecycle.transition('Failed');
63
+ throw e;
64
+ }
65
+ }
66
+ async stop() {
67
+ if (!this.lifecycle.assertCanStop())
68
+ return;
69
+ this.lifecycle.transition('Stopping');
70
+ try {
71
+ const s = this.server;
72
+ this.server = undefined;
73
+ for (const sock of this.sockets)
74
+ sock.destroy();
75
+ this.sockets.clear();
76
+ if (s)
77
+ await new Promise((resolve) => s.close(() => resolve()));
78
+ this.handler = undefined;
79
+ this.boundPort = 0;
80
+ }
81
+ finally {
82
+ this.lifecycle.transition('Stopped');
83
+ }
84
+ }
85
+ onRequest(handler) {
86
+ this.lifecycle.assertCanRegisterHandler();
87
+ this.handler = handler;
88
+ }
89
+ async readBody(req) {
90
+ const chunks = [];
91
+ let total = 0;
92
+ const MAX = 16 * 1024 * 1024;
93
+ return await new Promise((resolve, reject) => {
94
+ req.on('data', (c) => {
95
+ total += c.length;
96
+ if (total > MAX) {
97
+ reject(new TransportError('body too large', ErrorCode.TRANSPORT));
98
+ req.destroy();
99
+ return;
100
+ }
101
+ chunks.push(c);
102
+ });
103
+ req.on('end', () => resolve(new Uint8Array(Buffer.concat(chunks))));
104
+ req.on('error', reject);
105
+ });
106
+ }
107
+ writeMeshResponse(res, httpStatus, resp) {
108
+ const body = encodeResponse(resp);
109
+ res.writeHead(httpStatus, { 'content-type': CONTENT_TYPE });
110
+ res.end(Buffer.from(body));
111
+ }
112
+ async handleInbound(req, res) {
113
+ if (req.method !== 'POST' || req.url !== PATH) {
114
+ res.writeHead(404, { 'content-type': 'text/plain' });
115
+ res.end('not found');
116
+ return;
117
+ }
118
+ let mreq;
119
+ try {
120
+ const body = await this.readBody(req);
121
+ mreq = decodeRequest(body);
122
+ }
123
+ catch (e) {
124
+ this.writeMeshResponse(res, 500, toMeshResponse('unknown', e));
125
+ return;
126
+ }
127
+ try {
128
+ assertHeadersMatchBody(req.headers, mreq);
129
+ }
130
+ catch (e) {
131
+ this.writeMeshResponse(res, 403, toMeshResponse(mreq.id, e));
132
+ return;
133
+ }
134
+ const cached = this.dedup.get(mreq.id);
135
+ if (cached) {
136
+ this.writeMeshResponse(res, 409, cached);
137
+ return;
138
+ }
139
+ const sigHeader = req.headers[HDR.SCOPE_SIG] ?? '';
140
+ let identityOk = false;
141
+ try {
142
+ identityOk = await this.verifier.verifyScopeSig(mreq.fromScope, mreq.id, mreq.toScope, sigHeader);
143
+ }
144
+ catch {
145
+ identityOk = false;
146
+ }
147
+ if (!identityOk) {
148
+ const denied = toMeshResponse(mreq.id, new CapabilityError('scope-sig invalid', ErrorCode.IDENTITY_SIG_INVALID));
149
+ this.writeMeshResponse(res, 403, denied);
150
+ return;
151
+ }
152
+ if (Date.now() >= mreq.deadlineMs) {
153
+ this.writeMeshResponse(res, 408, toMeshResponse(mreq.id, new DeadlineExceeded()));
154
+ return;
155
+ }
156
+ if (!this.handler) {
157
+ this.writeMeshResponse(res, 500, toMeshResponse(mreq.id, new HandlerError('no handler')));
158
+ return;
159
+ }
160
+ let response;
161
+ try {
162
+ response = await this.handler(mreq, { authenticatedScope: mreq.fromScope, remoteAddr: req.socket.remoteAddress ?? undefined });
163
+ }
164
+ catch (e) {
165
+ response = toMeshResponse(mreq.id, e);
166
+ }
167
+ const ttl = Math.max(0, mreq.deadlineMs - Date.now());
168
+ this.dedup.set(mreq.id, response, ttl);
169
+ this.writeMeshResponse(res, statusToHttp(response.status), response);
170
+ }
171
+ async send(target, req, opts) {
172
+ this.lifecycle.assertCanSend();
173
+ if (target.kind !== 'http') {
174
+ return toMeshResponse(req.id, new Error(`http cannot reach ${target.kind}`));
175
+ }
176
+ const sigB64u = await this.sign(req.id, req.toScope);
177
+ const headers = buildHeaders(req, sigB64u);
178
+ const body = encodeRequest(req);
179
+ const url = stripTrailingSlash(target.baseUrl) + PATH;
180
+ return runWithRetry(async () => {
181
+ const remaining = Math.max(0, req.deadlineMs - Date.now());
182
+ const perAttempt = Math.min(remaining, opts?.timeoutMs ?? remaining);
183
+ const ac = new AbortController();
184
+ const t = setTimeout(() => ac.abort(), perAttempt);
185
+ if (opts?.signal) {
186
+ if (opts.signal.aborted)
187
+ ac.abort();
188
+ else
189
+ opts.signal.addEventListener('abort', () => ac.abort(), { once: true });
190
+ }
191
+ try {
192
+ const r = await undiciRequest(url, { method: 'POST', headers: { ...headers }, body: Buffer.from(body), signal: ac.signal });
193
+ const buf = Buffer.from(await r.body.arrayBuffer());
194
+ if (r.statusCode === 200) {
195
+ try {
196
+ return { kind: 'response', resp: decodeResponse(new Uint8Array(buf)) };
197
+ }
198
+ catch (e) {
199
+ return { kind: 'response', resp: toMeshResponse(req.id, e) };
200
+ }
201
+ }
202
+ if (r.statusCode === 403) {
203
+ try {
204
+ return { kind: 'fatal', resp: decodeResponse(new Uint8Array(buf)) };
205
+ }
206
+ catch {
207
+ return { kind: 'fatal', resp: { id: req.id, status: 'denied', error: { code: 'E_CAP_INVALID', message: 'denied' } } };
208
+ }
209
+ }
210
+ if (r.statusCode === 408)
211
+ return { kind: 'timeout' };
212
+ if (r.statusCode === 409) {
213
+ try {
214
+ return { kind: 'response', resp: decodeResponse(new Uint8Array(buf)) };
215
+ }
216
+ catch {
217
+ return { kind: 'response', resp: { id: req.id, status: 'ok' } };
218
+ }
219
+ }
220
+ if (r.statusCode === 429) {
221
+ const ra = Number(r.headers['retry-after']);
222
+ const retryAfterMs = Number.isFinite(ra) ? ra * 1000 : undefined;
223
+ return { kind: 'retry', retryAfterMs };
224
+ }
225
+ return { kind: 'response', resp: { id: req.id, status: 'error', error: { code: 'E_TRANSPORT', message: `http ${r.statusCode}` } } };
226
+ }
227
+ catch (e) {
228
+ if (e.name === 'AbortError')
229
+ return { kind: 'timeout' };
230
+ return { kind: 'timeout' };
231
+ }
232
+ finally {
233
+ clearTimeout(t);
234
+ }
235
+ }, { maxRetries: this.maxRetries, baseDelayMs: this.baseDelayMs, deadlineMs: req.deadlineMs, signal: opts?.signal }).then((resp) => (resp.id ? resp : { ...resp, id: req.id }));
236
+ }
237
+ }
238
+ function statusToHttp(status) {
239
+ switch (status) {
240
+ case 'ok': return 200;
241
+ case 'denied': return 403;
242
+ case 'timeout': return 408;
243
+ case 'error':
244
+ default: return 500;
245
+ }
246
+ }
247
+ function stripTrailingSlash(s) {
248
+ return s.endsWith('/') ? s.slice(0, -1) : s;
249
+ }
250
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@orqenix/mesh-transport-http",
3
+ "version": "0.6.0-phase-6",
4
+ "description": "HTTP MeshTransport for Orqenix Phase 6: POST /orqenix/mesh/v1/rpc with msgpack envelopes, dedup cache, bounded retry, and clean teardown.",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE",
20
+ "CHANGELOG.md"
21
+ ],
22
+ "dependencies": {
23
+ "msgpackr": "^1.11.0",
24
+ "undici": "^6.20.0",
25
+ "@orqenix/mesh-transport-core": "0.6.0-phase-6"
26
+ },
27
+ "devDependencies": {
28
+ "@orqenix/transport-security": "0.6.0-phase-6",
29
+ "@types/node": "^22.7.0",
30
+ "@vitest/coverage-v8": "^2.1.0",
31
+ "tsx": "^4.19.0",
32
+ "typescript": "^5.6.0",
33
+ "vitest": "^2.1.0"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public",
37
+ "provenance": false
38
+ },
39
+ "engines": {
40
+ "node": ">=22.0.0"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc -p tsconfig.json",
44
+ "test": "vitest run --coverage",
45
+ "gate:G37": "vitest run test/G37-gate-wrapper.test.ts --reporter verbose"
46
+ }
47
+ }