@juzi/file-box 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +613 -0
  3. package/dist/cjs/package.json +3 -0
  4. package/dist/cjs/src/config.d.ts +4 -0
  5. package/dist/cjs/src/config.d.ts.map +1 -0
  6. package/dist/cjs/src/config.js +9 -0
  7. package/dist/cjs/src/config.js.map +1 -0
  8. package/dist/cjs/src/file-box.d.ts +209 -0
  9. package/dist/cjs/src/file-box.d.ts.map +1 -0
  10. package/dist/cjs/src/file-box.js +804 -0
  11. package/dist/cjs/src/file-box.js.map +1 -0
  12. package/dist/cjs/src/file-box.spec.d.ts +14 -0
  13. package/dist/cjs/src/file-box.spec.d.ts.map +1 -0
  14. package/dist/cjs/src/file-box.spec.js +393 -0
  15. package/dist/cjs/src/file-box.spec.js.map +1 -0
  16. package/dist/cjs/src/file-box.type.d.ts +103 -0
  17. package/dist/cjs/src/file-box.type.d.ts.map +1 -0
  18. package/dist/cjs/src/file-box.type.js +34 -0
  19. package/dist/cjs/src/file-box.type.js.map +1 -0
  20. package/dist/cjs/src/interface.d.ts +25 -0
  21. package/dist/cjs/src/interface.d.ts.map +1 -0
  22. package/dist/cjs/src/interface.js +3 -0
  23. package/dist/cjs/src/interface.js.map +1 -0
  24. package/dist/cjs/src/interface.spec.d.ts +3 -0
  25. package/dist/cjs/src/interface.spec.d.ts.map +1 -0
  26. package/dist/cjs/src/interface.spec.js +11 -0
  27. package/dist/cjs/src/interface.spec.js.map +1 -0
  28. package/dist/cjs/src/misc.d.ts +17 -0
  29. package/dist/cjs/src/misc.d.ts.map +1 -0
  30. package/dist/cjs/src/misc.js +137 -0
  31. package/dist/cjs/src/misc.js.map +1 -0
  32. package/dist/cjs/src/misc.spec.d.ts +3 -0
  33. package/dist/cjs/src/misc.spec.d.ts.map +1 -0
  34. package/dist/cjs/src/misc.spec.js +51 -0
  35. package/dist/cjs/src/misc.spec.js.map +1 -0
  36. package/dist/cjs/src/mod.d.ts +9 -0
  37. package/dist/cjs/src/mod.d.ts.map +1 -0
  38. package/dist/cjs/src/mod.js +12 -0
  39. package/dist/cjs/src/mod.js.map +1 -0
  40. package/dist/cjs/src/pure-functions/sized-chunk-transformer.d.ts +13 -0
  41. package/dist/cjs/src/pure-functions/sized-chunk-transformer.d.ts.map +1 -0
  42. package/dist/cjs/src/pure-functions/sized-chunk-transformer.js +45 -0
  43. package/dist/cjs/src/pure-functions/sized-chunk-transformer.js.map +1 -0
  44. package/dist/cjs/src/pure-functions/sized-chunk-transformer.spec.d.ts +3 -0
  45. package/dist/cjs/src/pure-functions/sized-chunk-transformer.spec.d.ts.map +1 -0
  46. package/dist/cjs/src/pure-functions/sized-chunk-transformer.spec.js +39 -0
  47. package/dist/cjs/src/pure-functions/sized-chunk-transformer.spec.js.map +1 -0
  48. package/dist/cjs/src/qrcode.d.ts +6 -0
  49. package/dist/cjs/src/qrcode.d.ts.map +1 -0
  50. package/dist/cjs/src/qrcode.js +35 -0
  51. package/dist/cjs/src/qrcode.js.map +1 -0
  52. package/dist/cjs/src/qrcode.spec.d.ts +3 -0
  53. package/dist/cjs/src/qrcode.spec.d.ts.map +1 -0
  54. package/dist/cjs/src/qrcode.spec.js +47 -0
  55. package/dist/cjs/src/qrcode.spec.js.map +1 -0
  56. package/dist/cjs/src/urn-registry/mod.d.ts +3 -0
  57. package/dist/cjs/src/urn-registry/mod.d.ts.map +1 -0
  58. package/dist/cjs/src/urn-registry/mod.js +6 -0
  59. package/dist/cjs/src/urn-registry/mod.js.map +1 -0
  60. package/dist/cjs/src/urn-registry/random-uuid.d.ts +4 -0
  61. package/dist/cjs/src/urn-registry/random-uuid.d.ts.map +1 -0
  62. package/dist/cjs/src/urn-registry/random-uuid.js +30 -0
  63. package/dist/cjs/src/urn-registry/random-uuid.js.map +1 -0
  64. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.d.ts +76 -0
  65. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.d.ts.map +1 -0
  66. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.js +259 -0
  67. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.js.map +1 -0
  68. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.spec.d.ts +3 -0
  69. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.spec.d.ts.map +1 -0
  70. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.spec.js +81 -0
  71. package/dist/cjs/src/urn-registry/uniform-resource-name-registry.spec.js.map +1 -0
  72. package/dist/cjs/src/urn-registry/uuid-to-big-int.d.ts +8 -0
  73. package/dist/cjs/src/urn-registry/uuid-to-big-int.d.ts.map +1 -0
  74. package/dist/cjs/src/urn-registry/uuid-to-big-int.js +16 -0
  75. package/dist/cjs/src/urn-registry/uuid-to-big-int.js.map +1 -0
  76. package/dist/cjs/src/urn-registry/uuid-to-big-int.spec.d.ts +3 -0
  77. package/dist/cjs/src/urn-registry/uuid-to-big-int.spec.d.ts.map +1 -0
  78. package/dist/cjs/src/urn-registry/uuid-to-big-int.spec.js +17 -0
  79. package/dist/cjs/src/urn-registry/uuid-to-big-int.spec.js.map +1 -0
  80. package/dist/cjs/src/version.d.ts +5 -0
  81. package/dist/cjs/src/version.d.ts.map +1 -0
  82. package/dist/cjs/src/version.js +8 -0
  83. package/dist/cjs/src/version.js.map +1 -0
  84. package/dist/cjs/src/version.spec.d.ts +3 -0
  85. package/dist/cjs/src/version.spec.d.ts.map +1 -0
  86. package/dist/cjs/src/version.spec.js +9 -0
  87. package/dist/cjs/src/version.spec.js.map +1 -0
  88. package/dist/cjs/tests/integration.spec.d.ts +3 -0
  89. package/dist/cjs/tests/integration.spec.d.ts.map +1 -0
  90. package/dist/cjs/tests/integration.spec.js +8 -0
  91. package/dist/cjs/tests/integration.spec.js.map +1 -0
  92. package/dist/cjs/tests/network-timeout.spec.d.ts +3 -0
  93. package/dist/cjs/tests/network-timeout.spec.d.ts.map +1 -0
  94. package/dist/cjs/tests/network-timeout.spec.js +121 -0
  95. package/dist/cjs/tests/network-timeout.spec.js.map +1 -0
  96. package/dist/esm/src/config.d.ts +4 -0
  97. package/dist/esm/src/config.d.ts.map +1 -0
  98. package/dist/esm/src/config.js +5 -0
  99. package/dist/esm/src/config.js.map +1 -0
  100. package/dist/esm/src/file-box.d.ts +209 -0
  101. package/dist/esm/src/file-box.d.ts.map +1 -0
  102. package/dist/esm/src/file-box.js +775 -0
  103. package/dist/esm/src/file-box.js.map +1 -0
  104. package/dist/esm/src/file-box.spec.d.ts +14 -0
  105. package/dist/esm/src/file-box.spec.d.ts.map +1 -0
  106. package/dist/esm/src/file-box.spec.js +386 -0
  107. package/dist/esm/src/file-box.spec.js.map +1 -0
  108. package/dist/esm/src/file-box.type.d.ts +103 -0
  109. package/dist/esm/src/file-box.type.d.ts.map +1 -0
  110. package/dist/esm/src/file-box.type.js +31 -0
  111. package/dist/esm/src/file-box.type.js.map +1 -0
  112. package/dist/esm/src/interface.d.ts +25 -0
  113. package/dist/esm/src/interface.d.ts.map +1 -0
  114. package/dist/esm/src/interface.js +2 -0
  115. package/dist/esm/src/interface.js.map +1 -0
  116. package/dist/esm/src/interface.spec.d.ts +3 -0
  117. package/dist/esm/src/interface.spec.d.ts.map +1 -0
  118. package/dist/esm/src/interface.spec.js +9 -0
  119. package/dist/esm/src/interface.spec.js.map +1 -0
  120. package/dist/esm/src/misc.d.ts +17 -0
  121. package/dist/esm/src/misc.d.ts.map +1 -0
  122. package/dist/esm/src/misc.js +126 -0
  123. package/dist/esm/src/misc.js.map +1 -0
  124. package/dist/esm/src/misc.spec.d.ts +3 -0
  125. package/dist/esm/src/misc.spec.d.ts.map +1 -0
  126. package/dist/esm/src/misc.spec.js +49 -0
  127. package/dist/esm/src/misc.spec.js.map +1 -0
  128. package/dist/esm/src/mod.d.ts +9 -0
  129. package/dist/esm/src/mod.d.ts.map +1 -0
  130. package/dist/esm/src/mod.js +6 -0
  131. package/dist/esm/src/mod.js.map +1 -0
  132. package/dist/esm/src/pure-functions/sized-chunk-transformer.d.ts +13 -0
  133. package/dist/esm/src/pure-functions/sized-chunk-transformer.d.ts.map +1 -0
  134. package/dist/esm/src/pure-functions/sized-chunk-transformer.js +39 -0
  135. package/dist/esm/src/pure-functions/sized-chunk-transformer.js.map +1 -0
  136. package/dist/esm/src/pure-functions/sized-chunk-transformer.spec.d.ts +3 -0
  137. package/dist/esm/src/pure-functions/sized-chunk-transformer.spec.d.ts.map +1 -0
  138. package/dist/esm/src/pure-functions/sized-chunk-transformer.spec.js +37 -0
  139. package/dist/esm/src/pure-functions/sized-chunk-transformer.spec.js.map +1 -0
  140. package/dist/esm/src/qrcode.d.ts +6 -0
  141. package/dist/esm/src/qrcode.d.ts.map +1 -0
  142. package/dist/esm/src/qrcode.js +27 -0
  143. package/dist/esm/src/qrcode.js.map +1 -0
  144. package/dist/esm/src/qrcode.spec.d.ts +3 -0
  145. package/dist/esm/src/qrcode.spec.d.ts.map +1 -0
  146. package/dist/esm/src/qrcode.spec.js +45 -0
  147. package/dist/esm/src/qrcode.spec.js.map +1 -0
  148. package/dist/esm/src/urn-registry/mod.d.ts +3 -0
  149. package/dist/esm/src/urn-registry/mod.d.ts.map +1 -0
  150. package/dist/esm/src/urn-registry/mod.js +3 -0
  151. package/dist/esm/src/urn-registry/mod.js.map +1 -0
  152. package/dist/esm/src/urn-registry/random-uuid.d.ts +4 -0
  153. package/dist/esm/src/urn-registry/random-uuid.d.ts.map +1 -0
  154. package/dist/esm/src/urn-registry/random-uuid.js +4 -0
  155. package/dist/esm/src/urn-registry/random-uuid.js.map +1 -0
  156. package/dist/esm/src/urn-registry/uniform-resource-name-registry.d.ts +76 -0
  157. package/dist/esm/src/urn-registry/uniform-resource-name-registry.d.ts.map +1 -0
  158. package/dist/esm/src/urn-registry/uniform-resource-name-registry.js +253 -0
  159. package/dist/esm/src/urn-registry/uniform-resource-name-registry.js.map +1 -0
  160. package/dist/esm/src/urn-registry/uniform-resource-name-registry.spec.d.ts +3 -0
  161. package/dist/esm/src/urn-registry/uniform-resource-name-registry.spec.d.ts.map +1 -0
  162. package/dist/esm/src/urn-registry/uniform-resource-name-registry.spec.js +79 -0
  163. package/dist/esm/src/urn-registry/uniform-resource-name-registry.spec.js.map +1 -0
  164. package/dist/esm/src/urn-registry/uuid-to-big-int.d.ts +8 -0
  165. package/dist/esm/src/urn-registry/uuid-to-big-int.d.ts.map +1 -0
  166. package/dist/esm/src/urn-registry/uuid-to-big-int.js +13 -0
  167. package/dist/esm/src/urn-registry/uuid-to-big-int.js.map +1 -0
  168. package/dist/esm/src/urn-registry/uuid-to-big-int.spec.d.ts +3 -0
  169. package/dist/esm/src/urn-registry/uuid-to-big-int.spec.d.ts.map +1 -0
  170. package/dist/esm/src/urn-registry/uuid-to-big-int.spec.js +15 -0
  171. package/dist/esm/src/urn-registry/uuid-to-big-int.spec.js.map +1 -0
  172. package/dist/esm/src/version.d.ts +5 -0
  173. package/dist/esm/src/version.d.ts.map +1 -0
  174. package/dist/esm/src/version.js +5 -0
  175. package/dist/esm/src/version.js.map +1 -0
  176. package/dist/esm/src/version.spec.d.ts +3 -0
  177. package/dist/esm/src/version.spec.d.ts.map +1 -0
  178. package/dist/esm/src/version.spec.js +7 -0
  179. package/dist/esm/src/version.spec.js.map +1 -0
  180. package/dist/esm/tests/integration.spec.d.ts +3 -0
  181. package/dist/esm/tests/integration.spec.d.ts.map +1 -0
  182. package/dist/esm/tests/integration.spec.js +6 -0
  183. package/dist/esm/tests/integration.spec.js.map +1 -0
  184. package/dist/esm/tests/network-timeout.spec.d.ts +3 -0
  185. package/dist/esm/tests/network-timeout.spec.d.ts.map +1 -0
  186. package/dist/esm/tests/network-timeout.spec.js +119 -0
  187. package/dist/esm/tests/network-timeout.spec.js.map +1 -0
  188. package/package.json +85 -0
  189. package/src/config.ts +5 -0
  190. package/src/file-box.spec.ts +480 -0
  191. package/src/file-box.ts +1042 -0
  192. package/src/file-box.type.ts +145 -0
  193. package/src/interface.spec.ts +17 -0
  194. package/src/interface.ts +47 -0
  195. package/src/misc.spec.ts +70 -0
  196. package/src/misc.ts +157 -0
  197. package/src/mod.ts +33 -0
  198. package/src/pure-functions/sized-chunk-transformer.spec.ts +52 -0
  199. package/src/pure-functions/sized-chunk-transformer.ts +49 -0
  200. package/src/qrcode.spec.ts +55 -0
  201. package/src/qrcode.ts +38 -0
  202. package/src/typings.d.ts +1 -0
  203. package/src/urn-registry/mod.ts +7 -0
  204. package/src/urn-registry/random-uuid.ts +7 -0
  205. package/src/urn-registry/uniform-resource-name-registry.spec.ts +109 -0
  206. package/src/urn-registry/uniform-resource-name-registry.ts +342 -0
  207. package/src/urn-registry/uuid-to-big-int.spec.ts +19 -0
  208. package/src/urn-registry/uuid-to-big-int.ts +16 -0
  209. package/src/version.spec.ts +9 -0
  210. package/src/version.ts +4 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Huan(202110): Assignment and Resolution of Uniform Resource Names
