@croct/sdk 0.17.7 → 0.17.8

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 (409) hide show
  1. package/activeRecord.cjs.map +1 -0
  2. package/activeRecord.d.ts +8 -4
  3. package/activeRecord.js +115 -106
  4. package/activeRecord.js.map +1 -1
  5. package/apiKey.cjs.map +1 -0
  6. package/apiKey.d.ts +4 -2
  7. package/apiKey.js +152 -141
  8. package/apiKey.js.map +1 -1
  9. package/base64Url.cjs.map +1 -0
  10. package/base64Url.d.ts +4 -2
  11. package/base64Url.js +8 -15
  12. package/base64Url.js.map +1 -1
  13. package/cache/cache.cjs.map +1 -0
  14. package/cache/cache.d.ts +6 -4
  15. package/cache/cache.js +9 -10
  16. package/cache/cache.js.map +1 -1
  17. package/cache/cookieCache.cjs.map +1 -0
  18. package/cache/cookieCache.d.ts +6 -3
  19. package/cache/cookieCache.js +52 -54
  20. package/cache/cookieCache.js.map +1 -1
  21. package/cache/fallbackCache.cjs.map +1 -0
  22. package/cache/fallbackCache.d.ts +5 -2
  23. package/cache/fallbackCache.js +20 -21
  24. package/cache/fallbackCache.js.map +1 -1
  25. package/cache/inMemoryCache.cjs.map +1 -0
  26. package/cache/inMemoryCache.d.ts +5 -2
  27. package/cache/inMemoryCache.js +15 -17
  28. package/cache/inMemoryCache.js.map +1 -1
  29. package/cache/index.cjs.map +1 -0
  30. package/cache/index.d.ts +4 -4
  31. package/cache/index.js +9 -11
  32. package/cache/index.js.map +1 -1
  33. package/cache/localStorageCache.cjs.map +1 -0
  34. package/cache/localStorageCache.d.ts +5 -2
  35. package/cache/localStorageCache.js +55 -63
  36. package/cache/localStorageCache.js.map +1 -1
  37. package/channel/channel.cjs.map +1 -0
  38. package/channel/channel.d.ts +8 -6
  39. package/channel/channel.js +21 -22
  40. package/channel/channel.js.map +1 -1
  41. package/channel/encodedChannel.cjs.map +1 -0
  42. package/channel/encodedChannel.d.ts +6 -3
  43. package/channel/encodedChannel.js +13 -14
  44. package/channel/encodedChannel.js.map +1 -1
  45. package/channel/guaranteedChannel.cjs.map +1 -0
  46. package/channel/guaranteedChannel.d.ts +9 -7
  47. package/channel/guaranteedChannel.js +74 -73
  48. package/channel/guaranteedChannel.js.map +1 -1
  49. package/channel/httpBeaconChannel.cjs.map +1 -0
  50. package/channel/httpBeaconChannel.d.ts +9 -6
  51. package/channel/httpBeaconChannel.js +82 -83
  52. package/channel/httpBeaconChannel.js.map +1 -1
  53. package/channel/index.cjs.map +1 -0
  54. package/channel/index.d.ts +12 -7
  55. package/channel/index.js +15 -17
  56. package/channel/index.js.map +1 -1
  57. package/channel/queuedChannel.cjs.map +1 -0
  58. package/channel/queuedChannel.d.ts +7 -4
  59. package/channel/queuedChannel.js +87 -97
  60. package/channel/queuedChannel.js.map +1 -1
  61. package/channel/retryChannel.cjs.map +1 -0
  62. package/channel/retryChannel.d.ts +7 -5
  63. package/channel/retryChannel.js +58 -57
  64. package/channel/retryChannel.js.map +1 -1
  65. package/channel/sandboxChannel.cjs.map +1 -0
  66. package/channel/sandboxChannel.d.ts +5 -2
  67. package/channel/sandboxChannel.js +34 -35
  68. package/channel/sandboxChannel.js.map +1 -1
  69. package/cid/assigner.cjs.map +1 -0
  70. package/cid/assigner.d.ts +3 -1
  71. package/cid/assigner.js +0 -2
  72. package/cid/assigner.js.map +1 -1
  73. package/cid/cachedAssigner.cjs.map +1 -0
  74. package/cid/cachedAssigner.d.ts +7 -5
  75. package/cid/cachedAssigner.js +37 -43
  76. package/cid/cachedAssigner.js.map +1 -1
  77. package/cid/fixedAssigner.cjs.map +1 -0
  78. package/cid/fixedAssigner.d.ts +5 -2
  79. package/cid/fixedAssigner.js +9 -10
  80. package/cid/fixedAssigner.js.map +1 -1
  81. package/cid/index.cjs.map +1 -0
  82. package/cid/index.d.ts +6 -4
  83. package/cid/index.js +9 -11
  84. package/cid/index.js.map +1 -1
  85. package/cid/remoteAssigner.cjs.map +1 -0
  86. package/cid/remoteAssigner.d.ts +6 -3
  87. package/cid/remoteAssigner.js +36 -37
  88. package/cid/remoteAssigner.js.map +1 -1
  89. package/constants.cjs.map +1 -0
  90. package/constants.d.ts +6 -4
  91. package/constants.js +10 -7
  92. package/constants.js.map +1 -1
  93. package/container.cjs.map +1 -0
  94. package/container.d.ts +28 -15
  95. package/container.js +269 -252
  96. package/container.js.map +1 -1
  97. package/contentFetcher.cjs.map +1 -0
  98. package/contentFetcher.d.ts +17 -14
  99. package/contentFetcher.js +156 -163
  100. package/contentFetcher.js.map +1 -1
  101. package/context.cjs.map +1 -0
  102. package/context.d.ts +13 -9
  103. package/context.js +80 -81
  104. package/context.js.map +1 -1
  105. package/error.cjs.map +1 -0
  106. package/error.d.ts +4 -2
  107. package/error.js +21 -21
  108. package/error.js.map +1 -1
  109. package/evaluator.cjs.map +1 -0
  110. package/evaluator.d.ts +18 -16
  111. package/evaluator.js +179 -179
  112. package/evaluator.js.map +1 -1
  113. package/eventManager.cjs.map +1 -0
  114. package/eventManager.d.ts +8 -6
  115. package/eventManager.js +24 -26
  116. package/eventManager.js.map +1 -1
  117. package/eventSubjectProcessor.cjs.map +1 -0
  118. package/eventSubjectProcessor.d.ts +16 -3
  119. package/eventSubjectProcessor.js +53 -59
  120. package/eventSubjectProcessor.js.map +1 -1
  121. package/facade/contentFetcherFacade.cjs.map +1 -0
  122. package/facade/contentFetcherFacade.d.ts +16 -7
  123. package/facade/contentFetcherFacade.js +32 -35
  124. package/facade/contentFetcherFacade.js.map +1 -1
  125. package/facade/evaluatorFacade.cjs.map +1 -0
  126. package/facade/evaluatorFacade.d.ts +17 -10
  127. package/facade/evaluatorFacade.js +56 -60
  128. package/facade/evaluatorFacade.js.map +1 -1
  129. package/facade/index.cjs.map +1 -0
  130. package/facade/index.d.ts +29 -7
  131. package/facade/index.js +19 -19
  132. package/facade/index.js.map +1 -1
  133. package/facade/sdkFacade.cjs.map +1 -0
  134. package/facade/sdkFacade.d.ts +33 -15
  135. package/facade/sdkFacade.js +201 -214
  136. package/facade/sdkFacade.js.map +1 -1
  137. package/facade/sessionFacade.cjs.map +1 -0
  138. package/facade/sessionFacade.d.ts +18 -3
  139. package/facade/sessionFacade.js +10 -11
  140. package/facade/sessionFacade.js.map +1 -1
  141. package/facade/sessionPatch.cjs.map +1 -0
  142. package/facade/sessionPatch.d.ts +17 -4
  143. package/facade/sessionPatch.js +22 -24
  144. package/facade/sessionPatch.js.map +1 -1
  145. package/facade/trackerFacade.cjs.map +1 -0
  146. package/facade/trackerFacade.d.ts +17 -4
  147. package/facade/trackerFacade.js +67 -57
  148. package/facade/trackerFacade.js.map +1 -1
  149. package/facade/userFacade.cjs.map +1 -0
  150. package/facade/userFacade.d.ts +21 -4
  151. package/facade/userFacade.js +17 -18
  152. package/facade/userFacade.js.map +1 -1
  153. package/facade/userPatch.cjs.map +1 -0
  154. package/facade/userPatch.d.ts +17 -4
  155. package/facade/userPatch.js +22 -24
  156. package/facade/userPatch.js.map +1 -1
  157. package/help.cjs.map +1 -0
  158. package/help.d.ts +3 -1
  159. package/help.js +19 -23
  160. package/help.js.map +1 -1
  161. package/index.cjs.map +1 -0
  162. package/index.d.ts +25 -3
  163. package/index.js +7 -7
  164. package/index.js.map +1 -1
  165. package/logging/consoleLogger.cjs.map +1 -0
  166. package/logging/consoleLogger.d.ts +5 -2
  167. package/logging/consoleLogger.js +23 -24
  168. package/logging/consoleLogger.js.map +1 -1
  169. package/logging/filteredLogger.cjs.map +1 -0
  170. package/logging/filteredLogger.d.ts +8 -5
  171. package/logging/filteredLogger.js +36 -37
  172. package/logging/filteredLogger.js.map +1 -1
  173. package/logging/index.cjs.map +1 -0
  174. package/logging/index.d.ts +5 -5
  175. package/logging/index.js +11 -13
  176. package/logging/index.js.map +1 -1
  177. package/logging/logger.cjs.map +1 -0
  178. package/logging/logger.d.ts +4 -2
  179. package/logging/logger.js +0 -2
  180. package/logging/logger.js.map +1 -1
  181. package/logging/namespacedLogger.cjs.map +1 -0
  182. package/logging/namespacedLogger.d.ts +5 -2
  183. package/logging/namespacedLogger.js +22 -23
  184. package/logging/namespacedLogger.js.map +1 -1
  185. package/logging/nullLogger.cjs.map +1 -0
  186. package/logging/nullLogger.d.ts +5 -2
  187. package/logging/nullLogger.js +11 -16
  188. package/logging/nullLogger.js.map +1 -1
  189. package/namespacedStorage.cjs.map +1 -0
  190. package/namespacedStorage.d.ts +3 -1
  191. package/namespacedStorage.js +51 -52
  192. package/namespacedStorage.js.map +1 -1
  193. package/package.json +60 -6
  194. package/patch.cjs.map +1 -0
  195. package/patch.d.ts +6 -4
  196. package/patch.js +0 -2
  197. package/patch.js.map +1 -1
  198. package/queue/capacityRestrictedQueue.cjs.map +1 -0
  199. package/queue/capacityRestrictedQueue.d.ts +5 -2
  200. package/queue/capacityRestrictedQueue.js +31 -32
  201. package/queue/capacityRestrictedQueue.js.map +1 -1
  202. package/queue/inMemoryQueue.cjs.map +1 -0
  203. package/queue/inMemoryQueue.d.ts +5 -2
  204. package/queue/inMemoryQueue.js +32 -34
  205. package/queue/inMemoryQueue.js.map +1 -1
  206. package/queue/index.cjs.map +1 -0
  207. package/queue/index.d.ts +6 -5
  208. package/queue/index.js +11 -13
  209. package/queue/index.js.map +1 -1
  210. package/queue/monitoredQueue.cjs.map +1 -0
  211. package/queue/monitoredQueue.d.ts +8 -5
  212. package/queue/monitoredQueue.js +104 -110
  213. package/queue/monitoredQueue.js.map +1 -1
  214. package/queue/persistentQueue.cjs.map +1 -0
  215. package/queue/persistentQueue.d.ts +5 -2
  216. package/queue/persistentQueue.js +52 -54
  217. package/queue/persistentQueue.js.map +1 -1
  218. package/queue/queue.cjs.map +1 -0
  219. package/queue/queue.d.ts +3 -1
  220. package/queue/queue.js +0 -2
  221. package/queue/queue.js.map +1 -1
  222. package/retry/arbitraryPolicy.cjs.map +1 -0
  223. package/retry/arbitraryPolicy.d.ts +5 -2
  224. package/retry/arbitraryPolicy.js +14 -15
  225. package/retry/arbitraryPolicy.js.map +1 -1
  226. package/retry/backoffPolicy.cjs.map +1 -0
  227. package/retry/backoffPolicy.d.ts +5 -3
  228. package/retry/backoffPolicy.js +52 -50
  229. package/retry/backoffPolicy.js.map +1 -1
  230. package/retry/index.cjs.map +1 -0
  231. package/retry/index.d.ts +5 -5
  232. package/retry/index.js +11 -13
  233. package/retry/index.js.map +1 -1
  234. package/retry/maxAttemptsPolicy.cjs.map +1 -0
  235. package/retry/maxAttemptsPolicy.d.ts +5 -2
  236. package/retry/maxAttemptsPolicy.js +17 -18
  237. package/retry/maxAttemptsPolicy.js.map +1 -1
  238. package/retry/neverPolicy.cjs.map +1 -0
  239. package/retry/neverPolicy.d.ts +5 -2
  240. package/retry/neverPolicy.js +9 -10
  241. package/retry/neverPolicy.js.map +1 -1
  242. package/retry/policy.cjs.map +1 -0
  243. package/retry/policy.d.ts +3 -1
  244. package/retry/policy.js +0 -2
  245. package/retry/policy.js.map +1 -1
  246. package/schema/attributeSchema.cjs.map +1 -0
  247. package/schema/attributeSchema.d.ts +6 -2
  248. package/schema/attributeSchema.js +7 -7
  249. package/schema/attributeSchema.js.map +1 -1
  250. package/schema/contentFetcherSchemas.cjs.map +1 -0
  251. package/schema/contentFetcherSchemas.d.ts +6 -2
  252. package/schema/contentFetcherSchemas.js +24 -21
  253. package/schema/contentFetcherSchemas.js.map +1 -1
  254. package/schema/contentSchemas.cjs.map +1 -0
  255. package/schema/contentSchemas.d.ts +6 -2
  256. package/schema/contentSchemas.js +45 -45
  257. package/schema/contentSchemas.js.map +1 -1
  258. package/schema/contextSchemas.cjs.map +1 -0
  259. package/schema/contextSchemas.d.ts +6 -2
  260. package/schema/contextSchemas.js +6 -6
  261. package/schema/contextSchemas.js.map +1 -1
  262. package/schema/ecommerceSchemas.cjs.map +1 -0
  263. package/schema/ecommerceSchemas.d.ts +10 -6
  264. package/schema/ecommerceSchemas.js +176 -172
  265. package/schema/ecommerceSchemas.js.map +1 -1
  266. package/schema/evaluatorSchemas.cjs.map +1 -0
  267. package/schema/evaluatorSchemas.d.ts +6 -2
  268. package/schema/evaluatorSchemas.js +46 -30
  269. package/schema/evaluatorSchemas.js.map +1 -1
  270. package/schema/eventSchemas.cjs.map +1 -0
  271. package/schema/eventSchemas.d.ts +16 -12
  272. package/schema/eventSchemas.js +125 -102
  273. package/schema/eventSchemas.js.map +1 -1
  274. package/schema/index.cjs.map +1 -0
  275. package/schema/index.d.ts +14 -11
  276. package/schema/index.js +11 -14
  277. package/schema/index.js.map +1 -1
  278. package/schema/loggerSchema.cjs.map +1 -0
  279. package/schema/loggerSchema.d.ts +6 -2
  280. package/schema/loggerSchema.js +13 -13
  281. package/schema/loggerSchema.js.map +1 -1
  282. package/schema/operationSchemas.cjs.map +1 -0
  283. package/schema/operationSchemas.d.ts +14 -10
  284. package/schema/operationSchemas.js +85 -69
  285. package/schema/operationSchemas.js.map +1 -1
  286. package/schema/sdkFacadeSchemas.cjs.map +1 -0
  287. package/schema/sdkFacadeSchemas.d.ts +6 -2
  288. package/schema/sdkFacadeSchemas.js +65 -51
  289. package/schema/sdkFacadeSchemas.js.map +1 -1
  290. package/schema/sdkSchemas.cjs.map +1 -0
  291. package/schema/sdkSchemas.d.ts +8 -4
  292. package/schema/sdkSchemas.js +80 -78
  293. package/schema/sdkSchemas.js.map +1 -1
  294. package/schema/tokenSchema.cjs.map +1 -0
  295. package/schema/tokenSchema.d.ts +6 -2
  296. package/schema/tokenSchema.js +41 -38
  297. package/schema/tokenSchema.js.map +1 -1
  298. package/schema/userSchema.cjs.map +1 -0
  299. package/schema/userSchema.d.ts +6 -2
  300. package/schema/userSchema.js +183 -134
  301. package/schema/userSchema.js.map +1 -1
  302. package/sdk.cjs.map +1 -0
  303. package/sdk.d.ts +28 -14
  304. package/sdk.js +106 -108
  305. package/sdk.js.map +1 -1
  306. package/sdkEvents.cjs.map +1 -0
  307. package/sdkEvents.d.ts +10 -5
  308. package/sdkEvents.js +0 -2
  309. package/sdkEvents.js.map +1 -1
  310. package/sourceLocation.cjs.map +1 -0
  311. package/sourceLocation.d.ts +7 -5
  312. package/sourceLocation.js +56 -57
  313. package/sourceLocation.js.map +1 -1
  314. package/tab.cjs.map +1 -0
  315. package/tab.d.ts +9 -7
  316. package/tab.js +93 -90
  317. package/tab.js.map +1 -1
  318. package/token/cachedTokenStore.cjs.map +1 -0
  319. package/token/cachedTokenStore.d.ts +8 -3
  320. package/token/cachedTokenStore.js +22 -24
  321. package/token/cachedTokenStore.js.map +1 -1
  322. package/token/inMemoryTokenStore.cjs.map +1 -0
  323. package/token/inMemoryTokenStore.d.ts +7 -2
  324. package/token/inMemoryTokenStore.js +12 -13
  325. package/token/inMemoryTokenStore.js.map +1 -1
  326. package/token/index.cjs.map +1 -0
  327. package/token/index.d.ts +7 -4
  328. package/token/index.js +9 -11
  329. package/token/index.js.map +1 -1
  330. package/token/replicatedTokenStore.cjs.map +1 -0
  331. package/token/replicatedTokenStore.d.ts +7 -2
  332. package/token/replicatedTokenStore.js +14 -15
  333. package/token/replicatedTokenStore.js.map +1 -1
  334. package/token/token.cjs.map +1 -0
  335. package/token/token.d.ts +11 -8
  336. package/token/token.js +212 -195
  337. package/token/token.js.map +1 -1
  338. package/tracker.cjs.map +1 -0
  339. package/tracker.d.ts +20 -13
  340. package/tracker.js +307 -307
  341. package/tracker.js.map +1 -1
  342. package/trackingEvents.cjs.map +1 -0
  343. package/trackingEvents.d.ts +65 -62
  344. package/trackingEvents.js +57 -56
  345. package/trackingEvents.js.map +1 -1
  346. package/transformer.cjs.map +1 -0
  347. package/transformer.d.ts +4 -2
  348. package/transformer.js +5 -6
  349. package/transformer.js.map +1 -1
  350. package/utilityTypes.cjs.map +1 -0
  351. package/utilityTypes.d.ts +4 -2
  352. package/utilityTypes.js +0 -2
  353. package/utilityTypes.js.map +1 -1
  354. package/uuid.cjs.map +1 -0
  355. package/uuid.d.ts +3 -1
  356. package/uuid.js +27 -32
  357. package/uuid.js.map +1 -1
  358. package/validation/arrayType.cjs.map +1 -0
  359. package/validation/arrayType.d.ts +5 -3
  360. package/validation/arrayType.js +45 -41
  361. package/validation/arrayType.js.map +1 -1
  362. package/validation/booleanType.cjs.map +1 -0
  363. package/validation/booleanType.d.ts +5 -2
  364. package/validation/booleanType.js +19 -16
  365. package/validation/booleanType.js.map +1 -1
  366. package/validation/functionType.cjs.map +1 -0
  367. package/validation/functionType.d.ts +5 -2
  368. package/validation/functionType.js +19 -16
  369. package/validation/functionType.js.map +1 -1
  370. package/validation/index.cjs.map +1 -0
  371. package/validation/index.d.ts +12 -12
  372. package/validation/index.js +27 -29
  373. package/validation/index.js.map +1 -1
  374. package/validation/jsonType.cjs.map +1 -0
  375. package/validation/jsonType.d.ts +8 -6
  376. package/validation/jsonType.js +89 -82
  377. package/validation/jsonType.js.map +1 -1
  378. package/validation/mixedSchema.cjs.map +1 -0
  379. package/validation/mixedSchema.d.ts +5 -2
  380. package/validation/mixedSchema.js +5 -7
  381. package/validation/mixedSchema.js.map +1 -1
  382. package/validation/nullType.cjs.map +1 -0
  383. package/validation/nullType.d.ts +5 -2
  384. package/validation/nullType.js +19 -16
  385. package/validation/nullType.js.map +1 -1
  386. package/validation/numberType.cjs.map +1 -0
  387. package/validation/numberType.d.ts +5 -3
  388. package/validation/numberType.js +40 -32
  389. package/validation/numberType.js.map +1 -1
  390. package/validation/objectType.cjs.map +1 -0
  391. package/validation/objectType.d.ts +5 -3
  392. package/validation/objectType.js +84 -85
  393. package/validation/objectType.js.map +1 -1
  394. package/validation/schema.cjs.map +1 -0
  395. package/validation/schema.d.ts +5 -3
  396. package/validation/schema.js +8 -9
  397. package/validation/schema.js.map +1 -1
  398. package/validation/stringType.cjs.map +1 -0
  399. package/validation/stringType.d.ts +5 -3
  400. package/validation/stringType.js +74 -70
  401. package/validation/stringType.js.map +1 -1
  402. package/validation/unionType.cjs.map +1 -0
  403. package/validation/unionType.d.ts +5 -2
  404. package/validation/unionType.js +37 -35
  405. package/validation/unionType.js.map +1 -1
  406. package/validation/violation.cjs.map +1 -0
  407. package/validation/violation.d.ts +4 -2
  408. package/validation/violation.js +18 -18
  409. package/validation/violation.js.map +1 -1
