@vritti/api-sdk 0.3.3 → 0.3.5

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 (133) hide show
  1. package/dist/auth.cjs +942 -0
  2. package/dist/auth.cjs.map +1 -0
  3. package/dist/auth.d.cts +95 -0
  4. package/dist/auth.d.ts +95 -0
  5. package/dist/auth.js +884 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cache.cjs +182 -14
  8. package/dist/cache.cjs.map +1 -1
  9. package/dist/cache.d.cts +48 -4
  10. package/dist/cache.d.ts +48 -4
  11. package/dist/cache.js +177 -12
  12. package/dist/cache.js.map +1 -1
  13. package/dist/catalog-resolver.cjs +226 -51
  14. package/dist/catalog-resolver.cjs.map +1 -1
  15. package/dist/catalog-resolver.d.cts +41 -19
  16. package/dist/catalog-resolver.d.ts +41 -19
  17. package/dist/catalog-resolver.js +212 -46
  18. package/dist/catalog-resolver.js.map +1 -1
  19. package/dist/code-pattern-BP4zkNtT.d.cts +12 -0
  20. package/dist/code-pattern-BP4zkNtT.d.ts +12 -0
  21. package/dist/context.cjs +93 -0
  22. package/dist/context.cjs.map +1 -0
  23. package/dist/context.d.cts +19 -0
  24. package/dist/context.d.ts +19 -0
  25. package/dist/context.js +64 -0
  26. package/dist/context.js.map +1 -0
  27. package/dist/countries.cjs +1559 -0
  28. package/dist/countries.cjs.map +1 -0
  29. package/dist/countries.d.cts +13 -0
  30. package/dist/countries.d.ts +13 -0
  31. package/dist/countries.js +1532 -0
  32. package/dist/countries.js.map +1 -0
  33. package/dist/data-table.cjs +1280 -0
  34. package/dist/data-table.cjs.map +1 -0
  35. package/dist/data-table.d.cts +123 -0
  36. package/dist/data-table.d.ts +123 -0
  37. package/dist/data-table.js +1260 -0
  38. package/dist/data-table.js.map +1 -0
  39. package/dist/database.cjs +1510 -0
  40. package/dist/database.cjs.map +1 -0
  41. package/dist/database.d.cts +287 -0
  42. package/dist/database.d.ts +287 -0
  43. package/dist/database.js +1469 -0
  44. package/dist/database.js.map +1 -0
  45. package/dist/decimal.d.cts +0 -1
  46. package/dist/decimal.d.ts +0 -1
  47. package/dist/decorators.cjs +1817 -0
  48. package/dist/decorators.cjs.map +1 -0
  49. package/dist/decorators.d.cts +24 -0
  50. package/dist/decorators.d.ts +24 -0
  51. package/dist/decorators.js +1780 -0
  52. package/dist/decorators.js.map +1 -0
  53. package/dist/drizzle-pg-core.cjs +25 -0
  54. package/dist/drizzle-pg-core.cjs.map +1 -1
  55. package/dist/drizzle-pg-core.d.cts +7 -0
  56. package/dist/drizzle-pg-core.d.ts +7 -0
  57. package/dist/drizzle-pg-core.js +22 -0
  58. package/dist/drizzle-pg-core.js.map +1 -1
  59. package/dist/exceptions.cjs +301 -0
  60. package/dist/exceptions.cjs.map +1 -0
  61. package/dist/exceptions.d.cts +90 -0
  62. package/dist/exceptions.d.ts +90 -0
  63. package/dist/exceptions.js +257 -0
  64. package/dist/exceptions.js.map +1 -0
  65. package/dist/filter.types-PuARU9XD.d.cts +50 -0
  66. package/dist/filter.types-PuARU9XD.d.ts +50 -0
  67. package/dist/filters.cjs +407 -0
  68. package/dist/filters.cjs.map +1 -0
  69. package/dist/filters.d.cts +55 -0
  70. package/dist/filters.d.ts +55 -0
  71. package/dist/filters.js +377 -0
  72. package/dist/filters.js.map +1 -0
  73. package/dist/index.cjs +0 -5423
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +93 -854
  76. package/dist/index.d.ts +93 -854
  77. package/dist/index.js +0 -5301
  78. package/dist/index.js.map +1 -1
  79. package/dist/is-country.decorator-CcNwSSr5.d.cts +5 -0
  80. package/dist/is-country.decorator-CcNwSSr5.d.ts +5 -0
  81. package/dist/license.d.cts +1 -1
  82. package/dist/license.d.ts +1 -1
  83. package/dist/lodash.cjs.map +1 -1
  84. package/dist/lodash.js.map +1 -1
  85. package/dist/logger.cjs +862 -0
  86. package/dist/logger.cjs.map +1 -0
  87. package/dist/logger.d.cts +118 -0
  88. package/dist/logger.d.ts +118 -0
  89. package/dist/logger.js +816 -0
  90. package/dist/logger.js.map +1 -0
  91. package/dist/migrate.cjs +2 -2
  92. package/dist/migrate.cjs.map +1 -1
  93. package/dist/migrate.d.cts +2 -0
  94. package/dist/migrate.d.ts +2 -0
  95. package/dist/migrate.js +2 -2
  96. package/dist/migrate.js.map +1 -1
  97. package/dist/money.cjs +18 -3
  98. package/dist/money.cjs.map +1 -1
  99. package/dist/money.d.cts +13 -13
  100. package/dist/money.d.ts +13 -13
  101. package/dist/money.js +18 -3
  102. package/dist/money.js.map +1 -1
  103. package/dist/nats.cjs +34 -35
  104. package/dist/nats.cjs.map +1 -1
  105. package/dist/nats.d.cts +14 -14
  106. package/dist/nats.d.ts +14 -14
  107. package/dist/nats.js +32 -33
  108. package/dist/nats.js.map +1 -1
  109. package/dist/root.cjs +225 -0
  110. package/dist/root.cjs.map +1 -0
  111. package/dist/root.d.cts +4 -0
  112. package/dist/root.d.ts +4 -0
  113. package/dist/root.js +200 -0
  114. package/dist/root.js.map +1 -0
  115. package/dist/{types-DQRwj5rr.d.cts → types-C9jPdQqH.d.cts} +32 -6
  116. package/dist/{types-DQRwj5rr.d.ts → types-C9jPdQqH.d.ts} +32 -6
  117. package/dist/types.cjs +19 -0
  118. package/dist/types.cjs.map +1 -0
  119. package/dist/types.d.cts +17 -0
  120. package/dist/types.d.ts +17 -0
  121. package/dist/types.js +1 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/utils.cjs +273 -0
  124. package/dist/utils.cjs.map +1 -0
  125. package/dist/utils.d.cts +8 -0
  126. package/dist/utils.d.ts +8 -0
  127. package/dist/utils.js +245 -0
  128. package/dist/utils.js.map +1 -0
  129. package/package.json +122 -1
  130. package/dist/cache.service-_SuJIcNA.d.cts +0 -20
  131. package/dist/cache.service-_SuJIcNA.d.ts +0 -20
  132. package/dist/fastify-augmentation-CQPBNS5a.d.cts +0 -105
  133. package/dist/fastify-augmentation-CQPBNS5a.d.ts +0 -105
package/dist/nats.cjs CHANGED
@@ -25,10 +25,10 @@ __export(nats_exports, {
25
25
  NatsClientModule: () => NatsClientModule,
26
26
  NatsClientService: () => NatsClientService,
27
27
  NatsMicroserviceClientService: () => NatsMicroserviceClientService,
28
- RpcBuCurrencyCode: () => RpcBuCurrencyCode,
29
- RpcBuId: () => RpcBuId,
30
28
  RpcNatsHeaders: () => RpcNatsHeaders,
31
29
  RpcProblemExceptionFilter: () => RpcProblemExceptionFilter,
30
+ RpcSiteCurrencyCode: () => RpcSiteCurrencyCode,
31
+ RpcSiteId: () => RpcSiteId,
32
32
  parseNatsHeaders: () => parseNatsHeaders
33
33
  });
34
34
  module.exports = __toCommonJS(nats_exports);
