@solidstarters/solid-core 1.2.163 → 1.2.166

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 (189) hide show
  1. package/dist/controllers/test-queue.controller.d.ts +1 -1
  2. package/dist/controllers/test-queue.controller.d.ts.map +1 -1
  3. package/dist/controllers/test-queue.controller.js +6 -4
  4. package/dist/controllers/test-queue.controller.js.map +1 -1
  5. package/dist/decorators/error-codes-provider.decorator.d.ts +4 -0
  6. package/dist/decorators/error-codes-provider.decorator.d.ts.map +1 -0
  7. package/dist/decorators/error-codes-provider.decorator.js +12 -0
  8. package/dist/decorators/error-codes-provider.decorator.js.map +1 -0
  9. package/dist/entities/security-rule.entity.js +0 -1
  10. package/dist/entities/security-rule.entity.js.map +1 -1
  11. package/dist/filters/http-exception.filter.d.ts +3 -2
  12. package/dist/filters/http-exception.filter.d.ts.map +1 -1
  13. package/dist/filters/http-exception.filter.js +23 -16
  14. package/dist/filters/http-exception.filter.js.map +1 -1
  15. package/dist/helpers/error-mapper.service.d.ts +12 -2
  16. package/dist/helpers/error-mapper.service.d.ts.map +1 -1
  17. package/dist/helpers/error-mapper.service.js +85 -72
  18. package/dist/helpers/error-mapper.service.js.map +1 -1
  19. package/dist/helpers/solid-core-error-codes-provider.service.d.ts +7 -0
  20. package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -0
  21. package/dist/helpers/solid-core-error-codes-provider.service.js +67 -0
  22. package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -0
  23. package/dist/helpers/solid-registry.d.ts +5 -1
  24. package/dist/helpers/solid-registry.d.ts.map +1 -1
  25. package/dist/helpers/solid-registry.js +16 -0
  26. package/dist/helpers/solid-registry.js.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/interfaces.d.ts +16 -0
  32. package/dist/interfaces.d.ts.map +1 -1
  33. package/dist/interfaces.js.map +1 -1
  34. package/dist/jobs/chatter-queue-options.d.ts +8 -0
  35. package/dist/jobs/chatter-queue-options.d.ts.map +1 -0
  36. package/dist/jobs/chatter-queue-options.js +10 -0
  37. package/dist/jobs/chatter-queue-options.js.map +1 -0
  38. package/dist/jobs/chatter-queue-publisher.service.d.ts +22 -0
  39. package/dist/jobs/chatter-queue-publisher.service.d.ts.map +1 -0
  40. package/dist/jobs/chatter-queue-publisher.service.js +39 -0
  41. package/dist/jobs/chatter-queue-publisher.service.js.map +1 -0
  42. package/dist/jobs/chatter-queue-subscriber.service.d.ts +17 -0
  43. package/dist/jobs/chatter-queue-subscriber.service.d.ts.map +1 -0
  44. package/dist/jobs/chatter-queue-subscriber.service.js +59 -0
  45. package/dist/jobs/chatter-queue-subscriber.service.js.map +1 -0
  46. package/dist/jobs/{database/computed-field-evaluation-publisher.service.d.ts → computed-field-evaluation-publisher.service.d.ts} +2 -2
  47. package/dist/jobs/computed-field-evaluation-publisher.service.d.ts.map +1 -0
  48. package/dist/jobs/{database/computed-field-evaluation-publisher.service.js → computed-field-evaluation-publisher.service.js} +8 -8
  49. package/dist/jobs/computed-field-evaluation-publisher.service.js.map +1 -0
  50. package/dist/jobs/{database/computed-field-evaluation-queue-options.d.ts → computed-field-evaluation-queue-options.d.ts} +1 -1
  51. package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -0
  52. package/dist/jobs/{database/computed-field-evaluation-queue-options.js → computed-field-evaluation-queue-options.js} +2 -2
  53. package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -0
  54. package/dist/jobs/{database/computed-field-evaluation-subscriber.service.d.ts → computed-field-evaluation-subscriber.service.d.ts} +3 -3
  55. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -0
  56. package/dist/jobs/computed-field-evaluation-subscriber.service.js +51 -0
  57. package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -0
  58. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.d.ts +12 -0
  59. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.d.ts.map +1 -0
  60. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.js +39 -0
  61. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.js.map +1 -0
  62. package/dist/jobs/database/computed-field-evaluation-queue-options-database.d.ts +8 -0
  63. package/dist/jobs/database/computed-field-evaluation-queue-options-database.d.ts.map +1 -0
  64. package/dist/jobs/database/computed-field-evaluation-queue-options-database.js +10 -0
  65. package/dist/jobs/database/computed-field-evaluation-queue-options-database.js.map +1 -0
  66. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.d.ts +18 -0
  67. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.d.ts.map +1 -0
  68. package/dist/jobs/database/{computed-field-evaluation-subscriber.service.js → computed-field-evaluation-subscriber-database.service.js} +8 -8
  69. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.js.map +1 -0
  70. package/dist/jobs/database/generate-code-queue-options-database.js +2 -2
  71. package/dist/jobs/database/generate-code-queue-options-database.js.map +1 -1
  72. package/dist/jobs/database/test-queue-subscriber-database.service.d.ts.map +1 -1
  73. package/dist/jobs/database/test-queue-subscriber-database.service.js +7 -1
  74. package/dist/jobs/database/test-queue-subscriber-database.service.js.map +1 -1
  75. package/dist/jobs/generate-code-publisher.service.d.ts +11 -0
  76. package/dist/jobs/generate-code-publisher.service.d.ts.map +1 -0
  77. package/dist/jobs/generate-code-publisher.service.js +39 -0
  78. package/dist/jobs/generate-code-publisher.service.js.map +1 -0
  79. package/dist/jobs/generate-code-queue-options.d.ts +8 -0
  80. package/dist/jobs/generate-code-queue-options.d.ts.map +1 -0
  81. package/dist/jobs/generate-code-queue-options.js +10 -0
  82. package/dist/jobs/generate-code-queue-options.js.map +1 -0
  83. package/dist/jobs/generate-code-subscriber.service.d.ts +18 -0
  84. package/dist/jobs/generate-code-subscriber.service.d.ts.map +1 -0
  85. package/dist/jobs/generate-code-subscriber.service.js +70 -0
  86. package/dist/jobs/generate-code-subscriber.service.js.map +1 -0
  87. package/dist/jobs/test-queue-subscriber.service.d.ts +1 -1
  88. package/dist/jobs/test-queue-subscriber.service.d.ts.map +1 -1
  89. package/dist/jobs/test-queue-subscriber.service.js +9 -6
  90. package/dist/jobs/test-queue-subscriber.service.js.map +1 -1
  91. package/dist/jobs/trigger-mcp-client-publisher.service.d.ts +11 -0
  92. package/dist/jobs/trigger-mcp-client-publisher.service.d.ts.map +1 -0
  93. package/dist/jobs/trigger-mcp-client-publisher.service.js +39 -0
  94. package/dist/jobs/trigger-mcp-client-publisher.service.js.map +1 -0
  95. package/dist/jobs/trigger-mcp-client-queue-options.d.ts +8 -0
  96. package/dist/jobs/trigger-mcp-client-queue-options.d.ts.map +1 -0
  97. package/dist/jobs/trigger-mcp-client-queue-options.js +10 -0
  98. package/dist/jobs/trigger-mcp-client-queue-options.js.map +1 -0
  99. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts +18 -0
  100. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts.map +1 -0
  101. package/dist/jobs/trigger-mcp-client-subscriber.service.js +103 -0
  102. package/dist/jobs/trigger-mcp-client-subscriber.service.js.map +1 -0
  103. package/dist/jobs/twilio-sms-publisher.service.d.ts +11 -0
  104. package/dist/jobs/twilio-sms-publisher.service.d.ts.map +1 -0
  105. package/dist/jobs/twilio-sms-publisher.service.js +39 -0
  106. package/dist/jobs/twilio-sms-publisher.service.js.map +1 -0
  107. package/dist/jobs/twilio-sms-queue-options.d.ts +8 -0
  108. package/dist/jobs/twilio-sms-queue-options.d.ts.map +1 -0
  109. package/dist/jobs/twilio-sms-queue-options.js +10 -0
  110. package/dist/jobs/twilio-sms-queue-options.js.map +1 -0
  111. package/dist/jobs/twilio-sms-subscriber.service.d.ts +17 -0
  112. package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -0
  113. package/dist/jobs/twilio-sms-subscriber.service.js +48 -0
  114. package/dist/jobs/twilio-sms-subscriber.service.js.map +1 -0
  115. package/dist/repository/security-rule.repository.js +2 -2
  116. package/dist/repository/security-rule.repository.js.map +1 -1
  117. package/dist/seeders/seed-data/solid-core-metadata.json +2 -2
  118. package/dist/services/authentication.service.js +3 -3
  119. package/dist/services/authentication.service.js.map +1 -1
  120. package/dist/services/queues/database-publisher.service.js +2 -2
  121. package/dist/services/queues/database-publisher.service.js.map +1 -1
  122. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  123. package/dist/services/queues/database-subscriber.service.js +2 -1
  124. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  125. package/dist/services/queues/publisher-factory.service.js +1 -1
  126. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  127. package/dist/services/solid-introspect.service.d.ts +1 -0
  128. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  129. package/dist/services/solid-introspect.service.js +14 -0
  130. package/dist/services/solid-introspect.service.js.map +1 -1
  131. package/dist/solid-core.module.d.ts.map +1 -1
  132. package/dist/solid-core.module.js +23 -4
  133. package/dist/solid-core.module.js.map +1 -1
  134. package/dist/subscribers/audit.subscriber.d.ts +8 -0
  135. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  136. package/dist/subscribers/audit.subscriber.js +52 -3
  137. package/dist/subscribers/audit.subscriber.js.map +1 -1
  138. package/dist/subscribers/computed-entity-field.subscriber.d.ts +3 -3
  139. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  140. package/dist/subscribers/computed-entity-field.subscriber.js +5 -7
  141. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  142. package/dist/tsconfig.tsbuildinfo +1 -1
  143. package/package.json +1 -1
  144. package/src/controllers/test-queue.controller.ts +4 -3
  145. package/src/decorators/error-codes-provider.decorator.ts +9 -0
  146. package/src/entities/security-rule.entity.ts +1 -1
  147. package/src/filters/http-exception.filter.ts +48 -23
  148. package/src/helpers/error-mapper.service.ts +117 -176
  149. package/src/helpers/solid-core-error-codes-provider.service.ts +63 -0
  150. package/src/helpers/solid-registry.ts +20 -1
  151. package/src/index.ts +1 -0
  152. package/src/interfaces.ts +36 -0
  153. package/src/jobs/chatter-queue-options.ts +9 -0
  154. package/src/jobs/chatter-queue-publisher.service.ts +37 -0
  155. package/src/jobs/chatter-queue-subscriber.service.ts +46 -0
  156. package/src/jobs/computed-field-evaluation-publisher.service.ts +23 -0
  157. package/src/jobs/{database/computed-field-evaluation-queue-options.ts → computed-field-evaluation-queue-options.ts} +2 -2
  158. package/src/jobs/computed-field-evaluation-subscriber.service.ts +38 -0
  159. package/src/jobs/database/{computed-field-evaluation-publisher.service.ts → computed-field-evaluation-publisher-database.service.ts} +2 -2
  160. package/src/jobs/database/computed-field-evaluation-queue-options-database.ts +9 -0
  161. package/src/jobs/database/{computed-field-evaluation-subscriber.service.ts → computed-field-evaluation-subscriber-database.service.ts} +2 -2
  162. package/src/jobs/database/generate-code-queue-options-database.ts +2 -2
  163. package/src/jobs/database/test-queue-subscriber-database.service.ts +10 -2
  164. package/src/jobs/generate-code-publisher.service.ts +23 -0
  165. package/src/jobs/generate-code-queue-options.ts +9 -0
  166. package/src/jobs/generate-code-subscriber.service.ts +59 -0
  167. package/src/jobs/test-queue-subscriber.service.ts +15 -7
  168. package/src/jobs/trigger-mcp-client-publisher.service.ts +22 -0
  169. package/src/jobs/trigger-mcp-client-queue-options.ts +9 -0
  170. package/src/jobs/trigger-mcp-client-subscriber.service.ts +104 -0
  171. package/src/jobs/twilio-sms-publisher.service.ts +23 -0
  172. package/src/jobs/twilio-sms-queue-options.ts +9 -0
  173. package/src/jobs/twilio-sms-subscriber.service.ts +32 -0
  174. package/src/repository/security-rule.repository.ts +2 -2
  175. package/src/seeders/seed-data/solid-core-metadata.json +2 -2
  176. package/src/services/authentication.service.ts +4 -4
  177. package/src/services/queues/database-publisher.service.ts +2 -2
  178. package/src/services/queues/database-subscriber.service.ts +2 -1
  179. package/src/services/queues/publisher-factory.service.ts +1 -1
  180. package/src/services/solid-introspect.service.ts +22 -0
  181. package/src/solid-core.module.ts +35 -8
  182. package/src/subscribers/audit.subscriber.ts +235 -5
  183. package/src/subscribers/computed-entity-field.subscriber.ts +7 -5
  184. package/dist/jobs/database/computed-field-evaluation-publisher.service.d.ts.map +0 -1
  185. package/dist/jobs/database/computed-field-evaluation-publisher.service.js.map +0 -1
  186. package/dist/jobs/database/computed-field-evaluation-queue-options.d.ts.map +0 -1
  187. package/dist/jobs/database/computed-field-evaluation-queue-options.js.map +0 -1
  188. package/dist/jobs/database/computed-field-evaluation-subscriber.service.d.ts.map +0 -1
  189. package/dist/jobs/database/computed-field-evaluation-subscriber.service.js.map +0 -1
