@nats-kit/rpc 0.3.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 (96) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +94 -0
  4. package/dist/commonjs/client.d.ts +9 -0
  5. package/dist/commonjs/client.d.ts.map +1 -0
  6. package/dist/commonjs/client.js +307 -0
  7. package/dist/commonjs/client.js.map +1 -0
  8. package/dist/commonjs/contract.d.ts +59 -0
  9. package/dist/commonjs/contract.d.ts.map +1 -0
  10. package/dist/commonjs/contract.js +56 -0
  11. package/dist/commonjs/contract.js.map +1 -0
  12. package/dist/commonjs/errors.d.ts +58 -0
  13. package/dist/commonjs/errors.d.ts.map +1 -0
  14. package/dist/commonjs/errors.js +74 -0
  15. package/dist/commonjs/errors.js.map +1 -0
  16. package/dist/commonjs/eslint/index.d.ts +22 -0
  17. package/dist/commonjs/eslint/index.d.ts.map +1 -0
  18. package/dist/commonjs/eslint/index.js +33 -0
  19. package/dist/commonjs/eslint/index.js.map +1 -0
  20. package/dist/commonjs/events.d.ts +55 -0
  21. package/dist/commonjs/events.d.ts.map +1 -0
  22. package/dist/commonjs/events.js +82 -0
  23. package/dist/commonjs/events.js.map +1 -0
  24. package/dist/commonjs/headers.d.ts +53 -0
  25. package/dist/commonjs/headers.d.ts.map +1 -0
  26. package/dist/commonjs/headers.js +116 -0
  27. package/dist/commonjs/headers.js.map +1 -0
  28. package/dist/commonjs/index.d.ts +15 -0
  29. package/dist/commonjs/index.d.ts.map +1 -0
  30. package/dist/commonjs/index.js +61 -0
  31. package/dist/commonjs/index.js.map +1 -0
  32. package/dist/commonjs/kv.d.ts +13 -0
  33. package/dist/commonjs/kv.d.ts.map +1 -0
  34. package/dist/commonjs/kv.js +23 -0
  35. package/dist/commonjs/kv.js.map +1 -0
  36. package/dist/commonjs/package.json +4 -0
  37. package/dist/commonjs/server.d.ts +45 -0
  38. package/dist/commonjs/server.d.ts.map +1 -0
  39. package/dist/commonjs/server.js +433 -0
  40. package/dist/commonjs/server.js.map +1 -0
  41. package/dist/commonjs/types.d.ts +100 -0
  42. package/dist/commonjs/types.d.ts.map +1 -0
  43. package/dist/commonjs/types.js +3 -0
  44. package/dist/commonjs/types.js.map +1 -0
  45. package/dist/esm/client.d.ts +9 -0
  46. package/dist/esm/client.d.ts.map +1 -0
  47. package/dist/esm/client.js +304 -0
  48. package/dist/esm/client.js.map +1 -0
  49. package/dist/esm/contract.d.ts +59 -0
  50. package/dist/esm/contract.d.ts.map +1 -0
  51. package/dist/esm/contract.js +48 -0
  52. package/dist/esm/contract.js.map +1 -0
  53. package/dist/esm/errors.d.ts +58 -0
  54. package/dist/esm/errors.d.ts.map +1 -0
  55. package/dist/esm/errors.js +67 -0
  56. package/dist/esm/errors.js.map +1 -0
  57. package/dist/esm/eslint/index.d.ts +22 -0
  58. package/dist/esm/eslint/index.d.ts.map +1 -0
  59. package/dist/esm/eslint/index.js +30 -0
  60. package/dist/esm/eslint/index.js.map +1 -0
  61. package/dist/esm/events.d.ts +55 -0
  62. package/dist/esm/events.d.ts.map +1 -0
  63. package/dist/esm/events.js +77 -0
  64. package/dist/esm/events.js.map +1 -0
  65. package/dist/esm/headers.d.ts +53 -0
  66. package/dist/esm/headers.d.ts.map +1 -0
  67. package/dist/esm/headers.js +108 -0
  68. package/dist/esm/headers.js.map +1 -0
  69. package/dist/esm/index.d.ts +15 -0
  70. package/dist/esm/index.d.ts.map +1 -0
  71. package/dist/esm/index.js +25 -0
  72. package/dist/esm/index.js.map +1 -0
  73. package/dist/esm/kv.d.ts +13 -0
  74. package/dist/esm/kv.d.ts.map +1 -0
  75. package/dist/esm/kv.js +20 -0
  76. package/dist/esm/kv.js.map +1 -0
  77. package/dist/esm/package.json +4 -0
  78. package/dist/esm/server.d.ts +45 -0
  79. package/dist/esm/server.d.ts.map +1 -0
  80. package/dist/esm/server.js +426 -0
  81. package/dist/esm/server.js.map +1 -0
  82. package/dist/esm/types.d.ts +100 -0
  83. package/dist/esm/types.d.ts.map +1 -0
  84. package/dist/esm/types.js +2 -0
  85. package/dist/esm/types.js.map +1 -0
  86. package/package.json +103 -0
  87. package/src/client.ts +377 -0
  88. package/src/contract.ts +105 -0
  89. package/src/errors.ts +100 -0
  90. package/src/eslint/index.ts +30 -0
  91. package/src/events.ts +139 -0
  92. package/src/headers.ts +147 -0
  93. package/src/index.ts +76 -0
  94. package/src/kv.ts +33 -0
  95. package/src/server.ts +500 -0
  96. package/src/types.ts +119 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * RPC error taxonomy (design §2.3, wire spec §4.5–§4.6).
