@kohost/api-client 3.0.0-beta.7 → 3.0.0-beta.70

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 (261) hide show
  1. package/README.md +71 -0
  2. package/dist/cjs/AMQPClient/index.js +298 -0
  3. package/dist/cjs/{Client.js → Client/index.js} +1535 -586
  4. package/dist/cjs/Commands/CheckInReservationCommand.js +19 -0
  5. package/dist/cjs/Commands/Command.js +34 -0
  6. package/dist/cjs/Commands/CreateImageUploadEndpointCommand.js +17 -0
  7. package/dist/cjs/Commands/CreateShortLinkCommand.js +20 -0
  8. package/dist/cjs/Commands/DiscoverCategoriesCommand.js +20 -0
  9. package/dist/cjs/Commands/DiscoverReservationSpaceCategoryAvailabilitiesCommand.js +20 -0
  10. package/dist/cjs/Commands/DiscoverReservationsCommand.js +20 -0
  11. package/dist/cjs/Commands/DiscoverRoomsCommand.js +37 -0
  12. package/dist/cjs/Commands/DiscoverUsersCommand.js +19 -0
  13. package/dist/cjs/Commands/GetMobileKeyCommand.js +24 -0
  14. package/dist/cjs/Commands/GetProductsCommand.js +17 -0
  15. package/dist/cjs/Commands/OCRDocumentCommand.js +15 -0
  16. package/dist/cjs/Commands/SellProductsCommand.js +17 -0
  17. package/dist/cjs/Commands/SendEmailCommand.js +24 -0
  18. package/dist/cjs/Commands/SendSMSCommand.js +21 -0
  19. package/dist/cjs/Commands/SetAlarmCommand.js +17 -0
  20. package/dist/cjs/Commands/SetCourtesyCommand.js +17 -0
  21. package/dist/cjs/Commands/SetDimmerCommand.js +17 -0
  22. package/dist/cjs/Commands/SetLockCommand.js +17 -0
  23. package/dist/cjs/Commands/SetMediaCommand.js +17 -0
  24. package/dist/cjs/Commands/SetSceneCommand.js +17 -0
  25. package/dist/cjs/Commands/SetSwitchCommand.js +17 -0
  26. package/dist/cjs/Commands/SetThermostatCommand.js +17 -0
  27. package/dist/cjs/Commands/SetWindowCoveringCommand.js +17 -0
  28. package/dist/cjs/Commands/UpdateReservationCommand.js +19 -0
  29. package/dist/cjs/Commands/UpdateUserCommand.js +41 -0
  30. package/dist/cjs/Commands/UploadImageCommand.js +17 -0
  31. package/dist/cjs/Commands/index.js +55 -0
  32. package/dist/cjs/Errors/AppError.js +8 -0
  33. package/dist/cjs/Errors/AuthenticationError.js +9 -0
  34. package/dist/cjs/Errors/AuthorizationError.js +9 -0
  35. package/dist/cjs/Errors/ConflictError.js +9 -0
  36. package/dist/cjs/Errors/DeviceCommError.js +9 -0
  37. package/dist/cjs/Errors/LoginError.js +9 -0
  38. package/dist/cjs/Errors/NotFoundError.js +9 -0
  39. package/dist/cjs/Errors/RequestError.js +9 -0
  40. package/dist/cjs/Errors/SystemCommError.js +9 -0
  41. package/dist/cjs/Errors/TokenExpiredError.js +9 -0
  42. package/dist/cjs/Errors/UnprocessableRequestError.js +9 -0
  43. package/dist/cjs/Errors/ValidationError.js +9 -0
  44. package/dist/cjs/Errors/index.js +16 -0
  45. package/dist/cjs/Events/ApplicationInUseEvent.js +21 -0
  46. package/dist/cjs/Events/ApplicationOutOfUseEvent.js +21 -0
  47. package/dist/cjs/Events/EmailEvent.js +18 -0
  48. package/dist/cjs/Events/Event.js +55 -0
  49. package/dist/cjs/Events/SMSEvent.js +18 -0
  50. package/dist/cjs/Events/SMSSentEvent.js +17 -0
  51. package/dist/cjs/Events/SceneSetEvent.js +17 -0
  52. package/dist/cjs/Events/ShortLinkCreatedEvent.js +17 -0
  53. package/dist/cjs/Events/SystemAlarmUpdatedEvent.js +17 -0
  54. package/dist/cjs/Events/SystemCameraUpdatedEvent.js +17 -0
  55. package/dist/cjs/Events/SystemCategoryUpdatedEvent.js +17 -0
  56. package/dist/cjs/Events/SystemCourtesyUpdatedEvent.js +17 -0
  57. package/dist/cjs/Events/SystemDimmerUpdatedEvent.js +17 -0
  58. package/dist/cjs/Events/SystemGatewayUpdatedEvent.js +17 -0
  59. package/dist/cjs/Events/SystemLockUpdatedEvent.js +17 -0
  60. package/dist/cjs/Events/SystemMediaSourceUpdatedEvent.js +17 -0
  61. package/dist/cjs/Events/SystemMotionSensorUpdatedEvent.js +17 -0
  62. package/dist/cjs/Events/SystemProductUpdatedEvent.js +17 -0
  63. package/dist/cjs/Events/SystemReservationUpdatedEvent.js +17 -0
  64. package/dist/cjs/Events/SystemSceneControllerUpdatedEvent.js +17 -0
  65. package/dist/cjs/Events/SystemSpaceUpdatedEvent.js +17 -0
  66. package/dist/cjs/Events/SystemSwitchUpdatedEvent.js +17 -0
  67. package/dist/cjs/Events/SystemThermostatUpdatedEvent.js +17 -0
  68. package/dist/cjs/Events/SystemUserUpdatedEvent.js +17 -0
  69. package/dist/cjs/Events/SystemWindowCoveringUpdatedEvent.js +17 -0
  70. package/dist/cjs/Events/index.js +54 -0
  71. package/dist/cjs/Models/Alarm.js +35 -0
  72. package/dist/cjs/Models/Camera.js +35 -0
  73. package/dist/cjs/Models/Category.js +36 -0
  74. package/dist/cjs/Models/Courtesy.js +39 -0
  75. package/dist/cjs/Models/Credential.js +35 -0
  76. package/dist/cjs/Models/Dimmer.js +61 -0
  77. package/dist/cjs/Models/DiscoveredDevice.js +36 -0
  78. package/dist/cjs/Models/EmailMessage.js +35 -0
  79. package/dist/cjs/Models/EnergyReport.js +35 -0
  80. package/dist/cjs/Models/EnergyReportShard.js +35 -0
  81. package/dist/cjs/Models/Gateway.js +35 -0
  82. package/dist/cjs/Models/Identification.js +38 -0
  83. package/dist/cjs/Models/Kohost.js +96 -0
  84. package/dist/cjs/Models/Lock.js +39 -0
  85. package/dist/cjs/Models/MediaFile.js +48 -0
  86. package/dist/cjs/Models/MediaSource.js +35 -0
  87. package/dist/cjs/Models/MotionSensor.js +35 -0
  88. package/dist/cjs/Models/Notification.js +34 -0
  89. package/dist/cjs/Models/Order.js +97 -0
  90. package/dist/cjs/Models/Organization.js +34 -0
  91. package/dist/cjs/Models/Product.js +35 -0
  92. package/dist/cjs/Models/Property.js +34 -0
  93. package/dist/cjs/Models/Reservation.js +114 -0
  94. package/dist/cjs/Models/Room.js +218 -0
  95. package/dist/cjs/Models/Scene.js +169 -0
  96. package/dist/cjs/Models/ShortLink.js +35 -0
  97. package/dist/cjs/Models/SmsMessage.js +35 -0
  98. package/dist/cjs/Models/Space.js +97 -0
  99. package/dist/cjs/Models/Switch.js +39 -0
  100. package/dist/cjs/Models/SystemUser.js +55 -0
  101. package/dist/cjs/Models/Thermostat.js +86 -0
  102. package/dist/cjs/Models/Ticket.js +112 -0
  103. package/dist/cjs/Models/User.js +115 -0
  104. package/dist/cjs/Models/WindowCovering.js +55 -0
  105. package/dist/cjs/Models/index.js +72 -0
  106. package/dist/cjs/SocketIoClient/index.js +74 -0
  107. package/dist/cjs/defs/deviceTypes.js +15 -0
  108. package/dist/cjs/defs/formalDeviceTypes.js +6 -0
  109. package/dist/cjs/defs/index.js +11 -0
  110. package/dist/cjs/{index.cjs.js → index.js} +7 -1
  111. package/dist/cjs/schemas/AlarmSchema.d.ts +150 -0
  112. package/dist/cjs/schemas/CameraSchema.d.ts +142 -0
  113. package/dist/cjs/schemas/CategorySchema.d.ts +81 -0
  114. package/dist/cjs/schemas/CourtesySchema.d.ts +140 -0
  115. package/dist/cjs/schemas/CredentialSchema.d.ts +21 -0
  116. package/dist/cjs/schemas/DefinitionsSchema.d.ts +10 -0
  117. package/dist/cjs/schemas/DimmerSchema.d.ts +140 -0
  118. package/dist/cjs/schemas/DiscoveredDeviceSchema.d.ts +39 -0
  119. package/dist/cjs/schemas/EmailMessageSchema.d.ts +49 -0
  120. package/dist/cjs/schemas/EnergyReportSchema.d.ts +57 -0
  121. package/dist/cjs/schemas/EnergyReportShardSchema.d.ts +61 -0
  122. package/dist/cjs/schemas/GatewaySchema.d.ts +137 -0
  123. package/dist/cjs/schemas/IdentificationSchema.d.ts +45 -0
  124. package/dist/cjs/schemas/LockSchema.d.ts +140 -0
  125. package/dist/cjs/schemas/MediaFileSchema.d.ts +43 -0
  126. package/dist/cjs/schemas/MediaSourceSchema.d.ts +237 -0
  127. package/dist/cjs/schemas/MotionSensorSchema.d.ts +136 -0
  128. package/dist/cjs/schemas/NotificationSchema.d.ts +54 -0
  129. package/dist/cjs/schemas/OrderSchema.d.ts +91 -0
  130. package/dist/cjs/schemas/OrganizationSchema.d.ts +33 -0
  131. package/dist/cjs/schemas/PaymentSchema.d.ts +33 -0
  132. package/dist/cjs/schemas/ProductSchema.d.ts +65 -0
  133. package/dist/cjs/schemas/PropertySchema.d.ts +132 -0
  134. package/dist/cjs/schemas/ReservationSchema.d.ts +112 -0
  135. package/dist/cjs/schemas/RoomSchema.d.ts +1060 -0
  136. package/dist/cjs/schemas/SceneSchema.d.ts +57 -0
  137. package/dist/cjs/schemas/ShortLinkSchema.d.ts +20 -0
  138. package/dist/cjs/schemas/SmsMessageSchema.d.ts +40 -0
  139. package/dist/cjs/schemas/SpaceSchema.d.ts +58 -0
  140. package/dist/cjs/schemas/SwitchSchema.d.ts +140 -0
  141. package/dist/cjs/schemas/SystemUserSchema.d.ts +192 -0
  142. package/dist/cjs/schemas/ThermostatSchema.d.ts +171 -0
  143. package/dist/cjs/schemas/TicketSchema.d.ts +88 -0
  144. package/dist/cjs/schemas/UserSchema.d.ts +280 -0
  145. package/dist/cjs/schemas/WindowCoveringSchema.d.ts +139 -0
  146. package/dist/cjs/schemas/alarm.json +82 -0
  147. package/dist/cjs/schemas/camera.json +50 -0
  148. package/dist/cjs/schemas/category.json +42 -0
  149. package/dist/cjs/schemas/courtesy.json +49 -0
  150. package/dist/cjs/schemas/credential.json +37 -0
  151. package/dist/cjs/schemas/definitions.json +217 -0
  152. package/dist/cjs/schemas/dimmer.json +46 -0
  153. package/dist/cjs/schemas/discoveredDevice.json +31 -0
  154. package/dist/cjs/schemas/emailMessage.json +71 -0
  155. package/dist/cjs/schemas/energyReport.json +86 -0
  156. package/dist/cjs/schemas/energyReportShard.json +75 -0
  157. package/dist/cjs/schemas/gateway.json +35 -0
  158. package/dist/cjs/schemas/identification.json +61 -0
  159. package/dist/cjs/schemas/lock.json +45 -0
  160. package/dist/cjs/schemas/mediaFile.json +70 -0
  161. package/dist/cjs/schemas/mediaSource.json +187 -0
  162. package/dist/cjs/schemas/motionSensor.json +32 -0
  163. package/dist/cjs/schemas/notification.json +29 -0
  164. package/dist/cjs/schemas/order.json +182 -0
  165. package/dist/cjs/schemas/organization.json +36 -0
  166. package/dist/cjs/schemas/payment.json +47 -0
  167. package/dist/cjs/schemas/product.json +41 -0
  168. package/dist/cjs/schemas/property.json +346 -0
  169. package/dist/cjs/schemas/reservation.json +130 -0
  170. package/dist/cjs/schemas/room.json +98 -0
  171. package/dist/cjs/schemas/scene.json +121 -0
  172. package/dist/cjs/schemas/shortLink.json +30 -0
  173. package/dist/cjs/schemas/smsMessage.json +61 -0
  174. package/dist/cjs/schemas/space.json +118 -0
  175. package/dist/cjs/schemas/switch.json +45 -0
  176. package/dist/cjs/schemas/systemUser.json +98 -0
  177. package/dist/cjs/schemas/thermostat.json +150 -0
  178. package/dist/cjs/schemas/ticket.json +141 -0
  179. package/dist/cjs/schemas/user.json +170 -0
  180. package/dist/cjs/schemas/windowCovering.json +43 -0
  181. package/dist/cjs/utils/errorFactory.js +8 -0
  182. package/dist/cjs/utils/eventFactory.js +10 -0
  183. package/dist/cjs/utils/getDeviceTypes.js +7 -0
  184. package/dist/cjs/utils/getFormalDeviceType.js +5 -0
  185. package/dist/cjs/utils/index.js +11 -0
  186. package/dist/cjs/utils/schema.js +25 -0
  187. package/dist/esm/Client.js +1632 -627
  188. package/dist/esm/Client.js.map +4 -4
  189. package/dist/esm/Commands.js +521 -113
  190. package/dist/esm/Commands.js.map +3 -3
  191. package/dist/esm/Errors.js +73 -22
  192. package/dist/esm/Errors.js.map +3 -3
  193. package/dist/esm/Events.js +318 -73
  194. package/dist/esm/Events.js.map +3 -3
  195. package/dist/esm/Models.js +3322 -1199
  196. package/dist/esm/Models.js.map +4 -4
  197. package/dist/esm/SocketIoClient.js +4846 -0
  198. package/dist/esm/SocketIoClient.js.map +7 -0
  199. package/dist/esm/defs.js +146 -101
  200. package/dist/esm/defs.js.map +4 -4
  201. package/dist/esm/index.js +17 -10
  202. package/dist/esm/utils.js +445 -73
  203. package/dist/esm/utils.js.map +3 -3
  204. package/dist/useCases/AdminUpdateCustomer.js +1 -1
  205. package/dist/useCases/AssignSpaceToReservation.js +32 -0
  206. package/dist/useCases/{AdminCreateProperty.js → BatchNotifyCheckIn.js} +2 -2
  207. package/dist/useCases/{AdminCreateCustomer.js → CreateCateory.js} +2 -2
  208. package/dist/useCases/CreateImageUploadEndpoint.js +32 -0
  209. package/dist/useCases/{DeleteIntegration.js → CreateMediaSource.js} +4 -4
  210. package/dist/useCases/{AdminListCustomers.js → CreateOrganization.js} +3 -3
  211. package/dist/useCases/{AdminLoginUser.js → CreateProperty.js} +2 -2
  212. package/dist/useCases/DeleteCategory.js +32 -0
  213. package/dist/useCases/DeleteMediaFile.js +32 -0
  214. package/dist/useCases/DeleteMediaSource.js +32 -0
  215. package/dist/useCases/{ListIntegrations.js → DescribeCategory.js} +3 -3
  216. package/dist/useCases/{DeleteSource.js → DescribeLockCredential.js} +3 -3
  217. package/dist/useCases/{AdminListAdminUsers.js → DescribeMediaSource.js} +3 -3
  218. package/dist/useCases/DescribeMyAccessCredentials.js +32 -0
  219. package/dist/useCases/{AdminCreateAdminUser.js → DescribeOrganization.js} +4 -4
  220. package/dist/useCases/{DescribeIntegration.js → DescribeProduct.js} +2 -2
  221. package/dist/useCases/{AdminDescribeCustomer.js → DescribeProperty.js} +2 -2
  222. package/dist/useCases/DescribeReservationEarlyCheckInProducts.js +32 -0
  223. package/dist/useCases/DescribeReservationLateCheckOutProducts.js +32 -0
  224. package/dist/useCases/{AdminDescribeProperty.js → DescribeReservationRoomUpgrades.js} +2 -2
  225. package/dist/useCases/ListCategories.js +32 -0
  226. package/dist/useCases/ListMediaSources.js +32 -0
  227. package/dist/useCases/{CreateSource.js → ListMyOrders.js} +4 -4
  228. package/dist/useCases/{AdminListProperties.js → ListMyTickets.js} +2 -2
  229. package/dist/useCases/ListOrders.js +32 -0
  230. package/dist/useCases/{AdminRefreshToken.js → ListOrganizations.js} +3 -3
  231. package/dist/useCases/ListProperties.js +32 -0
  232. package/dist/useCases/ListScenes.js +32 -0
  233. package/dist/useCases/ListTeam.js +32 -0
  234. package/dist/useCases/ListUserOrders.js +32 -0
  235. package/dist/useCases/ListUserSpaces.js +32 -0
  236. package/dist/useCases/LogoutUser.js +32 -0
  237. package/dist/useCases/PurchaseReservationEarlyCheckInProducts.js +32 -0
  238. package/dist/useCases/PurchaseReservationLateCheckOutProducts.js +32 -0
  239. package/dist/useCases/{CreateIntegrationDeviceMapEntry.js → PurchaseReservationRoomUpgrades.js} +2 -2
  240. package/dist/useCases/RequestLoginLink.js +1 -1
  241. package/dist/useCases/{CreateIntegration.js → RequestMyKeyToken.js} +2 -2
  242. package/dist/useCases/RequestPWAToken.js +32 -0
  243. package/dist/useCases/SendCheckInSMS.js +32 -0
  244. package/dist/useCases/{SetSource.js → SetDimmer.js} +2 -2
  245. package/dist/useCases/{DescribeSource.js → SetMediaSource.js} +3 -3
  246. package/dist/useCases/{UpdateSource.js → SetRoomScene.js} +3 -3
  247. package/dist/useCases/SetSpaceScene.js +32 -0
  248. package/dist/useCases/TipUser.js +32 -0
  249. package/dist/useCases/{AdminUpdateProperty.js → UpdateCategory.js} +2 -2
  250. package/dist/useCases/{UpdateIntegration.js → UpdateMediaSource.js} +3 -3
  251. package/dist/useCases/UpdateProperty.js +32 -0
  252. package/dist/useCases/UpdateReservationExpectedArrivalTime.js +32 -0
  253. package/dist/useCases/{ListSources.js → UploadImage.js} +4 -4
  254. package/package.json +36 -10
  255. package/dist/cjs/Commands.js +0 -585
  256. package/dist/cjs/Errors.js +0 -176
  257. package/dist/cjs/Events.js +0 -387
  258. package/dist/cjs/Models.js +0 -3612
  259. package/dist/cjs/defs.js +0 -178
  260. package/dist/cjs/utils.js +0 -250
  261. package/dist/useCases/AdminRequestLoginLink.js +0 -32
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ [![npm version](https://badge.fury.io/js/@kohost%2Fapi-client.svg)](https://badge.fury.io/js/@kohost%2Fapi-client) [![Use Case Synced](https://github.com/kohost/api-client/actions/workflows/sync-use-cases.yml/badge.svg?branch=master)](https://github.com/kohost/api-client/actions/workflows/sync-use-cases.yml)
2
+
3
+ # Kohost API Client
4
+
5
+ Kohost API Client is a Node.js and Browser library for interacting with the Kohost API. It provides a simple and convenient way to access the API, as well as standard models, schemas, commands, and events.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @kohost/api-client
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ The library consists of several modules, including:
16
+
17
+ - Models: Defines the models used in the API.
18
+ - Errors: Defines the error objects returned by the API.
19
+ - Commands: Defines the available commands for managing hosting resources.
20
+ - Events: Defines the events emitted by the API.
21
+ - defs: Defines the API endpoint definitions.
22
+ - utils: Contains utility functions.
23
+ - Client: The main http client for interacting with the API
24
+
25
+ ```javascript
26
+ import { Client } from "@kohost/api-client";
27
+
28
+ const kohost = new Client({
29
+ url: "https://localhost:8080/v3",
30
+ propertyId: "development",
31
+ });
32
+ ```
33
+
34
+ ## Authentication
35
+
36
+ Currently, the only supported mode of Authentication with the API is via an HTTP Only cookie. You can login a user via the following command to get a cookie.
37
+
38
+ ### Requesting a Login Token
39
+
40
+ ```javascript
41
+ const email = "help@kohost.io";
42
+
43
+ await kohost.RequestLoginLink({
44
+ data: { email },
45
+ });
46
+
47
+ /** OR via Phone **/
48
+
49
+ const phone = "+17025555555";
50
+
51
+ await kohost.RequestLoginLink({
52
+ data: { phone },
53
+ });
54
+ ```
55
+
56
+ Click the link in the email or SMS to authenticate.
57
+
58
+ ### Using a Token
59
+
60
+ Simply use the `LoginUser` use case to provide a user ID via the `sub` parameter, along with the `token` parameter.
61
+
62
+ ```javascript
63
+ const sub = "user-id-from-api";
64
+ const token = "token-provided-by-api";
65
+
66
+ await kohost.LoginUser({
67
+ data: { sub, token },
68
+ });
69
+ ```
70
+
71
+ A successful response will set an HTTP only cookie in the browser.
@@ -0,0 +1,298 @@
1
+ const Errors = require("../Errors");
2
+ const amqp = require("amqplib");
3
+ const crypto = require("crypto");
4
+ const isFatalError = require("amqplib/lib/connection").isFatalError;
5
+ const debug = require("debug")("kohost:amqp-client");
6
+
7
+ const HEADER_KEY_ORGANIZATION_ID = "X-Organization-Id";
8
+ const HEADER_KEY_PROPERTY_ID = "X-Property-Id";
9
+ const HEADER_KEY_DRIVER = "X-Driver";
10
+ const HEADER_KEY_COMMAND_NAME = "X-Command-Name";
11
+ const HEADER_KEY_EVENT_NAME = "X-Event-Name";
12
+
13
+ const exchanges = {
14
+ // routes commands based on `command-name` header and in many cases `property-id` header
15
+ Commands: {
16
+ name: "kohost.commands",
17
+ type: "headers",
18
+ options: {
19
+ durable: true,
20
+ },
21
+ },
22
+ // routes events based on routing keys
23
+ DriverEvents: {
24
+ name: "kohost.events.drivers",
25
+ type: "topic",
26
+ options: {
27
+ durable: true,
28
+ },
29
+ },
30
+ AppEvents: {
31
+ name: "kohost.events.app",
32
+ type: "topic",
33
+ options: {
34
+ durable: true,
35
+ },
36
+ },
37
+ Direct: {
38
+ name: "kohost.direct",
39
+ type: "direct",
40
+ options: {
41
+ durable: true,
42
+ },
43
+ },
44
+ Replies: {
45
+ name: "kohost.replies",
46
+ type: "topic",
47
+ options: {
48
+ durable: true,
49
+ },
50
+ },
51
+ // dead letter exchange
52
+ dlx: {
53
+ name: "kohost.dlx",
54
+ type: "direct",
55
+ },
56
+ };
57
+
58
+ class KohostAMQPClient {
59
+ static get Message() {
60
+ return Message;
61
+ }
62
+
63
+ static get exchanges() {
64
+ return exchanges;
65
+ }
66
+ static generateCorrelationId() {
67
+ return crypto.randomUUID();
68
+ }
69
+
70
+ static validateMessage(message) {
71
+ if (!message) throw new Error("Message is required");
72
+ }
73
+
74
+ static parseError(err) {
75
+ let type;
76
+ let message;
77
+ let options = {};
78
+ if (err.message && err.type) {
79
+ const { message: errMessage, type: errType, ...rest } = err;
80
+ type = errType;
81
+ message = errMessage;
82
+ options = rest;
83
+ } else {
84
+ message = "Unknown Error";
85
+ }
86
+
87
+ debug("parseError", type, message, options);
88
+
89
+ switch (type) {
90
+ case "RequestError":
91
+ return new Errors.RequestError(message, options);
92
+
93
+ case "AuthenticationError":
94
+ return new Errors.AuthenticationError(message, options);
95
+
96
+ case "ValidationError":
97
+ return new Errors.ValidationError(message, options);
98
+
99
+ case "NotFoundError":
100
+ return new Errors.NotFoundError(message, options);
101
+
102
+ case "UnprocessableRequestError":
103
+ return new Errors.UnprocessableRequestError(message, options);
104
+
105
+ default:
106
+ return new Error(message, options);
107
+ }
108
+ }
109
+
110
+ static parseMessage(message) {
111
+ debug("parseMessage input %o", message);
112
+
113
+ let error = null;
114
+ let data = {};
115
+ let query = {};
116
+ let context = {};
117
+ let headers = {};
118
+
119
+ const isCommand = message?.properties?.type === "Command";
120
+ const isEvent = message?.properties?.type === "Event";
121
+
122
+ const messageHeaders = message?.properties?.headers || {};
123
+
124
+ const commandName = messageHeaders[HEADER_KEY_COMMAND_NAME] || null;
125
+ const eventName = messageHeaders[HEADER_KEY_EVENT_NAME] || null;
126
+
127
+ if (message.content) {
128
+ try {
129
+ const payload =
130
+ message.properties?.contentType === "application/json"
131
+ ? JSON.parse(message.content.toString())
132
+ : message.content.toString();
133
+ data = payload?.data || {};
134
+ error = payload?.error;
135
+ query = payload?.query || {};
136
+ context = payload?.context || {};
137
+ } catch (error) {
138
+ data = message.content.toString();
139
+ }
140
+ }
141
+
142
+ if (message?.properties?.headers) {
143
+ const orgHeader = message.properties.headers[HEADER_KEY_ORGANIZATION_ID];
144
+ const propertyHeader = message.properties.headers[HEADER_KEY_PROPERTY_ID];
145
+ const driverHeader = message.properties.headers[HEADER_KEY_DRIVER];
146
+
147
+ if (orgHeader) {
148
+ context.organizationId = orgHeader;
149
+ headers[HEADER_KEY_ORGANIZATION_ID] = orgHeader;
150
+ }
151
+
152
+ if (propertyHeader) {
153
+ context.propertyId = propertyHeader;
154
+ headers[HEADER_KEY_PROPERTY_ID] = propertyHeader;
155
+ }
156
+
157
+ if (driverHeader) {
158
+ context.driver = driverHeader;
159
+ headers[HEADER_KEY_DRIVER] = driverHeader;
160
+ }
161
+ }
162
+
163
+ const parsed = {};
164
+
165
+ if (error) parsed.error = this.parseError(error);
166
+
167
+ parsed.data = data;
168
+ parsed.query = query;
169
+ parsed.context = context;
170
+ parsed.headers = headers;
171
+
172
+ if (isEvent && eventName) parsed.event = eventName;
173
+ else if (isCommand && commandName) parsed.command = commandName;
174
+
175
+ debug("parseMessage parsed %o", parsed);
176
+
177
+ return parsed;
178
+ }
179
+
180
+ static getMessage(message) {
181
+ if (!message?.content) return null;
182
+ const payload = JSON.parse(message.content.toString());
183
+ const data = payload?.data;
184
+ return data;
185
+ }
186
+
187
+ static isFatalError(err) {
188
+ return isFatalError(err);
189
+ }
190
+
191
+ async createConnection(connection, options = {}) {
192
+ return await amqp.connect(connection, options);
193
+ }
194
+
195
+ static createMessage(content) {
196
+ return new Message(content);
197
+ }
198
+
199
+ async createChannel(connection) {
200
+ const channel = await connection.createChannel();
201
+ return channel;
202
+ }
203
+
204
+ async assertExchange(channel, { exchange, type, options }) {
205
+ return await channel.assertExchange(exchange, type, options);
206
+ }
207
+
208
+ async assertQueue(channel, { queue, options }) {
209
+ return await channel.assertQueue(queue, options);
210
+ }
211
+
212
+ async bindQueue(channel, { queue, exchange, routingKey, args }) {
213
+ return await channel.bindQueue(queue, exchange, routingKey, args);
214
+ }
215
+
216
+ async bindExchange(channel, { source, destination, routingKey, args }) {
217
+ return await channel.bindExchange(destination, source, routingKey, args);
218
+ }
219
+
220
+ async subscribeToQueue(channel, { queue, cb, options }) {
221
+ return await channel.consume(queue, cb, options);
222
+ }
223
+
224
+ publishToExchange(channel, { exchange, routingKey, content, options }) {
225
+ return channel.publish(exchange, routingKey, content, options);
226
+ }
227
+ }
228
+
229
+ class Message {
230
+ constructor(content) {
231
+ this.toExchange = null;
232
+ this.content = content;
233
+ this.options = {
234
+ contentType: "application/json",
235
+ timestamp: Date.now(),
236
+ };
237
+ this.routingKey = "";
238
+ }
239
+
240
+ get correlationId() {
241
+ return this.options.correlationId || null;
242
+ }
243
+
244
+ to({ exchange }) {
245
+ if (typeof exchange === "undefined")
246
+ throw new Error("Exchange is required");
247
+ this.toExchange = exchange;
248
+ return this;
249
+ }
250
+
251
+ withType(type) {
252
+ this.options.type = type;
253
+ return this;
254
+ }
255
+
256
+ withRoutingKey(routingKey) {
257
+ this.routingKey = routingKey;
258
+ return this;
259
+ }
260
+
261
+ withHeaders(headers) {
262
+ if (!this.options.headers) this.options.headers = {};
263
+ this.options.headers = { ...this.options.headers, ...headers };
264
+ return this;
265
+ }
266
+
267
+ withContext(context) {
268
+ for (let key in context) {
269
+ this.withHeaders({ [key]: context[key] });
270
+ }
271
+ return this;
272
+ }
273
+
274
+ withCorrelationId(correlationId) {
275
+ this.options.correlationId = correlationId;
276
+ return this;
277
+ }
278
+
279
+ withReplyTo(queue) {
280
+ this.options.replyTo = queue;
281
+ return this;
282
+ }
283
+
284
+ build() {
285
+ let content = this.content;
286
+ if (content.build && typeof content.build === "function")
287
+ content = content.build();
288
+
289
+ return {
290
+ exchange: this.toExchange,
291
+ content: Buffer.from(JSON.stringify(content)),
292
+ options: this.options,
293
+ routingKey: this.routingKey,
294
+ };
295
+ }
296
+ }
297
+
298
+ module.exports = KohostAMQPClient;