@@ -1,89 +1,88 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HttpBeaconChannel = void 0;
4
- const channel_1 = require("./channel");
5
- const logging_1 = require("../logging");
6
- const error_1 = require("../error");
7
- const constants_1 = require("../constants");
8
- const help_1 = require("../help");
1
+ import { MessageDeliveryError } from "./channel";
2
+ import { NullLogger } from "../logging";
3
+ import { formatMessage } from "../error";
4
+ import { CLIENT_LIBRARY } from "../constants";
5
+ import { Help } from "../help";
9
6
  class HttpBeaconChannel {
10
- constructor({ logger = new logging_1.NullLogger(), ...configuration }) {
11
- this.listeners = [];
12
- this.closed = false;
13
- this.configuration = configuration;
14
- this.logger = logger;
7
+ constructor({ logger = new NullLogger(), ...configuration }) {
8
+ this.listeners = [];
9
+ this.closed = false;
10
+ this.configuration = configuration;
11
+ this.logger = logger;
12
+ }
13
+ async publish({ id: receiptId, message }) {
14
+ if (this.closed) {
15
+ return Promise.reject(MessageDeliveryError.nonRetryable("Channel is closed"));
15
16
  }
16
- async publish({ id: receiptId, message }) {
17
- if (this.closed) {
18
- return Promise.reject(channel_1.MessageDeliveryError.nonRetryable('Channel is closed'));
19
- }
20
- const { token, timestamp, context, payload } = JSON.parse(message);
21
- const { endpointUrl, appId, cidAssigner } = this.configuration;
22
- return fetch(endpointUrl, {
23
- method: 'POST',
24
- headers: {
25
- 'X-App-Id': appId,
26
- 'X-Client-Id': await cidAssigner.assignCid(),
27
- 'X-Client-Library': constants_1.CLIENT_LIBRARY,
28
- 'Content-Type': 'application/json',
29
- ...(token !== undefined ? { 'X-Token': token } : {}),
30
- },
31
- body: JSON.stringify({
32
- context: context,
33
- payload: payload,
34
- originalTime: timestamp,
35
- departureTime: Date.now(),
36
- }),
37
- }).then(async (response) => {
38
- if (response.ok) {
39
- this.notify(receiptId);
40
- return;
41
- }
42
- const problem = await response.json().catch(() => ({
43
- type: 'https://croct.help/api/event-tracker#unexpected-error',
44
- title: response.statusText,
45
- status: response.status,
46
- }));
47
- const isRetryable = HttpBeaconChannel.isRetryable(problem.status);
48
- const help = help_1.Help.forStatusCode(problem.status);
49
- if (help !== undefined) {
50
- this.logger.error(help);
51
- }
52
- else if (!isRetryable) {
53
- this.logger.error(`Beacon rejected with non-retryable status: ${problem.title}`);
54
- }
55
- return Promise.reject(isRetryable
56
- ? channel_1.MessageDeliveryError.retryable(problem.title)
57
- : channel_1.MessageDeliveryError.nonRetryable(problem.title));
58
- }).catch(error => {
59
- this.logger.error(`Failed to publish beacon: ${(0, error_1.formatMessage)(error)}`);
60
- return Promise.reject(error instanceof channel_1.MessageDeliveryError
61
- ? error
62
- : channel_1.MessageDeliveryError.retryable(error));
63
- });
17
+ const { token, timestamp, context, payload } = JSON.parse(message);
18
+ const { endpointUrl, appId, cidAssigner } = this.configuration;
19
+ return fetch(endpointUrl, {
20
+ method: "POST",
21
+ headers: {
22
+ "X-App-Id": appId,
23
+ "X-Client-Id": await cidAssigner.assignCid(),
24
+ "X-Client-Library": CLIENT_LIBRARY,
25
+ "Content-Type": "application/json",
26
+ ...token !== void 0 ? { "X-Token": token } : {}
27
+ },
28
+ body: JSON.stringify({
29
+ context,
30
+ payload,
31
+ originalTime: timestamp,
32
+ departureTime: Date.now()
33
+ })
34
+ }).then(async (response) => {
35
+ if (response.ok) {
36
+ this.notify(receiptId);
37
+ return;
38
+ }
39
+ const problem = await response.json().catch(
40
+ () => ({
41
+ type: "https://croct.help/api/event-tracker#unexpected-error",
42
+ title: response.statusText,
43
+ status: response.status
44
+ })
45
+ );
46
+ const isRetryable = HttpBeaconChannel.isRetryable(problem.status);
47
+ const help = Help.forStatusCode(problem.status);
48
+ if (help !== void 0) {
49
+ this.logger.error(help);
50
+ } else if (!isRetryable) {
51
+ this.logger.error(`Beacon rejected with non-retryable status: ${problem.title}`);
52
+ }
53
+ return Promise.reject(
54
+ isRetryable ? MessageDeliveryError.retryable(problem.title) : MessageDeliveryError.nonRetryable(problem.title)
55
+ );
56
+ }).catch((error) => {
57
+ this.logger.error(`Failed to publish beacon: ${formatMessage(error)}`);
58
+ return Promise.reject(
59
+ error instanceof MessageDeliveryError ? error : MessageDeliveryError.retryable(error)
60
+ );
61
+ });
62
+ }
63
+ subscribe(listener) {
64
+ if (!this.listeners.includes(listener)) {
65
+ this.listeners.push(listener);
64
66
  }
65
- subscribe(listener) {
66
- if (!this.listeners.includes(listener)) {
67
- this.listeners.push(listener);
68
- }
69
- }
70
- unsubscribe(listener) {
71
- const index = this.listeners.indexOf(listener);
72
- if (index >= 0) {
73
- this.listeners.splice(index, 1);
74
- }
75
- }
76
- notify(receiptId) {
77
- this.listeners.forEach(dispatch => dispatch(receiptId));
78
- }
79
- close() {
80
- this.closed = true;
81
- return Promise.resolve();
82
- }
83
- static isRetryable(status) {
84
- // Retry on any server error and client errors 429 (rate limit) and 408 (request timeout)
85
- return status >= 500 || status === 429 || status === 408;
67
+ }
68
+ unsubscribe(listener) {
69
+ const index = this.listeners.indexOf(listener);
70
+ if (index >= 0) {
71
+ this.listeners.splice(index, 1);
86
72
  }
73
+ }
74
+ notify(receiptId) {
75
+ this.listeners.forEach((dispatch) => dispatch(receiptId));
76
+ }
77
+ close() {
78
+ this.closed = true;
79
+ return Promise.resolve();
80
+ }
81
+ static isRetryable(status) {
82
+ return status >= 500 || status === 429 || status === 408;
83
+ }
87
84
  }
88
- exports.HttpBeaconChannel = HttpBeaconChannel;
85
+ export {
86
+ HttpBeaconChannel
87
+ };
89
88
  //# sourceMappingURL=httpBeaconChannel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"httpBeaconChannel.js","sourceRoot":"","sources":["../src/channel/httpBeaconChannel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/channel/httpBeaconChannel.ts"],"sourcesContent":["import {ChannelListener, DuplexChannel, MessageDeliveryError} from './channel';\nimport {Envelope} from './guaranteedChannel';\nimport {Logger, NullLogger} from '../logging';\nimport {CidAssigner} from '../cid';\nimport {formatMessage} from '../error';\nimport {CLIENT_LIBRARY} from '../constants';\nimport {Help} from '../help';\n\nexport type Configuration = {\n appId: string,\n endpointUrl: string,\n cidAssigner: CidAssigner,\n logger?: Logger,\n};\n\ntype ApiProblem = {\n type: string,\n title: string,\n status: number,\n detail: string,\n};\n\nexport class HttpBeaconChannel implements DuplexChannel<string, Envelope<string, string>> {\n private readonly configuration: Omit<Configuration, 'logger'>;\n\n private readonly logger: Logger;\n\n private readonly listeners: Array<ChannelListener<string>> = [];\n\n private closed = false;\n\n public constructor({logger = new NullLogger(), ...configuration}: Configuration) {\n this.configuration = configuration;\n this.logger = logger;\n }\n\n public async publish({id: receiptId, message}: Envelope<string, string>): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed'));\n }\n\n const {token, timestamp, context, payload} = JSON.parse(message);\n const {endpointUrl, appId, cidAssigner} = this.configuration;\n\n return fetch(endpointUrl, {\n method: 'POST',\n headers: {\n 'X-App-Id': appId,\n 'X-Client-Id': await cidAssigner.assignCid(),\n 'X-Client-Library': CLIENT_LIBRARY,\n 'Content-Type': 'application/json',\n ...(token !== undefined ? {'X-Token': token} : {}),\n },\n body: JSON.stringify({\n context: context,\n payload: payload,\n originalTime: timestamp,\n departureTime: Date.now(),\n }),\n }).then(async response => {\n if (response.ok) {\n this.notify(receiptId);\n\n return;\n }\n\n const problem: ApiProblem = await response.json().catch(\n () => ({\n type: 'https://croct.help/api/event-tracker#unexpected-error',\n title: response.statusText,\n status: response.status,\n }),\n );\n\n const isRetryable = HttpBeaconChannel.isRetryable(problem.status);\n const help = Help.forStatusCode(problem.status);\n\n if (help !== undefined) {\n this.logger.error(help);\n } else if (!isRetryable) {\n this.logger.error(`Beacon rejected with non-retryable status: ${problem.title}`);\n }\n\n return Promise.reject(\n isRetryable\n ? MessageDeliveryError.retryable(problem.title)\n : MessageDeliveryError.nonRetryable(problem.title),\n );\n }).catch(error => {\n this.logger.error(`Failed to publish beacon: ${formatMessage(error)}`);\n\n return Promise.reject(\n error instanceof MessageDeliveryError\n ? error\n : MessageDeliveryError.retryable(error),\n );\n });\n }\n\n public subscribe(listener: ChannelListener<string>): void {\n if (!this.listeners.includes(listener)) {\n this.listeners.push(listener);\n }\n }\n\n public unsubscribe(listener: ChannelListener<string>): void {\n const index = this.listeners.indexOf(listener);\n\n if (index >= 0) {\n this.listeners.splice(index, 1);\n }\n }\n\n private notify(receiptId: string): void {\n this.listeners.forEach(dispatch => dispatch(receiptId));\n }\n\n public close(): Promise<void> {\n this.closed = true;\n\n return Promise.resolve();\n }\n\n private static isRetryable(status: number): boolean {\n // Retry on any server error and client errors 429 (rate limit) and 408 (request timeout)\n return status >= 500 || status === 429 || status === 408;\n }\n}\n"],"mappings":"AAAA,SAAwC,4BAA2B;AAEnE,SAAgB,kBAAiB;AAEjC,SAAQ,qBAAoB;AAC5B,SAAQ,sBAAqB;AAC7B,SAAQ,YAAW;AAgBZ,MAAM,kBAA6E;AAAA,EAS/E,YAAY,EAAC,SAAS,IAAI,WAAW,GAAG,GAAG,cAAa,GAAkB;AAJjF,SAAiB,YAA4C,CAAC;AAE9D,SAAQ,SAAS;AAGb,SAAK,gBAAgB;AACrB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,QAAQ,EAAC,IAAI,WAAW,QAAO,GAA4C;AACpF,QAAI,KAAK,QAAQ;AACb,aAAO,QAAQ,OAAO,qBAAqB,aAAa,mBAAmB,CAAC;AAAA,IAChF;AAEA,UAAM,EAAC,OAAO,WAAW,SAAS,QAAO,IAAI,KAAK,MAAM,OAAO;AAC/D,UAAM,EAAC,aAAa,OAAO,YAAW,IAAI,KAAK;AAE/C,WAAO,MAAM,aAAa;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,YAAY;AAAA,QACZ,eAAe,MAAM,YAAY,UAAU;AAAA,QAC3C,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,GAAI,UAAU,SAAY,EAAC,WAAW,MAAK,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,eAAe,KAAK,IAAI;AAAA,MAC5B,CAAC;AAAA,IACL,CAAC,EAAE,KAAK,OAAM,aAAY;AACtB,UAAI,SAAS,IAAI;AACb,aAAK,OAAO,SAAS;AAErB;AAAA,MACJ;AAEA,YAAM,UAAsB,MAAM,SAAS,KAAK,EAAE;AAAA,QAC9C,OAAO;AAAA,UACH,MAAM;AAAA,UACN,OAAO,SAAS;AAAA,UAChB,QAAQ,SAAS;AAAA,QACrB;AAAA,MACJ;AAEA,YAAM,cAAc,kBAAkB,YAAY,QAAQ,MAAM;AAChE,YAAM,OAAO,KAAK,cAAc,QAAQ,MAAM;AAE9C,UAAI,SAAS,QAAW;AACpB,aAAK,OAAO,MAAM,IAAI;AAAA,MAC1B,WAAW,CAAC,aAAa;AACrB,aAAK,OAAO,MAAM,8CAA8C,QAAQ,KAAK,EAAE;AAAA,MACnF;AAEA,aAAO,QAAQ;AAAA,QACX,cACM,qBAAqB,UAAU,QAAQ,KAAK,IAC5C,qBAAqB,aAAa,QAAQ,KAAK;AAAA,MACzD;AAAA,IACJ,CAAC,EAAE,MAAM,WAAS;AACd,WAAK,OAAO,MAAM,6BAA6B,cAAc,KAAK,CAAC,EAAE;AAErE,aAAO,QAAQ;AAAA,QACX,iBAAiB,uBACX,QACA,qBAAqB,UAAU,KAAK;AAAA,MAC9C;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEO,UAAU,UAAyC;AACtD,QAAI,CAAC,KAAK,UAAU,SAAS,QAAQ,GAAG;AACpC,WAAK,UAAU,KAAK,QAAQ;AAAA,IAChC;AAAA,EACJ;AAAA,EAEO,YAAY,UAAyC;AACxD,UAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ;AAE7C,QAAI,SAAS,GAAG;AACZ,WAAK,UAAU,OAAO,OAAO,CAAC;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,OAAO,WAAyB;AACpC,SAAK,UAAU,QAAQ,cAAY,SAAS,SAAS,CAAC;AAAA,EAC1D;AAAA,EAEO,QAAuB;AAC1B,SAAK,SAAS;AAEd,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEA,OAAe,YAAY,QAAyB;AAEhD,WAAO,UAAU,OAAO,WAAW,OAAO,WAAW;AAAA,EACzD;AACJ;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/channel/index.ts"],"sourcesContent":["export * from './channel';\nexport {EncodedChannel} from './encodedChannel';\nexport {GuaranteedChannel} from './guaranteedChannel';\nexport {QueuedChannel} from './queuedChannel';\nexport {RetryChannel} from './retryChannel';\nexport {SandboxChannel} from './sandboxChannel';\nexport {HttpBeaconChannel} from './httpBeaconChannel';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAc,sBAAd;AACA,4BAA6B;AAC7B,+BAAgC;AAChC,2BAA4B;AAC5B,0BAA2B;AAC3B,4BAA6B;AAC7B,+BAAgC;","names":[]}
@@ -1,7 +1,12 @@
1
- export * from './channel';
2
- export { EncodedChannel } from './encodedChannel';
3
- export { GuaranteedChannel } from './guaranteedChannel';
4
- export { QueuedChannel } from './queuedChannel';
5
- export { RetryChannel } from './retryChannel';
6
- export { SandboxChannel } from './sandboxChannel';
7
- export { HttpBeaconChannel } from './httpBeaconChannel';
1
+ export { ChannelListener, Closeable, DuplexChannel, InputChannel, MessageDeliveryError, OutputChannel } from './channel.js';
2
+ export { EncodedChannel } from './encodedChannel.js';
3
+ export { GuaranteedChannel } from './guaranteedChannel.js';
4
+ export { QueuedChannel } from './queuedChannel.js';
5
+ export { RetryChannel } from './retryChannel.js';
6
+ export { SandboxChannel } from './sandboxChannel.js';
7
+ export { HttpBeaconChannel } from './httpBeaconChannel.js';
8
+ import '../transformer.js';
9
+ import '../logging/logger.js';
10
+ import '../queue/queue.js';
11
+ import '../retry/policy.js';
12
+ import '../cid/assigner.js';
package/channel/index.js CHANGED
@@ -1,18 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HttpBeaconChannel = exports.SandboxChannel = exports.RetryChannel = exports.QueuedChannel = exports.GuaranteedChannel = exports.EncodedChannel = void 0;
4
- const tslib_1 = require("tslib");
5
- tslib_1.__exportStar(require("./channel"), exports);
6
- var encodedChannel_1 = require("./encodedChannel");
7
- Object.defineProperty(exports, "EncodedChannel", { enumerable: true, get: function () { return encodedChannel_1.EncodedChannel; } });
8
- var guaranteedChannel_1 = require("./guaranteedChannel");
9
- Object.defineProperty(exports, "GuaranteedChannel", { enumerable: true, get: function () { return guaranteedChannel_1.GuaranteedChannel; } });
10
- var queuedChannel_1 = require("./queuedChannel");
11
- Object.defineProperty(exports, "QueuedChannel", { enumerable: true, get: function () { return queuedChannel_1.QueuedChannel; } });
12
- var retryChannel_1 = require("./retryChannel");
13
- Object.defineProperty(exports, "RetryChannel", { enumerable: true, get: function () { return retryChannel_1.RetryChannel; } });
14
- var sandboxChannel_1 = require("./sandboxChannel");
15
- Object.defineProperty(exports, "SandboxChannel", { enumerable: true, get: function () { return sandboxChannel_1.SandboxChannel; } });
16
- var httpBeaconChannel_1 = require("./httpBeaconChannel");
17
- Object.defineProperty(exports, "HttpBeaconChannel", { enumerable: true, get: function () { return httpBeaconChannel_1.HttpBeaconChannel; } });
1
+ export * from "./channel";
2
+ import { EncodedChannel } from "./encodedChannel";
3
+ import { GuaranteedChannel } from "./guaranteedChannel";
4
+ import { QueuedChannel } from "./queuedChannel";
5
+ import { RetryChannel } from "./retryChannel";
6
+ import { SandboxChannel } from "./sandboxChannel";
7
+ import { HttpBeaconChannel } from "./httpBeaconChannel";
8
+ export {
9
+ EncodedChannel,
10
+ GuaranteedChannel,
11
+ HttpBeaconChannel,
12
+ QueuedChannel,
13
+ RetryChannel,
14
+ SandboxChannel
15
+ };
18
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/channel/index.ts"],"names":[],"mappings":";;;;AAAA,oDAA0B;AAC1B,mDAAgD;AAAxC,gHAAA,cAAc,OAAA;AACtB,yDAAsD;AAA9C,sHAAA,iBAAiB,OAAA;AACzB,iDAA8C;AAAtC,8GAAA,aAAa,OAAA;AACrB,+CAA4C;AAApC,4GAAA,YAAY,OAAA;AACpB,mDAAgD;AAAxC,gHAAA,cAAc,OAAA;AACtB,yDAAsD;AAA9C,sHAAA,iBAAiB,OAAA"}
1
+ {"version":3,"sources":["../src/channel/index.ts"],"sourcesContent":["export * from './channel';\nexport {EncodedChannel} from './encodedChannel';\nexport {GuaranteedChannel} from './guaranteedChannel';\nexport {QueuedChannel} from './queuedChannel';\nexport {RetryChannel} from './retryChannel';\nexport {SandboxChannel} from './sandboxChannel';\nexport {HttpBeaconChannel} from './httpBeaconChannel';\n"],"mappings":"AAAA,cAAc;AACd,SAAQ,sBAAqB;AAC7B,SAAQ,yBAAwB;AAChC,SAAQ,qBAAoB;AAC5B,SAAQ,oBAAmB;AAC3B,SAAQ,sBAAqB;AAC7B,SAAQ,yBAAwB;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/channel/queuedChannel.ts"],"sourcesContent":["import {MessageDeliveryError, OutputChannel} from './channel';\nimport {Queue} from '../queue';\nimport {Logger, NullLogger} from '../logging';\n\nexport class QueuedChannel<T> implements OutputChannel<T> {\n private readonly channel: OutputChannel<T>;\n\n private readonly queue: Queue<T>;\n\n private readonly logger: Logger;\n\n private pending?: Promise<void>;\n\n private closed = false;\n\n public constructor(channel: OutputChannel<T>, queue: Queue<T>, logger?: Logger) {\n this.channel = channel;\n this.queue = queue;\n this.logger = logger ?? new NullLogger();\n }\n\n public flush(): Promise<void> {\n if (this.pending === undefined) {\n return this.requeue();\n }\n\n return this.pending.catch(this.requeue.bind(this));\n }\n\n public publish(message: T): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n if (this.queue.length() >= this.queue.getCapacity()) {\n this.logger.warn('The queue is full, message rejected.');\n\n return Promise.reject(MessageDeliveryError.retryable('The queue is full.'));\n }\n\n if (this.pending === undefined) {\n this.pending = this.requeue();\n }\n\n this.pending = this.chainNext(this.pending, message, true);\n\n return this.pending;\n }\n\n private enqueue(message: T): void {\n this.logger.debug('Enqueueing message...');\n this.logger.debug(`Queue length: ${this.queue.length() + 1}`);\n\n this.queue.push(message);\n }\n\n private dequeue(): void {\n this.logger.debug('Dequeuing message...');\n this.logger.debug(`Queue length: ${Math.max(0, this.queue.length() - 1)}`);\n\n this.queue.shift();\n }\n\n private requeue(): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n this.pending = Promise.resolve();\n\n if (this.queue.isEmpty()) {\n return this.pending;\n }\n\n const length = this.queue.length();\n\n this.logger.debug('Requeuing messages...');\n this.logger.debug(`Queue length: ${length}`);\n\n for (const message of this.queue.all()) {\n this.pending = this.chainNext(this.pending, message);\n }\n\n return this.pending;\n }\n\n private async chainNext(previous: Promise<void>, message: T, enqueue = false): Promise<void> {\n if (enqueue) {\n this.enqueue(message);\n }\n\n try {\n await previous;\n } catch (error) {\n if (error instanceof MessageDeliveryError && error.retryable) {\n // If the previous message failed to deliver, requeue all messages\n // including the current one that was just enqueued\n return this.requeue();\n }\n\n throw error;\n }\n\n if (this.closed) {\n throw MessageDeliveryError.retryable('Connection deliberately closed.');\n }\n\n try {\n const result = await this.channel.publish(message);\n\n this.dequeue();\n\n return result;\n } catch (error) {\n if (!(error instanceof MessageDeliveryError) || !error.retryable) {\n // Discard the message if it's non-retryable\n this.dequeue();\n\n if (!enqueue) {\n // If the message was not enqueued, suppress the error\n // so that the next message in the queue can be immediately\n return;\n }\n }\n\n throw error;\n }\n }\n\n public async close(): Promise<void> {\n this.closed = true;\n\n await this.channel.close();\n\n if (this.pending !== undefined) {\n try {\n await this.pending;\n } catch {\n // suppress errors\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,8 @@
1
- import { OutputChannel } from './channel';
2
- import { Queue } from '../queue';
3
- import { Logger } from '../logging';
4
- export declare class QueuedChannel<T> implements OutputChannel<T> {
1
+ import { OutputChannel } from './channel.js';
2
+ import { Queue } from '../queue/queue.js';
3
+ import { Logger } from '../logging/logger.js';
4
+
5
+ declare class QueuedChannel<T> implements OutputChannel<T> {
5
6
  private readonly channel;
6
7
  private readonly queue;
7
8
  private readonly logger;
@@ -16,3 +17,5 @@ export declare class QueuedChannel<T> implements OutputChannel<T> {
16
17
  private chainNext;
17
18
  close(): Promise<void>;
18
19
  }
20
+
21
+ export { QueuedChannel };
@@ -1,109 +1,99 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.QueuedChannel = void 0;
4
- const channel_1 = require("./channel");
5
- const logging_1 = require("../logging");
1
+ import { MessageDeliveryError } from "./channel";
2
+ import { NullLogger } from "../logging";
6
3
  class QueuedChannel {
7
- constructor(channel, queue, logger) {
8
- this.closed = false;
9
- this.channel = channel;
10
- this.queue = queue;
11
- this.logger = logger !== null && logger !== void 0 ? logger : new logging_1.NullLogger();
4
+ constructor(channel, queue, logger) {
5
+ this.closed = false;
6
+ this.channel = channel;
7
+ this.queue = queue;
8
+ this.logger = logger ?? new NullLogger();
9
+ }
10
+ flush() {
11
+ if (this.pending === void 0) {
12
+ return this.requeue();
12
13
  }
13
- flush() {
14
- if (this.pending === undefined) {
15
- return this.requeue();
16
- }
17
- return this.pending.catch(this.requeue.bind(this));
14
+ return this.pending.catch(this.requeue.bind(this));
15
+ }
16
+ publish(message) {
17
+ if (this.closed) {
18
+ return Promise.reject(MessageDeliveryError.nonRetryable("Channel is closed."));
18
19
  }
19
- publish(message) {
20
- if (this.closed) {
21
- return Promise.reject(channel_1.MessageDeliveryError.nonRetryable('Channel is closed.'));
22
- }
23
- if (this.queue.length() >= this.queue.getCapacity()) {
24
- this.logger.warn('The queue is full, message rejected.');
25
- return Promise.reject(channel_1.MessageDeliveryError.retryable('The queue is full.'));
26
- }
27
- if (this.pending === undefined) {
28
- this.pending = this.requeue();
29
- }
30
- this.pending = this.chainNext(this.pending, message, true);
31
- return this.pending;
20
+ if (this.queue.length() >= this.queue.getCapacity()) {
21
+ this.logger.warn("The queue is full, message rejected.");
22
+ return Promise.reject(MessageDeliveryError.retryable("The queue is full."));
32
23
  }
33
- enqueue(message) {
34
- this.logger.debug('Enqueueing message...');
35
- this.logger.debug(`Queue length: ${this.queue.length() + 1}`);
36
- this.queue.push(message);
24
+ if (this.pending === void 0) {
25
+ this.pending = this.requeue();
37
26
  }
38
- dequeue() {
39
- this.logger.debug('Dequeuing message...');
40
- this.logger.debug(`Queue length: ${Math.max(0, this.queue.length() - 1)}`);
41
- this.queue.shift();
27
+ this.pending = this.chainNext(this.pending, message, true);
28
+ return this.pending;
29
+ }
30
+ enqueue(message) {
31
+ this.logger.debug("Enqueueing message...");
32
+ this.logger.debug(`Queue length: ${this.queue.length() + 1}`);
33
+ this.queue.push(message);
34
+ }
35
+ dequeue() {
36
+ this.logger.debug("Dequeuing message...");
37
+ this.logger.debug(`Queue length: ${Math.max(0, this.queue.length() - 1)}`);
38
+ this.queue.shift();
39
+ }
40
+ requeue() {
41
+ if (this.closed) {
42
+ return Promise.reject(MessageDeliveryError.nonRetryable("Channel is closed."));
42
43
  }
43
- requeue() {
44
- if (this.closed) {
45
- return Promise.reject(channel_1.MessageDeliveryError.nonRetryable('Channel is closed.'));
46
- }
47
- this.pending = Promise.resolve();
48
- if (this.queue.isEmpty()) {
49
- return this.pending;
50
- }
51
- const length = this.queue.length();
52
- this.logger.debug('Requeuing messages...');
53
- this.logger.debug(`Queue length: ${length}`);
54
- for (const message of this.queue.all()) {
55
- this.pending = this.chainNext(this.pending, message);
56
- }
57
- return this.pending;
44
+ this.pending = Promise.resolve();
45
+ if (this.queue.isEmpty()) {
46
+ return this.pending;
58
47
  }
59
- async chainNext(previous, message, enqueue = false) {
60
- if (enqueue) {
61
- this.enqueue(message);
62
- }
63
- try {
64
- await previous;
65
- }
66
- catch (error) {
67
- if (error instanceof channel_1.MessageDeliveryError && error.retryable) {
68
- // If the previous message failed to deliver, requeue all messages
69
- // including the current one that was just enqueued
70
- return this.requeue();
71
- }
72
- throw error;
73
- }
74
- if (this.closed) {
75
- throw channel_1.MessageDeliveryError.retryable('Connection deliberately closed.');
76
- }
77
- try {
78
- const result = await this.channel.publish(message);
79
- this.dequeue();
80
- return result;
81
- }
82
- catch (error) {
83
- if (!(error instanceof channel_1.MessageDeliveryError) || !error.retryable) {
84
- // Discard the message if it's non-retryable
85
- this.dequeue();
86
- if (!enqueue) {
87
- // If the message was not enqueued, suppress the error
88
- // so that the next message in the queue can be immediately
89
- return;
90
- }
91
- }
92
- throw error;
93
- }
48
+ const length = this.queue.length();
49
+ this.logger.debug("Requeuing messages...");
50
+ this.logger.debug(`Queue length: ${length}`);
51
+ for (const message of this.queue.all()) {
52
+ this.pending = this.chainNext(this.pending, message);
94
53
  }
95
- async close() {
96
- this.closed = true;
97
- await this.channel.close();
98
- if (this.pending !== undefined) {
99
- try {
100
- await this.pending;
101
- }
102
- catch {
103
- // suppress errors
104
- }
54
+ return this.pending;
55
+ }
56
+ async chainNext(previous, message, enqueue = false) {
57
+ if (enqueue) {
58
+ this.enqueue(message);
59
+ }
60
+ try {
61
+ await previous;
62
+ } catch (error) {
63
+ if (error instanceof MessageDeliveryError && error.retryable) {
64
+ return this.requeue();
65
+ }
66
+ throw error;
67
+ }
68
+ if (this.closed) {
69
+ throw MessageDeliveryError.retryable("Connection deliberately closed.");
70
+ }
71
+ try {
72
+ const result = await this.channel.publish(message);
73
+ this.dequeue();
74
+ return result;
75
+ } catch (error) {
76
+ if (!(error instanceof MessageDeliveryError) || !error.retryable) {
77
+ this.dequeue();
78
+ if (!enqueue) {
79
+ return;
105
80
  }
81
+ }
82
+ throw error;
83
+ }
84
+ }
85
+ async close() {
86
+ this.closed = true;
87
+ await this.channel.close();
88
+ if (this.pending !== void 0) {
89
+ try {
90
+ await this.pending;
91
+ } catch {
92
+ }
106
93
  }
94
+ }
107
95
  }
108
- exports.QueuedChannel = QueuedChannel;
96
+ export {
97
+ QueuedChannel
98
+ };
109
99
  //# sourceMappingURL=queuedChannel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queuedChannel.js","sourceRoot":"","sources":["../src/channel/queuedChannel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/channel/queuedChannel.ts"],"sourcesContent":["import {MessageDeliveryError, OutputChannel} from './channel';\nimport {Queue} from '../queue';\nimport {Logger, NullLogger} from '../logging';\n\nexport class QueuedChannel<T> implements OutputChannel<T> {\n private readonly channel: OutputChannel<T>;\n\n private readonly queue: Queue<T>;\n\n private readonly logger: Logger;\n\n private pending?: Promise<void>;\n\n private closed = false;\n\n public constructor(channel: OutputChannel<T>, queue: Queue<T>, logger?: Logger) {\n this.channel = channel;\n this.queue = queue;\n this.logger = logger ?? new NullLogger();\n }\n\n public flush(): Promise<void> {\n if (this.pending === undefined) {\n return this.requeue();\n }\n\n return this.pending.catch(this.requeue.bind(this));\n }\n\n public publish(message: T): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n if (this.queue.length() >= this.queue.getCapacity()) {\n this.logger.warn('The queue is full, message rejected.');\n\n return Promise.reject(MessageDeliveryError.retryable('The queue is full.'));\n }\n\n if (this.pending === undefined) {\n this.pending = this.requeue();\n }\n\n this.pending = this.chainNext(this.pending, message, true);\n\n return this.pending;\n }\n\n private enqueue(message: T): void {\n this.logger.debug('Enqueueing message...');\n this.logger.debug(`Queue length: ${this.queue.length() + 1}`);\n\n this.queue.push(message);\n }\n\n private dequeue(): void {\n this.logger.debug('Dequeuing message...');\n this.logger.debug(`Queue length: ${Math.max(0, this.queue.length() - 1)}`);\n\n this.queue.shift();\n }\n\n private requeue(): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n this.pending = Promise.resolve();\n\n if (this.queue.isEmpty()) {\n return this.pending;\n }\n\n const length = this.queue.length();\n\n this.logger.debug('Requeuing messages...');\n this.logger.debug(`Queue length: ${length}`);\n\n for (const message of this.queue.all()) {\n this.pending = this.chainNext(this.pending, message);\n }\n\n return this.pending;\n }\n\n private async chainNext(previous: Promise<void>, message: T, enqueue = false): Promise<void> {\n if (enqueue) {\n this.enqueue(message);\n }\n\n try {\n await previous;\n } catch (error) {\n if (error instanceof MessageDeliveryError && error.retryable) {\n // If the previous message failed to deliver, requeue all messages\n // including the current one that was just enqueued\n return this.requeue();\n }\n\n throw error;\n }\n\n if (this.closed) {\n throw MessageDeliveryError.retryable('Connection deliberately closed.');\n }\n\n try {\n const result = await this.channel.publish(message);\n\n this.dequeue();\n\n return result;\n } catch (error) {\n if (!(error instanceof MessageDeliveryError) || !error.retryable) {\n // Discard the message if it's non-retryable\n this.dequeue();\n\n if (!enqueue) {\n // If the message was not enqueued, suppress the error\n // so that the next message in the queue can be immediately\n return;\n }\n }\n\n throw error;\n }\n }\n\n public async close(): Promise<void> {\n this.closed = true;\n\n await this.channel.close();\n\n if (this.pending !== undefined) {\n try {\n await this.pending;\n } catch {\n // suppress errors\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/channel/retryChannel.ts"],"sourcesContent":["import {MessageDeliveryError, OutputChannel} from './channel';\nimport {Logger, NullLogger} from '../logging';\nimport {RetryPolicy} from '../retry';\n\ntype Configuration<T> = {\n channel: OutputChannel<T>,\n retryPolicy: RetryPolicy<T>,\n logger?: Logger,\n};\n\nexport class RetryChannel<T> implements OutputChannel<T> {\n private readonly channel: OutputChannel<T>;\n\n private readonly retryPolicy: RetryPolicy<T>;\n\n private readonly logger: Logger;\n\n private closed = false;\n\n public constructor({channel, retryPolicy, logger}: Configuration<T>) {\n this.channel = channel;\n this.retryPolicy = retryPolicy;\n this.logger = logger ?? new NullLogger();\n }\n\n public publish(message: T): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('The channel is closed.'));\n }\n\n return this.channel\n .publish(message)\n .catch(error => this.retry(message, error));\n }\n\n public async retry(message: T, error: unknown): Promise<void> {\n if (error instanceof MessageDeliveryError && !error.retryable) {\n throw error;\n }\n\n let attempt = 0;\n\n while (this.retryPolicy.shouldRetry(attempt, message, error)) {\n if (this.closed) {\n throw MessageDeliveryError.retryable('Connection deliberately closed.');\n }\n\n const delay = this.retryPolicy.getDelay(attempt);\n\n this.logger.debug(`Retry attempt ${attempt + 1}`);\n\n if (delay > 0) {\n this.logger.debug(`Retry attempt delayed in ${delay}ms`);\n\n await new Promise<void>((resolve, reject): void => {\n const closeWatcher = window.setInterval(\n () => {\n if (this.closed) {\n // Cancel delay immediately when the channel is closed\n window.clearInterval(closeWatcher);\n\n reject(MessageDeliveryError.retryable('Connection deliberately closed.'));\n }\n },\n 0,\n );\n\n window.setTimeout(\n (): void => {\n window.clearInterval(closeWatcher);\n\n resolve();\n },\n delay,\n );\n });\n }\n\n try {\n return await this.channel.publish(message);\n } catch {\n attempt += 1;\n }\n }\n\n throw MessageDeliveryError.nonRetryable('Maximum retry attempts reached.');\n }\n\n public close(): Promise<void> {\n this.closed = true;\n\n return this.channel.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAkD;AAClD,qBAAiC;AAS1B,MAAM,aAA4C;AAAA,EAS9C,YAAY,EAAC,SAAS,aAAa,OAAM,GAAqB;AAFrE,SAAQ,SAAS;AAGb,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,SAAS,UAAU,IAAI,0BAAW;AAAA,EAC3C;AAAA,EAEO,QAAQ,SAA2B;AACtC,QAAI,KAAK,QAAQ;AACb,aAAO,QAAQ,OAAO,oCAAqB,aAAa,wBAAwB,CAAC;AAAA,IACrF;AAEA,WAAO,KAAK,QACP,QAAQ,OAAO,EACf,MAAM,WAAS,KAAK,MAAM,SAAS,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,MAAM,SAAY,OAA+B;AAC1D,QAAI,iBAAiB,uCAAwB,CAAC,MAAM,WAAW;AAC3D,YAAM;AAAA,IACV;AAEA,QAAI,UAAU;AAEd,WAAO,KAAK,YAAY,YAAY,SAAS,SAAS,KAAK,GAAG;AAC1D,UAAI,KAAK,QAAQ;AACb,cAAM,oCAAqB,UAAU,iCAAiC;AAAA,MAC1E;AAEA,YAAM,QAAQ,KAAK,YAAY,SAAS,OAAO;AAE/C,WAAK,OAAO,MAAM,iBAAiB,UAAU,CAAC,EAAE;AAEhD,UAAI,QAAQ,GAAG;AACX,aAAK,OAAO,MAAM,4BAA4B,KAAK,IAAI;AAEvD,cAAM,IAAI,QAAc,CAAC,SAAS,WAAiB;AAC/C,gBAAM,eAAe,OAAO;AAAA,YACxB,MAAM;AACF,kBAAI,KAAK,QAAQ;AAEb,uBAAO,cAAc,YAAY;AAEjC,uBAAO,oCAAqB,UAAU,iCAAiC,CAAC;AAAA,cAC5E;AAAA,YACJ;AAAA,YACA;AAAA,UACJ;AAEA,iBAAO;AAAA,YACH,MAAY;AACR,qBAAO,cAAc,YAAY;AAEjC,sBAAQ;AAAA,YACZ;AAAA,YACA;AAAA,UACJ;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,UAAI;AACA,eAAO,MAAM,KAAK,QAAQ,QAAQ,OAAO;AAAA,MAC7C,QAAQ;AACJ,mBAAW;AAAA,MACf;AAAA,IACJ;AAEA,UAAM,oCAAqB,aAAa,iCAAiC;AAAA,EAC7E;AAAA,EAEO,QAAuB;AAC1B,SAAK,SAAS;AAEd,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AACJ;","names":[]}
@@ -1,12 +1,13 @@
1
- import { OutputChannel } from './channel';
2
- import { Logger } from '../logging';
3
- import { RetryPolicy } from '../retry';
1
+ import { OutputChannel } from './channel.js';
2
+ import { Logger } from '../logging/logger.js';
3
+ import { RetryPolicy } from '../retry/policy.js';
4
+
4
5
  type Configuration<T> = {
5
6
  channel: OutputChannel<T>;
6
7
  retryPolicy: RetryPolicy<T>;
7
8
  logger?: Logger;
8
9
  };
9
- export declare class RetryChannel<T> implements OutputChannel<T> {
10
+ declare class RetryChannel<T> implements OutputChannel<T> {
10
11
  private readonly channel;
11
12
  private readonly retryPolicy;
12
13
  private readonly logger;
@@ -16,4 +17,5 @@ export declare class RetryChannel<T> implements OutputChannel<T> {
16
17
  retry(message: T, error: unknown): Promise<void>;
17
18
  close(): Promise<void>;
18
19
  }
19
- export {};
20
+
21
+ export { RetryChannel };