3
+ *
4
+ * - `transport`: never touched the network (no-responders, timeout,
5
+ * connection lost, local abort), synthesised entirely by the client.
6
+ * - `service`: an ADR-32 header error (`Nats-Service-Error-Code`) — bad
7
+ * envelope, auth, or a server-side crash. Counted in micro's `num_errors`.
8
+ * - `domain`: an application outcome carried in the response BODY
9
+ * (`{ok:false,error:{code,...}}`). Never touches micro's error counter.
10
+ */
11
+ export type RpcErrorKind = "transport" | "service" | "domain";
12
+ export interface RpcErrorInit {
13
+ code: string;
14
+ message: string;
15
+ kind: RpcErrorKind;
16
+ details?: unknown;
17
+ /** ADR-32 numeric code, present only when `kind === "service"`. */
18
+ serviceCode?: number;
19
+ subject?: string;
20
+ requestId?: string;
21
+ cause?: unknown;
22
+ }
23
+ /** The single error type every `RpcClient` method call rejects with. */
24
+ export declare class RpcError extends Error {
25
+ readonly code: string;
26
+ readonly kind: RpcErrorKind;
27
+ readonly details?: unknown;
28
+ readonly serviceCode?: number;
29
+ readonly subject?: string;
30
+ readonly requestId?: string;
31
+ constructor(init: RpcErrorInit);
32
+ }
33
+ export declare function isRpcError(e: unknown): e is RpcError;
34
+ export declare function isTransportError(e: unknown): e is RpcError;
35
+ export declare function isDomainError<C extends string>(e: unknown, code?: C): e is RpcError;
36
+ /** Reserved transport codes (§4.6) — never appear on the wire. */
37
+ export declare const TRANSPORT_ERROR_CODES: {
38
+ readonly NO_RESPONDERS: "NO_RESPONDERS";
39
+ readonly TIMEOUT: "TIMEOUT";
40
+ readonly CONNECTION_LOST: "CONNECTION_LOST";
41
+ readonly ABORTED: "ABORTED";
42
+ };
43
+ /** Reserved service codes (§2.3) — the numeric-to-string mapping from §4.6. */
44
+ export declare const SERVICE_ERROR_CODES: {
45
+ readonly BAD_REQUEST: "BAD_REQUEST";
46
+ readonly UNAUTHENTICATED: "UNAUTHENTICATED";
47
+ readonly FORBIDDEN: "FORBIDDEN";
48
+ readonly NOT_IMPLEMENTED: "NOT_IMPLEMENTED";
49
+ readonly INTERNAL: "INTERNAL";
50
+ readonly UNAVAILABLE: "UNAVAILABLE";
51
+ readonly MALFORMED_REPLY: "MALFORMED_REPLY";
52
+ readonly SERVICE_ERROR: "SERVICE_ERROR";
53
+ };
54
+ /** §4.6 client normalisation step (2): ADR-32 numeric code -> reserved string code. */
55
+ export declare const SERVICE_CODE_BY_STATUS: Record<number, string>;
56
+ /** Server-side reverse mapping: a domain/service code back to its wire status (§2.4). */
57
+ export declare const STATUS_BY_SERVICE_CODE: Partial<Record<string, number>>;
58
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wEAAwE;AACxE,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,IAAI,EAAE,YAAY;CAU/B;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAE1D;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,CAAC,EAAE,OAAO,EACV,IAAI,CAAC,EAAE,CAAC,GACP,CAAC,IAAI,QAAQ,CAGf;AAED,kEAAkE;AAClE,eAAO,MAAM,qBAAqB;;;;;CAKxB,CAAC;AAEX,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB;;;;;;;;;CAStB,CAAC;AAEX,uFAAuF;AACvF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOzD,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOlE,CAAC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STATUS_BY_SERVICE_CODE = exports.SERVICE_CODE_BY_STATUS = exports.SERVICE_ERROR_CODES = exports.TRANSPORT_ERROR_CODES = exports.RpcError = void 0;
4
+ exports.isRpcError = isRpcError;
5
+ exports.isTransportError = isTransportError;
6
+ exports.isDomainError = isDomainError;
7
+ /** The single error type every `RpcClient` method call rejects with. */
8
+ class RpcError extends Error {
9
+ code;
10
+ kind;
11
+ details;
12
+ serviceCode;
13
+ subject;
14
+ requestId;
15
+ constructor(init) {
16
+ super(init.message, init.cause !== undefined ? { cause: init.cause } : undefined);
17
+ this.name = "RpcError";
18
+ this.code = init.code;
19
+ this.kind = init.kind;
20
+ this.details = init.details;
21
+ this.serviceCode = init.serviceCode;
22
+ this.subject = init.subject;
23
+ this.requestId = init.requestId;
24
+ }
25
+ }
26
+ exports.RpcError = RpcError;
27
+ function isRpcError(e) {
28
+ return e instanceof RpcError;
29
+ }
30
+ function isTransportError(e) {
31
+ return isRpcError(e) && e.kind === "transport";
32
+ }
33
+ function isDomainError(e, code) {
34
+ if (!isRpcError(e) || e.kind !== "domain")
35
+ return false;
36
+ return code === undefined || e.code === code;
37
+ }
38
+ /** Reserved transport codes (§4.6) — never appear on the wire. */
39
+ exports.TRANSPORT_ERROR_CODES = {
40
+ NO_RESPONDERS: "NO_RESPONDERS",
41
+ TIMEOUT: "TIMEOUT",
42
+ CONNECTION_LOST: "CONNECTION_LOST",
43
+ ABORTED: "ABORTED",
44
+ };
45
+ /** Reserved service codes (§2.3) — the numeric-to-string mapping from §4.6. */
46
+ exports.SERVICE_ERROR_CODES = {
47
+ BAD_REQUEST: "BAD_REQUEST",
48
+ UNAUTHENTICATED: "UNAUTHENTICATED",
49
+ FORBIDDEN: "FORBIDDEN",
50
+ NOT_IMPLEMENTED: "NOT_IMPLEMENTED",
51
+ INTERNAL: "INTERNAL",
52
+ UNAVAILABLE: "UNAVAILABLE",
53
+ MALFORMED_REPLY: "MALFORMED_REPLY",
54
+ SERVICE_ERROR: "SERVICE_ERROR",
55
+ };
56
+ /** §4.6 client normalisation step (2): ADR-32 numeric code -> reserved string code. */
57
+ exports.SERVICE_CODE_BY_STATUS = {
58
+ 400: exports.SERVICE_ERROR_CODES.BAD_REQUEST,
59
+ 401: exports.SERVICE_ERROR_CODES.UNAUTHENTICATED,
60
+ 403: exports.SERVICE_ERROR_CODES.FORBIDDEN,
61
+ 404: exports.SERVICE_ERROR_CODES.NOT_IMPLEMENTED,
62
+ 500: exports.SERVICE_ERROR_CODES.INTERNAL,
63
+ 503: exports.SERVICE_ERROR_CODES.UNAVAILABLE,
64
+ };
65
+ /** Server-side reverse mapping: a domain/service code back to its wire status (§2.4). */
66
+ exports.STATUS_BY_SERVICE_CODE = {
67
+ [exports.SERVICE_ERROR_CODES.BAD_REQUEST]: 400,
68
+ [exports.SERVICE_ERROR_CODES.UNAUTHENTICATED]: 401,
69
+ [exports.SERVICE_ERROR_CODES.FORBIDDEN]: 403,
70
+ [exports.SERVICE_ERROR_CODES.NOT_IMPLEMENTED]: 404,
71
+ [exports.SERVICE_ERROR_CODES.INTERNAL]: 500,
72
+ [exports.SERVICE_ERROR_CODES.UNAVAILABLE]: 503,
73
+ };
74
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AA6CA,gCAEC;AAED,4CAEC;AAED,sCAMC;AAnCD,wEAAwE;AACxE,MAAa,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAS;IACb,IAAI,CAAe;IACnB,OAAO,CAAW;IAClB,WAAW,CAAU;IACrB,OAAO,CAAU;IACjB,SAAS,CAAU;IAE5B,YAAY,IAAkB;QAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;CACF;AAlBD,4BAkBC;AAED,SAAgB,UAAU,CAAC,CAAU;IACnC,OAAO,CAAC,YAAY,QAAQ,CAAC;AAC/B,CAAC;AAED,SAAgB,gBAAgB,CAAC,CAAU;IACzC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AACjD,CAAC;AAED,SAAgB,aAAa,CAC3B,CAAU,EACV,IAAQ;IAER,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AAC/C,CAAC;AAED,kEAAkE;AACrD,QAAA,qBAAqB,GAAG;IACnC,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,iBAAiB;IAClC,OAAO,EAAE,SAAS;CACV,CAAC;AAEX,+EAA+E;AAClE,QAAA,mBAAmB,GAAG;IACjC,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,iBAAiB;IAClC,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;CACtB,CAAC;AAEX,uFAAuF;AAC1E,QAAA,sBAAsB,GAA2B;IAC5D,GAAG,EAAE,2BAAmB,CAAC,WAAW;IACpC,GAAG,EAAE,2BAAmB,CAAC,eAAe;IACxC,GAAG,EAAE,2BAAmB,CAAC,SAAS;IAClC,GAAG,EAAE,2BAAmB,CAAC,eAAe;IACxC,GAAG,EAAE,2BAAmB,CAAC,QAAQ;IACjC,GAAG,EAAE,2BAAmB,CAAC,WAAW;CACrC,CAAC;AAEF,yFAAyF;AAC5E,QAAA,sBAAsB,GAAoC;IACrE,CAAC,2BAAmB,CAAC,WAAW,CAAC,EAAE,GAAG;IACtC,CAAC,2BAAmB,CAAC,eAAe,CAAC,EAAE,GAAG;IAC1C,CAAC,2BAAmB,CAAC,SAAS,CAAC,EAAE,GAAG;IACpC,CAAC,2BAAmB,CAAC,eAAe,CAAC,EAAE,GAAG;IAC1C,CAAC,2BAAmB,CAAC,QAAQ,CAAC,EAAE,GAAG;IACnC,CAAC,2BAAmB,CAAC,WAAW,CAAC,EAAE,GAAG;CACvC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ESLint flat-config snippet (design §2.8): a lint-level nudge, not a
3
+ * guarantee — `no-restricted-properties` is purely syntactic. Spread into a
4
+ * consumer's flat config:
5
+ *
6
+ * ```js
7
+ * import { rpcBoundaryRules } from "@nats-kit/rpc/eslint";
8
+ * export default [{ files: ["src/**\/*.ts"], rules: { ...rpcBoundaryRules } }];
9
+ * ```
10
+ */
11
+ export declare const rpcBoundaryRules: {
12
+ "no-restricted-properties": (string | {
13
+ property: string;
14
+ message: string;
15
+ object?: undefined;
16
+ } | {
17
+ object: string;
18
+ property: string;
19
+ message: string;
20
+ })[];
21
+ };
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/eslint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;CAmB5B,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rpcBoundaryRules = void 0;
4
+ /**
5
+ * ESLint flat-config snippet (design §2.8): a lint-level nudge, not a
6
+ * guarantee — `no-restricted-properties` is purely syntactic. Spread into a
7
+ * consumer's flat config:
8
+ *
9
+ * ```js
10
+ * import { rpcBoundaryRules } from "@nats-kit/rpc/eslint";
11
+ * export default [{ files: ["src/**\/*.ts"], rules: { ...rpcBoundaryRules } }];
12
+ * ```
13
+ */
14
+ exports.rpcBoundaryRules = {
15
+ "no-restricted-properties": [
16
+ "error",
17
+ {
18
+ property: "respondError",
19
+ message: "Return fail(...) or throw RpcError from an RPC handler; the rpc layer owns ADR-32 error headers.",
20
+ },
21
+ {
22
+ object: "nc",
23
+ property: "request",
24
+ message: "Use a typed createRpcClient() method instead of raw nc.request().",
25
+ },
26
+ {
27
+ object: "msg",
28
+ property: "respond",
29
+ message: "Raw msg.respond() bypasses the RPC envelope. Use an RPC handler.",
30
+ },
31
+ ],
32
+ };
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/eslint/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACU,QAAA,gBAAgB,GAAG;IAC9B,0BAA0B,EAAE;QAC1B,OAAO;QACP;YACE,QAAQ,EAAE,cAAc;YACxB,OAAO,EACL,kGAAkG;SACrG;QACD;YACE,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,mEAAmE;SAC7E;QACD;YACE,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,kEAAkE;SAC5E;KACF;CACF,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { type MsgHdrs, type NatsConnectionLike, type NatsConnectionRunner, type PubAck } from "@nats-kit/core";
2
+ import { z } from "zod";
3
+ /** A CloudEvents-shaped event definition (§2.5, §4.8). */
4
+ export interface EventContract<T extends z.ZodType> {
5
+ /** `<app>.<entity>.<event>` — also the CloudEvents `type` and the subject. */
6
+ type: string;
7
+ /** CloudEvents `source`, e.g. "urn:anki:sandbox". */
8
+ source: string;
9
+ data: T;
10
+ }
11
+ export declare function defineEvent<T extends z.ZodType>(def: EventContract<T>): EventContract<T>;
12
+ /**
13
+ * `publishEvent` needs a JetStream client to get a `PubAck` (design §2.5);
14
+ * `NatsConnectionLike` alone is Core-NATS-only, so we widen it with just the
15
+ * one extra accessor both `NatsConnectionRunner` and the NestJS `NatsService`
16
+ * (which delegates to it) already expose.
17
+ */
18
+ export interface PublishEventOptions {
19
+ nats: NatsConnectionLike & Pick<NatsConnectionRunner, "getJetStream">;
20
+ /** CloudEvents `id` and `Nats-Msg-Id`. Defaults to a nuid. */
21
+ id?: string;
22
+ /** RFC3339. Defaults to `new Date().toISOString()`. */
23
+ time?: string;
24
+ /** CloudEvents optional `subject` attribute (a resource id, NOT the NATS subject). */
25
+ subject?: string;
26
+ traceparent?: string;
27
+ /** Override the publish subject. Defaults to `event.type`. */
28
+ natsSubject?: string;
29
+ }
30
+ interface CloudEventEnvelope<T> {
31
+ specversion: "1.0";
32
+ id: string;
33
+ source: string;
34
+ type: string;
35
+ time: string;
36
+ subject?: string;
37
+ datacontenttype: "application/json";
38
+ data: T;
39
+ }
40
+ export type CloudEvent<T> = CloudEventEnvelope<T>;
41
+ /**
42
+ * Publish a CloudEvents 1.0 structured-mode envelope (§4.8) via JetStream,
43
+ * with `Nats-Msg-Id` set to the CloudEvents `id` for stream-level dedup.
44
+ */
45
+ export declare function publishEvent<T extends z.ZodType>(event: EventContract<T>, data: z.input<T>, options: PublishEventOptions): Promise<PubAck>;
46
+ /**
47
+ * Parse a received JetStream/Core message as a CloudEvents envelope,
48
+ * validating the full envelope (not just `data`) per §4.8.
49
+ */
50
+ export declare function parseEvent<T extends z.ZodType>(event: EventContract<T>, msg: {
51
+ data: Uint8Array;
52
+ headers?: MsgHdrs;
53
+ }): CloudEvent<z.output<T>>;
54
+ export {};
55
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,MAAM,EACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,0DAA0D;AAC1D,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;IAChD,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;CACT;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAExF;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;IACtE,8DAA8D;IAC9D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,kBAAkB,CAAC,CAAC;IAC5B,WAAW,EAAE,KAAK,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,kBAAkB,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAuClD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EACpD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAC5C,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,GAAG,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAKzB"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineEvent = defineEvent;
4
+ exports.publishEvent = publishEvent;
5
+ exports.parseEvent = parseEvent;
6
+ const nuid_1 = require("@nats-io/nuid");
7
+ const core_1 = require("@nats-kit/core");
8
+ const zod_1 = require("zod");
9
+ function defineEvent(def) {
10
+ return def;
11
+ }
12
+ /** Validates the envelope shape (§4.8) around an arbitrary `data` payload. */
13
+ const CloudEventEnvelopeSchema = zod_1.z.object({
14
+ specversion: zod_1.z.literal("1.0"),
15
+ id: zod_1.z.string().min(1),
16
+ source: zod_1.z.string().min(1),
17
+ type: zod_1.z.string().min(1),
18
+ time: zod_1.z.string().min(1),
19
+ subject: zod_1.z.string().optional(),
20
+ datacontenttype: zod_1.z.literal("application/json"),
21
+ data: zod_1.z.unknown(),
22
+ });
23
+ /**
24
+ * JSON has no representation for `NaN`/`Infinity` — `JSON.stringify` silently
25
+ * turns them into `null`, which would silently corrupt an event's data on
26
+ * the wire. Walk the value and reject before that can happen.
27
+ */
28
+ function assertJsonSafe(value, path = "$") {
29
+ if (typeof value === "number") {
30
+ if (!Number.isFinite(value)) {
31
+ throw new Error(`publishEvent: non-finite number (${String(value)}) at ${path} is not valid JSON`);
32
+ }
33
+ return;
34
+ }
35
+ if (Array.isArray(value)) {
36
+ value.forEach((v, i) => assertJsonSafe(v, `${path}[${i}]`));
37
+ return;
38
+ }
39
+ if (value !== null && typeof value === "object") {
40
+ for (const [k, v] of Object.entries(value)) {
41
+ assertJsonSafe(v, `${path}.${k}`);
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Publish a CloudEvents 1.0 structured-mode envelope (§4.8) via JetStream,
47
+ * with `Nats-Msg-Id` set to the CloudEvents `id` for stream-level dedup.
48
+ */
49
+ async function publishEvent(event, data, options) {
50
+ const parsed = event.data.parse(data);
51
+ assertJsonSafe(parsed);
52
+ const id = options.id ?? nuid_1.nuid.next();
53
+ const envelope = {
54
+ specversion: "1.0",
55
+ id,
56
+ source: event.source,
57
+ type: event.type,
58
+ time: options.time ?? new Date().toISOString(),
59
+ subject: options.subject,
60
+ datacontenttype: "application/json",
61
+ data: parsed,
62
+ };
63
+ const h = (0, core_1.headers)();
64
+ if (options.traceparent !== undefined) {
65
+ h.set("traceparent", options.traceparent);
66
+ }
67
+ const body = new TextEncoder().encode(JSON.stringify(envelope));
68
+ await options.nats.waitForReady();
69
+ const js = options.nats.getJetStream();
70
+ return js.publish(options.natsSubject ?? event.type, body, { msgID: id, headers: h });
71
+ }
72
+ /**
73
+ * Parse a received JetStream/Core message as a CloudEvents envelope,
74
+ * validating the full envelope (not just `data`) per §4.8.
75
+ */
76
+ function parseEvent(event, msg) {
77
+ const raw = JSON.parse(new TextDecoder().decode(msg.data));
78
+ const envelope = CloudEventEnvelopeSchema.parse(raw);
79
+ const data = event.data.parse(envelope.data);
80
+ return { ...envelope, data };
81
+ }
82
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type MsgHdrs } from "@nats-kit/core";
2
+ import { type RpcCaller } from "./types.js";
3
+ /** Header names (D5, §4.2). Never mint a bare `Nats-*` header — that prefix is server/ADR-32 territory. */
4
+ export declare const HEADER_REQUEST_ID = "Nk-Request-Id";
5
+ export declare const HEADER_CALLER_KIND = "Nk-Caller-Kind";
6
+ export declare const HEADER_CALLER_ID = "Nk-Caller-Id";
7
+ export declare const HEADER_CALLER_ROLE = "Nk-Caller-Role";
8
+ export declare const HEADER_DEADLINE = "Nk-Deadline";
9
+ export declare const HEADER_CONTENT_TYPE = "Content-Type";
10
+ export declare const HEADER_TRACEPARENT = "traceparent";
11
+ export declare const HEADER_TRACESTATE = "tracestate";
12
+ export declare const CONTENT_TYPE_JSON = "application/json";
13
+ export interface BuildRequestHeadersInit {
14
+ requestId: string;
15
+ caller: RpcCaller;
16
+ deadlineMs?: number;
17
+ traceparent?: string;
18
+ tracestate?: string;
19
+ /** Extra `Nk-*` headers. `Nats-*` and reserved names are rejected by the caller (client.ts). */
20
+ extra?: Record<string, string>;
21
+ }
22
+ /** Build the request `MsgHdrs` per §4.2. */
23
+ export declare function buildRequestHeaders(init: BuildRequestHeadersInit): MsgHdrs;
24
+ /**
25
+ * Parse `Nk-Caller-Role` per §4.2: comma-separated, no spaces, absent/empty
26
+ * means an empty set. Guards the classic `"".split(",")` trap, which yields
27
+ * `[""]` rather than `[]`.
28
+ */
29
+ export declare function parseRoles(headerValue: string | undefined | null): readonly string[];
30
+ export declare function isValidRole(role: string): boolean;
31
+ export declare function isValidRequestId(id: string): boolean;
32
+ export interface ParsedRequestHeaders {
33
+ requestId: string;
34
+ callerKind: "user" | "service";
35
+ callerId?: string;
36
+ roles: readonly string[];
37
+ deadlineMs?: number;
38
+ traceparent?: string;
39
+ }
40
+ export type ParseHeadersResult = {
41
+ ok: true;
42
+ value: ParsedRequestHeaders;
43
+ } | {
44
+ ok: false;
45
+ message: string;
46
+ };
47
+ /**
48
+ * Parse and validate the required/conditional request headers per §4.2.
49
+ * Used by `createRpcServer` as dispatch step 1 (missing/malformed -> 400;
50
+ * `user` with no `Nk-Caller-Id` -> handled by the caller as 401).
51
+ */
52
+ export declare function parseRequestHeaders(h: MsgHdrs | undefined): ParseHeadersResult;
53
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,2GAA2G;AAC3G,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAC/C,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAC7C,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAKpD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CA0B1E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,MAAM,EAAE,CAGpF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,kBAAkB,CAmD9E"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONTENT_TYPE_JSON = exports.HEADER_TRACESTATE = exports.HEADER_TRACEPARENT = exports.HEADER_CONTENT_TYPE = exports.HEADER_DEADLINE = exports.HEADER_CALLER_ROLE = exports.HEADER_CALLER_ID = exports.HEADER_CALLER_KIND = exports.HEADER_REQUEST_ID = void 0;
4
+ exports.buildRequestHeaders = buildRequestHeaders;
5
+ exports.parseRoles = parseRoles;
6
+ exports.isValidRole = isValidRole;
7
+ exports.isValidRequestId = isValidRequestId;
8
+ exports.parseRequestHeaders = parseRequestHeaders;
9
+ const core_1 = require("@nats-kit/core");
10
+ const nats_core_1 = require("@nats-io/nats-core");
11
+ /** Header names (D5, §4.2). Never mint a bare `Nats-*` header — that prefix is server/ADR-32 territory. */
12
+ exports.HEADER_REQUEST_ID = "Nk-Request-Id";
13
+ exports.HEADER_CALLER_KIND = "Nk-Caller-Kind";
14
+ exports.HEADER_CALLER_ID = "Nk-Caller-Id";
15
+ exports.HEADER_CALLER_ROLE = "Nk-Caller-Role";
16
+ exports.HEADER_DEADLINE = "Nk-Deadline";
17
+ exports.HEADER_CONTENT_TYPE = "Content-Type";
18
+ exports.HEADER_TRACEPARENT = "traceparent";
19
+ exports.HEADER_TRACESTATE = "tracestate";
20
+ exports.CONTENT_TYPE_JSON = "application/json";
21
+ const ROLE_RE = /^[A-Za-z0-9_:-]{1,64}$/;
22
+ const REQUEST_ID_RE = /^[A-Za-z0-9_-]{1,64}$/;
23
+ /** Build the request `MsgHdrs` per §4.2. */
24
+ function buildRequestHeaders(init) {
25
+ const h = (0, core_1.headers)();
26
+ h.set(exports.HEADER_CONTENT_TYPE, exports.CONTENT_TYPE_JSON);
27
+ h.set(exports.HEADER_REQUEST_ID, init.requestId);
28
+ h.set(exports.HEADER_CALLER_KIND, init.caller.kind);
29
+ if (init.caller.id !== undefined) {
30
+ h.set(exports.HEADER_CALLER_ID, init.caller.id);
31
+ }
32
+ if (init.caller.roles && init.caller.roles.length > 0) {
33
+ h.set(exports.HEADER_CALLER_ROLE, init.caller.roles.join(","));
34
+ }
35
+ if (init.deadlineMs !== undefined) {
36
+ h.set(exports.HEADER_DEADLINE, String(Math.trunc(init.deadlineMs)));
37
+ }
38
+ if (init.traceparent !== undefined) {
39
+ h.set(exports.HEADER_TRACEPARENT, init.traceparent);
40
+ }
41
+ if (init.tracestate !== undefined) {
42
+ h.set(exports.HEADER_TRACESTATE, init.tracestate);
43
+ }
44
+ if (init.extra) {
45
+ for (const [k, v] of Object.entries(init.extra)) {
46
+ h.set(k, v);
47
+ }
48
+ }
49
+ return h;
50
+ }
51
+ /**
52
+ * Parse `Nk-Caller-Role` per §4.2: comma-separated, no spaces, absent/empty
53
+ * means an empty set. Guards the classic `"".split(",")` trap, which yields
54
+ * `[""]` rather than `[]`.
55
+ */
56
+ function parseRoles(headerValue) {
57
+ if (!headerValue)
58
+ return [];
59
+ return headerValue.split(",").filter((r) => r.length > 0);
60
+ }
61
+ function isValidRole(role) {
62
+ return ROLE_RE.test(role);
63
+ }
64
+ function isValidRequestId(id) {
65
+ return REQUEST_ID_RE.test(id);
66
+ }
67
+ /**
68
+ * Parse and validate the required/conditional request headers per §4.2.
69
+ * Used by `createRpcServer` as dispatch step 1 (missing/malformed -> 400;
70
+ * `user` with no `Nk-Caller-Id` -> handled by the caller as 401).
71
+ */
72
+ function parseRequestHeaders(h) {
73
+ if (!h) {
74
+ return { ok: false, message: "missing required headers" };
75
+ }
76
+ const contentType = h.get(exports.HEADER_CONTENT_TYPE, nats_core_1.Match.IgnoreCase);
77
+ if (contentType && contentType !== exports.CONTENT_TYPE_JSON) {
78
+ return { ok: false, message: `unsupported ${exports.HEADER_CONTENT_TYPE}: "${contentType}"` };
79
+ }
80
+ const requestId = h.get(exports.HEADER_REQUEST_ID, nats_core_1.Match.IgnoreCase);
81
+ if (!requestId || !isValidRequestId(requestId)) {
82
+ return { ok: false, message: `missing or malformed ${exports.HEADER_REQUEST_ID}` };
83
+ }
84
+ const callerKind = h.get(exports.HEADER_CALLER_KIND, nats_core_1.Match.IgnoreCase);
85
+ if (callerKind !== "user" && callerKind !== "service") {
86
+ return { ok: false, message: `missing or invalid ${exports.HEADER_CALLER_KIND}` };
87
+ }
88
+ const rawCallerId = h.get(exports.HEADER_CALLER_ID, nats_core_1.Match.IgnoreCase) || undefined;
89
+ if (rawCallerId !== undefined && (rawCallerId.length < 1 || rawCallerId.length > 256)) {
90
+ return { ok: false, message: `${exports.HEADER_CALLER_ID} must be 1-256 chars` };
91
+ }
92
+ const callerId = rawCallerId;
93
+ const rawRoles = h.get(exports.HEADER_CALLER_ROLE, nats_core_1.Match.IgnoreCase);
94
+ const roles = parseRoles(rawRoles);
95
+ if (rawRoles) {
96
+ for (const role of roles) {
97
+ if (!isValidRole(role)) {
98
+ return { ok: false, message: `malformed role in ${exports.HEADER_CALLER_ROLE}: "${role}"` };
99
+ }
100
+ }
101
+ }
102
+ const rawDeadline = h.get(exports.HEADER_DEADLINE, nats_core_1.Match.IgnoreCase);
103
+ let deadlineMs;
104
+ if (rawDeadline) {
105
+ if (!/^\d+$/.test(rawDeadline)) {
106
+ return { ok: false, message: `malformed ${exports.HEADER_DEADLINE}` };
107
+ }
108
+ deadlineMs = Number(rawDeadline);
109
+ }
110
+ const traceparent = h.get(exports.HEADER_TRACEPARENT, nats_core_1.Match.IgnoreCase) || undefined;
111
+ return {
112
+ ok: true,
113
+ value: { requestId, callerKind, callerId, roles, deadlineMs, traceparent },
114
+ };
115
+ }
116
+ //# 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,15 @@
1
+ export { defineService, method, methodSubject, serviceName, groupSubject, SUBJECT_SEGMENT_RE, } from "./contract.js";
2
+ export type { RpcMethodDef, ServiceContract } from "./contract.js";
3
+ export { createRpcClient } from "./client.js";
4
+ export type { RpcCaller, RpcCallOptions, RpcClient, RpcClientOptions, } from "./types.js";
5
+ export { createRpcServer, ok, fail, newRequestId } from "./server.js";
6
+ export type { RpcContext, RpcResult, RpcHandlers, RpcAuthorize, RpcServerOptions, RpcServerHandle, } from "./types.js";
7
+ export { RpcError, isRpcError, isDomainError, isTransportError, TRANSPORT_ERROR_CODES, SERVICE_ERROR_CODES, } from "./errors.js";
8
+ export type { RpcErrorKind, RpcErrorInit } from "./errors.js";
9
+ export { HEADER_REQUEST_ID, HEADER_CALLER_KIND, HEADER_CALLER_ID, HEADER_CALLER_ROLE, HEADER_DEADLINE, HEADER_CONTENT_TYPE, HEADER_TRACEPARENT, HEADER_TRACESTATE, CONTENT_TYPE_JSON, parseRoles, parseRequestHeaders, } from "./headers.js";
10
+ export { defineEvent, publishEvent, parseEvent } from "./events.js";
11
+ export type { EventContract, PublishEventOptions, CloudEvent } from "./events.js";
12
+ export { defineKvValue } from "./kv.js";
13
+ export type { KvValueContract } from "./kv.js";
14
+ export { ServiceError } from "@nats-io/services";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,aAAa,EACb,MAAM,EACN,aAAa,EACb,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,SAAS,EACT,cAAc,EACd,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI9D,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGlF,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ // Public surface of @nats-kit/rpc — typed request/reply RPC over NATS,
3
+ // built on @nats-io/services (ADR-32) with a reconnect supervisor.
4
+ //
5
+ // See docs/spec/nats-kit-wire-spec.md for the language-neutral wire spec this
6
+ // package implements (mirrors design doc §4).
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ServiceError = exports.defineKvValue = exports.parseEvent = exports.publishEvent = exports.defineEvent = exports.parseRequestHeaders = exports.parseRoles = exports.CONTENT_TYPE_JSON = exports.HEADER_TRACESTATE = exports.HEADER_TRACEPARENT = exports.HEADER_CONTENT_TYPE = exports.HEADER_DEADLINE = exports.HEADER_CALLER_ROLE = exports.HEADER_CALLER_ID = exports.HEADER_CALLER_KIND = exports.HEADER_REQUEST_ID = exports.SERVICE_ERROR_CODES = exports.TRANSPORT_ERROR_CODES = exports.isTransportError = exports.isDomainError = exports.isRpcError = exports.RpcError = exports.newRequestId = exports.fail = exports.ok = exports.createRpcServer = exports.createRpcClient = exports.SUBJECT_SEGMENT_RE = exports.groupSubject = exports.serviceName = exports.methodSubject = exports.method = exports.defineService = void 0;
9
+ // Contract
10
+ var contract_js_1 = require("./contract.js");
11
+ Object.defineProperty(exports, "defineService", { enumerable: true, get: function () { return contract_js_1.defineService; } });
12
+ Object.defineProperty(exports, "method", { enumerable: true, get: function () { return contract_js_1.method; } });
13
+ Object.defineProperty(exports, "methodSubject", { enumerable: true, get: function () { return contract_js_1.methodSubject; } });
14
+ Object.defineProperty(exports, "serviceName", { enumerable: true, get: function () { return contract_js_1.serviceName; } });
15
+ Object.defineProperty(exports, "groupSubject", { enumerable: true, get: function () { return contract_js_1.groupSubject; } });
16
+ Object.defineProperty(exports, "SUBJECT_SEGMENT_RE", { enumerable: true, get: function () { return contract_js_1.SUBJECT_SEGMENT_RE; } });
17
+ // Client
18
+ var client_js_1 = require("./client.js");
19
+ Object.defineProperty(exports, "createRpcClient", { enumerable: true, get: function () { return client_js_1.createRpcClient; } });
20
+ // Server
21
+ var server_js_1 = require("./server.js");
22
+ Object.defineProperty(exports, "createRpcServer", { enumerable: true, get: function () { return server_js_1.createRpcServer; } });
23
+ Object.defineProperty(exports, "ok", { enumerable: true, get: function () { return server_js_1.ok; } });
24
+ Object.defineProperty(exports, "fail", { enumerable: true, get: function () { return server_js_1.fail; } });
25
+ Object.defineProperty(exports, "newRequestId", { enumerable: true, get: function () { return server_js_1.newRequestId; } });
26
+ // Errors
27
+ var errors_js_1 = require("./errors.js");
28
+ Object.defineProperty(exports, "RpcError", { enumerable: true, get: function () { return errors_js_1.RpcError; } });
29
+ Object.defineProperty(exports, "isRpcError", { enumerable: true, get: function () { return errors_js_1.isRpcError; } });
30
+ Object.defineProperty(exports, "isDomainError", { enumerable: true, get: function () { return errors_js_1.isDomainError; } });
31
+ Object.defineProperty(exports, "isTransportError", { enumerable: true, get: function () { return errors_js_1.isTransportError; } });
32
+ Object.defineProperty(exports, "TRANSPORT_ERROR_CODES", { enumerable: true, get: function () { return errors_js_1.TRANSPORT_ERROR_CODES; } });
33
+ Object.defineProperty(exports, "SERVICE_ERROR_CODES", { enumerable: true, get: function () { return errors_js_1.SERVICE_ERROR_CODES; } });
34
+ // Headers (exposed for consumers building their own low-level tooling, e.g.
35
+ // the interop test harness or a Go-side test client written in TS).
36
+ var headers_js_1 = require("./headers.js");
37
+ Object.defineProperty(exports, "HEADER_REQUEST_ID", { enumerable: true, get: function () { return headers_js_1.HEADER_REQUEST_ID; } });
38
+ Object.defineProperty(exports, "HEADER_CALLER_KIND", { enumerable: true, get: function () { return headers_js_1.HEADER_CALLER_KIND; } });
39
+ Object.defineProperty(exports, "HEADER_CALLER_ID", { enumerable: true, get: function () { return headers_js_1.HEADER_CALLER_ID; } });
40
+ Object.defineProperty(exports, "HEADER_CALLER_ROLE", { enumerable: true, get: function () { return headers_js_1.HEADER_CALLER_ROLE; } });
41
+ Object.defineProperty(exports, "HEADER_DEADLINE", { enumerable: true, get: function () { return headers_js_1.HEADER_DEADLINE; } });
42
+ Object.defineProperty(exports, "HEADER_CONTENT_TYPE", { enumerable: true, get: function () { return headers_js_1.HEADER_CONTENT_TYPE; } });
43
+ Object.defineProperty(exports, "HEADER_TRACEPARENT", { enumerable: true, get: function () { return headers_js_1.HEADER_TRACEPARENT; } });
44
+ Object.defineProperty(exports, "HEADER_TRACESTATE", { enumerable: true, get: function () { return headers_js_1.HEADER_TRACESTATE; } });
45
+ Object.defineProperty(exports, "CONTENT_TYPE_JSON", { enumerable: true, get: function () { return headers_js_1.CONTENT_TYPE_JSON; } });
46
+ Object.defineProperty(exports, "parseRoles", { enumerable: true, get: function () { return headers_js_1.parseRoles; } });
47
+ Object.defineProperty(exports, "parseRequestHeaders", { enumerable: true, get: function () { return headers_js_1.parseRequestHeaders; } });
48
+ // Events
49
+ var events_js_1 = require("./events.js");
50
+ Object.defineProperty(exports, "defineEvent", { enumerable: true, get: function () { return events_js_1.defineEvent; } });
51
+ Object.defineProperty(exports, "publishEvent", { enumerable: true, get: function () { return events_js_1.publishEvent; } });
52
+ Object.defineProperty(exports, "parseEvent", { enumerable: true, get: function () { return events_js_1.parseEvent; } });
53
+ // KV
54
+ var kv_js_1 = require("./kv.js");
55
+ Object.defineProperty(exports, "defineKvValue", { enumerable: true, get: function () { return kv_js_1.defineKvValue; } });
56
+ // Re-export the ADR-32 error class from `@nats-io/services` so consumers can
57
+ // `instanceof`-check it without a direct dependency (mirrors the core
58
+ // barrel's `@nats-io/*` re-export rule).
59
+ var services_1 = require("@nats-io/services");
60
+ Object.defineProperty(exports, "ServiceError", { enumerable: true, get: function () { return services_1.ServiceError; } });
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,uEAAuE;AACvE,mEAAmE;AACnE,EAAE;AACF,8EAA8E;AAC9E,8CAA8C;;;AAE9C,WAAW;AACX,6CAOuB;AANrB,4GAAA,aAAa,OAAA;AACb,qGAAA,MAAM,OAAA;AACN,4GAAA,aAAa,OAAA;AACb,0GAAA,WAAW,OAAA;AACX,2GAAA,YAAY,OAAA;AACZ,iHAAA,kBAAkB,OAAA;AAIpB,SAAS;AACT,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AAQxB,SAAS;AACT,yCAAsE;AAA7D,4GAAA,eAAe,OAAA;AAAE,+FAAA,EAAE,OAAA;AAAE,iGAAA,IAAI,OAAA;AAAE,yGAAA,YAAY,OAAA;AAUhD,SAAS;AACT,yCAOqB;AANnB,qGAAA,QAAQ,OAAA;AACR,uGAAA,UAAU,OAAA;AACV,0GAAA,aAAa,OAAA;AACb,6GAAA,gBAAgB,OAAA;AAChB,kHAAA,qBAAqB,OAAA;AACrB,gHAAA,mBAAmB,OAAA;AAIrB,4EAA4E;AAC5E,oEAAoE;AACpE,2CAYsB;AAXpB,+GAAA,iBAAiB,OAAA;AACjB,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,gHAAA,kBAAkB,OAAA;AAClB,6GAAA,eAAe,OAAA;AACf,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA;AAClB,+GAAA,iBAAiB,OAAA;AACjB,+GAAA,iBAAiB,OAAA;AACjB,wGAAA,UAAU,OAAA;AACV,iHAAA,mBAAmB,OAAA;AAGrB,SAAS;AACT,yCAAoE;AAA3D,wGAAA,WAAW,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,uGAAA,UAAU,OAAA;AAG9C,KAAK;AACL,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AAGtB,6EAA6E;AAC7E,sEAAsE;AACtE,yCAAyC;AACzC,8CAAiD;AAAxC,wGAAA,YAAY,OAAA"}