3
+ * https://datatracker.ietf.org/wg/urn/about/
4
+ */
5
+ /// <reference types="node" />
6
+ /// <reference types="node" />
7
+ import type { Readable } from 'stream';
8
+ import { FileBox } from '../file-box.js';
9
+ interface UniformResourceNameRegistryOptions {
10
+ expireMilliseconds?: number;
11
+ storeDir?: string;
12
+ }
13
+ declare class UniformResourceNameRegistry {
14
+ protected static processExitMap: WeakMap<UniformResourceNameRegistry, Function>;
15
+ /**
16
+ * The directory that store all UUID files
17
+ */
18
+ protected storeDir: string;
19
+ protected expireMilliseconds: number;
20
+ /**
21
+ * Key: expiretime
22
+ * Value: the array of UUID that will expires after the `expiretime` (Key)
23
+ */
24
+ protected uuidExpiringTable: Map<number, string[]>;
25
+ protected purgerTimer?: ReturnType<typeof setInterval>;
26
+ constructor(options?: UniformResourceNameRegistryOptions);
27
+ /**
28
+ * Return a FileBox Interface with the current URN Registry for conience
29
+ */
30
+ getFileBox(): typeof FileBox;
31
+ /**
32
+ * init the UUID registry
33
+ *
34
+ * must be called before use.
35
+ */
36
+ init(): void;
37
+ protected purgeExpiredUuid(): void;
38
+ /**
39
+ * Clean up by calling this.destroy() before process exit
40
+ */
41
+ protected addProcessExitListener(): void;
42
+ protected uuidFileName(uuid: string): string;
43
+ /**
44
+ * @deprecated use `load()` instead
45
+ */
46
+ resolve(uuid: string): Promise<Readable>;
47
+ /**
48
+ * `resolve()` can only be used once.
49
+ * after resolve(), the UUID will be not exist any more
50
+ */
51
+ load(uuid: string): Promise<Readable>;
52
+ /**
53
+ * @deprecated use `save()` instead
54
+ */
55
+ register(stream: Readable): Promise<string>;
56
+ /**
57
+ * Save the `Readable` stream and return a random UUID
58
+ * The UUID will be expired after MAX_KEEP_MINUTES
59
+ */
60
+ save(stream: Readable): Promise<string>;
61
+ /**
62
+ * Set a timer to execute delete callback after `expireMilliseconds`
63
+ */
64
+ protected addToExpiringTable(uuid: string): void;
65
+ protected purge(uuid: string): Promise<void>;
66
+ /**
67
+ * destroy the urn registry.
68
+ *
69
+ * This function will be called automatically at `process.on(exit)`
70
+ * however, it till need to be called before the program ends
71
+ * because there have some timers in eventloop task list
72
+ */
73
+ destroy(): void;
74
+ }
75
+ export { UniformResourceNameRegistry };
76
+ //# sourceMappingURL=uniform-resource-name-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-resource-name-registry.d.ts","sourceRoot":"","sources":["../../../../src/urn-registry/uniform-resource-name-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;;;AAgCH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAKtC,OAAO,EACL,OAAO,EACR,MAA8B,gBAAgB,CAAA;AAY/C,UAAU,kCAAkC;IAC1C,kBAAkB,CAAC,EAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAa,MAAM,CAAC;CAC9B;AAED,cAAM,2BAA2B;IAE/B,SAAS,CAAC,MAAM,CAAC,cAAc,iDAG5B;IAEH;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAA;IAE1B,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAA;IAEpC;;;OAGG;IACH,SAAS,CAAC,iBAAiB,EAAE,GAAG,CAC9B,MAAM,EACN,MAAM,EAAE,CACT,CAAA;IAED,SAAS,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAA;gBAGpD,OAAO,GAAE,kCAAuC;IAalD;;OAEG;IACH,UAAU,IAAK,OAAO,OAAO;IAS7B;;;;OAIG;IACH,IAAI;IA2BJ,SAAS,CAAC,gBAAgB;IAoB1B;;OAEG;IACH,SAAS,CAAC,sBAAsB;IAqBhC,SAAS,CAAC,YAAY,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAO7C;;OAEG;IACG,OAAO,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK/C;;;OAGG;IACG,IAAI,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAc5C;;OAEG;IACG,QAAQ,CAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD;;;OAGG;IACG,IAAI,CAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB9C;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;cAmBjC,KAAK,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnD;;;;;;OAMG;IACH,OAAO;CAgDR;AAED,OAAO,EAAE,2BAA2B,EAAE,CAAA"}
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ /**
3
+ * Huan(202110): Assignment and Resolution of Uniform Resource Names
4
+ * https://datatracker.ietf.org/wg/urn/about/
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.UniformResourceNameRegistry = void 0;
11
+ /**
12
+ * RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace
13
+ * ------------------------------------------------------------
14
+ * This specification defines a Uniform Resource Name namespace for
15
+ * UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
16
+ * Unique IDentifier). A UUID is 128 bits long, and can guarantee
17
+ * uniqueness across space and time. UUIDs were originally used in the
18
+ * Apollo Network Computing System and later in the Open Software
19
+ * Foundation's (OSF) Distributed Computing Environment (DCE), and then
20
+ * in Microsoft Windows platforms.
21
+ *
22
+ * The information here is meant to be a concise guide for those wishing
23
+ * to implement services using UUIDs as URNs. Nothing in this document
24
+ * should be construed to override the DCE standards that defined UUIDs.
25
+ */
26
+ /**
27
+ * RFC 2141: Uniform Resource Names (URNs) Syntax
28
+ * ----------------------------------------------
29
+ * Uniform Resource Names (URNs) are intended to serve as persistent,
30
+ * location-independent, resource identifiers. This document sets
31
+ * forward the canonical syntax for URNs. A discussion of both existing
32
+ * legacy and new namespaces and requirements for URN presentation and
33
+ * transmission are presented. Finally, there is a discussion of URN
34
+ * equivalence and how to determine it.
35
+ */
36
+ const fs_1 = __importDefault(require("fs"));
37
+ const os_1 = __importDefault(require("os"));
38
+ const path_1 = __importDefault(require("path"));
39
+ const clone_class_1 = require("clone-class");
40
+ const brolog_1 = require("brolog");
41
+ const file_box_js_1 = require("../file-box.js");
42
+ const random_uuid_js_1 = require("./random-uuid.js");
43
+ /**
44
+ * A UUID will be only keep for a certain time.
45
+ */
46
+ const DEFAULT_UUID_EXPIRE_MINUTES = 30;
47
+ const DEFAULT_UUID_PURGE_INTERVAL_MINUTES = 1;
48
+ class UniformResourceNameRegistry {
49
+ static processExitMap = new WeakMap();
50
+ /**
51
+ * The directory that store all UUID files
52
+ */
53
+ storeDir;
54
+ expireMilliseconds;
55
+ /**
56
+ * Key: expiretime
57
+ * Value: the array of UUID that will expires after the `expiretime` (Key)
58
+ */
59
+ uuidExpiringTable;
60
+ purgerTimer;
61
+ constructor(options = {}) {
62
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'constructor("%s")', JSON.stringify(options));
63
+ this.uuidExpiringTable = new Map();
64
+ this.expireMilliseconds = options.expireMilliseconds ?? (DEFAULT_UUID_EXPIRE_MINUTES * 60 * 1000 * 1000);
65
+ this.storeDir = options.storeDir || path_1.default.join(os_1.default.tmpdir(), 'file-box-urn-registry.' + String(process.pid));
66
+ }
67
+ /**
68
+ * Return a FileBox Interface with the current URN Registry for conience
69
+ */
70
+ getFileBox() {
71
+ this.init();
72
+ class UUIDFileBox extends file_box_js_1.FileBox {
73
+ }
74
+ UUIDFileBox.setUuidLoader(this.load.bind(this));
75
+ UUIDFileBox.setUuidSaver(this.save.bind(this));
76
+ return UUIDFileBox;
77
+ }
78
+ /**
79
+ * init the UUID registry
80
+ *
81
+ * must be called before use.
82
+ */
83
+ init() {
84
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'init()');
85
+ try {
86
+ const stat = fs_1.default.statSync(this.storeDir);
87
+ if (!stat.isDirectory()) {
88
+ throw new Error(this.storeDir + ' is Not a directory');
89
+ }
90
+ }
91
+ catch (e) {
92
+ if (e.code === 'ENOENT') {
93
+ fs_1.default.mkdirSync(this.storeDir, { recursive: true });
94
+ }
95
+ else {
96
+ throw e;
97
+ }
98
+ }
99
+ if (!this.purgerTimer) {
100
+ this.addProcessExitListener();
101
+ this.purgerTimer = setInterval(() => this.purgeExpiredUuid(), DEFAULT_UUID_PURGE_INTERVAL_MINUTES * 60 * 1000);
102
+ }
103
+ }
104
+ purgeExpiredUuid() {
105
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'purgeExpiredUuid()');
106
+ const expireTimeList = [...this.uuidExpiringTable.keys()]
107
+ .sort((a, b) => Number(a) - Number(b));
108
+ for (const expireTime of expireTimeList) {
109
+ if (Date.now() < expireTime) {
110
+ // The earliest expire time is in the future
111
+ break;
112
+ }
113
+ const uuidList = this.uuidExpiringTable.get(expireTime) || [];
114
+ this.uuidExpiringTable.delete(expireTime);
115
+ for (const uuid of uuidList) {
116
+ this.purge(uuid).catch(console.error);
117
+ }
118
+ }
119
+ }
120
+ /**
121
+ * Clean up by calling this.destroy() before process exit
122
+ */
123
+ addProcessExitListener() {
124
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'addProcessExitListener()');
125
+ const Klass = (0, clone_class_1.instanceToClass)(this, UniformResourceNameRegistry);
126
+ /**
127
+ * If we have already registered the listener, do nothing.
128
+ */
129
+ if (Klass.processExitMap.has(this)) {
130
+ return;
131
+ }
132
+ const destroyCallback = () => this.destroy();
133
+ process.addListener('exit', destroyCallback);
134
+ Klass.processExitMap.set(this, () => process.removeListener('exit', destroyCallback));
135
+ }
136
+ uuidFileName(uuid) {
137
+ return path_1.default.join(this.storeDir, uuid + '.dat');
138
+ }
139
+ /**
140
+ * @deprecated use `load()` instead
141
+ */
142
+ async resolve(uuid) {
143
+ brolog_1.log.warn('UniformResourceNameRegistry', 'resolve() is deprecated: use `load()` instead.\n%s', new Error().stack);
144
+ return this.load(uuid);
145
+ }
146
+ /**
147
+ * `resolve()` can only be used once.
148
+ * after resolve(), the UUID will be not exist any more
149
+ */
150
+ async load(uuid) {
151
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'load(%s)', uuid);
152
+ const filename = this.uuidFileName(uuid);
153
+ const stream = fs_1.default.createReadStream(filename);
154
+ await new Promise((resolve, reject) => {
155
+ stream.on('ready', resolve);
156
+ stream.on('error', reject);
157
+ });
158
+ return stream;
159
+ }
160
+ /**
161
+ * @deprecated use `save()` instead
162
+ */
163
+ async register(stream) {
164
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'register() deprecated: use save() instead.\n%s', new Error().stack);
165
+ return this.save(stream);
166
+ }
167
+ /**
168
+ * Save the `Readable` stream and return a random UUID
169
+ * The UUID will be expired after MAX_KEEP_MINUTES
170
+ */
171
+ async save(stream) {
172
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'save(stream)');
173
+ const uuid = (0, random_uuid_js_1.randomUuid)();
174
+ const fileStream = fs_1.default.createWriteStream(this.uuidFileName(uuid));
175
+ const future = new Promise((resolve, reject) => {
176
+ stream.on('end', resolve);
177
+ stream.on('error', reject);
178
+ fileStream.on('error', reject);
179
+ });
180
+ stream.pipe(fileStream);
181
+ await future;
182
+ this.addToExpiringTable(uuid);
183
+ return uuid;
184
+ }
185
+ /**
186
+ * Set a timer to execute delete callback after `expireMilliseconds`
187
+ */
188
+ addToExpiringTable(uuid) {
189
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'addToExpiringTable(%s)', uuid);
190
+ const expireTime = Date.now() + this.expireMilliseconds;
191
+ const expireTimeInterval = DEFAULT_UUID_PURGE_INTERVAL_MINUTES * 60 * 1000;
192
+ // https://stackoverflow.com/a/22687090
193
+ const expireTimeNearestMinute = Math.ceil(expireTime / expireTimeInterval) * expireTimeInterval;
194
+ const uuidList = this.uuidExpiringTable.get(expireTime) || [];
195
+ uuidList.push(uuid);
196
+ this.uuidExpiringTable.set(expireTimeNearestMinute, uuidList);
197
+ brolog_1.log.silly('UniformResourceNameRegistry', 'addToExpiringTable() uuidList.length = %s, expireTime = %s', uuidList.length, expireTimeNearestMinute);
198
+ }
199
+ async purge(uuid) {
200
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'purge(%s)', uuid);
201
+ const file = this.uuidFileName(uuid);
202
+ try {
203
+ await fs_1.default.promises.unlink(file);
204
+ brolog_1.log.silly('UniformResourceNameRegistry', 'purge() %s', file);
205
+ }
206
+ catch (e) {
207
+ brolog_1.log.warn('UniformResourceNameRegistry', 'purge() rejection:', e.message);
208
+ }
209
+ }
210
+ /**
211
+ * destroy the urn registry.
212
+ *
213
+ * This function will be called automatically at `process.on(exit)`
214
+ * however, it till need to be called before the program ends
215
+ * because there have some timers in eventloop task list
216
+ */
217
+ destroy() {
218
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'destroy() %s UUIDs left', [...this.uuidExpiringTable.values()].flat().length);
219
+ if (this.purgerTimer) {
220
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'destroy() clearing purger timer ...');
221
+ clearInterval(this.purgerTimer);
222
+ this.purgerTimer = undefined;
223
+ }
224
+ const Klass = (0, clone_class_1.instanceToClass)(this, UniformResourceNameRegistry);
225
+ /**
226
+ * Remove process exit listener
227
+ */
228
+ if (Klass.processExitMap.has(this)) {
229
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'destroy() remove process `exit` listener ...');
230
+ const fn = Klass.processExitMap.get(this);
231
+ Klass.processExitMap.delete(this);
232
+ fn && fn();
233
+ }
234
+ /**
235
+ * Clean up all the files
236
+ */
237
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'destroy() fs.rmSync(%s) ...', this.storeDir);
238
+ try {
239
+ /**
240
+ * Huan(202110):
241
+ * Check for the `this.uuidDir` exist or not
242
+ * when we are running unit tests, we might instanciate multiple UniformResourceNameRegistry
243
+ * which will cause the `this.destroy()` to be registered multiple times
244
+ */
245
+ fs_1.default.statSync(this.storeDir);
246
+ fs_1.default.rmSync(this.storeDir, { recursive: true });
247
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'destroy() fs.rmSync(%s) done', this.storeDir);
248
+ }
249
+ catch (e) {
250
+ if (e.code === 'ENOENT') {
251
+ brolog_1.log.verbose('UniformResourceNameRegistry', 'destroy() %s not exist', this.storeDir);
252
+ return;
253
+ }
254
+ brolog_1.log.warn('UniformResourceNameRegistry', 'destroy() fs.rmSync(%s) exception: %s', e.message);
255
+ }
256
+ }
257
+ }
258
+ exports.UniformResourceNameRegistry = UniformResourceNameRegistry;
259
+ //# sourceMappingURL=uniform-resource-name-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-resource-name-registry.js","sourceRoot":"","sources":["../../../../src/urn-registry/uniform-resource-name-registry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;GASG;AACH,4CAAuB;AACvB,4CAAuB;AACvB,gDAAyB;AAIzB,6CAA8C;AAC9C,mCAAyC;AAEzC,gDAE+C;AAE/C,qDAEuC;AAEvC;;GAEG;AACH,MAAM,2BAA2B,GAAW,EAAE,CAAA;AAC9C,MAAM,mCAAmC,GAAG,CAAC,CAAA;AAO7C,MAAM,2BAA2B;IAErB,MAAM,CAAC,cAAc,GAAG,IAAI,OAAO,EAG1C,CAAA;IAEH;;OAEG;IACO,QAAQ,CAAQ;IAEhB,kBAAkB,CAAQ;IAEpC;;;OAGG;IACO,iBAAiB,CAG1B;IAES,WAAW,CAAiC;IAEtD,YACE,UAA8C,EAAE;QAEhD,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;QAExF,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAA;QAElC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,CAAC,2BAA2B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;QACxG,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAI,CAAC,IAAI,CAC3C,YAAE,CAAC,MAAM,EAAE,EACX,wBAAwB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAC/C,CAAA;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,IAAI,EAAE,CAAA;QAEX,MAAM,WAAY,SAAQ,qBAAO;SAAG;QACpC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC/C,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9C,OAAO,WAAW,CAAA;IACpB,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAA;QAEpD,IAAI;YACF,MAAM,IAAI,GAAG,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;gBACvB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,CAAA;aACvD;SACF;QAAC,OAAO,CAAC,EAAE;YACV,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAClD,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;aACjD;iBAAM;gBACL,MAAM,CAAC,CAAA;aACR;SACF;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,sBAAsB,EAAE,CAAA;YAE7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAC5B,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAC7B,mCAAmC,GAAG,EAAE,GAAG,IAAI,CAChD,CAAA;SACF;IAEH,CAAC;IAES,gBAAgB;QACxB,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,oBAAoB,CAAC,CAAA;QAChE,MAAM,cAAc,GAAG,CAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAE;aACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAExC,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE;YACvC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE;gBAC3B,4CAA4C;gBAC5C,MAAK;aACN;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;YAC7D,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAEzC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;gBAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;aACtC;SACF;IACH,CAAC;IAED;;OAEG;IACO,sBAAsB;QAC9B,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,0BAA0B,CAAC,CAAA;QAEtE,MAAM,KAAK,GAAG,IAAA,6BAAe,EAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;QAEhE;;WAEG;QACH,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAClC,OAAM;SACP;QAED,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;QAE5C,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;QAC5C,KAAK,CAAC,cAAc,CAAC,GAAG,CACtB,IAAI,EACJ,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC,CACtD,CAAA;IACH,CAAC;IAES,YAAY,CAAE,IAAY;QAClC,OAAO,cAAI,CAAC,IAAI,CACd,IAAI,CAAC,QAAQ,EACb,IAAI,GAAG,MAAM,CACd,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAE,IAAY;QACzB,YAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,oDAAoD,EAAE,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;QAChH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAE,IAAY;QACtB,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QAE5D,MAAM,QAAQ,GAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,MAAM,GAAM,YAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAE/C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC3B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAE,MAAgB;QAC9B,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,gDAAgD,EAAE,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;QAC/G,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAE,MAAgB;QAC1B,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,cAAc,CAAC,CAAA;QAE1D,MAAM,IAAI,GAAG,IAAA,2BAAU,GAAE,CAAA;QAEzB,MAAM,UAAU,GAAG,YAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAS,OAAO,CAAC,CAAA;YAChC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAO,MAAM,CAAC,CAAA;YAC/B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAG,MAAM,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACvB,MAAM,MAAM,CAAA;QAEZ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAE7B,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACO,kBAAkB,CAAE,IAAY;QACxC,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,wBAAwB,EAAE,IAAI,CAAC,CAAA;QAE1E,MAAM,UAAU,GAAW,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAA;QAC/D,MAAM,kBAAkB,GAAG,mCAAmC,GAAG,EAAE,GAAG,IAAI,CAAA;QAE1E,uCAAuC;QACvC,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC,GAAG,kBAAkB,CAAA;QAE/F,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;QAC7D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAA;QAE7D,YAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,4DAA4D,EACnG,QAAQ,CAAC,MAAM,EACf,uBAAuB,CACxB,CAAA;IACH,CAAC;IAES,KAAK,CAAC,KAAK,CAAE,IAAY;QACjC,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI;YACF,MAAM,YAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC9B,YAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;SAC7D;QAAC,OAAO,CAAC,EAAE;YACV,YAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,oBAAoB,EAAG,CAAW,CAAC,OAAO,CAAC,CAAA;SACpF;IACH,CAAC;IAED;;;;;;OAMG;IACH,OAAO;QACL,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,yBAAyB,EAClE,CAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CACrD,CAAA;QAED,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,qCAAqC,CAAC,CAAA;YACjF,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC/B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;SAC7B;QAED,MAAM,KAAK,GAAG,IAAA,6BAAe,EAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;QAEhE;;WAEG;QACH,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAClC,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,8CAA8C,CAAC,CAAA;YAC1F,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACzC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACjC,EAAE,IAAI,EAAE,EAAE,CAAA;SACX;QAED;;WAEG;QACH,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,6BAA6B,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACxF,IAAI;YACF;;;;;eAKG;YACH,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAE1B,YAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC7C,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,8BAA8B,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;SAE1F;QAAC,OAAO,CAAC,EAAE;YACV,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAClD,YAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,wBAAwB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACnF,OAAM;aACP;YACD,YAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,uCAAuC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAA;SACvG;IACH,CAAC;;AAIM,kEAA2B"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ export {};
3
+ //# sourceMappingURL=uniform-resource-name-registry.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-resource-name-registry.spec.d.ts","sourceRoot":"","sources":["../../../../src/urn-registry/uniform-resource-name-registry.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tstest_1 = require("tstest");
5
+ const file_box_js_1 = require("../file-box.js");
6
+ const uniform_resource_name_registry_js_1 = require("./uniform-resource-name-registry.js");
7
+ (0, tstest_1.test)('UniformResourceNameRegistry class', async (t) => {
8
+ const QRCODE = 'test qrcode';
9
+ const urnRegistry = new uniform_resource_name_registry_js_1.UniformResourceNameRegistry();
10
+ await urnRegistry.init();
11
+ const fileBox = file_box_js_1.FileBox.fromQRCode(QRCODE);
12
+ const stream = await fileBox.toStream();
13
+ const uuid = await urnRegistry.save(stream);
14
+ const stream2 = await urnRegistry.load(uuid);
15
+ t.ok(stream2, 'should load stream');
16
+ const fileBox2 = file_box_js_1.FileBox.fromStream(stream2, 'test');
17
+ const qrcode = await fileBox2.toQRCode();
18
+ t.equal(qrcode, QRCODE, 'should get back the qrcode data');
19
+ await t.resolves(() => urnRegistry.load(uuid), 'should not reject when load a UUID again');
20
+ await urnRegistry.destroy();
21
+ });
22
+ (0, tstest_1.test)('expireMilliseconds: in time', async (t) => {
23
+ const expireMilliseconds = 3;
24
+ const urnRegistry = new uniform_resource_name_registry_js_1.UniformResourceNameRegistry({
25
+ expireMilliseconds,
26
+ });
27
+ await urnRegistry.init();
28
+ const uuid = await urnRegistry.save(await file_box_js_1.FileBox.fromQRCode('qr').toStream());
29
+ await new Promise(resolve => setTimeout(resolve, 1));
30
+ await t.resolves(() => urnRegistry.load(uuid), `should not expire after 1ms (with ${expireMilliseconds}ms expire)`);
31
+ await urnRegistry.destroy();
32
+ });
33
+ (0, tstest_1.test)('expireMilliseconds: time out', async (t) => {
34
+ const sandbox = tstest_1.sinon.createSandbox({
35
+ useFakeTimers: true,
36
+ });
37
+ const expireMilliseconds = 10 * 60 * 1000; // 10 minute
38
+ const urnRegistry = new uniform_resource_name_registry_js_1.UniformResourceNameRegistry({
39
+ expireMilliseconds,
40
+ });
41
+ await urnRegistry.init();
42
+ /**
43
+ * Time: 0
44
+ */
45
+ const uuid1 = await urnRegistry.save(await file_box_js_1.FileBox.fromQRCode('qr').toStream());
46
+ await t.resolves(() => urnRegistry.load(uuid1), 'should load uuid1 successfully');
47
+ /**
48
+ * Time: 5
49
+ */
50
+ await sandbox.clock.tickAsync(5 * 60 * 1000);
51
+ const uuid2 = await urnRegistry.save(await file_box_js_1.FileBox.fromQRCode('qr2').toStream());
52
+ await t.resolves(() => urnRegistry.load(uuid1), 'should load uuid1 successfully after 5 minutes');
53
+ await t.resolves(() => urnRegistry.load(uuid2), 'should load uuid2 successfully');
54
+ /**
55
+ * Time: 11
56
+ */
57
+ await sandbox.clock.tickAsync(6 * 60 * 1000);
58
+ await t.rejects(() => urnRegistry.load(uuid1), 'should load uuid1 fail because it is expired');
59
+ await t.resolves(() => urnRegistry.load(uuid2), 'should load uuid2 successfully 6 minutes after it has been saved');
60
+ /**
61
+ * Time 20
62
+ */
63
+ await sandbox.clock.tickAsync(9 * 60 * 1000);
64
+ await t.rejects(() => urnRegistry.load(uuid2), 'should load uuid2 fail because it is expired');
65
+ await urnRegistry.destroy();
66
+ sandbox.restore();
67
+ });
68
+ (0, tstest_1.test)('URN FileBox helper smoke testing', async (t) => {
69
+ const QRCODE = 'test qrcode';
70
+ const urnRegistry = new uniform_resource_name_registry_js_1.UniformResourceNameRegistry();
71
+ const UUIDFileBox = urnRegistry.getFileBox();
72
+ const uuid = await UUIDFileBox
73
+ .fromQRCode(QRCODE)
74
+ .toUuid();
75
+ const qrcode = await UUIDFileBox
76
+ .fromUuid(uuid)
77
+ .toQRCode();
78
+ t.equal(qrcode, QRCODE, 'should get back the qrcode data');
79
+ urnRegistry.destroy();
80
+ });
81
+ //# sourceMappingURL=uniform-resource-name-registry.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-resource-name-registry.spec.js","sourceRoot":"","sources":["../../../../src/urn-registry/uniform-resource-name-registry.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Convert UUID to BigInt
3
+ * @param uuid
4
+ * @returns BigInt
5
+ */
6
+ declare function uuidToBigInt(uuid: string): BigInt;
7
+ export { uuidToBigInt, };
8
+ //# sourceMappingURL=uuid-to-big-int.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid-to-big-int.d.ts","sourceRoot":"","sources":["../../../../src/urn-registry/uuid-to-big-int.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iBAAS,YAAY,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK3C;AAED,OAAO,EACL,YAAY,GACb,CAAA"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Convert UUID to BigInt
4
+ * @param uuid
5
+ * @returns BigInt
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.uuidToBigInt = void 0;
9
+ function uuidToBigInt(uuid) {
10
+ // credit: https://stackoverflow.com/a/58014300/1123955
11
+ const hexBytes = `0x${uuid.replace(/-/g, '')}`;
12
+ const bigInteger = BigInt(hexBytes);
13
+ return bigInteger;
14
+ }
15
+ exports.uuidToBigInt = uuidToBigInt;
16
+ //# sourceMappingURL=uuid-to-big-int.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid-to-big-int.js","sourceRoot":"","sources":["../../../../src/urn-registry/uuid-to-big-int.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,SAAS,YAAY,CAAE,IAAY;IACjC,uDAAuD;IACvD,MAAM,QAAQ,GAAM,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAA;IACjD,MAAM,UAAU,GAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,OAAO,UAAU,CAAA;AACnB,CAAC;AAGC,oCAAY"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ export {};
3
+ //# sourceMappingURL=uuid-to-big-int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid-to-big-int.spec.d.ts","sourceRoot":"","sources":["../../../../src/urn-registry/uuid-to-big-int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tstest_1 = require("tstest");
5
+ const uuid_to_big_int_js_1 = require("./uuid-to-big-int.js");
6
+ (0, tstest_1.test)('uuidToBigInt() Nil UUID', async (t) => {
7
+ const uuid = '00000000-0000-0000-0000-000000000000';
8
+ const bigInt = (0, uuid_to_big_int_js_1.uuidToBigInt)(uuid);
9
+ t.equal(bigInt.toString(), '0', 'should get zero for a Nil UUID');
10
+ });
11
+ (0, tstest_1.test)('uuidToBigInt() Nil UUID', async (t) => {
12
+ const UUID = '00bd7c03-a690-48d3-a1fe-1314574e4fc1';
13
+ const EXPECTED = BigInt('0x00bd7c03a69048d3a1fe1314574e4fc1');
14
+ const bigInt = (0, uuid_to_big_int_js_1.uuidToBigInt)(UUID);
15
+ t.equal(bigInt, EXPECTED, 'should convert UUID right');
16
+ });
17
+ //# sourceMappingURL=uuid-to-big-int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid-to-big-int.spec.js","sourceRoot":"","sources":["../../../../src/urn-registry/uuid-to-big-int.spec.ts"],"names":[],"mappings":";;;AAEA,mCAA8B;AAE9B,6DAAmD;AAEnD,IAAA,aAAI,EAAC,yBAAyB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACxC,MAAM,IAAI,GAAG,sCAAsC,CAAA;IACnD,MAAM,MAAM,GAAG,IAAA,iCAAY,EAAC,IAAI,CAAC,CAAA;IACjC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,gCAAgC,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,yBAAyB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACxC,MAAM,IAAI,GAAG,sCAAsC,CAAA;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,oCAAoC,CAAC,CAAA;IAE7D,MAAM,MAAM,GAAG,IAAA,iCAAY,EAAC,IAAI,CAAC,CAAA;IACjC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,2BAA2B,CAAC,CAAA;AACxD,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This file was auto generated from scripts/generate-version.sh
3
+ */
4
+ export declare const VERSION: string;
5
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,MAAgB,CAAA"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ /**
5
+ * This file was auto generated from scripts/generate-version.sh
6
+ */
7
+ exports.VERSION = '1.7.0';
8
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,OAAO,GAAW,OAAO,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ export {};
3
+ //# sourceMappingURL=version.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.spec.d.ts","sourceRoot":"","sources":["../../../src/version.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tstest_1 = require("tstest");
5
+ const version_js_1 = require("./version.js");
6
+ (0, tstest_1.test)('Make sure the VERSION is fresh in source code', async (t) => {
7
+ t.equal(version_js_1.VERSION, '0.0.0', 'version should be 0.0.0 in source code, only updated before publish to NPM');
8
+ });
9
+ //# sourceMappingURL=version.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.spec.js","sourceRoot":"","sources":["../../../src/version.spec.ts"],"names":[],"mappings":";;;AAEA,mCAA8B;AAE9B,6CAAsC;AAEtC,IAAA,aAAI,EAAC,+CAA+C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC9D,CAAC,CAAC,KAAK,CAAC,oBAAO,EAAE,OAAO,EAAE,4EAA4E,CAAC,CAAA;AACzG,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ export {};
3
+ //# sourceMappingURL=integration.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.spec.d.ts","sourceRoot":"","sources":["../../../tests/integration.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tstest_1 = require("tstest");
5
+ (0, tstest_1.test)('integration test', async (t) => {
6
+ t.pass('tbw');
7
+ });
8
+ //# sourceMappingURL=integration.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.spec.js","sourceRoot":"","sources":["../../../tests/integration.spec.ts"],"names":[],"mappings":";;;AAEA,mCAA8B;AAE9B,IAAA,aAAI,EAAC,kBAAkB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACf,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ export {};
3
+ //# sourceMappingURL=network-timeout.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-timeout.spec.d.ts","sourceRoot":"","sources":["../../../tests/network-timeout.spec.ts"],"names":[],"mappings":""}