@@ -2,6 +2,6 @@ import { PublisherFactory } from 'src/services/queues/publisher-factory.service'
2
2
  export declare class TestQueueController {
3
3
  private readonly publisherFactory;
4
4
  constructor(publisherFactory: PublisherFactory<any>);
5
- getHello(messageBroker: string): Promise<{}>;
5
+ getHello(messageBroker: string, timeoutSeconds: number): Promise<{}>;
6
6
  }
7
7
  //# sourceMappingURL=test-queue.controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-queue.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/test-queue.controller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAGjF,qBAGa,mBAAmB;IAKxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC;IAKtD,QAAQ,CAAyB,aAAa,EAAE,MAAM;CAqB/D"}
1
+ {"version":3,"file":"test-queue.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/test-queue.controller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAGjF,qBAGa,mBAAmB;IAKxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC;IAKtD,QAAQ,CAAyB,aAAa,EAAE,MAAM,EAA2B,cAAc,EAAE,MAAM;CAsBhH"}
@@ -24,13 +24,14 @@ let TestQueueController = class TestQueueController {
24
24
  constructor(publisherFactory) {
25
25
  this.publisherFactory = publisherFactory;
26
26
  }
27
- async getHello(messageBroker) {
27
+ async getHello(messageBroker, timeoutSeconds) {
28
28
  const pubsubMessage = 'A hopping-good time!';
29
29
  const m = {
30
30
  payload: {
31
31
  firstName: 'Harish',
32
32
  lastName: 'Patel',
33
- age: 40
33
+ age: 40,
34
+ timeoutSeconds: timeoutSeconds
34
35
  },
35
36
  parentEntity: 'feeType',
36
37
  parentEntityId: 23,
@@ -42,11 +43,12 @@ let TestQueueController = class TestQueueController {
42
43
  exports.TestQueueController = TestQueueController;
43
44
  __decorate([
44
45
  (0, public_decorator_1.Public)(),
45
- (0, common_1.Get)(':messageBroker'),
46
+ (0, common_1.Get)(':messageBroker/:timeoutSeconds'),
46
47
  openapi.ApiResponse({ status: 200 }),
47
48
  __param(0, (0, common_1.Param)('messageBroker')),
49
+ __param(1, (0, common_1.Param)('timeoutSeconds')),
48
50
  __metadata("design:type", Function),
49
- __metadata("design:paramtypes", [String]),
51
+ __metadata("design:paramtypes", [String, Number]),
50
52
  __metadata("design:returntype", Promise)
51
53
  ], TestQueueController.prototype, "getHello", null);
52
54
  exports.TestQueueController = TestQueueController = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"test-queue.controller.js","sourceRoot":"","sources":["../../src/controllers/test-queue.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,6CAA0C;AAC1C,iEAAqD;AACrD,qEAAyD;AACzD,4DAAoD;AACpD,4FAAiF;AAM1E,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE5B,YAGqB,gBAAuC;QAAvC,qBAAgB,GAAhB,gBAAgB,CAAuB;IACxD,CAAC;IAIC,AAAN,KAAK,CAAC,QAAQ,CAAyB,aAAqB;QACxD,MAAM,aAAa,GAAG,sBAAsB,CAAC;QAC7C,MAAM,CAAC,GAAG;YACN,OAAO,EAAE;gBACL,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,OAAO;gBACjB,GAAG,EAAE,EAAE;aACV;YACD,YAAY,EAAE,SAAS;YACvB,cAAc,EAAE,EAAE;SACrB,CAAC;QAOF,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC;QAE5E,OAAO,EAAE,CAAC;IACd,CAAC;CACJ,CAAA;AA/BY,kDAAmB;AAUtB;IAFL,IAAA,yBAAM,GAAE;IACR,IAAA,YAAG,EAAC,gBAAgB,CAAC;;IACN,WAAA,IAAA,cAAK,EAAC,eAAe,CAAC,CAAA;;;;mDAoBrC;8BA9BQ,mBAAmB;IAH/B,IAAA,qBAAI,EAAC,yBAAQ,CAAC,IAAI,CAAC;IACnB,IAAA,mBAAU,EAAC,QAAQ,CAAC;IACpB,IAAA,iBAAO,EAAC,QAAQ,CAAC;qCAMyB,4CAAgB;GAL9C,mBAAmB,CA+B/B","sourcesContent":["import { Controller, Get, Param } from '@nestjs/common';\nimport { ApiTags } from '@nestjs/swagger';\nimport { Auth } from 'src/decorators/auth.decorator';\nimport { Public } from 'src/decorators/public.decorator';\nimport { AuthType } from 'src/enums/auth-type.enum';\nimport { PublisherFactory } from 'src/services/queues/publisher-factory.service';\n\n\n@Auth(AuthType.None)\n@Controller('queues')\n@ApiTags(\"Queues\")\nexport class TestQueueController {\n\n constructor(\n // private readonly publisherRmq: TestQueuePublisher,\n // private readonly publisherDb: TestQueuePublisherDatabase\n private readonly publisherFactory: PublisherFactory<any>\n ) { }\n\n @Public()\n @Get(':messageBroker')\n async getHello(@Param('messageBroker') messageBroker: string) {\n const pubsubMessage = 'A hopping-good time!';\n const m = {\n payload: {\n firstName: 'Harish',\n lastName: 'Patel',\n age: 40\n },\n parentEntity: 'feeType',\n parentEntityId: 23,\n };\n // if (messageBroker === 'rabbitmq') {\n // await this.publisherRmq.publish(m);\n // }\n // if (messageBroker === 'database') {\n // await this.publisherDb.publish(m);\n // }\n await this.publisherFactory.publish(m, 'TestQueuePublisher', messageBroker);\n\n return {};\n }\n}\n"]}
1
+ {"version":3,"file":"test-queue.controller.js","sourceRoot":"","sources":["../../src/controllers/test-queue.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,6CAA0C;AAC1C,iEAAqD;AACrD,qEAAyD;AACzD,4DAAoD;AACpD,4FAAiF;AAM1E,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE5B,YAGqB,gBAAuC;QAAvC,qBAAgB,GAAhB,gBAAgB,CAAuB;IACxD,CAAC;IAIC,AAAN,KAAK,CAAC,QAAQ,CAAyB,aAAqB,EAA2B,cAAsB;QACzG,MAAM,aAAa,GAAG,sBAAsB,CAAC;QAC7C,MAAM,CAAC,GAAG;YACN,OAAO,EAAE;gBACL,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,OAAO;gBACjB,GAAG,EAAE,EAAE;gBACP,cAAc,EAAE,cAAc;aACjC;YACD,YAAY,EAAE,SAAS;YACvB,cAAc,EAAE,EAAE;SACrB,CAAC;QAOF,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC;QAE5E,OAAO,EAAE,CAAC;IACd,CAAC;CACJ,CAAA;AAhCY,kDAAmB;AAUtB;IAFL,IAAA,yBAAM,GAAE;IACR,IAAA,YAAG,EAAC,gCAAgC,CAAC;;IACtB,WAAA,IAAA,cAAK,EAAC,eAAe,CAAC,CAAA;IAAyB,WAAA,IAAA,cAAK,EAAC,gBAAgB,CAAC,CAAA;;;;mDAqBrF;8BA/BQ,mBAAmB;IAH/B,IAAA,qBAAI,EAAC,yBAAQ,CAAC,IAAI,CAAC;IACnB,IAAA,mBAAU,EAAC,QAAQ,CAAC;IACpB,IAAA,iBAAO,EAAC,QAAQ,CAAC;qCAMyB,4CAAgB;GAL9C,mBAAmB,CAgC/B","sourcesContent":["import { Controller, Get, Param } from '@nestjs/common';\nimport { ApiTags } from '@nestjs/swagger';\nimport { Auth } from 'src/decorators/auth.decorator';\nimport { Public } from 'src/decorators/public.decorator';\nimport { AuthType } from 'src/enums/auth-type.enum';\nimport { PublisherFactory } from 'src/services/queues/publisher-factory.service';\n\n\n@Auth(AuthType.None)\n@Controller('queues')\n@ApiTags(\"Queues\")\nexport class TestQueueController {\n\n constructor(\n // private readonly publisherRmq: TestQueuePublisher,\n // private readonly publisherDb: TestQueuePublisherDatabase\n private readonly publisherFactory: PublisherFactory<any>\n ) { }\n\n @Public()\n @Get(':messageBroker/:timeoutSeconds')\n async getHello(@Param('messageBroker') messageBroker: string, @Param('timeoutSeconds') timeoutSeconds: number) {\n const pubsubMessage = 'A hopping-good time!';\n const m = {\n payload: {\n firstName: 'Harish',\n lastName: 'Patel',\n age: 40,\n timeoutSeconds: timeoutSeconds\n },\n parentEntity: 'feeType',\n parentEntityId: 23,\n };\n // if (messageBroker === 'rabbitmq') {\n // await this.publisherRmq.publish(m);\n // }\n // if (messageBroker === 'database') {\n // await this.publisherDb.publish(m);\n // }\n await this.publisherFactory.publish(m, 'TestQueuePublisher', messageBroker);\n\n return {};\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import 'reflect-metadata';
2
+ export declare const IS_ERROR_CODE_PROVIDER = "IS_ERROR_CODE_PROVIDER";
3
+ export declare const ErrorCodeProvider: () => (target: Function) => void;
4
+ //# sourceMappingURL=error-codes-provider.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes-provider.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/error-codes-provider.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,eAAO,MAAM,iBAAiB,iBACV,QAAQ,SAG3B,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorCodeProvider = exports.IS_ERROR_CODE_PROVIDER = void 0;
4
+ require("reflect-metadata");
5
+ exports.IS_ERROR_CODE_PROVIDER = 'IS_ERROR_CODE_PROVIDER';
6
+ const ErrorCodeProvider = () => {
7
+ return (target) => {
8
+ Reflect.defineMetadata(exports.IS_ERROR_CODE_PROVIDER, true, target);
9
+ };
10
+ };
11
+ exports.ErrorCodeProvider = ErrorCodeProvider;
12
+ //# sourceMappingURL=error-codes-provider.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes-provider.decorator.js","sourceRoot":"","sources":["../../src/decorators/error-codes-provider.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAEb,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAExD,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAClC,OAAO,CAAC,MAAgB,EAAE,EAAE;QACxB,OAAO,CAAC,cAAc,CAAC,8BAAsB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;AACN,CAAC,CAAC;AAJW,QAAA,iBAAiB,qBAI5B","sourcesContent":["import 'reflect-metadata';\n\nexport const IS_ERROR_CODE_PROVIDER = 'IS_ERROR_CODE_PROVIDER';\n\nexport const ErrorCodeProvider = () => {\n return (target: Function) => {\n Reflect.defineMetadata(IS_ERROR_CODE_PROVIDER, true, target);\n };\n};"]}
@@ -27,7 +27,6 @@ __decorate([
27
27
  __metadata("design:type", String)
28
28
  ], SecurityRule.prototype, "name", void 0);
29
29
  __decorate([
30
- (0, typeorm_1.Index)({ unique: true }),
31
30
  (0, typeorm_1.Column)({ type: "varchar" }),
32
31
  __metadata("design:type", String)
33
32
  ], SecurityRule.prototype, "description", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"security-rule.entity.js","sourceRoot":"","sources":["../../src/entities/security-rule.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mDAA0D;AAC1D,mEAAmE;AACnE,iEAAiE;AACjE,qCAAuE;AAGhE,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,4BAAY;;;;CAkB7C,CAAA;AAlBY,oCAAY;AAGrB;IAFC,IAAA,eAAK,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvB,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0CACf;AAGb;IAFC,IAAA,eAAK,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvB,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;iDACR;AAIpB;IAHC,IAAA,eAAK,GAAE;IACP,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,mCAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvE,IAAA,oBAAU,GAAE;8BACP,mCAAY;0CAAC;AAInB;IAHC,IAAA,eAAK,GAAE;IACP,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,qCAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxE,IAAA,oBAAU,GAAE;8BACE,qCAAa;mDAAC;AAE7B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;wDACD;uBAhBf,YAAY;IADxB,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,YAAY,CAkBxB","sourcesContent":["import { CommonEntity } from 'src/entities/common.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RoleMetadata } from 'src/entities/role-metadata.entity';\nimport { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';\n\n@Entity(\"ss_security_rule\")\nexport class SecurityRule extends CommonEntity {\n @Index({ unique: true })\n @Column({ type: \"varchar\" })\n name: string;\n @Index({ unique: true })\n @Column({ type: \"varchar\" })\n description: string;\n @Index()\n @ManyToOne(() => RoleMetadata, { onDelete: \"CASCADE\", nullable: false })\n @JoinColumn()\n role: RoleMetadata;\n @Index()\n @ManyToOne(() => ModelMetadata, { onDelete: \"CASCADE\", nullable: false })\n @JoinColumn()\n modelMetadata: ModelMetadata;\n @Column({ type: \"text\" })\n securityRuleConfig: any;\n\n}\n"]}
1
+ {"version":3,"file":"security-rule.entity.js","sourceRoot":"","sources":["../../src/entities/security-rule.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mDAA0D;AAC1D,mEAAmE;AACnE,iEAAiE;AACjE,qCAAuE;AAGhE,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,4BAAY;;;;CAkB7C,CAAA;AAlBY,oCAAY;AAGrB;IAFC,IAAA,eAAK,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvB,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0CACf;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;iDACR;AAIpB;IAHC,IAAA,eAAK,GAAE;IACP,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,mCAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvE,IAAA,oBAAU,GAAE;8BACP,mCAAY;0CAAC;AAInB;IAHC,IAAA,eAAK,GAAE;IACP,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,qCAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxE,IAAA,oBAAU,GAAE;8BACE,qCAAa;mDAAC;AAE7B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;wDACD;uBAhBf,YAAY;IADxB,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,YAAY,CAkBxB","sourcesContent":["import { CommonEntity } from 'src/entities/common.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RoleMetadata } from 'src/entities/role-metadata.entity';\nimport { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';\n\n@Entity(\"ss_security_rule\")\nexport class SecurityRule extends CommonEntity {\n @Index({ unique: true })\n @Column({ type: \"varchar\" })\n name: string;\n // @Index({ unique: true })\n @Column({ type: \"varchar\" })\n description: string;\n @Index()\n @ManyToOne(() => RoleMetadata, { onDelete: \"CASCADE\", nullable: false })\n @JoinColumn()\n role: RoleMetadata;\n @Index()\n @ManyToOne(() => ModelMetadata, { onDelete: \"CASCADE\", nullable: false })\n @JoinColumn()\n modelMetadata: ModelMetadata;\n @Column({ type: \"text\" })\n securityRuleConfig: any;\n\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import { ExceptionFilter, ArgumentsHost } from '@nestjs/common';
2
+ import { ErrorMapperService } from 'src/helpers/error-mapper.service';
2
3
  export declare class HttpExceptionFilter implements ExceptionFilter {
4
+ private readonly errorMapper;
3
5
  private readonly logger;
4
- constructor();
6
+ constructor(errorMapper: ErrorMapperService);
5
7
  catch(exception: any, host: ArgumentsHost): void;
6
- private getErrorJson;
7
8
  }
8
9
  //# sourceMappingURL=http-exception.filter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-exception.filter.d.ts","sourceRoot":"","sources":["../../src/filters/http-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAS,aAAa,EAAsB,MAAM,gBAAgB,CAAC;AAI3F,qBAEa,mBAAoB,YAAW,eAAe;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;;IAM/D,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa;IAiBzC,OAAO,CAAC,YAAY;CAQvB"}
1
+ {"version":3,"file":"http-exception.filter.d.ts","sourceRoot":"","sources":["../../src/filters/http-exception.filter.ts"],"names":[],"mappings":"AACA,OAAO,EACH,eAAe,EAEf,aAAa,EAIhB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAItE,qBAEa,mBAAoB,YAAW,eAAe;IAG3C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;gBAElC,WAAW,EAAE,kBAAkB;IAI5D,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa;CAuC5C"}
@@ -13,8 +13,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.HttpExceptionFilter = void 0;
14
14
  const common_1 = require("@nestjs/common");
15
15
  const logging_interceptor_1 = require("../interceptors/logging.interceptor");
16
+ const error_mapper_service_1 = require("../helpers/error-mapper.service");
16
17
  let HttpExceptionFilter = HttpExceptionFilter_1 = class HttpExceptionFilter {
17
- constructor() {
18
+ constructor(errorMapper) {
19
+ this.errorMapper = errorMapper;
18
20
  this.logger = new common_1.Logger(HttpExceptionFilter_1.name);
19
21
  this.logger.debug('HttpExceptionFilter initialized');
20
22
  }
@@ -22,27 +24,32 @@ let HttpExceptionFilter = HttpExceptionFilter_1 = class HttpExceptionFilter {
22
24
  const ctx = host.switchToHttp();
23
25
  const response = ctx.getResponse();
24
26
  const request = ctx.getRequest();
25
- const status = exception.status || 500;
26
- const message = exception.message || 'Internal server error';
27
- const { method, url } = request;
28
- this.logger.error(`[${status || 500} ${logging_interceptor_1.HttpStatusCodeMessages[status] || 'Internal Server Error'}] ${method} ${url} - ${message}`);
29
- this.logger.error(exception.stack || 'No stack trace available');
30
- const errorJson = this.getErrorJson(status, message, exception.response);
31
- response.status(status).json(errorJson);
32
- }
33
- getErrorJson(status, message, additionalErrorData = {}) {
34
- return {
27
+ const isHttp = exception instanceof common_1.HttpException;
28
+ const explicitStatus = isHttp ? exception.getStatus() : undefined;
29
+ const code = this.errorMapper.mapException(exception);
30
+ const defaultStatus = this.errorMapper.getHttpStatus(code);
31
+ const message = this.errorMapper.getMessage(code);
32
+ const status = explicitStatus ?? defaultStatus ?? 500;
33
+ this.logger.error(`[${status} ${logging_interceptor_1.HttpStatusCodeMessages[status] || 'Internal Server Error'}] ${request?.method} ${request?.url} - ${exception?.message || message} [code=${code}]`);
34
+ if (exception?.stack) {
35
+ this.logger.error(exception.stack);
36
+ }
37
+ const extra = (isHttp && exception.getResponse?.()) ??
38
+ exception?.response ??
39
+ {};
40
+ response.status(status).json({
35
41
  statusCode: status,
36
- message: [message],
37
- error: logging_interceptor_1.HttpStatusCodeMessages[status] || 'Internal Server Error',
38
- data: additionalErrorData
39
- };
42
+ statusCodeMessage: logging_interceptor_1.HttpStatusCodeMessages[status] || 'Internal Server Error',
43
+ errorCode: code,
44
+ error: message,
45
+ data: extra,
46
+ });
40
47
  }
41
48
  };
42
49
  exports.HttpExceptionFilter = HttpExceptionFilter;
43
50
  exports.HttpExceptionFilter = HttpExceptionFilter = HttpExceptionFilter_1 = __decorate([
44
51
  (0, common_1.Catch)(),
45
52
  (0, common_1.Injectable)(),
46
- __metadata("design:paramtypes", [])
53
+ __metadata("design:paramtypes", [error_mapper_service_1.ErrorMapperService])
47
54
  ], HttpExceptionFilter);
48
55
  //# sourceMappingURL=http-exception.filter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-exception.filter.js","sourceRoot":"","sources":["../../src/filters/http-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA2F;AAE3F,6EAA6E;AAItE,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAG5B;QAFiB,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;QAG3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,SAAc,EAAE,IAAmB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAY,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC;QACvC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,uBAAuB,CAAC;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAGhC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,4CAAsB,CAAC,MAAM,CAAC,IAAI,uBAAuB,KAAK,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC;QACnI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,0BAA0B,CAAC,CAAC;QAGjE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAEO,YAAY,CAAC,MAAqB,EAAE,OAAe,EAAE,sBAA+B,EAAE;QAC1F,OAAO;YACH,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,KAAK,EAAE,4CAAsB,CAAC,MAAM,CAAC,IAAI,uBAAuB;YAChE,IAAI,EAAE,mBAAmB;SAC5B,CAAA;IACL,CAAC;CACJ,CAAA;AAhCY,kDAAmB;8BAAnB,mBAAmB;IAF/B,IAAA,cAAK,GAAE;IACP,IAAA,mBAAU,GAAE;;GACA,mBAAmB,CAgC/B","sourcesContent":["import { ExceptionFilter, Catch, ArgumentsHost, Logger, Injectable } from '@nestjs/common';\nimport { Response } from 'express';\nimport { HttpStatusCodeMessages } from '../interceptors/logging.interceptor';\n\n@Catch()\n@Injectable()\nexport class HttpExceptionFilter implements ExceptionFilter {\n private readonly logger = new Logger(HttpExceptionFilter.name);\n\n constructor() {\n this.logger.debug('HttpExceptionFilter initialized');\n } \n\n catch(exception: any, host: ArgumentsHost) {\n const ctx = host.switchToHttp();\n const response = ctx.getResponse<Response>();\n const request = ctx.getRequest();\n const status = exception.status || 500;\n const message = exception.message || 'Internal server error';\n const { method, url } = request;\n\n // Log the error here\n this.logger.error(`[${status || 500} ${HttpStatusCodeMessages[status] || 'Internal Server Error'}] ${method} ${url} - ${message}`);\n this.logger.error(exception.stack || 'No stack trace available');\n\n // Send the response to the client\n const errorJson = this.getErrorJson(status, message, exception.response);\n response.status(status).json(errorJson);\n }\n\n private getErrorJson(status: number|string, message: string, additionalErrorData: unknown = {}): any {\n return {\n statusCode: status,\n message: [message],\n error: HttpStatusCodeMessages[status] || 'Internal Server Error',\n data: additionalErrorData\n }\n }\n}"]}
1
+ {"version":3,"file":"http-exception.filter.js","sourceRoot":"","sources":["../../src/filters/http-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,2CAOwB;AAExB,6EAA6E;AAC7E,0EAAsE;AAM/D,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAG5B,YAA6B,WAA+B;QAA/B,gBAAW,GAAX,WAAW,CAAoB;QAF3C,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;QAG3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,SAAc,EAAE,IAAmB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAY,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAW,CAAC;QAE1C,MAAM,MAAM,GAAG,SAAS,YAAY,sBAAa,CAAC;QAClD,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAGlE,MAAM,IAAI,GAAc,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,cAAc,IAAI,aAAa,IAAI,GAAG,CAAC;QAGtD,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,IAAI,MAAM,IAAI,4CAAsB,CAAC,MAAM,CAAC,IAAI,uBAAuB,KAAK,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,GAAG,MAAM,SAAS,EAAE,OAAO,IAAI,OAAO,UAAU,IAAI,GAAG,CAClK,CAAC;QACF,IAAI,SAAS,EAAE,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAGD,MAAM,KAAK,GACP,CAAC,MAAM,IAAK,SAAS,CAAC,WAAW,EAAE,EAAU,CAAC;YAC9C,SAAS,EAAE,QAAQ;YACnB,EAAE,CAAC;QAGP,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACzB,UAAU,EAAE,MAAM;YAClB,iBAAiB,EAAE,4CAAsB,CAAC,MAAM,CAAC,IAAI,uBAAuB;YAE5E,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,KAAK;SACd,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AA9CY,kDAAmB;8BAAnB,mBAAmB;IAF/B,IAAA,cAAK,GAAE;IACP,IAAA,mBAAU,GAAE;qCAIiC,yCAAkB;GAHnD,mBAAmB,CA8C/B","sourcesContent":["// src/common/filters/http-exception.filter.ts\nimport {\n ExceptionFilter,\n Catch,\n ArgumentsHost,\n Logger,\n Injectable,\n HttpException,\n} from '@nestjs/common';\nimport { Response, Request } from 'express';\nimport { HttpStatusCodeMessages } from '../interceptors/logging.interceptor';\nimport { ErrorMapperService } from 'src/helpers/error-mapper.service';\nimport { ErrorCode } from 'src/interfaces';\n\n\n@Catch()\n@Injectable()\nexport class HttpExceptionFilter implements ExceptionFilter {\n private readonly logger = new Logger(HttpExceptionFilter.name);\n\n constructor(private readonly errorMapper: ErrorMapperService) {\n this.logger.debug('HttpExceptionFilter initialized');\n }\n\n catch(exception: any, host: ArgumentsHost) {\n const ctx = host.switchToHttp();\n const response = ctx.getResponse<Response>();\n const request = ctx.getRequest<Request>();\n\n const isHttp = exception instanceof HttpException;\n const explicitStatus = isHttp ? exception.getStatus() : undefined;\n\n // Canonical code + static message\n const code: ErrorCode = this.errorMapper.mapException(exception);\n const defaultStatus = this.errorMapper.getHttpStatus(code);\n const message = this.errorMapper.getMessage(code);\n\n const status = explicitStatus ?? defaultStatus ?? 500;\n\n // Logging\n this.logger.error(\n `[${status} ${HttpStatusCodeMessages[status] || 'Internal Server Error'}] ${request?.method} ${request?.url} - ${exception?.message || message} [code=${code}]`,\n );\n if (exception?.stack) {\n this.logger.error(exception.stack);\n }\n\n // Preserve any extra data the exception carried (optional)\n const extra =\n (isHttp && (exception.getResponse?.() as any)) ??\n exception?.response ??\n {};\n\n // Keep your legacy shape; add canonical code\n response.status(status).json({\n statusCode: status,\n statusCodeMessage: HttpStatusCodeMessages[status] || 'Internal Server Error',\n // message: [message],\n errorCode: code,\n error: message,\n data: extra,\n });\n }\n}"]}
@@ -1,8 +1,18 @@
1
- export declare const ERROR_CODES: readonly ["bedrock-throttling-error", "bedrock-access-denied", "bedrock-input-too-long", "bedrock-validation-error", "bedrock-model-not-found", "db-duplicate-key", "db-foreign-key-error", "metadata-extraction-date-parsing-failed", "metadata-extraction-missing-s3-file", "solidx-mcp-server-unavailable", "unknown-error"];
2
- export type ErrorCode = typeof ERROR_CODES[number];
1
+ import { SolidRegistry } from 'src/helpers/solid-registry';
2
+ import { ErrorCode } from 'src/interfaces';
3
3
  export declare class ErrorMapperService {
4
+ private readonly solidRegistry;
5
+ private readonly logger;
6
+ constructor(solidRegistry: SolidRegistry);
4
7
  mapException(exc: unknown): ErrorCode;
5
8
  mapMessage(message: string, trace?: string): ErrorCode;
9
+ getMessage(code: ErrorCode): string;
10
+ getHttpStatus(code: ErrorCode): number;
11
+ private matchCode;
12
+ private lookupMeta;
13
+ private getAllRulesSorted;
14
+ private getProviders;
6
15
  private combineErrorText;
16
+ private safeJsonStringify;
7
17
  }
8
18
  //# sourceMappingURL=error-mapper.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-mapper.service.d.ts","sourceRoot":"","sources":["../../src/helpers/error-mapper.service.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,iUAYd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD,qBACa,kBAAkB;IAK3B,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS;IAsIrC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS;IAOtD,OAAO,CAAC,gBAAgB;CAuC3B"}
1
+ {"version":3,"file":"error-mapper.service.d.ts","sourceRoot":"","sources":["../../src/helpers/error-mapper.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAA4C,MAAM,gBAAgB,CAAC;AAmCrF,qBACa,kBAAkB;IAGf,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAEjC,aAAa,EAAE,aAAa;IAGzD,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS;IAMrC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS;IAMtD,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAMnC,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAMtC,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,iBAAiB;CAO5B"}
@@ -5,70 +5,86 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var ErrorMapperService_1;
8
12
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.ErrorMapperService = exports.ERROR_CODES = void 0;
13
+ exports.ErrorMapperService = void 0;
10
14
  const common_1 = require("@nestjs/common");
11
- exports.ERROR_CODES = [
12
- 'bedrock-throttling-error',
13
- 'bedrock-access-denied',
14
- 'bedrock-input-too-long',
15
- 'bedrock-validation-error',
16
- 'bedrock-model-not-found',
17
- 'db-duplicate-key',
18
- 'db-foreign-key-error',
19
- 'metadata-extraction-date-parsing-failed',
20
- 'metadata-extraction-missing-s3-file',
21
- 'solidx-mcp-server-unavailable',
22
- 'unknown-error',
23
- ];
24
- let ErrorMapperService = class ErrorMapperService {
15
+ const solid_registry_1 = require("./solid-registry");
16
+ let ErrorMapperService = ErrorMapperService_1 = class ErrorMapperService {
17
+ constructor(solidRegistry) {
18
+ this.solidRegistry = solidRegistry;
19
+ this.logger = new common_1.Logger(ErrorMapperService_1.name);
20
+ }
25
21
  mapException(exc) {
26
22
  const combined = this.combineErrorText(exc);
27
- if (combined.includes("all connection attempts failed") && combined.includes("unhandled errors in a taskgroup (1 sub-exception)")) {
28
- return 'solidx-mcp-server-unavailable';
29
- }
30
- if (combined.includes('throttlingexception') ||
31
- combined.includes('too many tokens')) {
32
- return 'bedrock-throttling-error';
33
- }
34
- if (combined.includes('accessdeniedexception')) {
35
- return 'bedrock-access-denied';
36
- }
37
- if (combined.includes('validationexception') &&
38
- combined.includes('input is too long')) {
39
- return 'bedrock-input-too-long';
40
- }
41
- if (combined.includes('validationexception')) {
42
- return 'bedrock-validation-error';
43
- }
44
- if (combined.includes('modelnotfoundexception')) {
45
- return 'bedrock-model-not-found';
46
- }
47
- if (combined.includes('unique constraint') ||
48
- combined.includes('duplicate key')) {
49
- return 'db-duplicate-key';
50
- }
51
- if (combined.includes('foreign key')) {
52
- return 'db-foreign-key-error';
23
+ return this.matchCode(combined);
24
+ }
25
+ mapMessage(message, trace) {
26
+ const combined = `${message ?? ''}\n${trace ?? ''}`.toLowerCase();
27
+ return this.matchCode(combined);
28
+ }
29
+ getMessage(code) {
30
+ const meta = this.lookupMeta(code);
31
+ return (meta ?? { message: 'An unexpected error occurred.' }).message;
32
+ }
33
+ getHttpStatus(code) {
34
+ const meta = this.lookupMeta(code);
35
+ return meta?.httpStatus ?? 500;
36
+ }
37
+ matchCode(combined) {
38
+ const rules = this.getAllRulesSorted();
39
+ for (const rule of rules) {
40
+ try {
41
+ if (rule.match(combined))
42
+ return rule.code;
43
+ }
44
+ catch (e) {
45
+ this.logger.warn(`Error rule threw in match(): code=${rule.code} provider? — ${e}`);
46
+ }
53
47
  }
54
- if (combined.includes('mapper_parsing_exception') &&
55
- (combined.includes('failed to parse field [metadata.properties.dates]') ||
56
- combined.includes('failed to parse field [metadata.properties.date_authored]'))) {
57
- return 'metadata-extraction-date-parsing-failed';
48
+ return 'unknown-error';
49
+ }
50
+ lookupMeta(code) {
51
+ const rules = this.getAllRulesSorted();
52
+ const rule = rules.find((r) => r.code === code);
53
+ if (rule?.meta)
54
+ return rule.meta;
55
+ const providers = this.getProviders();
56
+ for (const p of providers) {
57
+ if (p.resolve) {
58
+ const meta = p.resolve(code);
59
+ if (meta)
60
+ return meta;
61
+ }
58
62
  }
59
- if (combined.includes('nosuchkey') && combined.includes('getobject')) {
60
- return 'metadata-extraction-missing-s3-file';
63
+ return undefined;
64
+ }
65
+ getAllRulesSorted() {
66
+ const providers = this.getProviders();
67
+ const all = [];
68
+ for (const p of providers) {
69
+ try {
70
+ const rules = p.rules() ?? [];
71
+ all.push(...rules);
72
+ }
73
+ catch (e) {
74
+ this.logger.warn(`ErrorCodeProvider.rules() failed for ${p.name?.()}: ${e}`);
75
+ }
61
76
  }
62
- return 'unknown-error';
77
+ return all.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
63
78
  }
64
- mapMessage(message, trace) {
65
- const combined = `${message ?? ''}\n${trace ?? ''}`.toLowerCase();
66
- return this.mapException(combined);
79
+ getProviders() {
80
+ return this.solidRegistry
81
+ .getErrorCodeProviders()
82
+ .map((w) => w.instance)
83
+ .filter(Boolean);
67
84
  }
68
85
  combineErrorText(exc) {
69
- if (typeof exc === 'string') {
86
+ if (typeof exc === 'string')
70
87
  return exc.toLowerCase();
71
- }
72
88
  if (exc instanceof Error) {
73
89
  const message = exc.message ?? '';
74
90
  const stack = exc.stack ?? '';
@@ -76,15 +92,11 @@ let ErrorMapperService = class ErrorMapperService {
76
92
  }
77
93
  if (exc && typeof exc === 'object') {
78
94
  try {
79
- const maybeAny = exc;
80
- const msg = String(maybeAny.message ?? '') ||
81
- String(maybeAny['Message'] ?? '') ||
82
- '';
83
- const name = String(maybeAny.name ?? '') ||
84
- String(maybeAny['__type'] ?? '') ||
85
- '';
86
- const stack = String(maybeAny.stack ?? '');
87
- const json = safeJsonStringify(maybeAny);
95
+ const obj = exc;
96
+ const msg = String(obj.message ?? obj['Message'] ?? '');
97
+ const name = String(obj.name ?? obj['__type'] ?? '');
98
+ const stack = String(obj.stack ?? '');
99
+ const json = this.safeJsonStringify(obj);
88
100
  return `${name}\n${msg}\n${stack}\n${json}`.toLowerCase();
89
101
  }
90
102
  catch {
@@ -92,17 +104,18 @@ let ErrorMapperService = class ErrorMapperService {
92
104
  }
93
105
  return String(exc ?? '').toLowerCase();
94
106
  }
107
+ safeJsonStringify(obj) {
108
+ try {
109
+ return JSON.stringify(obj);
110
+ }
111
+ catch {
112
+ return '';
113
+ }
114
+ }
95
115
  };
96
116
  exports.ErrorMapperService = ErrorMapperService;
97
- exports.ErrorMapperService = ErrorMapperService = __decorate([
98
- (0, common_1.Injectable)()
117
+ exports.ErrorMapperService = ErrorMapperService = ErrorMapperService_1 = __decorate([
118
+ (0, common_1.Injectable)(),
119
+ __metadata("design:paramtypes", [solid_registry_1.SolidRegistry])
99
120
  ], ErrorMapperService);
100
- function safeJsonStringify(obj) {
101
- try {
102
- return JSON.stringify(obj);
103
- }
104
- catch {
105
- return '';
106
- }
107
- }
108
121
  //# sourceMappingURL=error-mapper.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-mapper.service.js","sourceRoot":"","sources":["../../src/helpers/error-mapper.service.ts"],"names":[],"mappings":"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","sourcesContent":["// src/common/errors/error-mapper.service.ts\nimport { Injectable } from '@nestjs/common';\n\nexport const ERROR_CODES = [\n 'bedrock-throttling-error',\n 'bedrock-access-denied',\n 'bedrock-input-too-long',\n 'bedrock-validation-error',\n 'bedrock-model-not-found',\n 'db-duplicate-key',\n 'db-foreign-key-error',\n 'metadata-extraction-date-parsing-failed',\n 'metadata-extraction-missing-s3-file',\n 'solidx-mcp-server-unavailable',\n 'unknown-error',\n] as const;\n\nexport type ErrorCode = typeof ERROR_CODES[number];\n\n@Injectable()\nexport class ErrorMapperService {\n /**\n * Given an error/exception, return a mapped error code string.\n * Default: \"unknown-error\"\n */\n mapException(exc: unknown): ErrorCode {\n const combined = this.combineErrorText(exc);\n\n // AiInteraction - mcp server down. \n // {\n // \"success\": false,\n // \"errors\": [\n // \"unhandled errors in a TaskGroup (1 sub-exception)\"\n // ],\n // \"error_trace\": [\n // \"Traceback (most recent call last):\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/mcp/client/sse.py\\\", line 47, in sse_client\\n async with aconnect_sse(\\n ^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 210, in __aenter__\\n return await anext(self.gen)\\n ^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx_sse/_api.py\\\", line 69, in aconnect_sse\\n async with client.stream(method, url, headers=headers, **kwargs) as response:\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 210, in __aenter__\\n return await anext(self.gen)\\n ^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1583, in stream\\n response = await self.send(\\n ^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1629, in send\\n response = await self._send_handling_auth(\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1657, in _send_handling_auth\\n response = await self._send_handling_redirects(\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1694, in _send_handling_redirects\\n response = await self._send_single_request(request)\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1730, in _send_single_request\\n response = await transport.handle_async_request(request)\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\\\", line 393, in handle_async_request\\n with map_httpcore_exceptions():\\n ^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 158, in __exit__\\n self.gen.throw(value)\",\n // \"File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\\\", line 118, in map_httpcore_exceptions\\n raise mapped_exc(message) from exc\",\n // \"httpx.ConnectError: All connection attempts failed\",\n // \"During handling of the above exception, another exception occurred:\",\n // \"+ Exception Group Traceback (most recent call last):\",\n // \"| File \\\"/Users/harishpatel/mcp/clients/solidx_mcp_client/client_sse_nochat.py\\\", line 239, in main\\n | await client.connect_to_sse_server()\",\n // \"| File \\\"/Users/harishpatel/mcp/clients/solidx_mcp_client/client_sse_nochat.py\\\", line 49, in connect_to_sse_server\\n | streams = await self._streams_context.__aenter__()\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 210, in __aenter__\\n | return await anext(self.gen)\\n | ^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/mcp/client/sse.py\\\", line 43, in sse_client\\n | async with anyio.create_task_group() as tg:\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/anyio/_backends/_asyncio.py\\\", line 767, in __aexit__\\n | raise BaseExceptionGroup(\",\n // \"| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)\",\n // \"+-+---------------- 1 ----------------\",\n // \"| Traceback (most recent call last):\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\\\", line 101, in map_httpcore_exceptions\\n | yield\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\\\", line 394, in handle_async_request\\n | resp = await self._pool.handle_async_request(req)\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection_pool.py\\\", line 256, in handle_async_request\\n | raise exc from None\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection_pool.py\\\", line 236, in handle_async_request\\n | response = await connection.handle_async_request(\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection.py\\\", line 101, in handle_async_request\\n | raise exc\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection.py\\\", line 78, in handle_async_request\\n | stream = await self._connect(request)\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_async/connection.py\\\", line 124, in _connect\\n | stream = await self._network_backend.connect_tcp(**kwargs)\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_backends/auto.py\\\", line 31, in connect_tcp\\n | return await self._backend.connect_tcp(\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_backends/anyio.py\\\", line 113, in connect_tcp\\n | with map_exceptions(exc_map):\\n | ^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 158, in __exit__\\n | self.gen.throw(value)\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpcore/_exceptions.py\\\", line 14, in map_exceptions\\n | raise to_exc(exc) from exc\",\n // \"| httpcore.ConnectError: All connection attempts failed\",\n // \"| \\n | The above exception was the direct cause of the following exception:\\n |\",\n // \"| Traceback (most recent call last):\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/mcp/client/sse.py\\\", line 47, in sse_client\\n | async with aconnect_sse(\\n | ^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 210, in __aenter__\\n | return await anext(self.gen)\\n | ^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx_sse/_api.py\\\", line 69, in aconnect_sse\\n | async with client.stream(method, url, headers=headers, **kwargs) as response:\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 210, in __aenter__\\n | return await anext(self.gen)\\n | ^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1583, in stream\\n | response = await self.send(\\n | ^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1629, in send\\n | response = await self._send_handling_auth(\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1657, in _send_handling_auth\\n | response = await self._send_handling_redirects(\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1694, in _send_handling_redirects\\n | response = await self._send_single_request(request)\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_client.py\\\", line 1730, in _send_single_request\\n | response = await transport.handle_async_request(request)\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\\\", line 393, in handle_async_request\\n | with map_httpcore_exceptions():\\n | ^^^^^^^^^^^^^^^^^^^^^^^^^\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/lib/python3.12/contextlib.py\\\", line 158, in __exit__\\n | self.gen.throw(value)\",\n // \"| File \\\"/Users/harishpatel/.pyenv/versions/3.12.7/envs/solid_mcp_client/lib/python3.12/site-packages/httpx/_transports/default.py\\\", line 118, in map_httpcore_exceptions\\n | raise mapped_exc(message) from exc\",\n // \"| httpx.ConnectError: All connection attempts failed\",\n // \"+------------------------------------\"\n // ],\n // \"request\": \"\\\"Can you do 1 + 1\\\"\"\n // }\n if (combined.includes(\"all connection attempts failed\") && combined.includes(\"unhandled errors in a taskgroup (1 sub-exception)\")) {\n return 'solidx-mcp-server-unavailable';\n }\n\n // --- Bedrock errors ---\n // Throttling: \"ThrottlingException\" or \"Too many tokens\"\n if (\n combined.includes('throttlingexception') ||\n combined.includes('too many tokens')\n ) {\n return 'bedrock-throttling-error';\n }\n\n if (combined.includes('accessdeniedexception')) {\n return 'bedrock-access-denied';\n }\n\n if (\n combined.includes('validationexception') &&\n combined.includes('input is too long')\n ) {\n return 'bedrock-input-too-long';\n }\n\n if (combined.includes('validationexception')) {\n return 'bedrock-validation-error';\n }\n\n if (combined.includes('modelnotfoundexception')) {\n return 'bedrock-model-not-found';\n }\n\n // --- DB errors ---\n if (\n combined.includes('unique constraint') ||\n combined.includes('duplicate key')\n ) {\n return 'db-duplicate-key';\n }\n\n if (combined.includes('foreign key')) {\n return 'db-foreign-key-error';\n }\n\n // --- OpenSearch errors ---\n // mapper_parsing_exception on specific fields\n if (\n combined.includes('mapper_parsing_exception') &&\n (combined.includes('failed to parse field [metadata.properties.dates]') ||\n combined.includes(\n 'failed to parse field [metadata.properties.date_authored]',\n ))\n ) {\n return 'metadata-extraction-date-parsing-failed';\n }\n\n // --- S3 errors ---\n // NoSuchKey during GetObject\n if (combined.includes('nosuchkey') && combined.includes('getobject')) {\n return 'metadata-extraction-missing-s3-file';\n }\n\n // --- Catch-all ---\n return 'unknown-error';\n }\n\n /**\n * Same mapping, but takes raw strings instead of an Exception object.\n */\n mapMessage(message: string, trace?: string): ErrorCode {\n const combined = `${message ?? ''}\\n${trace ?? ''}`.toLowerCase();\n return this.mapException(combined);\n }\n\n // ---- helpers ----\n\n private combineErrorText(exc: unknown): string {\n // If caller passed us a pre-lowered string (e.g. from mapMessage), use it\n if (typeof exc === 'string') {\n return exc.toLowerCase();\n }\n\n // Standard Error\n if (exc instanceof Error) {\n const message = exc.message ?? '';\n // Many libs set .stack to \"Error: message\\n<stack>\"\n // We still include it in case upstream mutated it.\n const stack = exc.stack ?? '';\n return `${message}\\n${stack}`.toLowerCase();\n }\n\n // Some SDKs throw objects (e.g., { name, message, code, $metadata, ... })\n if (exc && typeof exc === 'object') {\n try {\n const maybeAny = exc as Record<string, unknown>;\n const msg =\n String(maybeAny.message ?? '') ||\n String(maybeAny['Message'] ?? '') ||\n '';\n const name =\n String(maybeAny.name ?? '') ||\n String(maybeAny['__type'] ?? '') ||\n '';\n const stack = String((maybeAny as any).stack ?? '');\n // Also fold in a JSON snapshot as a last resort\n const json = safeJsonStringify(maybeAny);\n return `${name}\\n${msg}\\n${stack}\\n${json}`.toLowerCase();\n } catch {\n // fall through\n }\n }\n\n // Fallback\n return String(exc ?? '').toLowerCase();\n }\n}\n\nfunction safeJsonStringify(obj: unknown): string {\n try {\n return JSON.stringify(obj);\n } catch {\n return '';\n }\n}"]}
1
+ {"version":3,"file":"error-mapper.service.js","sourceRoot":"","sources":["../../src/helpers/error-mapper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ErrorCode, ErrorMeta, ErrorRule, IErrorCodeProvider } from 'src/interfaces';\n\n// export const ERROR_CODES = [\n// 'db-duplicate-key',\n// 'db-foreign-key-error',\n// 'solidx-mcp-server-unavailable',\n// 'unknown-error',\n// ] as const;\n\n// export type ErrorCode = typeof ERROR_CODES[number];\n\n// type ErrorMeta = {\n// message: string;\n// httpStatus?: number;\n// };\n\n// const ERROR_MESSAGES: Record<ErrorCode, ErrorMeta> = {\n// 'db-duplicate-key': {\n// message: 'Duplicate key violation. A record with these values already exists.',\n// httpStatus: 409,\n// },\n// 'db-foreign-key-error': {\n// message: 'Foreign key constraint prevents this operation due to related records.',\n// httpStatus: 409,\n// },\n// 'solidx-mcp-server-unavailable': {\n// message: 'SolidX MCP server is unreachable. Please verify the MCP endpoint.',\n// httpStatus: 503,\n// },\n// 'unknown-error': {\n// message: 'An unexpected error occurred.',\n// httpStatus: 500,\n// },\n// };\n\n@Injectable()\nexport class ErrorMapperService {\n private readonly logger = new Logger(ErrorMapperService.name);\n\n constructor(private readonly solidRegistry: SolidRegistry) { }\n\n /** Map an exception object (or string) to a canonical ErrorCode */\n mapException(exc: unknown): ErrorCode {\n const combined = this.combineErrorText(exc);\n return this.matchCode(combined);\n }\n\n /** Map plain message/trace to ErrorCode */\n mapMessage(message: string, trace?: string): ErrorCode {\n const combined = `${message ?? ''}\\n${trace ?? ''}`.toLowerCase();\n return this.matchCode(combined);\n }\n\n /** Get static message for a given code */\n getMessage(code: ErrorCode): string {\n const meta = this.lookupMeta(code);\n return (meta ?? { message: 'An unexpected error occurred.' }).message;\n }\n\n /** Get default HTTP status for a code (falls back to 500) */\n getHttpStatus(code: ErrorCode): number {\n const meta = this.lookupMeta(code);\n return meta?.httpStatus ?? 500;\n }\n\n // ---- internal helpers ----\n private matchCode(combined: string): ErrorCode {\n const rules = this.getAllRulesSorted();\n for (const rule of rules) {\n try {\n if (rule.match(combined)) return rule.code;\n } catch (e) {\n // Defensive: bad provider shouldn't crash mapping\n this.logger.warn(`Error rule threw in match(): code=${rule.code} provider? — ${e}`);\n }\n }\n return 'unknown-error';\n }\n\n private lookupMeta(code: ErrorCode): ErrorMeta | undefined {\n // Prefer the first rule with that code\n const rules = this.getAllRulesSorted();\n const rule = rules.find((r) => r.code === code);\n if (rule?.meta) return rule.meta;\n\n // Optional: ask providers directly if they implement resolve()\n const providers = this.getProviders();\n for (const p of providers) {\n if (p.resolve) {\n const meta = p.resolve(code);\n if (meta) return meta;\n }\n }\n return undefined;\n }\n\n private getAllRulesSorted(): ReadonlyArray<ErrorRule> {\n const providers = this.getProviders();\n const all: ErrorRule[] = [];\n for (const p of providers) {\n try {\n const rules = p.rules() ?? [];\n // Optional: namespace collision check can be added here if desired\n all.push(...rules);\n } catch (e) {\n this.logger.warn(`ErrorCodeProvider.rules() failed for ${p.name?.()}: ${e}`);\n }\n }\n // Sort by priority desc; default 0\n return all.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n private getProviders(): IErrorCodeProvider[] {\n // convert InstanceWrapper → instance\n return this.solidRegistry\n .getErrorCodeProviders()\n .map((w) => w.instance)\n .filter(Boolean) as IErrorCodeProvider[];\n }\n\n private combineErrorText(exc: unknown): string {\n if (typeof exc === 'string') return exc.toLowerCase();\n\n if (exc instanceof Error) {\n const message = exc.message ?? '';\n const stack = exc.stack ?? '';\n return `${message}\\n${stack}`.toLowerCase();\n }\n\n if (exc && typeof exc === 'object') {\n try {\n const obj = exc as Record<string, unknown>;\n const msg = String(obj.message ?? (obj as any)['Message'] ?? '');\n const name = String(obj.name ?? (obj as any)['__type'] ?? '');\n const stack = String((obj as any).stack ?? '');\n const json = this.safeJsonStringify(obj);\n return `${name}\\n${msg}\\n${stack}\\n${json}`.toLowerCase();\n } catch {\n // ignore\n }\n }\n\n return String(exc ?? '').toLowerCase();\n }\n\n private safeJsonStringify(obj: unknown): string {\n try {\n return JSON.stringify(obj);\n } catch {\n return '';\n }\n }\n}"]}
@@ -0,0 +1,7 @@
1
+ import { ErrorMeta, ErrorRule, IErrorCodeProvider } from 'src/interfaces';
2
+ export declare class SolidCoreErrorCodesProvider implements IErrorCodeProvider {
3
+ name(): string;
4
+ rules(): ReadonlyArray<ErrorRule>;
5
+ resolve(code: string): ErrorMeta | undefined;
6
+ }
7
+ //# sourceMappingURL=solid-core-error-codes-provider.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-core-error-codes-provider.service.d.ts","sourceRoot":"","sources":["../../src/helpers/solid-core-error-codes-provider.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG1E,qBAEa,2BAA4B,YAAW,kBAAkB;IAClE,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,aAAa,CAAC,SAAS,CAAC;IA6CjC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAI/C"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SolidCoreErrorCodesProvider = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const error_codes_provider_decorator_1 = require("../decorators/error-codes-provider.decorator");
12
+ let SolidCoreErrorCodesProvider = class SolidCoreErrorCodesProvider {
13
+ name() {
14
+ return 'SolidCoreErrorCodeProvider';
15
+ }
16
+ rules() {
17
+ return [
18
+ {
19
+ code: 'solidx-mcp-server-unavailable',
20
+ priority: 100,
21
+ match: (txt) => txt.includes('all connection attempts failed') &&
22
+ txt.includes('unhandled errors in a taskgroup (1 sub-exception)'),
23
+ meta: {
24
+ message: 'SolidX MCP server is unreachable. Please verify the MCP endpoint.',
25
+ httpStatus: 503,
26
+ },
27
+ },
28
+ {
29
+ code: 'db-duplicate-key',
30
+ priority: 90,
31
+ match: (txt) => txt.includes('unique constraint') || txt.includes('duplicate key'),
32
+ meta: {
33
+ message: 'Duplicate key violation. A record with these values already exists.',
34
+ httpStatus: 409,
35
+ },
36
+ },
37
+ {
38
+ code: 'db-foreign-key-error',
39
+ priority: 90,
40
+ match: (txt) => txt.includes('violates foreign key'),
41
+ meta: {
42
+ message: 'Foreign key constraint prevents this operation due to related records.',
43
+ httpStatus: 409,
44
+ },
45
+ },
46
+ {
47
+ code: 'unknown-error',
48
+ priority: -1,
49
+ match: (_txt) => true,
50
+ meta: {
51
+ message: 'An unexpected error occurred.',
52
+ httpStatus: 500,
53
+ },
54
+ },
55
+ ];
56
+ }
57
+ resolve(code) {
58
+ const rule = this.rules().find((r) => r.code === code);
59
+ return rule?.meta;
60
+ }
61
+ };
62
+ exports.SolidCoreErrorCodesProvider = SolidCoreErrorCodesProvider;
63
+ exports.SolidCoreErrorCodesProvider = SolidCoreErrorCodesProvider = __decorate([
64
+ (0, error_codes_provider_decorator_1.ErrorCodeProvider)(),
65
+ (0, common_1.Injectable)()
66
+ ], SolidCoreErrorCodesProvider);
67
+ //# sourceMappingURL=solid-core-error-codes-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-core-error-codes-provider.service.js","sourceRoot":"","sources":["../../src/helpers/solid-core-error-codes-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AACA,2CAA4C;AAC5C,iGAAkF;AAM3E,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACpC,IAAI;QACA,OAAO,4BAA4B,CAAC;IACxC,CAAC;IAED,KAAK;QACD,OAAO;YACH;gBACI,IAAI,EAAE,+BAA+B;gBACrC,QAAQ,EAAE,GAAG;gBACb,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACX,GAAG,CAAC,QAAQ,CAAC,gCAAgC,CAAC;oBAC9C,GAAG,CAAC,QAAQ,CAAC,mDAAmD,CAAC;gBACrE,IAAI,EAAE;oBACF,OAAO,EAAE,mEAAmE;oBAC5E,UAAU,EAAE,GAAG;iBAClB;aACJ;YACD;gBACI,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAClF,IAAI,EAAE;oBACF,OAAO,EAAE,qEAAqE;oBAC9E,UAAU,EAAE,GAAG;iBAClB;aACJ;YACD;gBACI,IAAI,EAAE,sBAAsB;gBAC5B,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBACpD,IAAI,EAAE;oBACF,OAAO,EACH,wEAAwE;oBAC5E,UAAU,EAAE,GAAG;iBAClB;aACJ;YACD;gBACI,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,CAAC,CAAC;gBACZ,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;gBACrB,IAAI,EAAE;oBACF,OAAO,EAAE,+BAA+B;oBACxC,UAAU,EAAE,GAAG;iBAClB;aACJ;SACJ,CAAC;IACN,CAAC;IAGD,OAAO,CAAC,IAAY;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvD,OAAO,IAAI,EAAE,IAAI,CAAC;IACtB,CAAC;CACJ,CAAA;AAtDY,kEAA2B;sCAA3B,2BAA2B;IAFvC,IAAA,kDAAiB,GAAE;IACnB,IAAA,mBAAU,GAAE;GACA,2BAA2B,CAsDvC","sourcesContent":["// src/common/errors/providers/solidcore-error-code.provider.ts\nimport { Injectable } from '@nestjs/common';\nimport { ErrorCodeProvider } from 'src/decorators/error-codes-provider.decorator';\nimport { ErrorMeta, ErrorRule, IErrorCodeProvider } from 'src/interfaces';\n\n\n@ErrorCodeProvider()\n@Injectable()\nexport class SolidCoreErrorCodesProvider implements IErrorCodeProvider {\n name(): string {\n return 'SolidCoreErrorCodeProvider';\n }\n\n rules(): ReadonlyArray<ErrorRule> {\n return [\n {\n code: 'solidx-mcp-server-unavailable',\n priority: 100, // run early\n match: (txt) =>\n txt.includes('all connection attempts failed') &&\n txt.includes('unhandled errors in a taskgroup (1 sub-exception)'),\n meta: {\n message: 'SolidX MCP server is unreachable. Please verify the MCP endpoint.',\n httpStatus: 503,\n },\n },\n {\n code: 'db-duplicate-key',\n priority: 90,\n match: (txt) => txt.includes('unique constraint') || txt.includes('duplicate key'),\n meta: {\n message: 'Duplicate key violation. A record with these values already exists.',\n httpStatus: 409,\n },\n },\n {\n code: 'db-foreign-key-error',\n priority: 90,\n match: (txt) => txt.includes('violates foreign key'),\n meta: {\n message:\n 'Foreign key constraint prevents this operation due to related records.',\n httpStatus: 409,\n },\n },\n {\n code: 'unknown-error',\n priority: -1, // last resort\n match: (_txt) => true, // fallback catch-all\n meta: {\n message: 'An unexpected error occurred.',\n httpStatus: 500,\n },\n },\n ];\n }\n\n // Optional explicit meta resolution (if you want)\n resolve(code: string): ErrorMeta | undefined {\n const rule = this.rules().find((r) => r.code === code);\n return rule?.meta;\n }\n}"]}