@@ -120,7 +120,10 @@ var RpcProblemExceptionFilter = class _RpcProblemExceptionFilter {
120
120
  if (this.isHttpException(exception)) {
121
121
  const status = exception.getStatus();
122
122
  const response = exception.getResponse();
123
- return (0, import_rxjs.throwError)(() => this.toProblemPayload(response, status));
123
+ const payload = this.toProblemPayload(response, status);
124
+ const log = status >= import_common3.HttpStatus.INTERNAL_SERVER_ERROR ? this.logger.error : this.logger.warn;
125
+ log.call(this.logger, `RPC ${status}: ${payload.detail}`);
126
+ return (0, import_rxjs.throwError)(() => payload);
124
127
  }
125
128
  if (exception instanceof Error) {
126
129
  const cause = exception.cause;
@@ -155,7 +158,7 @@ var RpcProblemExceptionFilter = class _RpcProblemExceptionFilter {
155
158
  };
156
159
  }
157
160
  const obj = response ?? {};
158
- const detail = typeof obj.detail === "string" ? obj.detail : "Request failed";
161
+ const detail = typeof obj.detail === "string" ? obj.detail : typeof obj.message === "string" ? obj.message : Array.isArray(obj.message) ? obj.message.join(", ") : "Request failed";
159
162
  return {
160
163
  type: typeof obj.type === "string" ? obj.type : "about:blank",
161
164
  label: typeof obj.label === "string" ? obj.label : void 0,
@@ -181,11 +184,11 @@ var import_common4 = require("@nestjs/common");
181
184
  var NATS_HEADER_KEYS = {
182
185
  ORG_ID: "x-org-id",
183
186
  USER_ID: "x-user-id",
184
- BU_ID: "x-bu-id",
185
- BU_TIMEZONE: "x-bu-timezone",
186
- BU_CURRENCY_CODE: "x-bu-currency-code",
187
- BU_ANCESTOR_IDS: "x-bu-ancestor-ids",
188
- BU_DESCENDANT_IDS: "x-bu-descendant-ids"
187
+ SITE_ID: "x-site-id",
188
+ LE_ID: "x-le-id",
189
+ SITE_GROUP_ID: "x-sg-id",
190
+ SITE_TIMEZONE: "x-site-timezone",
191
+ SITE_CURRENCY_CODE: "x-site-currency-code"
189
192
  };
190
193
  function getHeader(headers, key) {
191
194
  if (!headers) return void 0;
@@ -200,16 +203,15 @@ function parseNatsHeaders(headers) {
200
203
  if (!headers) return null;
201
204
  const orgId = getHeader(headers, NATS_HEADER_KEYS.ORG_ID);
202
205
  const userId = getHeader(headers, NATS_HEADER_KEYS.USER_ID);
203
- const buId = getHeader(headers, NATS_HEADER_KEYS.BU_ID);
204
- if (!orgId || !userId || !buId) return null;
206
+ if (!orgId || !userId) return null;
205
207
  return {
206
208
  orgId,
207
209
  userId,
208
- buId,
209
- buTimezone: getHeader(headers, NATS_HEADER_KEYS.BU_TIMEZONE) || "UTC",
210
- buCurrencyCode: getHeader(headers, NATS_HEADER_KEYS.BU_CURRENCY_CODE) || "",
211
- buAncestorIds: JSON.parse(getHeader(headers, NATS_HEADER_KEYS.BU_ANCESTOR_IDS) || "[]"),
212
- buDescendantIds: JSON.parse(getHeader(headers, NATS_HEADER_KEYS.BU_DESCENDANT_IDS) || "[]")
210
+ siteId: getHeader(headers, NATS_HEADER_KEYS.SITE_ID) || "",
211
+ legalEntityId: getHeader(headers, NATS_HEADER_KEYS.LE_ID) || "",
212
+ siteGroupId: getHeader(headers, NATS_HEADER_KEYS.SITE_GROUP_ID) || "",
213
+ siteTimezone: getHeader(headers, NATS_HEADER_KEYS.SITE_TIMEZONE) || "UTC",
214
+ siteCurrencyCode: getHeader(headers, NATS_HEADER_KEYS.SITE_CURRENCY_CODE) || ""
213
215
  };
214
216
  }
215
217
  __name(parseNatsHeaders, "parseNatsHeaders");
@@ -219,17 +221,17 @@ var RpcNatsHeaders = (0, import_common4.createParamDecorator)((_data, ctx) => {
219
221
  const rpcCtx = ctx.switchToRpc().getContext();
220
222
  return parseNatsHeaders(rpcCtx.getHeaders());
221
223
  });
222
- var RpcBuId = (0, import_common4.createParamDecorator)((_data, ctx) => {
224
+ var RpcSiteId = (0, import_common4.createParamDecorator)((_data, ctx) => {
223
225
  const rpcCtx = ctx.switchToRpc().getContext();
224
226
  const headers = parseNatsHeaders(rpcCtx.getHeaders());
225
- if (!headers?.buId) throw new import_common4.InternalServerErrorException("Missing buId in NATS headers.");
226
- return headers.buId;
227
+ if (!headers?.siteId) throw new import_common4.InternalServerErrorException("Missing siteId in NATS headers.");
228
+ return headers.siteId;
227
229
  });
228
- var RpcBuCurrencyCode = (0, import_common4.createParamDecorator)((_data, ctx) => {
230
+ var RpcSiteCurrencyCode = (0, import_common4.createParamDecorator)((_data, ctx) => {
229
231
  const rpcCtx = ctx.switchToRpc().getContext();
230
232
  const headers = parseNatsHeaders(rpcCtx.getHeaders());
231
- if (!headers?.buCurrencyCode) throw new import_common4.InternalServerErrorException("Missing buCurrencyCode in NATS headers.");
232
- return headers.buCurrencyCode;
233
+ if (!headers?.siteCurrencyCode) throw new import_common4.InternalServerErrorException("Missing siteCurrencyCode in NATS headers.");
234
+ return headers.siteCurrencyCode;
233
235
  });
234
236
 
235
237
  // src/nats/nats-client.module.ts
@@ -289,8 +291,7 @@ var NatsClientService = class {
289
291
  this.contextResolver = contextResolver;
290
292
  this.clients = clients;
291
293
  }
292
- // For GraphQL, @Inject(REQUEST) is the { req, reply } context wrapper, not the Fastify request;
293
- // unwrap so `sessionInfo` (set by the auth guard on the request) is visible across both transports.
294
+ // Unwraps the GraphQL { req, reply } context wrapper so sessionInfo is visible across both transports
294
295
  get request() {
295
296
  return resolveInjectedRequest(this.injectedRequest);
296
297
  }
@@ -334,11 +335,11 @@ function contextToHeaders(ctx) {
334
335
  const hdrs = (0, import_nats.headers)();
335
336
  hdrs.set(NATS_HEADER_KEYS.ORG_ID, ctx.orgId);
336
337
  hdrs.set(NATS_HEADER_KEYS.USER_ID, ctx.userId);
337
- hdrs.set(NATS_HEADER_KEYS.BU_ID, ctx.buId);
338
- hdrs.set(NATS_HEADER_KEYS.BU_TIMEZONE, ctx.buTimezone);
339
- hdrs.set(NATS_HEADER_KEYS.BU_CURRENCY_CODE, ctx.buCurrencyCode);
340
- hdrs.set(NATS_HEADER_KEYS.BU_ANCESTOR_IDS, JSON.stringify(ctx.buAncestorIds));
341
- hdrs.set(NATS_HEADER_KEYS.BU_DESCENDANT_IDS, JSON.stringify(ctx.buDescendantIds));
338
+ if (ctx.siteId) hdrs.set(NATS_HEADER_KEYS.SITE_ID, ctx.siteId);
339
+ if (ctx.legalEntityId) hdrs.set(NATS_HEADER_KEYS.LE_ID, ctx.legalEntityId);
340
+ if (ctx.siteGroupId) hdrs.set(NATS_HEADER_KEYS.SITE_GROUP_ID, ctx.siteGroupId);
341
+ if (ctx.siteTimezone) hdrs.set(NATS_HEADER_KEYS.SITE_TIMEZONE, ctx.siteTimezone);
342
+ if (ctx.siteCurrencyCode) hdrs.set(NATS_HEADER_KEYS.SITE_CURRENCY_CODE, ctx.siteCurrencyCode);
342
343
  return hdrs;
343
344
  }
344
345
  __name(contextToHeaders, "contextToHeaders");
@@ -383,10 +384,8 @@ var NatsMicroserviceClientService = class {
383
384
  const headers = {
384
385
  [NATS_HEADER_KEYS.ORG_ID]: natsHeaders2.orgId,
385
386
  [NATS_HEADER_KEYS.USER_ID]: natsHeaders2.userId,
386
- [NATS_HEADER_KEYS.BU_ID]: natsHeaders2.buId,
387
- [NATS_HEADER_KEYS.BU_TIMEZONE]: natsHeaders2.buTimezone,
388
- [NATS_HEADER_KEYS.BU_ANCESTOR_IDS]: JSON.stringify(natsHeaders2.buAncestorIds),
389
- [NATS_HEADER_KEYS.BU_DESCENDANT_IDS]: JSON.stringify(natsHeaders2.buDescendantIds)
387
+ [NATS_HEADER_KEYS.SITE_ID]: natsHeaders2.siteId,
388
+ [NATS_HEADER_KEYS.SITE_TIMEZONE]: natsHeaders2.siteTimezone
390
389
  };
391
390
  const record = new import_microservices3.NatsRecordBuilder(data ?? {}).setHeaders(headers).build();
392
391
  return client.send({
@@ -527,10 +526,10 @@ NatsClientModule = _ts_decorate4([
527
526
  NatsClientModule,
528
527
  NatsClientService,
529
528
  NatsMicroserviceClientService,
530
- RpcBuCurrencyCode,
531
- RpcBuId,
532
529
  RpcNatsHeaders,
533
530
  RpcProblemExceptionFilter,
531
+ RpcSiteCurrencyCode,
532
+ RpcSiteId,
534
533
  parseNatsHeaders
535
534
  });
536
535
  //# sourceMappingURL=nats.cjs.map
package/dist/nats.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nats.ts","../src/filters/rpc-problem-exception.filter.ts","../src/exceptions/conflict.exception.ts","../src/exceptions/base-field.exception.ts","../src/filters/pg-error.translator.ts","../src/nats/decorators/nats-headers.decorator.ts","../src/nats/nats-context.ts","../src/nats/nats-client.module.ts","../src/nats/constants.ts","../src/nats/nats-client.service.ts","../src/context/resolve-request.ts","../src/nats/nats-microservice-client.service.ts"],"sourcesContent":["// NATS + microservice exports — kept OUT of the main barrel (src/index.ts) so that\n// non-NATS consumers (e.g. cloud-server) never load @nestjs/microservices.\n// Consumers that use NATS import from '@vritti/api-sdk/nats' and provide @nestjs/microservices.\n\n// RPC exception filter (microservice side) — moved out of the main filters barrel\nexport { RpcProblemExceptionFilter } from './filters/rpc-problem-exception.filter';\nexport { RpcBuCurrencyCode, RpcBuId, RpcNatsHeaders } from './nats/decorators/nats-headers.decorator';\nexport type {\n ContextResolverFn,\n NatsHeaders,\n NatsMicroserviceModuleAsyncOptions,\n NatsRootModuleAsyncOptions,\n NatsServiceConfig,\n} from './nats/index';\nexport { NatsClientModule } from './nats/nats-client.module';\nexport { NatsClientService } from './nats/nats-client.service';\nexport { NATS_HEADER_KEYS, parseNatsHeaders } from './nats/nats-context';\nexport { NatsMicroserviceClientService } from './nats/nats-microservice-client.service';\n","import { type ArgumentsHost, Catch, type HttpException, HttpStatus, Logger } from '@nestjs/common';\nimport { RpcException } from '@nestjs/microservices';\nimport { type Observable, throwError } from 'rxjs';\nimport { tryTranslatePgError } from './pg-error.translator';\n\ninterface FieldError {\n field: string;\n message: string;\n}\n\ninterface ProblemPayload {\n type: string;\n label?: string;\n detail: string;\n message: string;\n errors: FieldError[];\n status: number;\n statusCode: number;\n}\n\n@Catch()\nexport class RpcProblemExceptionFilter {\n private readonly logger = new Logger(RpcProblemExceptionFilter.name);\n\n catch(exception: unknown, _host: ArgumentsHost): Observable<never> {\n // Translate raw Postgres errors (e.g. 23505 unique_violation from an unguarded INSERT in\n // a NATS handler) into a ConflictException before the rest of the filter handles them.\n const translatedPgError = tryTranslatePgError(exception);\n if (translatedPgError) exception = translatedPgError;\n\n if (exception instanceof RpcException) {\n return throwError(() => exception.getError());\n }\n\n if (this.isHttpException(exception)) {\n const status = exception.getStatus();\n const response = exception.getResponse();\n return throwError(() => this.toProblemPayload(response, status));\n }\n\n if (exception instanceof Error) {\n const cause = (exception as { cause?: unknown }).cause;\n const causeMessage = cause instanceof Error ? cause.message : undefined;\n const causeStack = cause instanceof Error ? cause.stack : undefined;\n this.logger.error(causeMessage ?? exception.message, causeStack ?? exception.stack);\n if (cause && cause !== exception) {\n this.logger.error(`Wrapped by: ${exception.message}`);\n }\n return throwError(() =>\n this.toProblemPayload(\n {\n type: 'about:blank',\n detail: causeMessage ?? exception.message,\n errors: [],\n },\n HttpStatus.INTERNAL_SERVER_ERROR,\n ),\n );\n }\n\n this.logger.error(`Unhandled non-error exception: ${JSON.stringify(exception)}`);\n return throwError(() =>\n this.toProblemPayload(\n {\n type: 'about:blank',\n detail: 'An unexpected error occurred',\n errors: [],\n },\n HttpStatus.INTERNAL_SERVER_ERROR,\n ),\n );\n }\n\n private toProblemPayload(response: unknown, status: number): ProblemPayload {\n if (typeof response === 'string') {\n return {\n type: 'about:blank',\n detail: response,\n message: response,\n errors: [],\n status,\n statusCode: status,\n };\n }\n\n const obj = (response ?? {}) as Record<string, unknown>;\n const detail = typeof obj.detail === 'string' ? obj.detail : 'Request failed';\n return {\n type: typeof obj.type === 'string' ? obj.type : 'about:blank',\n label: typeof obj.label === 'string' ? obj.label : undefined,\n detail,\n message: detail,\n errors: Array.isArray(obj.errors) ? (obj.errors as FieldError[]) : [],\n status,\n statusCode: status,\n };\n }\n\n private isHttpException(error: unknown): error is HttpException {\n return (\n error instanceof Error &&\n typeof (error as { getStatus?: unknown }).getStatus === 'function' &&\n typeof (error as { getResponse?: unknown }).getResponse === 'function'\n );\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class ConflictException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Conflict', HttpStatus.CONFLICT);\n }\n}\n","import { HttpException, HttpStatus } from '@nestjs/common';\nimport type { FieldError } from '../types/error-response.types';\n\n// Re-export FieldError for backwards compatibility\nexport type { FieldError } from '../types/error-response.types';\n\nexport interface ProblemOptions {\n type?: string;\n label?: string;\n detail?: string;\n errors?: FieldError[];\n}\n\nexport abstract class HttpProblemException extends HttpException {\n constructor(detailOrOptions: string | ProblemOptions, httpStatus: HttpStatus) {\n const options = typeof detailOrOptions === 'string' ? { detail: detailOrOptions } : detailOrOptions;\n\n super(\n {\n type: options.type ?? 'about:blank',\n label: options.label,\n detail: options.detail,\n errors: options.errors ?? [],\n },\n httpStatus,\n );\n }\n}\n","import { ConflictException } from '../exceptions/conflict.exception';\n\n// Postgres SQLSTATE codes we translate before the global filters render the response.\n// Reference: https://www.postgresql.org/docs/current/errcodes-appendix.html\n//\n// Today we only handle 23505 (unique_violation) — services already pre-check the common\n// duplicate cases for friendly messages; this is the race-condition / unguarded-write backstop\n// so a raw `error: duplicate key value violates unique constraint \"...\"` never reaches the\n// client as a 500. Extend the switch below as we identify other SQLSTATEs worth surfacing\n// (e.g. 23503 foreign_key_violation → 409 with FK info).\nconst PG_UNIQUE_VIOLATION = '23505';\n\nexport type PgErrorShape = {\n code?: string;\n message?: string;\n constraint?: string;\n table?: string;\n schema?: string;\n column?: string;\n detail?: string;\n hint?: string;\n};\n\n// Returns a ConflictException for a Postgres unique-violation error, otherwise undefined.\n// Both global filters call this at the top of their catch method so any 23505 escaping a\n// service produces the same RFC 9457 payload regardless of where it was thrown.\n//\n// Drizzle 1.0+ wraps pg driver errors in `DrizzleQueryError` with the original pg error on\n// `.cause`, so we walk a short cause chain to find the SQLSTATE.\nexport function tryTranslatePgError(error: unknown): ConflictException | undefined {\n const pgError = findPgError(error);\n if (!pgError) return undefined;\n const { code, constraint, table, detail } = pgError;\n if (code !== PG_UNIQUE_VIOLATION) return undefined;\n return new ConflictException({\n label: 'Duplicate Entry',\n detail: detail?.trim() || 'A record with these values already exists.',\n errors: [],\n ...(constraint || table ? { meta: { constraint, table } } : {}),\n });\n}\n\n// Walks up to N levels of `.cause` looking for a pg-shaped error (has SQLSTATE `code`).\n// Caps depth so a circular `cause` graph can't trap us.\nexport function findPgError(error: unknown, depth = 0): PgErrorShape | undefined {\n if (!error || typeof error !== 'object' || depth > 5) return undefined;\n const candidate = error as PgErrorShape & { cause?: unknown };\n if (typeof candidate.code === 'string') return candidate;\n return findPgError(candidate.cause, depth + 1);\n}\n","import { createParamDecorator, type ExecutionContext, InternalServerErrorException } from '@nestjs/common';\nimport { NatsContext } from '@nestjs/microservices';\nimport { parseNatsHeaders } from '../nats-context';\n\n// Extracts parsed NatsContext from NATS message headers\nexport const RpcNatsHeaders = createParamDecorator((_data: unknown, ctx: ExecutionContext) => {\n const rpcCtx = ctx.switchToRpc().getContext<NatsContext>();\n return parseNatsHeaders(rpcCtx.getHeaders());\n});\n\n// Extracts buId from NATS headers — throws if missing or empty\nexport const RpcBuId = createParamDecorator((_data: unknown, ctx: ExecutionContext): string => {\n const rpcCtx = ctx.switchToRpc().getContext<NatsContext>();\n const headers = parseNatsHeaders(rpcCtx.getHeaders());\n if (!headers?.buId) throw new InternalServerErrorException('Missing buId in NATS headers.');\n return headers.buId;\n});\n\n// Extracts buCurrencyCode from NATS headers — throws if missing or empty\nexport const RpcBuCurrencyCode = createParamDecorator((_data: unknown, ctx: ExecutionContext): string => {\n const rpcCtx = ctx.switchToRpc().getContext<NatsContext>();\n const headers = parseNatsHeaders(rpcCtx.getHeaders());\n if (!headers?.buCurrencyCode) throw new InternalServerErrorException('Missing buCurrencyCode in NATS headers.');\n return headers.buCurrencyCode;\n});\n","export interface NatsHeaders {\n orgId: string;\n userId: string;\n buId: string;\n buTimezone: string;\n buCurrencyCode: string;\n buAncestorIds: string[];\n buDescendantIds: string[];\n}\n\n// Header keys for NATS context transport\nexport const NATS_HEADER_KEYS = {\n ORG_ID: 'x-org-id',\n USER_ID: 'x-user-id',\n BU_ID: 'x-bu-id',\n BU_TIMEZONE: 'x-bu-timezone',\n BU_CURRENCY_CODE: 'x-bu-currency-code',\n BU_ANCESTOR_IDS: 'x-bu-ancestor-ids',\n BU_DESCENDANT_IDS: 'x-bu-descendant-ids',\n} as const;\n\n// Reads a header value from either a plain object or a NATS MsgHdrsImpl\nfunction getHeader(headers: unknown, key: string): string | undefined {\n if (!headers) return undefined;\n // MsgHdrsImpl uses .get(), plain objects use bracket access\n if (typeof (headers as { get?: unknown }).get === 'function') {\n const val = (headers as { get(key: string): string[] }).get(key);\n return Array.isArray(val) ? val[0] : (val as string | undefined);\n }\n return (headers as Record<string, string>)[key];\n}\n\n// Parses NATS message headers into a NatsHeaders object\nexport function parseNatsHeaders(headers: unknown): NatsHeaders | null {\n if (!headers) return null;\n\n const orgId = getHeader(headers, NATS_HEADER_KEYS.ORG_ID);\n const userId = getHeader(headers, NATS_HEADER_KEYS.USER_ID);\n const buId = getHeader(headers, NATS_HEADER_KEYS.BU_ID);\n\n if (!orgId || !userId || !buId) return null;\n\n return {\n orgId,\n userId,\n buId,\n buTimezone: getHeader(headers, NATS_HEADER_KEYS.BU_TIMEZONE) || 'UTC',\n buCurrencyCode: getHeader(headers, NATS_HEADER_KEYS.BU_CURRENCY_CODE) || '',\n buAncestorIds: JSON.parse(getHeader(headers, NATS_HEADER_KEYS.BU_ANCESTOR_IDS) || '[]'),\n buDescendantIds: JSON.parse(getHeader(headers, NATS_HEADER_KEYS.BU_DESCENDANT_IDS) || '[]'),\n };\n}\n","import { type DynamicModule, Global, Logger, Module, type OnModuleDestroy, type Provider } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport type { ClientProxy } from '@nestjs/microservices';\nimport { ClientProxyFactory, Transport } from '@nestjs/microservices';\nimport { NATS_CONTEXT_RESOLVER, NATS_MODULE_OPTIONS } from './constants';\nimport type {\n NatsMicroserviceModuleAsyncOptions,\n NatsModuleBaseOptions,\n NatsRootModuleAsyncOptions,\n NatsRootModuleOptions,\n} from './nats-client.interfaces';\nimport { NATS_CLIENTS, NatsClientService } from './nats-client.service';\nimport { NATS_MS_CLIENTS, NatsMicroserviceClientService } from './nats-microservice-client.service';\n\nconst NATS_MS_OPTIONS = Symbol('NATS_MS_OPTIONS');\n\n@Global()\n@Module({})\nexport class NatsClientModule implements OnModuleDestroy {\n private static readonly logger = new Logger(NatsClientModule.name);\n private static allClients: ClientProxy[] = [];\n\n async onModuleDestroy() {\n await Promise.all(NatsClientModule.allClients.map((c) => c.close()));\n NatsClientModule.allClients = [];\n }\n\n // Builds a Map of named NATS ClientProxy instances\n private static buildClients(options: NatsModuleBaseOptions, natsUrl: string): Map<string, ClientProxy> {\n const clients = new Map<string, ClientProxy>();\n\n for (const svc of options.services) {\n const proxy = ClientProxyFactory.create({\n transport: Transport.NATS,\n options: { servers: [natsUrl] },\n });\n clients.set(svc.name, proxy);\n NatsClientModule.allClients.push(proxy);\n NatsClientModule.logger.log(`Registered NATS client: ${svc.name} → ${natsUrl}`);\n }\n\n return clients;\n }\n\n // Gateway mode — request-scoped, resolves context from sessionInfo via callback\n static forRoot(asyncOptions: NatsRootModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: NATS_MODULE_OPTIONS,\n useFactory: asyncOptions.useFactory,\n inject: asyncOptions.inject || [],\n };\n\n const resolverProvider: Provider = {\n provide: NATS_CONTEXT_RESOLVER,\n useFactory: (options: NatsRootModuleOptions) => options.contextResolver,\n inject: [NATS_MODULE_OPTIONS],\n };\n\n const clientsProvider: Provider = {\n provide: NATS_CLIENTS,\n useFactory: (options: NatsRootModuleOptions, config: ConfigService): Map<string, ClientProxy> => {\n const natsUrl = options.natsUrl ?? config.get<string>('NATS_URL', 'nats://localhost:4222');\n return NatsClientModule.buildClients(options, natsUrl);\n },\n inject: [NATS_MODULE_OPTIONS, ConfigService],\n };\n\n return {\n module: NatsClientModule,\n imports: [ConfigModule, ...(asyncOptions.imports ?? [])],\n providers: [optionsProvider, resolverProvider, clientsProvider, NatsClientService],\n exports: [NatsClientService],\n };\n }\n\n // Microservice mode — singleton, forwards context from incoming NATS payload\n static forMicroservice(asyncOptions: NatsMicroserviceModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: NATS_MS_OPTIONS,\n useFactory: asyncOptions.useFactory,\n inject: asyncOptions.inject || [],\n };\n\n const clientsProvider: Provider = {\n provide: NATS_MS_CLIENTS,\n useFactory: (options: NatsModuleBaseOptions, config: ConfigService): Map<string, ClientProxy> => {\n const natsUrl = options.natsUrl ?? config.get<string>('NATS_URL', 'nats://localhost:4222');\n return NatsClientModule.buildClients(options, natsUrl);\n },\n inject: [NATS_MS_OPTIONS, ConfigService],\n };\n\n return {\n module: NatsClientModule,\n imports: [ConfigModule, ...(asyncOptions.imports ?? [])],\n providers: [optionsProvider, clientsProvider, NatsMicroserviceClientService],\n exports: [NatsMicroserviceClientService],\n };\n }\n}\n","export const NATS_MODULE_OPTIONS = Symbol('NATS_MODULE_OPTIONS');\nexport const NATS_CONTEXT_RESOLVER = Symbol('NATS_CONTEXT_RESOLVER');\n","// Pulls the `declare module 'fastify'` augmentation (request.sessionInfo) into this entry's\n// dts graph — tsup builds each entry in isolation and otherwise drops the global augmentation.\nimport '../types/fastify-augmentation';\nimport { Inject, Injectable, Scope } from '@nestjs/common';\nimport { REQUEST } from '@nestjs/core';\nimport type { ClientProxy } from '@nestjs/microservices';\nimport { NatsRecordBuilder } from '@nestjs/microservices';\nimport type { FastifyRequest } from 'fastify';\nimport { headers as natsHeaders } from 'nats';\nimport { resolveInjectedRequest } from '../context/resolve-request';\nimport { NATS_CONTEXT_RESOLVER } from './constants';\nimport type { ContextResolverFn } from './nats-client.interfaces';\nimport { NATS_HEADER_KEYS, type NatsHeaders } from './nats-context';\n\nexport const NATS_CLIENTS = Symbol('NATS_CLIENTS');\n\n@Injectable({ scope: Scope.REQUEST })\nexport class NatsClientService {\n private cachedContext: NatsHeaders | null = null;\n\n constructor(\n @Inject(REQUEST) private readonly injectedRequest: FastifyRequest,\n @Inject(NATS_CONTEXT_RESOLVER) private readonly contextResolver: ContextResolverFn,\n @Inject(NATS_CLIENTS) private readonly clients: Map<string, ClientProxy>,\n ) {}\n\n // For GraphQL, @Inject(REQUEST) is the { req, reply } context wrapper, not the Fastify request;\n // unwrap so `sessionInfo` (set by the auth guard on the request) is visible across both transports.\n private get request(): FastifyRequest {\n return resolveInjectedRequest(this.injectedRequest);\n }\n\n // Sends a message to a named microservice with NatsHeaders as NATS headers\n async send<T>(service: string, cmd: string, data?: object): Promise<T> {\n const client = this.clients.get(service);\n if (!client) {\n throw new Error(\n `NATS service \"${service}\" is not registered. Available: [${[...this.clients.keys()].join(', ')}]`,\n );\n }\n\n if (!this.cachedContext) {\n const sessionInfo = this.request.sessionInfo;\n if (!sessionInfo) {\n throw new Error('No sessionInfo on request — is the auth guard active?');\n }\n this.cachedContext = await this.contextResolver(sessionInfo);\n }\n\n const headers = contextToHeaders(this.cachedContext);\n const record = new NatsRecordBuilder(data ?? {}).setHeaders(headers).build();\n\n return client.send<T>({ cmd }, record).toPromise() as Promise<T>;\n }\n}\n\n// Converts NatsHeaders to a NATS MsgHdrs object for NATS transport\nfunction contextToHeaders(ctx: NatsHeaders): import('nats').MsgHdrs {\n const hdrs = natsHeaders();\n hdrs.set(NATS_HEADER_KEYS.ORG_ID, ctx.orgId);\n hdrs.set(NATS_HEADER_KEYS.USER_ID, ctx.userId);\n hdrs.set(NATS_HEADER_KEYS.BU_ID, ctx.buId);\n hdrs.set(NATS_HEADER_KEYS.BU_TIMEZONE, ctx.buTimezone);\n hdrs.set(NATS_HEADER_KEYS.BU_CURRENCY_CODE, ctx.buCurrencyCode);\n hdrs.set(NATS_HEADER_KEYS.BU_ANCESTOR_IDS, JSON.stringify(ctx.buAncestorIds));\n hdrs.set(NATS_HEADER_KEYS.BU_DESCENDANT_IDS, JSON.stringify(ctx.buDescendantIds));\n return hdrs;\n}\n","import type { FastifyRequest } from 'fastify';\n\n// NestJS injects the raw Fastify request via @Inject(REQUEST) for HTTP, but for GraphQL it injects\n// the GraphQL context object ({ req, reply }) — which has no `.headers` / `.sessionInfo`. Any\n// request-scoped service that reads the request off @Inject(REQUEST) (RequestService,\n// NatsClientService, …) calls this to unwrap to the real Fastify request, so it behaves identically\n// across both transports. (The guard sets `sessionInfo` on this same unwrapped request.)\nexport function resolveInjectedRequest(injected: FastifyRequest): FastifyRequest {\n const candidate = injected as unknown as { headers?: unknown; req?: FastifyRequest };\n if (candidate && candidate.headers === undefined && candidate.req) {\n return candidate.req;\n }\n return injected;\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport type { ClientProxy } from '@nestjs/microservices';\nimport { NatsRecordBuilder } from '@nestjs/microservices';\nimport { NATS_HEADER_KEYS, type NatsHeaders } from './nats-context';\n\nexport const NATS_MS_CLIENTS = Symbol('NATS_MS_CLIENTS');\n\n@Injectable()\nexport class NatsMicroserviceClientService {\n constructor(@Inject(NATS_MS_CLIENTS) private readonly clients: Map<string, ClientProxy>) {}\n\n // Forwards a message to another microservice with NatsHeaders\n async send<T>(service: string, cmd: string, natsHeaders: NatsHeaders, data?: object): Promise<T> {\n const client = this.clients.get(service);\n if (!client) {\n throw new Error(\n `NATS service \"${service}\" is not registered. Available: [${[...this.clients.keys()].join(', ')}]`,\n );\n }\n\n const headers: Record<string, string> = {\n [NATS_HEADER_KEYS.ORG_ID]: natsHeaders.orgId,\n [NATS_HEADER_KEYS.USER_ID]: natsHeaders.userId,\n [NATS_HEADER_KEYS.BU_ID]: natsHeaders.buId,\n [NATS_HEADER_KEYS.BU_TIMEZONE]: natsHeaders.buTimezone,\n [NATS_HEADER_KEYS.BU_ANCESTOR_IDS]: JSON.stringify(natsHeaders.buAncestorIds),\n [NATS_HEADER_KEYS.BU_DESCENDANT_IDS]: JSON.stringify(natsHeaders.buDescendantIds),\n };\n\n const record = new NatsRecordBuilder(data ?? {}).setHeaders(headers).build();\n return client.send<T>({ cmd }, record).toPromise() as Promise<T>;\n }\n}\n"],"mappings":"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","names":["import_common","import_common","HttpProblemException","HttpException","detailOrOptions","httpStatus","options","detail","type","label","errors","ConflictException","HttpProblemException","detailOrOptions","HttpStatus","CONFLICT","PG_UNIQUE_VIOLATION","tryTranslatePgError","error","pgError","findPgError","undefined","code","constraint","table","detail","ConflictException","label","trim","errors","meta","depth","candidate","cause","RpcProblemExceptionFilter","logger","Logger","name","catch","exception","_host","translatedPgError","tryTranslatePgError","RpcException","throwError","getError","isHttpException","status","getStatus","response","getResponse","toProblemPayload","Error","cause","causeMessage","message","undefined","causeStack","stack","error","type","detail","errors","HttpStatus","INTERNAL_SERVER_ERROR","JSON","stringify","statusCode","obj","label","Array","isArray","import_common","NATS_HEADER_KEYS","ORG_ID","USER_ID","BU_ID","BU_TIMEZONE","BU_CURRENCY_CODE","BU_ANCESTOR_IDS","BU_DESCENDANT_IDS","getHeader","headers","key","undefined","get","val","Array","isArray","parseNatsHeaders","orgId","userId","buId","buTimezone","buCurrencyCode","buAncestorIds","JSON","parse","buDescendantIds","RpcNatsHeaders","createParamDecorator","_data","ctx","rpcCtx","switchToRpc","getContext","parseNatsHeaders","getHeaders","RpcBuId","headers","buId","InternalServerErrorException","RpcBuCurrencyCode","buCurrencyCode","import_common","import_microservices","NATS_MODULE_OPTIONS","Symbol","NATS_CONTEXT_RESOLVER","import_common","import_microservices","resolveInjectedRequest","injected","candidate","headers","undefined","req","NATS_CLIENTS","Symbol","NatsClientService","cachedContext","injectedRequest","contextResolver","clients","request","resolveInjectedRequest","send","service","cmd","data","client","get","Error","keys","join","sessionInfo","headers","contextToHeaders","record","NatsRecordBuilder","setHeaders","build","toPromise","scope","Scope","REQUEST","ctx","hdrs","natsHeaders","set","NATS_HEADER_KEYS","ORG_ID","orgId","USER_ID","userId","BU_ID","buId","BU_TIMEZONE","buTimezone","BU_CURRENCY_CODE","buCurrencyCode","BU_ANCESTOR_IDS","JSON","stringify","buAncestorIds","BU_DESCENDANT_IDS","buDescendantIds","import_common","import_microservices","NATS_MS_CLIENTS","Symbol","NatsMicroserviceClientService","clients","send","service","cmd","natsHeaders","data","client","get","Error","keys","join","headers","NATS_HEADER_KEYS","ORG_ID","orgId","USER_ID","userId","BU_ID","buId","BU_TIMEZONE","buTimezone","BU_ANCESTOR_IDS","JSON","stringify","buAncestorIds","BU_DESCENDANT_IDS","buDescendantIds","record","NatsRecordBuilder","setHeaders","build","toPromise","NATS_MS_OPTIONS","Symbol","NatsClientModule","logger","Logger","name","allClients","onModuleDestroy","Promise","all","map","c","close","buildClients","options","natsUrl","clients","Map","svc","services","proxy","ClientProxyFactory","create","transport","Transport","NATS","servers","set","push","log","forRoot","asyncOptions","optionsProvider","provide","NATS_MODULE_OPTIONS","useFactory","inject","resolverProvider","NATS_CONTEXT_RESOLVER","contextResolver","clientsProvider","NATS_CLIENTS","config","get","ConfigService","module","imports","ConfigModule","providers","NatsClientService","exports","forMicroservice","NATS_MS_CLIENTS","NatsMicroserviceClientService"]}
1
+ {"version":3,"sources":["../src/nats.ts","../src/filters/rpc-problem-exception.filter.ts","../src/exceptions/conflict.exception.ts","../src/exceptions/base-field.exception.ts","../src/filters/pg-error.translator.ts","../src/nats/decorators/nats-headers.decorator.ts","../src/nats/nats-context.ts","../src/nats/nats-client.module.ts","../src/nats/constants.ts","../src/nats/nats-client.service.ts","../src/context/resolve-request.ts","../src/nats/nats-microservice-client.service.ts"],"sourcesContent":["// NATS + microservice exports — kept out of the main barrel so non-NATS consumers never load @nestjs/microservices\n\n// RPC exception filter (microservice side) — moved out of the main filters barrel\nexport { RpcProblemExceptionFilter } from './filters/rpc-problem-exception.filter';\nexport { RpcSiteCurrencyCode, RpcSiteId, RpcNatsHeaders } from './nats/decorators/nats-headers.decorator';\nexport type {\n ContextResolverFn,\n NatsHeaders,\n NatsMicroserviceModuleAsyncOptions,\n NatsRootModuleAsyncOptions,\n NatsServiceConfig,\n} from './nats/index';\nexport { NatsClientModule } from './nats/nats-client.module';\nexport { NatsClientService } from './nats/nats-client.service';\nexport { NATS_HEADER_KEYS, parseNatsHeaders } from './nats/nats-context';\nexport { NatsMicroserviceClientService } from './nats/nats-microservice-client.service';\n","import { type ArgumentsHost, Catch, type HttpException, HttpStatus, Logger } from '@nestjs/common';\nimport { RpcException } from '@nestjs/microservices';\nimport { type Observable, throwError } from 'rxjs';\nimport { tryTranslatePgError } from './pg-error.translator';\n\ninterface FieldError {\n field: string;\n message: string;\n}\n\ninterface ProblemPayload {\n type: string;\n label?: string;\n detail: string;\n message: string;\n errors: FieldError[];\n status: number;\n statusCode: number;\n}\n\n@Catch()\nexport class RpcProblemExceptionFilter {\n private readonly logger = new Logger(RpcProblemExceptionFilter.name);\n\n catch(exception: unknown, _host: ArgumentsHost): Observable<never> {\n // Translate raw Postgres errors into a ConflictException before the rest of the filter handles them.\n const translatedPgError = tryTranslatePgError(exception);\n if (translatedPgError) exception = translatedPgError;\n\n if (exception instanceof RpcException) {\n return throwError(() => exception.getError());\n }\n\n if (this.isHttpException(exception)) {\n const status = exception.getStatus();\n const response = exception.getResponse();\n const payload = this.toProblemPayload(response, status);\n // Log 4xx/5xx so the microservice terminal shows what actually failed (previously silent)\n const log = status >= HttpStatus.INTERNAL_SERVER_ERROR ? this.logger.error : this.logger.warn;\n log.call(this.logger, `RPC ${status}: ${payload.detail}`);\n return throwError(() => payload);\n }\n\n if (exception instanceof Error) {\n const cause = (exception as { cause?: unknown }).cause;\n const causeMessage = cause instanceof Error ? cause.message : undefined;\n const causeStack = cause instanceof Error ? cause.stack : undefined;\n this.logger.error(causeMessage ?? exception.message, causeStack ?? exception.stack);\n if (cause && cause !== exception) {\n this.logger.error(`Wrapped by: ${exception.message}`);\n }\n return throwError(() =>\n this.toProblemPayload(\n {\n type: 'about:blank',\n detail: causeMessage ?? exception.message,\n errors: [],\n },\n HttpStatus.INTERNAL_SERVER_ERROR,\n ),\n );\n }\n\n this.logger.error(`Unhandled non-error exception: ${JSON.stringify(exception)}`);\n return throwError(() =>\n this.toProblemPayload(\n {\n type: 'about:blank',\n detail: 'An unexpected error occurred',\n errors: [],\n },\n HttpStatus.INTERNAL_SERVER_ERROR,\n ),\n );\n }\n\n private toProblemPayload(response: unknown, status: number): ProblemPayload {\n if (typeof response === 'string') {\n return {\n type: 'about:blank',\n detail: response,\n message: response,\n errors: [],\n status,\n statusCode: status,\n };\n }\n\n const obj = (response ?? {}) as Record<string, unknown>;\n // Prefer RFC 9457 `detail`, then Nest/@nestjs-common's `message` (string or class-validator array),\n // so exceptions thrown as `@nestjs/common` errors still surface their real message across NATS.\n const detail =\n typeof obj.detail === 'string'\n ? obj.detail\n : typeof obj.message === 'string'\n ? obj.message\n : Array.isArray(obj.message)\n ? obj.message.join(', ')\n : 'Request failed';\n return {\n type: typeof obj.type === 'string' ? obj.type : 'about:blank',\n label: typeof obj.label === 'string' ? obj.label : undefined,\n detail,\n message: detail,\n errors: Array.isArray(obj.errors) ? (obj.errors as FieldError[]) : [],\n status,\n statusCode: status,\n };\n }\n\n private isHttpException(error: unknown): error is HttpException {\n return (\n error instanceof Error &&\n typeof (error as { getStatus?: unknown }).getStatus === 'function' &&\n typeof (error as { getResponse?: unknown }).getResponse === 'function'\n );\n }\n}\n","import { HttpStatus } from '@nestjs/common';\nimport { HttpProblemException, type ProblemOptions } from './base-field.exception';\n\nexport class ConflictException extends HttpProblemException {\n constructor(detailOrOptions?: string | ProblemOptions) {\n super(detailOrOptions ?? 'Conflict', HttpStatus.CONFLICT);\n }\n}\n","import { HttpException, HttpStatus } from '@nestjs/common';\nimport type { FieldError } from '../types/error-response.types';\n\n// Re-export FieldError for backwards compatibility\nexport type { FieldError } from '../types/error-response.types';\n\nexport interface ProblemOptions {\n type?: string;\n label?: string;\n detail?: string;\n errors?: FieldError[];\n}\n\nexport abstract class HttpProblemException extends HttpException {\n constructor(detailOrOptions: string | ProblemOptions, httpStatus: HttpStatus) {\n const options = typeof detailOrOptions === 'string' ? { detail: detailOrOptions } : detailOrOptions;\n\n super(\n {\n type: options.type ?? 'about:blank',\n label: options.label,\n detail: options.detail,\n errors: options.errors ?? [],\n },\n httpStatus,\n );\n }\n}\n","import { ConflictException } from '../exceptions/conflict.exception';\n\nconst PG_UNIQUE_VIOLATION = '23505';\n\nexport type PgErrorShape = {\n code?: string;\n message?: string;\n constraint?: string;\n table?: string;\n schema?: string;\n column?: string;\n detail?: string;\n hint?: string;\n};\n\n// Returns a ConflictException for a Postgres unique-violation error, otherwise undefined.\nexport function tryTranslatePgError(error: unknown): ConflictException | undefined {\n const pgError = findPgError(error);\n if (!pgError) return undefined;\n const { code, constraint, table, detail } = pgError;\n if (code !== PG_UNIQUE_VIOLATION) return undefined;\n return new ConflictException({\n label: 'Duplicate Entry',\n detail: detail?.trim() || 'A record with these values already exists.',\n errors: [],\n ...(constraint || table ? { meta: { constraint, table } } : {}),\n });\n}\n\n// Walks up to N levels of `.cause` looking for a pg-shaped error (has SQLSTATE `code`), capping depth.\nexport function findPgError(error: unknown, depth = 0): PgErrorShape | undefined {\n if (!error || typeof error !== 'object' || depth > 5) return undefined;\n const candidate = error as PgErrorShape & { cause?: unknown };\n if (typeof candidate.code === 'string') return candidate;\n return findPgError(candidate.cause, depth + 1);\n}\n","import { createParamDecorator, type ExecutionContext, InternalServerErrorException } from '@nestjs/common';\nimport { NatsContext } from '@nestjs/microservices';\nimport { parseNatsHeaders } from '../nats-context';\n\n// Extracts parsed NatsContext from NATS message headers\nexport const RpcNatsHeaders = createParamDecorator((_data: unknown, ctx: ExecutionContext) => {\n const rpcCtx = ctx.switchToRpc().getContext<NatsContext>();\n return parseNatsHeaders(rpcCtx.getHeaders());\n});\n\n// Extracts siteId from NATS headers — throws if missing or empty\nexport const RpcSiteId = createParamDecorator((_data: unknown, ctx: ExecutionContext): string => {\n const rpcCtx = ctx.switchToRpc().getContext<NatsContext>();\n const headers = parseNatsHeaders(rpcCtx.getHeaders());\n if (!headers?.siteId) throw new InternalServerErrorException('Missing siteId in NATS headers.');\n return headers.siteId;\n});\n\n// Extracts siteCurrencyCode from NATS headers — throws if missing or empty\nexport const RpcSiteCurrencyCode = createParamDecorator((_data: unknown, ctx: ExecutionContext): string => {\n const rpcCtx = ctx.switchToRpc().getContext<NatsContext>();\n const headers = parseNatsHeaders(rpcCtx.getHeaders());\n if (!headers?.siteCurrencyCode) throw new InternalServerErrorException('Missing siteCurrencyCode in NATS headers.');\n return headers.siteCurrencyCode;\n});\n","export interface NatsHeaders {\n orgId: string;\n userId: string;\n siteId: string;\n legalEntityId: string;\n siteGroupId: string;\n siteTimezone: string;\n siteCurrencyCode: string;\n}\n\n// Header keys for NATS context transport\nexport const NATS_HEADER_KEYS = {\n ORG_ID: 'x-org-id',\n USER_ID: 'x-user-id',\n SITE_ID: 'x-site-id',\n LE_ID: 'x-le-id',\n SITE_GROUP_ID: 'x-sg-id',\n SITE_TIMEZONE: 'x-site-timezone',\n SITE_CURRENCY_CODE: 'x-site-currency-code',\n} as const;\n\n// Reads a header value from either a plain object or a NATS MsgHdrsImpl\nfunction getHeader(headers: unknown, key: string): string | undefined {\n if (!headers) return undefined;\n // MsgHdrsImpl uses .get(), plain objects use bracket access\n if (typeof (headers as { get?: unknown }).get === 'function') {\n const val = (headers as { get(key: string): string[] }).get(key);\n return Array.isArray(val) ? val[0] : (val as string | undefined);\n }\n return (headers as Record<string, string>)[key];\n}\n\n// Parses NATS message headers into a NatsHeaders object — siteId is optional (empty for org-level contexts)\nexport function parseNatsHeaders(headers: unknown): NatsHeaders | null {\n if (!headers) return null;\n\n const orgId = getHeader(headers, NATS_HEADER_KEYS.ORG_ID);\n const userId = getHeader(headers, NATS_HEADER_KEYS.USER_ID);\n\n if (!orgId || !userId) return null;\n\n return {\n orgId,\n userId,\n siteId: getHeader(headers, NATS_HEADER_KEYS.SITE_ID) || '',\n legalEntityId: getHeader(headers, NATS_HEADER_KEYS.LE_ID) || '',\n siteGroupId: getHeader(headers, NATS_HEADER_KEYS.SITE_GROUP_ID) || '',\n siteTimezone: getHeader(headers, NATS_HEADER_KEYS.SITE_TIMEZONE) || 'UTC',\n siteCurrencyCode: getHeader(headers, NATS_HEADER_KEYS.SITE_CURRENCY_CODE) || '',\n };\n}\n","import { type DynamicModule, Global, Logger, Module, type OnModuleDestroy, type Provider } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport type { ClientProxy } from '@nestjs/microservices';\nimport { ClientProxyFactory, Transport } from '@nestjs/microservices';\nimport { NATS_CONTEXT_RESOLVER, NATS_MODULE_OPTIONS } from './constants';\nimport type {\n NatsMicroserviceModuleAsyncOptions,\n NatsModuleBaseOptions,\n NatsRootModuleAsyncOptions,\n NatsRootModuleOptions,\n} from './nats-client.interfaces';\nimport { NATS_CLIENTS, NatsClientService } from './nats-client.service';\nimport { NATS_MS_CLIENTS, NatsMicroserviceClientService } from './nats-microservice-client.service';\n\nconst NATS_MS_OPTIONS = Symbol('NATS_MS_OPTIONS');\n\n@Global()\n@Module({})\nexport class NatsClientModule implements OnModuleDestroy {\n private static readonly logger = new Logger(NatsClientModule.name);\n private static allClients: ClientProxy[] = [];\n\n async onModuleDestroy() {\n await Promise.all(NatsClientModule.allClients.map((c) => c.close()));\n NatsClientModule.allClients = [];\n }\n\n // Builds a Map of named NATS ClientProxy instances\n private static buildClients(options: NatsModuleBaseOptions, natsUrl: string): Map<string, ClientProxy> {\n const clients = new Map<string, ClientProxy>();\n\n for (const svc of options.services) {\n const proxy = ClientProxyFactory.create({\n transport: Transport.NATS,\n options: { servers: [natsUrl] },\n });\n clients.set(svc.name, proxy);\n NatsClientModule.allClients.push(proxy);\n NatsClientModule.logger.log(`Registered NATS client: ${svc.name} → ${natsUrl}`);\n }\n\n return clients;\n }\n\n // Gateway mode — request-scoped, resolves context from sessionInfo via callback\n static forRoot(asyncOptions: NatsRootModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: NATS_MODULE_OPTIONS,\n useFactory: asyncOptions.useFactory,\n inject: asyncOptions.inject || [],\n };\n\n const resolverProvider: Provider = {\n provide: NATS_CONTEXT_RESOLVER,\n useFactory: (options: NatsRootModuleOptions) => options.contextResolver,\n inject: [NATS_MODULE_OPTIONS],\n };\n\n const clientsProvider: Provider = {\n provide: NATS_CLIENTS,\n useFactory: (options: NatsRootModuleOptions, config: ConfigService): Map<string, ClientProxy> => {\n const natsUrl = options.natsUrl ?? config.get<string>('NATS_URL', 'nats://localhost:4222');\n return NatsClientModule.buildClients(options, natsUrl);\n },\n inject: [NATS_MODULE_OPTIONS, ConfigService],\n };\n\n return {\n module: NatsClientModule,\n imports: [ConfigModule, ...(asyncOptions.imports ?? [])],\n providers: [optionsProvider, resolverProvider, clientsProvider, NatsClientService],\n exports: [NatsClientService],\n };\n }\n\n // Microservice mode — singleton, forwards context from incoming NATS payload\n static forMicroservice(asyncOptions: NatsMicroserviceModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: NATS_MS_OPTIONS,\n useFactory: asyncOptions.useFactory,\n inject: asyncOptions.inject || [],\n };\n\n const clientsProvider: Provider = {\n provide: NATS_MS_CLIENTS,\n useFactory: (options: NatsModuleBaseOptions, config: ConfigService): Map<string, ClientProxy> => {\n const natsUrl = options.natsUrl ?? config.get<string>('NATS_URL', 'nats://localhost:4222');\n return NatsClientModule.buildClients(options, natsUrl);\n },\n inject: [NATS_MS_OPTIONS, ConfigService],\n };\n\n return {\n module: NatsClientModule,\n imports: [ConfigModule, ...(asyncOptions.imports ?? [])],\n providers: [optionsProvider, clientsProvider, NatsMicroserviceClientService],\n exports: [NatsMicroserviceClientService],\n };\n }\n}\n","export const NATS_MODULE_OPTIONS = Symbol('NATS_MODULE_OPTIONS');\nexport const NATS_CONTEXT_RESOLVER = Symbol('NATS_CONTEXT_RESOLVER');\n","// Pulls the fastify module augmentation into this entry's dts graph — tsup builds each entry in isolation\nimport '../types/fastify-augmentation';\nimport { Inject, Injectable, Scope } from '@nestjs/common';\nimport { REQUEST } from '@nestjs/core';\nimport type { ClientProxy } from '@nestjs/microservices';\nimport { NatsRecordBuilder } from '@nestjs/microservices';\nimport type { FastifyRequest } from 'fastify';\nimport { headers as natsHeaders } from 'nats';\nimport { resolveInjectedRequest } from '../context/resolve-request';\nimport { NATS_CONTEXT_RESOLVER } from './constants';\nimport type { ContextResolverFn } from './nats-client.interfaces';\nimport { NATS_HEADER_KEYS, type NatsHeaders } from './nats-context';\n\nexport const NATS_CLIENTS = Symbol('NATS_CLIENTS');\n\n@Injectable({ scope: Scope.REQUEST })\nexport class NatsClientService {\n private cachedContext: NatsHeaders | null = null;\n\n constructor(\n @Inject(REQUEST) private readonly injectedRequest: FastifyRequest,\n @Inject(NATS_CONTEXT_RESOLVER) private readonly contextResolver: ContextResolverFn,\n @Inject(NATS_CLIENTS) private readonly clients: Map<string, ClientProxy>,\n ) {}\n\n // Unwraps the GraphQL { req, reply } context wrapper so sessionInfo is visible across both transports\n private get request(): FastifyRequest {\n return resolveInjectedRequest(this.injectedRequest);\n }\n\n // Sends a message to a named microservice with NatsHeaders as NATS headers\n async send<T>(service: string, cmd: string, data?: object): Promise<T> {\n const client = this.clients.get(service);\n if (!client) {\n throw new Error(\n `NATS service \"${service}\" is not registered. Available: [${[...this.clients.keys()].join(', ')}]`,\n );\n }\n\n if (!this.cachedContext) {\n const sessionInfo = this.request.sessionInfo;\n if (!sessionInfo) {\n throw new Error('No sessionInfo on request — is the auth guard active?');\n }\n this.cachedContext = await this.contextResolver(sessionInfo);\n }\n\n const headers = contextToHeaders(this.cachedContext);\n const record = new NatsRecordBuilder(data ?? {}).setHeaders(headers).build();\n\n return client.send<T>({ cmd }, record).toPromise() as Promise<T>;\n }\n}\n\n// Converts NatsHeaders to a NATS MsgHdrs object for NATS transport\nfunction contextToHeaders(ctx: NatsHeaders): import('nats').MsgHdrs {\n const hdrs = natsHeaders();\n hdrs.set(NATS_HEADER_KEYS.ORG_ID, ctx.orgId);\n hdrs.set(NATS_HEADER_KEYS.USER_ID, ctx.userId);\n if (ctx.siteId) hdrs.set(NATS_HEADER_KEYS.SITE_ID, ctx.siteId);\n if (ctx.legalEntityId) hdrs.set(NATS_HEADER_KEYS.LE_ID, ctx.legalEntityId);\n if (ctx.siteGroupId) hdrs.set(NATS_HEADER_KEYS.SITE_GROUP_ID, ctx.siteGroupId);\n if (ctx.siteTimezone) hdrs.set(NATS_HEADER_KEYS.SITE_TIMEZONE, ctx.siteTimezone);\n if (ctx.siteCurrencyCode) hdrs.set(NATS_HEADER_KEYS.SITE_CURRENCY_CODE, ctx.siteCurrencyCode);\n return hdrs;\n}\n","import type { FastifyRequest } from 'fastify';\n\n// Unwraps the @Inject(REQUEST) value to the real Fastify request (GraphQL injects a { req, reply } context).\nexport function resolveInjectedRequest(injected: FastifyRequest): FastifyRequest {\n const candidate = injected as unknown as { headers?: unknown; req?: FastifyRequest };\n if (candidate && candidate.headers === undefined && candidate.req) {\n return candidate.req;\n }\n return injected;\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport type { ClientProxy } from '@nestjs/microservices';\nimport { NatsRecordBuilder } from '@nestjs/microservices';\nimport { NATS_HEADER_KEYS, type NatsHeaders } from './nats-context';\n\nexport const NATS_MS_CLIENTS = Symbol('NATS_MS_CLIENTS');\n\n@Injectable()\nexport class NatsMicroserviceClientService {\n constructor(@Inject(NATS_MS_CLIENTS) private readonly clients: Map<string, ClientProxy>) {}\n\n // Forwards a message to another microservice with NatsHeaders\n async send<T>(service: string, cmd: string, natsHeaders: NatsHeaders, data?: object): Promise<T> {\n const client = this.clients.get(service);\n if (!client) {\n throw new Error(\n `NATS service \"${service}\" is not registered. Available: [${[...this.clients.keys()].join(', ')}]`,\n );\n }\n\n const headers: Record<string, string> = {\n [NATS_HEADER_KEYS.ORG_ID]: natsHeaders.orgId,\n [NATS_HEADER_KEYS.USER_ID]: natsHeaders.userId,\n [NATS_HEADER_KEYS.SITE_ID]: natsHeaders.siteId,\n [NATS_HEADER_KEYS.SITE_TIMEZONE]: natsHeaders.siteTimezone,\n };\n\n const record = new NatsRecordBuilder(data ?? {}).setHeaders(headers).build();\n return client.send<T>({ cmd }, record).toPromise() as Promise<T>;\n }\n}\n"],"mappings":"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","names":["import_common","import_common","HttpProblemException","HttpException","detailOrOptions","httpStatus","options","detail","type","label","errors","ConflictException","HttpProblemException","detailOrOptions","HttpStatus","CONFLICT","PG_UNIQUE_VIOLATION","tryTranslatePgError","error","pgError","findPgError","undefined","code","constraint","table","detail","ConflictException","label","trim","errors","meta","depth","candidate","cause","RpcProblemExceptionFilter","logger","Logger","name","catch","exception","_host","translatedPgError","tryTranslatePgError","RpcException","throwError","getError","isHttpException","status","getStatus","response","getResponse","payload","toProblemPayload","log","HttpStatus","INTERNAL_SERVER_ERROR","error","warn","call","detail","Error","cause","causeMessage","message","undefined","causeStack","stack","type","errors","JSON","stringify","statusCode","obj","Array","isArray","join","label","import_common","NATS_HEADER_KEYS","ORG_ID","USER_ID","SITE_ID","LE_ID","SITE_GROUP_ID","SITE_TIMEZONE","SITE_CURRENCY_CODE","getHeader","headers","key","undefined","get","val","Array","isArray","parseNatsHeaders","orgId","userId","siteId","legalEntityId","siteGroupId","siteTimezone","siteCurrencyCode","RpcNatsHeaders","createParamDecorator","_data","ctx","rpcCtx","switchToRpc","getContext","parseNatsHeaders","getHeaders","RpcSiteId","headers","siteId","InternalServerErrorException","RpcSiteCurrencyCode","siteCurrencyCode","import_common","import_microservices","NATS_MODULE_OPTIONS","Symbol","NATS_CONTEXT_RESOLVER","import_common","import_microservices","resolveInjectedRequest","injected","candidate","headers","undefined","req","NATS_CLIENTS","Symbol","NatsClientService","cachedContext","injectedRequest","contextResolver","clients","request","resolveInjectedRequest","send","service","cmd","data","client","get","Error","keys","join","sessionInfo","headers","contextToHeaders","record","NatsRecordBuilder","setHeaders","build","toPromise","scope","Scope","REQUEST","ctx","hdrs","natsHeaders","set","NATS_HEADER_KEYS","ORG_ID","orgId","USER_ID","userId","siteId","SITE_ID","legalEntityId","LE_ID","siteGroupId","SITE_GROUP_ID","siteTimezone","SITE_TIMEZONE","siteCurrencyCode","SITE_CURRENCY_CODE","import_common","import_microservices","NATS_MS_CLIENTS","Symbol","NatsMicroserviceClientService","clients","send","service","cmd","natsHeaders","data","client","get","Error","keys","join","headers","NATS_HEADER_KEYS","ORG_ID","orgId","USER_ID","userId","SITE_ID","siteId","SITE_TIMEZONE","siteTimezone","record","NatsRecordBuilder","setHeaders","build","toPromise","NATS_MS_OPTIONS","Symbol","NatsClientModule","logger","Logger","name","allClients","onModuleDestroy","Promise","all","map","c","close","buildClients","options","natsUrl","clients","Map","svc","services","proxy","ClientProxyFactory","create","transport","Transport","NATS","servers","set","push","log","forRoot","asyncOptions","optionsProvider","provide","NATS_MODULE_OPTIONS","useFactory","inject","resolverProvider","NATS_CONTEXT_RESOLVER","contextResolver","clientsProvider","NATS_CLIENTS","config","get","ConfigService","module","imports","ConfigModule","providers","NatsClientService","exports","forMicroservice","NATS_MS_CLIENTS","NatsMicroserviceClientService"]}
package/dist/nats.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ArgumentsHost, ModuleMetadata, InjectionToken, OnModuleDestroy, DynamicModule } from '@nestjs/common';
2
2
  import { Observable } from 'rxjs';
3
3
  import { VrittiSessionInfo, FastifyRequest } from 'fastify';
4
- import './fastify-augmentation-CQPBNS5a.cjs';
4
+ import './index.cjs';
5
5
  import { ClientProxy } from '@nestjs/microservices';
6
6
 
7
7
  declare class RpcProblemExceptionFilter {
@@ -12,26 +12,26 @@ declare class RpcProblemExceptionFilter {
12
12
  }
13
13
 
14
14
  declare const RpcNatsHeaders: (...dataOrPipes: unknown[]) => ParameterDecorator;
15
- declare const RpcBuId: (...dataOrPipes: unknown[]) => ParameterDecorator;
16
- declare const RpcBuCurrencyCode: (...dataOrPipes: unknown[]) => ParameterDecorator;
15
+ declare const RpcSiteId: (...dataOrPipes: unknown[]) => ParameterDecorator;
16
+ declare const RpcSiteCurrencyCode: (...dataOrPipes: unknown[]) => ParameterDecorator;
17
17
 
18
18
  interface NatsHeaders {
19
19
  orgId: string;
20
20
  userId: string;
21
- buId: string;
22
- buTimezone: string;
23
- buCurrencyCode: string;
24
- buAncestorIds: string[];
25
- buDescendantIds: string[];
21
+ siteId: string;
22
+ legalEntityId: string;
23
+ siteGroupId: string;
24
+ siteTimezone: string;
25
+ siteCurrencyCode: string;
26
26
  }
27
27
  declare const NATS_HEADER_KEYS: {
28
28
  readonly ORG_ID: "x-org-id";
29
29
  readonly USER_ID: "x-user-id";
30
- readonly BU_ID: "x-bu-id";
31
- readonly BU_TIMEZONE: "x-bu-timezone";
32
- readonly BU_CURRENCY_CODE: "x-bu-currency-code";
33
- readonly BU_ANCESTOR_IDS: "x-bu-ancestor-ids";
34
- readonly BU_DESCENDANT_IDS: "x-bu-descendant-ids";
30
+ readonly SITE_ID: "x-site-id";
31
+ readonly LE_ID: "x-le-id";
32
+ readonly SITE_GROUP_ID: "x-sg-id";
33
+ readonly SITE_TIMEZONE: "x-site-timezone";
34
+ readonly SITE_CURRENCY_CODE: "x-site-currency-code";
35
35
  };
36
36
  declare function parseNatsHeaders(headers: unknown): NatsHeaders | null;
37
37
 
@@ -84,4 +84,4 @@ declare class NatsMicroserviceClientService {
84
84
  send<T>(service: string, cmd: string, natsHeaders: NatsHeaders, data?: object): Promise<T>;
85
85
  }
86
86
 
87
- export { type ContextResolverFn, NATS_HEADER_KEYS, NatsClientModule, NatsClientService, type NatsHeaders, NatsMicroserviceClientService, type NatsMicroserviceModuleAsyncOptions, type NatsRootModuleAsyncOptions, type NatsServiceConfig, RpcBuCurrencyCode, RpcBuId, RpcNatsHeaders, RpcProblemExceptionFilter, parseNatsHeaders };
87
+ export { type ContextResolverFn, NATS_HEADER_KEYS, NatsClientModule, NatsClientService, type NatsHeaders, NatsMicroserviceClientService, type NatsMicroserviceModuleAsyncOptions, type NatsRootModuleAsyncOptions, type NatsServiceConfig, RpcNatsHeaders, RpcProblemExceptionFilter, RpcSiteCurrencyCode, RpcSiteId, parseNatsHeaders };
package/dist/nats.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ArgumentsHost, ModuleMetadata, InjectionToken, OnModuleDestroy, DynamicModule } from '@nestjs/common';
2
2
  import { Observable } from 'rxjs';
3
3
  import { VrittiSessionInfo, FastifyRequest } from 'fastify';
4
- import './fastify-augmentation-CQPBNS5a.js';
4
+ import './index.js';
5
5
  import { ClientProxy } from '@nestjs/microservices';
6
6
 
7
7
  declare class RpcProblemExceptionFilter {
@@ -12,26 +12,26 @@ declare class RpcProblemExceptionFilter {
12
12
  }
13
13
 
14
14
  declare const RpcNatsHeaders: (...dataOrPipes: unknown[]) => ParameterDecorator;
15
- declare const RpcBuId: (...dataOrPipes: unknown[]) => ParameterDecorator;
16
- declare const RpcBuCurrencyCode: (...dataOrPipes: unknown[]) => ParameterDecorator;
15
+ declare const RpcSiteId: (...dataOrPipes: unknown[]) => ParameterDecorator;
16
+ declare const RpcSiteCurrencyCode: (...dataOrPipes: unknown[]) => ParameterDecorator;
17
17
 
18
18
  interface NatsHeaders {
19
19
  orgId: string;
20
20
  userId: string;
21
- buId: string;
22
- buTimezone: string;
23
- buCurrencyCode: string;
24
- buAncestorIds: string[];
25
- buDescendantIds: string[];
21
+ siteId: string;
22
+ legalEntityId: string;
23
+ siteGroupId: string;
24
+ siteTimezone: string;
25
+ siteCurrencyCode: string;
26
26
  }
27
27
  declare const NATS_HEADER_KEYS: {
28
28
  readonly ORG_ID: "x-org-id";
29
29
  readonly USER_ID: "x-user-id";
30
- readonly BU_ID: "x-bu-id";
31
- readonly BU_TIMEZONE: "x-bu-timezone";
32
- readonly BU_CURRENCY_CODE: "x-bu-currency-code";
33
- readonly BU_ANCESTOR_IDS: "x-bu-ancestor-ids";
34
- readonly BU_DESCENDANT_IDS: "x-bu-descendant-ids";
30
+ readonly SITE_ID: "x-site-id";
31
+ readonly LE_ID: "x-le-id";
32
+ readonly SITE_GROUP_ID: "x-sg-id";
33
+ readonly SITE_TIMEZONE: "x-site-timezone";
34
+ readonly SITE_CURRENCY_CODE: "x-site-currency-code";
35
35
  };
36
36
  declare function parseNatsHeaders(headers: unknown): NatsHeaders | null;
37
37
 
@@ -84,4 +84,4 @@ declare class NatsMicroserviceClientService {
84
84
  send<T>(service: string, cmd: string, natsHeaders: NatsHeaders, data?: object): Promise<T>;
85
85
  }
86
86
 
87
- export { type ContextResolverFn, NATS_HEADER_KEYS, NatsClientModule, NatsClientService, type NatsHeaders, NatsMicroserviceClientService, type NatsMicroserviceModuleAsyncOptions, type NatsRootModuleAsyncOptions, type NatsServiceConfig, RpcBuCurrencyCode, RpcBuId, RpcNatsHeaders, RpcProblemExceptionFilter, parseNatsHeaders };
87
+ export { type ContextResolverFn, NATS_HEADER_KEYS, NatsClientModule, NatsClientService, type NatsHeaders, NatsMicroserviceClientService, type NatsMicroserviceModuleAsyncOptions, type NatsRootModuleAsyncOptions, type NatsServiceConfig, RpcNatsHeaders, RpcProblemExceptionFilter, RpcSiteCurrencyCode, RpcSiteId, parseNatsHeaders };
package/dist/nats.js CHANGED
@@ -88,7 +88,10 @@ var RpcProblemExceptionFilter = class _RpcProblemExceptionFilter {
88
88
  if (this.isHttpException(exception)) {
89
89
  const status = exception.getStatus();
90
90
  const response = exception.getResponse();
91
- return throwError(() => this.toProblemPayload(response, status));
91
+ const payload = this.toProblemPayload(response, status);
92
+ const log = status >= HttpStatus2.INTERNAL_SERVER_ERROR ? this.logger.error : this.logger.warn;
93
+ log.call(this.logger, `RPC ${status}: ${payload.detail}`);
94
+ return throwError(() => payload);
92
95
  }
93
96
  if (exception instanceof Error) {
94
97
  const cause = exception.cause;
@@ -123,7 +126,7 @@ var RpcProblemExceptionFilter = class _RpcProblemExceptionFilter {
123
126
  };
124
127
  }
125
128
  const obj = response ?? {};
126
- const detail = typeof obj.detail === "string" ? obj.detail : "Request failed";
129
+ const detail = typeof obj.detail === "string" ? obj.detail : typeof obj.message === "string" ? obj.message : Array.isArray(obj.message) ? obj.message.join(", ") : "Request failed";
127
130
  return {
128
131
  type: typeof obj.type === "string" ? obj.type : "about:blank",
129
132
  label: typeof obj.label === "string" ? obj.label : void 0,
@@ -149,11 +152,11 @@ import { createParamDecorator, InternalServerErrorException } from "@nestjs/comm
149
152
  var NATS_HEADER_KEYS = {
150
153
  ORG_ID: "x-org-id",
151
154
  USER_ID: "x-user-id",
152
- BU_ID: "x-bu-id",
153
- BU_TIMEZONE: "x-bu-timezone",
154
- BU_CURRENCY_CODE: "x-bu-currency-code",
155
- BU_ANCESTOR_IDS: "x-bu-ancestor-ids",
156
- BU_DESCENDANT_IDS: "x-bu-descendant-ids"
155
+ SITE_ID: "x-site-id",
156
+ LE_ID: "x-le-id",
157
+ SITE_GROUP_ID: "x-sg-id",
158
+ SITE_TIMEZONE: "x-site-timezone",
159
+ SITE_CURRENCY_CODE: "x-site-currency-code"
157
160
  };
158
161
  function getHeader(headers, key) {
159
162
  if (!headers) return void 0;
@@ -168,16 +171,15 @@ function parseNatsHeaders(headers) {
168
171
  if (!headers) return null;
169
172
  const orgId = getHeader(headers, NATS_HEADER_KEYS.ORG_ID);
170
173
  const userId = getHeader(headers, NATS_HEADER_KEYS.USER_ID);
171
- const buId = getHeader(headers, NATS_HEADER_KEYS.BU_ID);
172
- if (!orgId || !userId || !buId) return null;
174
+ if (!orgId || !userId) return null;
173
175
  return {
174
176
  orgId,
175
177
  userId,
176
- buId,
177
- buTimezone: getHeader(headers, NATS_HEADER_KEYS.BU_TIMEZONE) || "UTC",
178
- buCurrencyCode: getHeader(headers, NATS_HEADER_KEYS.BU_CURRENCY_CODE) || "",
179
- buAncestorIds: JSON.parse(getHeader(headers, NATS_HEADER_KEYS.BU_ANCESTOR_IDS) || "[]"),
180
- buDescendantIds: JSON.parse(getHeader(headers, NATS_HEADER_KEYS.BU_DESCENDANT_IDS) || "[]")
178
+ siteId: getHeader(headers, NATS_HEADER_KEYS.SITE_ID) || "",
179
+ legalEntityId: getHeader(headers, NATS_HEADER_KEYS.LE_ID) || "",
180
+ siteGroupId: getHeader(headers, NATS_HEADER_KEYS.SITE_GROUP_ID) || "",
181
+ siteTimezone: getHeader(headers, NATS_HEADER_KEYS.SITE_TIMEZONE) || "UTC",
182
+ siteCurrencyCode: getHeader(headers, NATS_HEADER_KEYS.SITE_CURRENCY_CODE) || ""
181
183
  };
182
184
  }
183
185
  __name(parseNatsHeaders, "parseNatsHeaders");
@@ -187,17 +189,17 @@ var RpcNatsHeaders = createParamDecorator((_data, ctx) => {
187
189
  const rpcCtx = ctx.switchToRpc().getContext();
188
190
  return parseNatsHeaders(rpcCtx.getHeaders());
189
191
  });
190
- var RpcBuId = createParamDecorator((_data, ctx) => {
192
+ var RpcSiteId = createParamDecorator((_data, ctx) => {
191
193
  const rpcCtx = ctx.switchToRpc().getContext();
192
194
  const headers = parseNatsHeaders(rpcCtx.getHeaders());
193
- if (!headers?.buId) throw new InternalServerErrorException("Missing buId in NATS headers.");
194
- return headers.buId;
195
+ if (!headers?.siteId) throw new InternalServerErrorException("Missing siteId in NATS headers.");
196
+ return headers.siteId;
195
197
  });
196
- var RpcBuCurrencyCode = createParamDecorator((_data, ctx) => {
198
+ var RpcSiteCurrencyCode = createParamDecorator((_data, ctx) => {
197
199
  const rpcCtx = ctx.switchToRpc().getContext();
198
200
  const headers = parseNatsHeaders(rpcCtx.getHeaders());
199
- if (!headers?.buCurrencyCode) throw new InternalServerErrorException("Missing buCurrencyCode in NATS headers.");
200
- return headers.buCurrencyCode;
201
+ if (!headers?.siteCurrencyCode) throw new InternalServerErrorException("Missing siteCurrencyCode in NATS headers.");
202
+ return headers.siteCurrencyCode;
201
203
  });
202
204
 
203
205
  // src/nats/nats-client.module.ts
@@ -257,8 +259,7 @@ var NatsClientService = class {
257
259
  this.contextResolver = contextResolver;
258
260
  this.clients = clients;
259
261
  }
260
- // For GraphQL, @Inject(REQUEST) is the { req, reply } context wrapper, not the Fastify request;
261
- // unwrap so `sessionInfo` (set by the auth guard on the request) is visible across both transports.
262
+ // Unwraps the GraphQL { req, reply } context wrapper so sessionInfo is visible across both transports
262
263
  get request() {
263
264
  return resolveInjectedRequest(this.injectedRequest);
264
265
  }
@@ -302,11 +303,11 @@ function contextToHeaders(ctx) {
302
303
  const hdrs = natsHeaders();
303
304
  hdrs.set(NATS_HEADER_KEYS.ORG_ID, ctx.orgId);
304
305
  hdrs.set(NATS_HEADER_KEYS.USER_ID, ctx.userId);
305
- hdrs.set(NATS_HEADER_KEYS.BU_ID, ctx.buId);
306
- hdrs.set(NATS_HEADER_KEYS.BU_TIMEZONE, ctx.buTimezone);
307
- hdrs.set(NATS_HEADER_KEYS.BU_CURRENCY_CODE, ctx.buCurrencyCode);
308
- hdrs.set(NATS_HEADER_KEYS.BU_ANCESTOR_IDS, JSON.stringify(ctx.buAncestorIds));
309
- hdrs.set(NATS_HEADER_KEYS.BU_DESCENDANT_IDS, JSON.stringify(ctx.buDescendantIds));
306
+ if (ctx.siteId) hdrs.set(NATS_HEADER_KEYS.SITE_ID, ctx.siteId);
307
+ if (ctx.legalEntityId) hdrs.set(NATS_HEADER_KEYS.LE_ID, ctx.legalEntityId);
308
+ if (ctx.siteGroupId) hdrs.set(NATS_HEADER_KEYS.SITE_GROUP_ID, ctx.siteGroupId);
309
+ if (ctx.siteTimezone) hdrs.set(NATS_HEADER_KEYS.SITE_TIMEZONE, ctx.siteTimezone);
310
+ if (ctx.siteCurrencyCode) hdrs.set(NATS_HEADER_KEYS.SITE_CURRENCY_CODE, ctx.siteCurrencyCode);
310
311
  return hdrs;
311
312
  }
312
313
  __name(contextToHeaders, "contextToHeaders");
@@ -351,10 +352,8 @@ var NatsMicroserviceClientService = class {
351
352
  const headers = {
352
353
  [NATS_HEADER_KEYS.ORG_ID]: natsHeaders2.orgId,
353
354
  [NATS_HEADER_KEYS.USER_ID]: natsHeaders2.userId,
354
- [NATS_HEADER_KEYS.BU_ID]: natsHeaders2.buId,
355
- [NATS_HEADER_KEYS.BU_TIMEZONE]: natsHeaders2.buTimezone,
356
- [NATS_HEADER_KEYS.BU_ANCESTOR_IDS]: JSON.stringify(natsHeaders2.buAncestorIds),
357
- [NATS_HEADER_KEYS.BU_DESCENDANT_IDS]: JSON.stringify(natsHeaders2.buDescendantIds)
355
+ [NATS_HEADER_KEYS.SITE_ID]: natsHeaders2.siteId,
356
+ [NATS_HEADER_KEYS.SITE_TIMEZONE]: natsHeaders2.siteTimezone
358
357
  };
359
358
  const record = new NatsRecordBuilder2(data ?? {}).setHeaders(headers).build();
360
359
  return client.send({
@@ -494,10 +493,10 @@ export {
494
493
  NatsClientModule,
495
494
  NatsClientService,
496
495
  NatsMicroserviceClientService,
497
- RpcBuCurrencyCode,
498
- RpcBuId,
499
496
  RpcNatsHeaders,
500
497
  RpcProblemExceptionFilter,
498
+ RpcSiteCurrencyCode,
499
+ RpcSiteId,
501
500
  parseNatsHeaders
502
501
  };
503
502
  //# sourceMappingURL=nats.js.map