@milaboratories/pl-drivers 1.11.45 → 1.11.47

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 (259) hide show
  1. package/README.md +0 -1
  2. package/dist/clients/constructors.cjs +5 -5
  3. package/dist/clients/constructors.cjs.map +1 -1
  4. package/dist/clients/constructors.d.ts +8 -8
  5. package/dist/clients/constructors.d.ts.map +1 -1
  6. package/dist/clients/constructors.js +5 -5
  7. package/dist/clients/constructors.js.map +1 -1
  8. package/dist/clients/crc32c.cjs.map +1 -1
  9. package/dist/clients/crc32c.d.ts.map +1 -1
  10. package/dist/clients/crc32c.js.map +1 -1
  11. package/dist/clients/download.cjs +12 -13
  12. package/dist/clients/download.cjs.map +1 -1
  13. package/dist/clients/download.d.ts +10 -10
  14. package/dist/clients/download.d.ts.map +1 -1
  15. package/dist/clients/download.js +12 -13
  16. package/dist/clients/download.js.map +1 -1
  17. package/dist/clients/logs.cjs +9 -9
  18. package/dist/clients/logs.cjs.map +1 -1
  19. package/dist/clients/logs.d.ts +8 -8
  20. package/dist/clients/logs.d.ts.map +1 -1
  21. package/dist/clients/logs.js +9 -9
  22. package/dist/clients/logs.js.map +1 -1
  23. package/dist/clients/ls_api.cjs +3 -3
  24. package/dist/clients/ls_api.cjs.map +1 -1
  25. package/dist/clients/ls_api.d.ts +5 -5
  26. package/dist/clients/ls_api.d.ts.map +1 -1
  27. package/dist/clients/ls_api.js +3 -3
  28. package/dist/clients/ls_api.js.map +1 -1
  29. package/dist/clients/progress.cjs +4 -3
  30. package/dist/clients/progress.cjs.map +1 -1
  31. package/dist/clients/progress.d.ts +7 -7
  32. package/dist/clients/progress.d.ts.map +1 -1
  33. package/dist/clients/progress.js +4 -3
  34. package/dist/clients/progress.js.map +1 -1
  35. package/dist/clients/upload.cjs +20 -20
  36. package/dist/clients/upload.cjs.map +1 -1
  37. package/dist/clients/upload.d.ts +6 -6
  38. package/dist/clients/upload.d.ts.map +1 -1
  39. package/dist/clients/upload.js +20 -20
  40. package/dist/clients/upload.js.map +1 -1
  41. package/dist/drivers/download_blob/blob_key.cjs.map +1 -1
  42. package/dist/drivers/download_blob/blob_key.js.map +1 -1
  43. package/dist/drivers/download_blob/download_blob.cjs +20 -20
  44. package/dist/drivers/download_blob/download_blob.cjs.map +1 -1
  45. package/dist/drivers/download_blob/download_blob.d.ts +9 -9
  46. package/dist/drivers/download_blob/download_blob.d.ts.map +1 -1
  47. package/dist/drivers/download_blob/download_blob.js +20 -20
  48. package/dist/drivers/download_blob/download_blob.js.map +1 -1
  49. package/dist/drivers/download_blob/download_blob_task.cjs +14 -14
  50. package/dist/drivers/download_blob/download_blob_task.cjs.map +1 -1
  51. package/dist/drivers/download_blob/download_blob_task.d.ts +7 -7
  52. package/dist/drivers/download_blob/download_blob_task.d.ts.map +1 -1
  53. package/dist/drivers/download_blob/download_blob_task.js +14 -14
  54. package/dist/drivers/download_blob/download_blob_task.js.map +1 -1
  55. package/dist/drivers/download_blob/sparse_cache/cache.cjs +4 -4
  56. package/dist/drivers/download_blob/sparse_cache/cache.cjs.map +1 -1
  57. package/dist/drivers/download_blob/sparse_cache/cache.d.ts +3 -3
  58. package/dist/drivers/download_blob/sparse_cache/cache.d.ts.map +1 -1
  59. package/dist/drivers/download_blob/sparse_cache/cache.js +4 -4
  60. package/dist/drivers/download_blob/sparse_cache/cache.js.map +1 -1
  61. package/dist/drivers/download_blob/sparse_cache/file.cjs +4 -4
  62. package/dist/drivers/download_blob/sparse_cache/file.cjs.map +1 -1
  63. package/dist/drivers/download_blob/sparse_cache/file.d.ts.map +1 -1
  64. package/dist/drivers/download_blob/sparse_cache/file.js +4 -4
  65. package/dist/drivers/download_blob/sparse_cache/file.js.map +1 -1
  66. package/dist/drivers/download_blob/sparse_cache/ranges.cjs +4 -4
  67. package/dist/drivers/download_blob/sparse_cache/ranges.cjs.map +1 -1
  68. package/dist/drivers/download_blob/sparse_cache/ranges.d.ts.map +1 -1
  69. package/dist/drivers/download_blob/sparse_cache/ranges.js +4 -4
  70. package/dist/drivers/download_blob/sparse_cache/ranges.js.map +1 -1
  71. package/dist/drivers/download_blob_url/driver.cjs +3 -3
  72. package/dist/drivers/download_blob_url/driver.cjs.map +1 -1
  73. package/dist/drivers/download_blob_url/driver.d.ts +9 -9
  74. package/dist/drivers/download_blob_url/driver.d.ts.map +1 -1
  75. package/dist/drivers/download_blob_url/driver.js +3 -3
  76. package/dist/drivers/download_blob_url/driver.js.map +1 -1
  77. package/dist/drivers/download_blob_url/driver_id.cjs.map +1 -1
  78. package/dist/drivers/download_blob_url/driver_id.d.ts +2 -2
  79. package/dist/drivers/download_blob_url/driver_id.js.map +1 -1
  80. package/dist/drivers/download_blob_url/snapshot.cjs.map +1 -1
  81. package/dist/drivers/download_blob_url/snapshot.d.ts +2 -2
  82. package/dist/drivers/download_blob_url/snapshot.d.ts.map +1 -1
  83. package/dist/drivers/download_blob_url/snapshot.js.map +1 -1
  84. package/dist/drivers/download_blob_url/task.cjs +14 -16
  85. package/dist/drivers/download_blob_url/task.cjs.map +1 -1
  86. package/dist/drivers/download_blob_url/task.d.ts +7 -7
  87. package/dist/drivers/download_blob_url/task.d.ts.map +1 -1
  88. package/dist/drivers/download_blob_url/task.js +14 -16
  89. package/dist/drivers/download_blob_url/task.js.map +1 -1
  90. package/dist/drivers/download_url/driver.cjs +4 -4
  91. package/dist/drivers/download_url/driver.cjs.map +1 -1
  92. package/dist/drivers/download_url/driver.d.ts +6 -6
  93. package/dist/drivers/download_url/driver.d.ts.map +1 -1
  94. package/dist/drivers/download_url/driver.js +4 -4
  95. package/dist/drivers/download_url/driver.js.map +1 -1
  96. package/dist/drivers/download_url/task.cjs +2 -2
  97. package/dist/drivers/download_url/task.cjs.map +1 -1
  98. package/dist/drivers/download_url/task.d.ts +6 -6
  99. package/dist/drivers/download_url/task.d.ts.map +1 -1
  100. package/dist/drivers/download_url/task.js +2 -2
  101. package/dist/drivers/download_url/task.js.map +1 -1
  102. package/dist/drivers/helpers/download_local_handle.cjs.map +1 -1
  103. package/dist/drivers/helpers/download_local_handle.d.ts +2 -2
  104. package/dist/drivers/helpers/download_local_handle.js.map +1 -1
  105. package/dist/drivers/helpers/download_remote_handle.cjs.map +1 -1
  106. package/dist/drivers/helpers/download_remote_handle.d.ts +4 -4
  107. package/dist/drivers/helpers/download_remote_handle.d.ts.map +1 -1
  108. package/dist/drivers/helpers/download_remote_handle.js.map +1 -1
  109. package/dist/drivers/helpers/files_cache.cjs.map +1 -1
  110. package/dist/drivers/helpers/files_cache.d.ts +1 -1
  111. package/dist/drivers/helpers/files_cache.js.map +1 -1
  112. package/dist/drivers/helpers/helpers.cjs +1 -1
  113. package/dist/drivers/helpers/helpers.cjs.map +1 -1
  114. package/dist/drivers/helpers/helpers.js +1 -1
  115. package/dist/drivers/helpers/helpers.js.map +1 -1
  116. package/dist/drivers/helpers/logs_handle.cjs.map +1 -1
  117. package/dist/drivers/helpers/logs_handle.d.ts +2 -2
  118. package/dist/drivers/helpers/logs_handle.d.ts.map +1 -1
  119. package/dist/drivers/helpers/logs_handle.js.map +1 -1
  120. package/dist/drivers/helpers/ls_remote_import_handle.cjs.map +1 -1
  121. package/dist/drivers/helpers/ls_remote_import_handle.d.ts +3 -3
  122. package/dist/drivers/helpers/ls_remote_import_handle.js.map +1 -1
  123. package/dist/drivers/helpers/ls_storage_entry.cjs +1 -1
  124. package/dist/drivers/helpers/ls_storage_entry.cjs.map +1 -1
  125. package/dist/drivers/helpers/ls_storage_entry.d.ts +2 -2
  126. package/dist/drivers/helpers/ls_storage_entry.js +1 -1
  127. package/dist/drivers/helpers/ls_storage_entry.js.map +1 -1
  128. package/dist/drivers/helpers/read_file.cjs.map +1 -1
  129. package/dist/drivers/helpers/read_file.d.ts +1 -1
  130. package/dist/drivers/helpers/read_file.js.map +1 -1
  131. package/dist/drivers/logs.cjs +6 -6
  132. package/dist/drivers/logs.cjs.map +1 -1
  133. package/dist/drivers/logs.d.ts +7 -7
  134. package/dist/drivers/logs.d.ts.map +1 -1
  135. package/dist/drivers/logs.js +6 -6
  136. package/dist/drivers/logs.js.map +1 -1
  137. package/dist/drivers/logs_stream.cjs +9 -9
  138. package/dist/drivers/logs_stream.cjs.map +1 -1
  139. package/dist/drivers/logs_stream.d.ts +7 -7
  140. package/dist/drivers/logs_stream.d.ts.map +1 -1
  141. package/dist/drivers/logs_stream.js +9 -9
  142. package/dist/drivers/logs_stream.js.map +1 -1
  143. package/dist/drivers/ls.cjs +22 -22
  144. package/dist/drivers/ls.cjs.map +1 -1
  145. package/dist/drivers/ls.d.ts +6 -6
  146. package/dist/drivers/ls.d.ts.map +1 -1
  147. package/dist/drivers/ls.js +22 -22
  148. package/dist/drivers/ls.js.map +1 -1
  149. package/dist/drivers/types.cjs +2 -2
  150. package/dist/drivers/types.cjs.map +1 -1
  151. package/dist/drivers/types.d.ts +4 -4
  152. package/dist/drivers/types.d.ts.map +1 -1
  153. package/dist/drivers/types.js +2 -2
  154. package/dist/drivers/types.js.map +1 -1
  155. package/dist/drivers/upload.cjs +6 -6
  156. package/dist/drivers/upload.cjs.map +1 -1
  157. package/dist/drivers/upload.d.ts +9 -9
  158. package/dist/drivers/upload.d.ts.map +1 -1
  159. package/dist/drivers/upload.js +6 -6
  160. package/dist/drivers/upload.js.map +1 -1
  161. package/dist/drivers/upload_task.cjs +17 -17
  162. package/dist/drivers/upload_task.cjs.map +1 -1
  163. package/dist/drivers/upload_task.d.ts +9 -9
  164. package/dist/drivers/upload_task.d.ts.map +1 -1
  165. package/dist/drivers/upload_task.js +17 -17
  166. package/dist/drivers/upload_task.js.map +1 -1
  167. package/dist/drivers/urls/url.cjs +4 -4
  168. package/dist/drivers/urls/url.cjs.map +1 -1
  169. package/dist/drivers/urls/url.d.ts +2 -2
  170. package/dist/drivers/urls/url.js +4 -4
  171. package/dist/drivers/urls/url.js.map +1 -1
  172. package/dist/drivers/virtual_storages.cjs +9 -9
  173. package/dist/drivers/virtual_storages.cjs.map +1 -1
  174. package/dist/drivers/virtual_storages.d.ts +1 -1
  175. package/dist/drivers/virtual_storages.js +9 -9
  176. package/dist/drivers/virtual_storages.js.map +1 -1
  177. package/dist/helpers/download.cjs +3 -3
  178. package/dist/helpers/download.cjs.map +1 -1
  179. package/dist/helpers/download.d.ts +3 -3
  180. package/dist/helpers/download.d.ts.map +1 -1
  181. package/dist/helpers/download.js +3 -3
  182. package/dist/helpers/download.js.map +1 -1
  183. package/dist/helpers/download_errors.cjs +6 -6
  184. package/dist/helpers/download_errors.cjs.map +1 -1
  185. package/dist/helpers/download_errors.d.ts.map +1 -1
  186. package/dist/helpers/download_errors.js +6 -6
  187. package/dist/helpers/download_errors.js.map +1 -1
  188. package/dist/helpers/validate.cjs.map +1 -1
  189. package/dist/helpers/validate.js.map +1 -1
  190. package/dist/index.d.ts +21 -21
  191. package/dist/proto-rest/downloadapi.d.ts.map +1 -1
  192. package/dist/proto-rest/index.d.ts +6 -6
  193. package/dist/proto-rest/lsapi.d.ts.map +1 -1
  194. package/dist/proto-rest/progressapi.d.ts.map +1 -1
  195. package/dist/proto-rest/streamingapi.d.ts.map +1 -1
  196. package/dist/proto-rest/uploadapi.d.ts.map +1 -1
  197. package/package.json +27 -26
  198. package/src/clients/constructors.ts +19 -16
  199. package/src/clients/crc32c.ts +257 -65
  200. package/src/clients/download.test.ts +27 -27
  201. package/src/clients/download.ts +44 -38
  202. package/src/clients/logs.ts +56 -52
  203. package/src/clients/ls_api.ts +33 -30
  204. package/src/clients/progress.ts +35 -31
  205. package/src/clients/upload.test.ts +11 -11
  206. package/src/clients/upload.ts +95 -79
  207. package/src/drivers/download_blob/blob_key.ts +1 -1
  208. package/src/drivers/download_blob/download_blob.test.ts +72 -74
  209. package/src/drivers/download_blob/download_blob.ts +94 -89
  210. package/src/drivers/download_blob/download_blob_task.ts +33 -36
  211. package/src/drivers/download_blob/sparse_cache/cache.test.ts +140 -156
  212. package/src/drivers/download_blob/sparse_cache/cache.ts +23 -15
  213. package/src/drivers/download_blob/sparse_cache/create_sparse_file_script.js +31 -38
  214. package/src/drivers/download_blob/sparse_cache/file.ts +7 -11
  215. package/src/drivers/download_blob/sparse_cache/ranges.test.ts +30 -30
  216. package/src/drivers/download_blob/sparse_cache/ranges.ts +5 -7
  217. package/src/drivers/download_blob_url/driver.ts +34 -29
  218. package/src/drivers/download_blob_url/driver_id.ts +2 -2
  219. package/src/drivers/download_blob_url/snapshot.ts +13 -3
  220. package/src/drivers/download_blob_url/task.ts +54 -40
  221. package/src/drivers/download_url/driver.test.ts +24 -26
  222. package/src/drivers/download_url/driver.ts +20 -28
  223. package/src/drivers/download_url/task.ts +22 -24
  224. package/src/drivers/helpers/download_local_handle.ts +2 -2
  225. package/src/drivers/helpers/download_remote_handle.ts +14 -11
  226. package/src/drivers/helpers/files_cache.test.ts +13 -13
  227. package/src/drivers/helpers/files_cache.ts +2 -2
  228. package/src/drivers/helpers/helpers.ts +1 -1
  229. package/src/drivers/helpers/logs_handle.ts +7 -7
  230. package/src/drivers/helpers/ls_remote_import_handle.ts +3 -3
  231. package/src/drivers/helpers/ls_storage_entry.ts +5 -5
  232. package/src/drivers/helpers/read_file.ts +5 -5
  233. package/src/drivers/helpers/test_helpers.ts +1 -1
  234. package/src/drivers/logs.test.ts +97 -92
  235. package/src/drivers/logs.ts +29 -20
  236. package/src/drivers/logs_stream.ts +30 -39
  237. package/src/drivers/ls.test.ts +44 -50
  238. package/src/drivers/ls.ts +42 -41
  239. package/src/drivers/types.ts +9 -7
  240. package/src/drivers/upload.test.ts +48 -48
  241. package/src/drivers/upload.ts +25 -34
  242. package/src/drivers/upload_task.ts +49 -40
  243. package/src/drivers/urls/url.test.ts +33 -32
  244. package/src/drivers/urls/url.ts +12 -8
  245. package/src/drivers/virtual_storages.ts +14 -14
  246. package/src/helpers/download.ts +41 -33
  247. package/src/helpers/download_errors.ts +9 -7
  248. package/src/helpers/validate.ts +1 -1
  249. package/src/index.ts +21 -21
  250. package/src/proto-rest/downloadapi.ts +86 -86
  251. package/src/proto-rest/index.ts +6 -6
  252. package/src/proto-rest/lsapi.ts +129 -129
  253. package/src/proto-rest/progressapi.ts +135 -135
  254. package/src/proto-rest/streamingapi.ts +430 -430
  255. package/src/proto-rest/uploadapi.ts +321 -321
  256. package/src/test_env.ts +1 -1
  257. package/dist/drivers/download_blob_url/url.d.ts +0 -2
  258. package/dist/drivers/download_blob_url/url.d.ts.map +0 -1
  259. package/src/drivers/download_blob_url/url.ts +0 -0
package/README.md CHANGED
@@ -8,7 +8,6 @@ Dependencies:
8
8
  - `brew install protobuf`
9
9
  - you don't need `protoc-gen-js`, just run `npm install`
10
10
  - `protodep`
11
-
12
11
  - `go install github.com/milaboratory/protodep@v0.1.7-milab`
13
12
 
14
13
  check that you have `${HOME}/go/bin` in `PATH`
@@ -8,31 +8,31 @@ var ls_api = require('./ls_api.cjs');
8
8
 
9
9
  function createDownloadClient(logger, client, localProjections) {
10
10
  return client.getDriver({
11
- name: 'DownloadBlob',
11
+ name: "DownloadBlob",
12
12
  init: (_, wireClientFactory, httpDispatcher) => new download.ClientDownload(wireClientFactory, httpDispatcher, logger, localProjections),
13
13
  });
14
14
  }
15
15
  function createLogsClient(client, logger) {
16
16
  return client.getDriver({
17
- name: 'StreamLogs',
17
+ name: "StreamLogs",
18
18
  init: (_, wireClientFactory, httpDispatcher) => new logs.ClientLogs(wireClientFactory, httpDispatcher, logger),
19
19
  });
20
20
  }
21
21
  function createUploadProgressClient(client, logger) {
22
22
  return client.getDriver({
23
- name: 'UploadProgress',
23
+ name: "UploadProgress",
24
24
  init: (_, wireClientFactory, httpDispatcher) => new progress.ClientProgress(wireClientFactory, httpDispatcher, client, logger),
25
25
  });
26
26
  }
27
27
  function createUploadBlobClient(client, logger) {
28
28
  return client.getDriver({
29
- name: 'UploadBlob',
29
+ name: "UploadBlob",
30
30
  init: (_, wireClientFactory, httpDispatcher) => new upload.ClientUpload(wireClientFactory, httpDispatcher, client, logger),
31
31
  });
32
32
  }
33
33
  function createLsFilesClient(client, logger) {
34
34
  return client.getDriver({
35
- name: 'LsFiles',
35
+ name: "LsFiles",
36
36
  init: (_client, wireClientFactory, _httpDispatcher) => new ls_api.ClientLs(wireClientFactory, logger),
37
37
  });
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"constructors.cjs","sources":["../../src/clients/constructors.ts"],"sourcesContent":["import type { WireClientProviderFactory, PlClient } from '@milaboratories/pl-client';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport type { Dispatcher } from 'undici';\nimport { ClientDownload } from './download';\nimport { ClientLogs } from './logs';\nimport { ClientProgress } from './progress';\nimport { ClientUpload } from './upload';\nimport { ClientLs } from './ls_api';\nimport type { LocalStorageProjection } from '../drivers/types';\n\nexport function createDownloadClient(\n logger: MiLogger,\n client: PlClient,\n localProjections: LocalStorageProjection[],\n) {\n return client.getDriver({\n name: 'DownloadBlob',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientDownload(wireClientFactory, httpDispatcher, logger, localProjections),\n });\n}\n\nexport function createLogsClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'StreamLogs',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientLogs(wireClientFactory, httpDispatcher, logger),\n });\n}\n\nexport function createUploadProgressClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'UploadProgress',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientProgress(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createUploadBlobClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'UploadBlob',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientUpload(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createLsFilesClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'LsFiles',\n init: (_client: PlClient, wireClientFactory: WireClientProviderFactory, _httpDispatcher: Dispatcher) =>\n new ClientLs(wireClientFactory, logger),\n });\n}\n"],"names":["ClientDownload","ClientLogs","ClientProgress","ClientUpload","ClientLs"],"mappings":";;;;;;;;SAUgB,oBAAoB,CAClC,MAAgB,EAChB,MAAgB,EAChB,gBAA0C,EAAA;IAE1C,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIA,uBAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC;AAClF,KAAA,CAAC;AACJ;AAEM,SAAU,gBAAgB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACjE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIC,eAAU,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,CAAC;AAC5D,KAAA,CAAC;AACJ;AAEM,SAAU,0BAA0B,CAAC,MAAgB,EAAE,MAAgB,EAAA;IAC3E,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIC,uBAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACxE,KAAA,CAAC;AACJ;AAEM,SAAU,sBAAsB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACvE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIC,mBAAY,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACtE,KAAA,CAAC;AACJ;AAEM,SAAU,mBAAmB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACpE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,IAAI,EAAE,CAAC,OAAiB,EAAE,iBAA4C,EAAE,eAA2B,KACjG,IAAIC,eAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAC1C,KAAA,CAAC;AACJ;;;;;;;;"}
1
+ {"version":3,"file":"constructors.cjs","sources":["../../src/clients/constructors.ts"],"sourcesContent":["import type { WireClientProviderFactory, PlClient } from \"@milaboratories/pl-client\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport type { Dispatcher } from \"undici\";\nimport { ClientDownload } from \"./download\";\nimport { ClientLogs } from \"./logs\";\nimport { ClientProgress } from \"./progress\";\nimport { ClientUpload } from \"./upload\";\nimport { ClientLs } from \"./ls_api\";\nimport type { LocalStorageProjection } from \"../drivers/types\";\n\nexport function createDownloadClient(\n logger: MiLogger,\n client: PlClient,\n localProjections: LocalStorageProjection[],\n) {\n return client.getDriver({\n name: \"DownloadBlob\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientDownload(wireClientFactory, httpDispatcher, logger, localProjections),\n });\n}\n\nexport function createLogsClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"StreamLogs\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientLogs(wireClientFactory, httpDispatcher, logger),\n });\n}\n\nexport function createUploadProgressClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"UploadProgress\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientProgress(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createUploadBlobClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"UploadBlob\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientUpload(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createLsFilesClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"LsFiles\",\n init: (\n _client: PlClient,\n wireClientFactory: WireClientProviderFactory,\n _httpDispatcher: Dispatcher,\n ) => new ClientLs(wireClientFactory, logger),\n });\n}\n"],"names":["ClientDownload","ClientLogs","ClientProgress","ClientUpload","ClientLs"],"mappings":";;;;;;;;SAUgB,oBAAoB,CAClC,MAAgB,EAChB,MAAgB,EAChB,gBAA0C,EAAA;IAE1C,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIA,uBAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC;AAClF,KAAA,CAAC;AACJ;AAEM,SAAU,gBAAgB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACjE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIC,eAAU,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,CAAC;AAC5D,KAAA,CAAC;AACJ;AAEM,SAAU,0BAA0B,CAAC,MAAgB,EAAE,MAAgB,EAAA;IAC3E,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIC,uBAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACxE,KAAA,CAAC;AACJ;AAEM,SAAU,sBAAsB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACvE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAIC,mBAAY,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACtE,KAAA,CAAC;AACJ;AAEM,SAAU,mBAAmB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACpE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,IAAI,EAAE,CACJ,OAAiB,EACjB,iBAA4C,EAC5C,eAA2B,KACxB,IAAIC,eAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAC7C,KAAA,CAAC;AACJ;;;;;;;;"}
@@ -1,11 +1,11 @@
1
- import type { PlClient } from '@milaboratories/pl-client';
2
- import type { MiLogger } from '@milaboratories/ts-helpers';
3
- import { ClientDownload } from './download';
4
- import { ClientLogs } from './logs';
5
- import { ClientProgress } from './progress';
6
- import { ClientUpload } from './upload';
7
- import { ClientLs } from './ls_api';
8
- import type { LocalStorageProjection } from '../drivers/types';
1
+ import type { PlClient } from "@milaboratories/pl-client";
2
+ import type { MiLogger } from "@milaboratories/ts-helpers";
3
+ import { ClientDownload } from "./download";
4
+ import { ClientLogs } from "./logs";
5
+ import { ClientProgress } from "./progress";
6
+ import { ClientUpload } from "./upload";
7
+ import { ClientLs } from "./ls_api";
8
+ import type { LocalStorageProjection } from "../drivers/types";
9
9
  export declare function createDownloadClient(logger: MiLogger, client: PlClient, localProjections: LocalStorageProjection[]): ClientDownload;
10
10
  export declare function createLogsClient(client: PlClient, logger: MiLogger): ClientLogs;
11
11
  export declare function createUploadProgressClient(client: PlClient, logger: MiLogger): ClientProgress;
@@ -1 +1 @@
1
- {"version":3,"file":"constructors.d.ts","sourceRoot":"","sources":["../../src/clients/constructors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,gBAAgB,EAAE,sBAAsB,EAAE,kBAO3C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,cAMlE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,kBAM5E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,gBAMxE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,YAMrE"}
1
+ {"version":3,"file":"constructors.d.ts","sourceRoot":"","sources":["../../src/clients/constructors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,gBAAgB,EAAE,sBAAsB,EAAE,kBAO3C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,cAMlE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,kBAM5E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,gBAMxE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,YASrE"}
@@ -6,31 +6,31 @@ import { ClientLs } from './ls_api.js';
6
6
 
7
7
  function createDownloadClient(logger, client, localProjections) {
8
8
  return client.getDriver({
9
- name: 'DownloadBlob',
9
+ name: "DownloadBlob",
10
10
  init: (_, wireClientFactory, httpDispatcher) => new ClientDownload(wireClientFactory, httpDispatcher, logger, localProjections),
11
11
  });
12
12
  }
13
13
  function createLogsClient(client, logger) {
14
14
  return client.getDriver({
15
- name: 'StreamLogs',
15
+ name: "StreamLogs",
16
16
  init: (_, wireClientFactory, httpDispatcher) => new ClientLogs(wireClientFactory, httpDispatcher, logger),
17
17
  });
18
18
  }
19
19
  function createUploadProgressClient(client, logger) {
20
20
  return client.getDriver({
21
- name: 'UploadProgress',
21
+ name: "UploadProgress",
22
22
  init: (_, wireClientFactory, httpDispatcher) => new ClientProgress(wireClientFactory, httpDispatcher, client, logger),
23
23
  });
24
24
  }
25
25
  function createUploadBlobClient(client, logger) {
26
26
  return client.getDriver({
27
- name: 'UploadBlob',
27
+ name: "UploadBlob",
28
28
  init: (_, wireClientFactory, httpDispatcher) => new ClientUpload(wireClientFactory, httpDispatcher, client, logger),
29
29
  });
30
30
  }
31
31
  function createLsFilesClient(client, logger) {
32
32
  return client.getDriver({
33
- name: 'LsFiles',
33
+ name: "LsFiles",
34
34
  init: (_client, wireClientFactory, _httpDispatcher) => new ClientLs(wireClientFactory, logger),
35
35
  });
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"constructors.js","sources":["../../src/clients/constructors.ts"],"sourcesContent":["import type { WireClientProviderFactory, PlClient } from '@milaboratories/pl-client';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport type { Dispatcher } from 'undici';\nimport { ClientDownload } from './download';\nimport { ClientLogs } from './logs';\nimport { ClientProgress } from './progress';\nimport { ClientUpload } from './upload';\nimport { ClientLs } from './ls_api';\nimport type { LocalStorageProjection } from '../drivers/types';\n\nexport function createDownloadClient(\n logger: MiLogger,\n client: PlClient,\n localProjections: LocalStorageProjection[],\n) {\n return client.getDriver({\n name: 'DownloadBlob',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientDownload(wireClientFactory, httpDispatcher, logger, localProjections),\n });\n}\n\nexport function createLogsClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'StreamLogs',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientLogs(wireClientFactory, httpDispatcher, logger),\n });\n}\n\nexport function createUploadProgressClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'UploadProgress',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientProgress(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createUploadBlobClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'UploadBlob',\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientUpload(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createLsFilesClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: 'LsFiles',\n init: (_client: PlClient, wireClientFactory: WireClientProviderFactory, _httpDispatcher: Dispatcher) =>\n new ClientLs(wireClientFactory, logger),\n });\n}\n"],"names":[],"mappings":";;;;;;SAUgB,oBAAoB,CAClC,MAAgB,EAChB,MAAgB,EAChB,gBAA0C,EAAA;IAE1C,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,cAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC;AAClF,KAAA,CAAC;AACJ;AAEM,SAAU,gBAAgB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACjE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,UAAU,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,CAAC;AAC5D,KAAA,CAAC;AACJ;AAEM,SAAU,0BAA0B,CAAC,MAAgB,EAAE,MAAgB,EAAA;IAC3E,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,cAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACxE,KAAA,CAAC;AACJ;AAEM,SAAU,sBAAsB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACvE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,YAAY,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACtE,KAAA,CAAC;AACJ;AAEM,SAAU,mBAAmB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACpE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,IAAI,EAAE,CAAC,OAAiB,EAAE,iBAA4C,EAAE,eAA2B,KACjG,IAAI,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAC1C,KAAA,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"constructors.js","sources":["../../src/clients/constructors.ts"],"sourcesContent":["import type { WireClientProviderFactory, PlClient } from \"@milaboratories/pl-client\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport type { Dispatcher } from \"undici\";\nimport { ClientDownload } from \"./download\";\nimport { ClientLogs } from \"./logs\";\nimport { ClientProgress } from \"./progress\";\nimport { ClientUpload } from \"./upload\";\nimport { ClientLs } from \"./ls_api\";\nimport type { LocalStorageProjection } from \"../drivers/types\";\n\nexport function createDownloadClient(\n logger: MiLogger,\n client: PlClient,\n localProjections: LocalStorageProjection[],\n) {\n return client.getDriver({\n name: \"DownloadBlob\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientDownload(wireClientFactory, httpDispatcher, logger, localProjections),\n });\n}\n\nexport function createLogsClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"StreamLogs\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientLogs(wireClientFactory, httpDispatcher, logger),\n });\n}\n\nexport function createUploadProgressClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"UploadProgress\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientProgress(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createUploadBlobClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"UploadBlob\",\n init: (_: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher) =>\n new ClientUpload(wireClientFactory, httpDispatcher, client, logger),\n });\n}\n\nexport function createLsFilesClient(client: PlClient, logger: MiLogger) {\n return client.getDriver({\n name: \"LsFiles\",\n init: (\n _client: PlClient,\n wireClientFactory: WireClientProviderFactory,\n _httpDispatcher: Dispatcher,\n ) => new ClientLs(wireClientFactory, logger),\n });\n}\n"],"names":[],"mappings":";;;;;;SAUgB,oBAAoB,CAClC,MAAgB,EAChB,MAAgB,EAChB,gBAA0C,EAAA;IAE1C,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,cAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC;AAClF,KAAA,CAAC;AACJ;AAEM,SAAU,gBAAgB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACjE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,UAAU,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,CAAC;AAC5D,KAAA,CAAC;AACJ;AAEM,SAAU,0BAA0B,CAAC,MAAgB,EAAE,MAAgB,EAAA;IAC3E,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,cAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACxE,KAAA,CAAC;AACJ;AAEM,SAAU,sBAAsB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACvE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,CAAC,CAAW,EAAE,iBAA4C,EAAE,cAA0B,KAC1F,IAAI,YAAY,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;AACtE,KAAA,CAAC;AACJ;AAEM,SAAU,mBAAmB,CAAC,MAAgB,EAAE,MAAgB,EAAA;IACpE,OAAO,MAAM,CAAC,SAAS,CAAC;AACtB,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,IAAI,EAAE,CACJ,OAAiB,EACjB,iBAA4C,EAC5C,eAA2B,KACxB,IAAI,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAC7C,KAAA,CAAC;AACJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"crc32c.cjs","sources":["../../src/clients/crc32c.ts"],"sourcesContent":["// copy from https://github.com/ashi009/node-fast-crc32c/blob/master/impls/js_crc32c.js\n// can not use fast-crc32c because it try to use native solution that brokes in electron\nconst kCRCTable = Int32Array.of(\n 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,\n 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,\n 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,\n 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,\n 0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,\n 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,\n 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,\n 0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,\n 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,\n 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,\n 0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,\n 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,\n 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,\n 0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,\n 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,\n 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,\n 0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,\n 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,\n 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,\n 0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,\n 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,\n 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,\n 0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,\n 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,\n 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,\n 0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,\n 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,\n 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,\n 0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,\n 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,\n 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,\n 0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,\n 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,\n 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,\n 0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,\n 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,\n 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,\n 0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,\n 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,\n 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,\n 0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,\n 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,\n 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,\n 0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,\n 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,\n 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,\n 0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,\n 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,\n 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,\n 0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,\n 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,\n 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,\n 0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,\n 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,\n 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,\n 0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,\n 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,\n 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,\n 0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,\n 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,\n 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,\n 0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,\n 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,\n 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351,\n);\n\nexport function crc32c(buf: Buffer | string, initial: number = 0) {\n if (!Buffer.isBuffer(buf)) {\n buf = Buffer.from(buf);\n }\n let crc = (initial | 0) ^ -1;\n for (let i = 0; i < buf.length; i++) {\n crc = kCRCTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ -1) >>> 0;\n};\n"],"names":[],"mappings":";;AAAA;AACA;AACA,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAC7B,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAC/C;SAEe,MAAM,CAAC,GAAoB,EAAE,UAAkB,CAAC,EAAA;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACzB,QAAA,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;IACA,IAAI,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE;AAC5B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,GAAG,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACtD;IACA,OAAO,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC;AACzB;;;;"}
1
+ {"version":3,"file":"crc32c.cjs","sources":["../../src/clients/crc32c.ts"],"sourcesContent":["// copy from https://github.com/ashi009/node-fast-crc32c/blob/master/impls/js_crc32c.js\n// can not use fast-crc32c because it try to use native solution that brokes in electron\nconst kCRCTable = Int32Array.of(\n 0x00000000,\n 0xf26b8303,\n 0xe13b70f7,\n 0x1350f3f4,\n 0xc79a971f,\n 0x35f1141c,\n 0x26a1e7e8,\n 0xd4ca64eb,\n 0x8ad958cf,\n 0x78b2dbcc,\n 0x6be22838,\n 0x9989ab3b,\n 0x4d43cfd0,\n 0xbf284cd3,\n 0xac78bf27,\n 0x5e133c24,\n 0x105ec76f,\n 0xe235446c,\n 0xf165b798,\n 0x030e349b,\n 0xd7c45070,\n 0x25afd373,\n 0x36ff2087,\n 0xc494a384,\n 0x9a879fa0,\n 0x68ec1ca3,\n 0x7bbcef57,\n 0x89d76c54,\n 0x5d1d08bf,\n 0xaf768bbc,\n 0xbc267848,\n 0x4e4dfb4b,\n 0x20bd8ede,\n 0xd2d60ddd,\n 0xc186fe29,\n 0x33ed7d2a,\n 0xe72719c1,\n 0x154c9ac2,\n 0x061c6936,\n 0xf477ea35,\n 0xaa64d611,\n 0x580f5512,\n 0x4b5fa6e6,\n 0xb93425e5,\n 0x6dfe410e,\n 0x9f95c20d,\n 0x8cc531f9,\n 0x7eaeb2fa,\n 0x30e349b1,\n 0xc288cab2,\n 0xd1d83946,\n 0x23b3ba45,\n 0xf779deae,\n 0x05125dad,\n 0x1642ae59,\n 0xe4292d5a,\n 0xba3a117e,\n 0x4851927d,\n 0x5b016189,\n 0xa96ae28a,\n 0x7da08661,\n 0x8fcb0562,\n 0x9c9bf696,\n 0x6ef07595,\n 0x417b1dbc,\n 0xb3109ebf,\n 0xa0406d4b,\n 0x522bee48,\n 0x86e18aa3,\n 0x748a09a0,\n 0x67dafa54,\n 0x95b17957,\n 0xcba24573,\n 0x39c9c670,\n 0x2a993584,\n 0xd8f2b687,\n 0x0c38d26c,\n 0xfe53516f,\n 0xed03a29b,\n 0x1f682198,\n 0x5125dad3,\n 0xa34e59d0,\n 0xb01eaa24,\n 0x42752927,\n 0x96bf4dcc,\n 0x64d4cecf,\n 0x77843d3b,\n 0x85efbe38,\n 0xdbfc821c,\n 0x2997011f,\n 0x3ac7f2eb,\n 0xc8ac71e8,\n 0x1c661503,\n 0xee0d9600,\n 0xfd5d65f4,\n 0x0f36e6f7,\n 0x61c69362,\n 0x93ad1061,\n 0x80fde395,\n 0x72966096,\n 0xa65c047d,\n 0x5437877e,\n 0x4767748a,\n 0xb50cf789,\n 0xeb1fcbad,\n 0x197448ae,\n 0x0a24bb5a,\n 0xf84f3859,\n 0x2c855cb2,\n 0xdeeedfb1,\n 0xcdbe2c45,\n 0x3fd5af46,\n 0x7198540d,\n 0x83f3d70e,\n 0x90a324fa,\n 0x62c8a7f9,\n 0xb602c312,\n 0x44694011,\n 0x5739b3e5,\n 0xa55230e6,\n 0xfb410cc2,\n 0x092a8fc1,\n 0x1a7a7c35,\n 0xe811ff36,\n 0x3cdb9bdd,\n 0xceb018de,\n 0xdde0eb2a,\n 0x2f8b6829,\n 0x82f63b78,\n 0x709db87b,\n 0x63cd4b8f,\n 0x91a6c88c,\n 0x456cac67,\n 0xb7072f64,\n 0xa457dc90,\n 0x563c5f93,\n 0x082f63b7,\n 0xfa44e0b4,\n 0xe9141340,\n 0x1b7f9043,\n 0xcfb5f4a8,\n 0x3dde77ab,\n 0x2e8e845f,\n 0xdce5075c,\n 0x92a8fc17,\n 0x60c37f14,\n 0x73938ce0,\n 0x81f80fe3,\n 0x55326b08,\n 0xa759e80b,\n 0xb4091bff,\n 0x466298fc,\n 0x1871a4d8,\n 0xea1a27db,\n 0xf94ad42f,\n 0x0b21572c,\n 0xdfeb33c7,\n 0x2d80b0c4,\n 0x3ed04330,\n 0xccbbc033,\n 0xa24bb5a6,\n 0x502036a5,\n 0x4370c551,\n 0xb11b4652,\n 0x65d122b9,\n 0x97baa1ba,\n 0x84ea524e,\n 0x7681d14d,\n 0x2892ed69,\n 0xdaf96e6a,\n 0xc9a99d9e,\n 0x3bc21e9d,\n 0xef087a76,\n 0x1d63f975,\n 0x0e330a81,\n 0xfc588982,\n 0xb21572c9,\n 0x407ef1ca,\n 0x532e023e,\n 0xa145813d,\n 0x758fe5d6,\n 0x87e466d5,\n 0x94b49521,\n 0x66df1622,\n 0x38cc2a06,\n 0xcaa7a905,\n 0xd9f75af1,\n 0x2b9cd9f2,\n 0xff56bd19,\n 0x0d3d3e1a,\n 0x1e6dcdee,\n 0xec064eed,\n 0xc38d26c4,\n 0x31e6a5c7,\n 0x22b65633,\n 0xd0ddd530,\n 0x0417b1db,\n 0xf67c32d8,\n 0xe52cc12c,\n 0x1747422f,\n 0x49547e0b,\n 0xbb3ffd08,\n 0xa86f0efc,\n 0x5a048dff,\n 0x8ecee914,\n 0x7ca56a17,\n 0x6ff599e3,\n 0x9d9e1ae0,\n 0xd3d3e1ab,\n 0x21b862a8,\n 0x32e8915c,\n 0xc083125f,\n 0x144976b4,\n 0xe622f5b7,\n 0xf5720643,\n 0x07198540,\n 0x590ab964,\n 0xab613a67,\n 0xb831c993,\n 0x4a5a4a90,\n 0x9e902e7b,\n 0x6cfbad78,\n 0x7fab5e8c,\n 0x8dc0dd8f,\n 0xe330a81a,\n 0x115b2b19,\n 0x020bd8ed,\n 0xf0605bee,\n 0x24aa3f05,\n 0xd6c1bc06,\n 0xc5914ff2,\n 0x37faccf1,\n 0x69e9f0d5,\n 0x9b8273d6,\n 0x88d28022,\n 0x7ab90321,\n 0xae7367ca,\n 0x5c18e4c9,\n 0x4f48173d,\n 0xbd23943e,\n 0xf36e6f75,\n 0x0105ec76,\n 0x12551f82,\n 0xe03e9c81,\n 0x34f4f86a,\n 0xc69f7b69,\n 0xd5cf889d,\n 0x27a40b9e,\n 0x79b737ba,\n 0x8bdcb4b9,\n 0x988c474d,\n 0x6ae7c44e,\n 0xbe2da0a5,\n 0x4c4623a6,\n 0x5f16d052,\n 0xad7d5351,\n);\n\nexport function crc32c(buf: Buffer | string, initial: number = 0) {\n if (!Buffer.isBuffer(buf)) {\n buf = Buffer.from(buf);\n }\n let crc = (initial | 0) ^ -1;\n for (let i = 0; i < buf.length; i++) {\n crc = kCRCTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ -1) >>> 0;\n}\n"],"names":[],"mappings":";;AAAA;AACA;AACA,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAC7B,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,CACX;SAEe,MAAM,CAAC,GAAoB,EAAE,UAAkB,CAAC,EAAA;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACzB,QAAA,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;IACA,IAAI,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE;AAC5B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,GAAG,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACtD;IACA,OAAO,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC;AACzB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"crc32c.d.ts","sourceRoot":"","sources":["../../src/clients/crc32c.ts"],"names":[],"mappings":"AAqEA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,MAAU,UAS/D"}
1
+ {"version":3,"file":"crc32c.d.ts","sourceRoot":"","sources":["../../src/clients/crc32c.ts"],"names":[],"mappings":"AAqQA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,MAAU,UAS/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"crc32c.js","sources":["../../src/clients/crc32c.ts"],"sourcesContent":["// copy from https://github.com/ashi009/node-fast-crc32c/blob/master/impls/js_crc32c.js\n// can not use fast-crc32c because it try to use native solution that brokes in electron\nconst kCRCTable = Int32Array.of(\n 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,\n 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,\n 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,\n 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,\n 0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,\n 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,\n 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,\n 0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,\n 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,\n 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,\n 0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,\n 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,\n 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,\n 0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,\n 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,\n 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,\n 0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,\n 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,\n 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,\n 0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,\n 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,\n 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,\n 0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,\n 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,\n 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,\n 0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,\n 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,\n 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,\n 0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,\n 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,\n 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,\n 0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,\n 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,\n 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,\n 0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,\n 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,\n 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,\n 0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,\n 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,\n 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,\n 0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,\n 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,\n 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,\n 0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,\n 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,\n 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,\n 0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,\n 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,\n 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,\n 0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,\n 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,\n 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,\n 0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,\n 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,\n 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,\n 0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,\n 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,\n 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,\n 0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,\n 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,\n 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,\n 0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,\n 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,\n 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351,\n);\n\nexport function crc32c(buf: Buffer | string, initial: number = 0) {\n if (!Buffer.isBuffer(buf)) {\n buf = Buffer.from(buf);\n }\n let crc = (initial | 0) ^ -1;\n for (let i = 0; i < buf.length; i++) {\n crc = kCRCTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ -1) >>> 0;\n};\n"],"names":[],"mappings":"AAAA;AACA;AACA,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAC7B,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAC9C,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAC/C;SAEe,MAAM,CAAC,GAAoB,EAAE,UAAkB,CAAC,EAAA;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACzB,QAAA,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;IACA,IAAI,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE;AAC5B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,GAAG,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACtD;IACA,OAAO,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC;AACzB;;;;"}
1
+ {"version":3,"file":"crc32c.js","sources":["../../src/clients/crc32c.ts"],"sourcesContent":["// copy from https://github.com/ashi009/node-fast-crc32c/blob/master/impls/js_crc32c.js\n// can not use fast-crc32c because it try to use native solution that brokes in electron\nconst kCRCTable = Int32Array.of(\n 0x00000000,\n 0xf26b8303,\n 0xe13b70f7,\n 0x1350f3f4,\n 0xc79a971f,\n 0x35f1141c,\n 0x26a1e7e8,\n 0xd4ca64eb,\n 0x8ad958cf,\n 0x78b2dbcc,\n 0x6be22838,\n 0x9989ab3b,\n 0x4d43cfd0,\n 0xbf284cd3,\n 0xac78bf27,\n 0x5e133c24,\n 0x105ec76f,\n 0xe235446c,\n 0xf165b798,\n 0x030e349b,\n 0xd7c45070,\n 0x25afd373,\n 0x36ff2087,\n 0xc494a384,\n 0x9a879fa0,\n 0x68ec1ca3,\n 0x7bbcef57,\n 0x89d76c54,\n 0x5d1d08bf,\n 0xaf768bbc,\n 0xbc267848,\n 0x4e4dfb4b,\n 0x20bd8ede,\n 0xd2d60ddd,\n 0xc186fe29,\n 0x33ed7d2a,\n 0xe72719c1,\n 0x154c9ac2,\n 0x061c6936,\n 0xf477ea35,\n 0xaa64d611,\n 0x580f5512,\n 0x4b5fa6e6,\n 0xb93425e5,\n 0x6dfe410e,\n 0x9f95c20d,\n 0x8cc531f9,\n 0x7eaeb2fa,\n 0x30e349b1,\n 0xc288cab2,\n 0xd1d83946,\n 0x23b3ba45,\n 0xf779deae,\n 0x05125dad,\n 0x1642ae59,\n 0xe4292d5a,\n 0xba3a117e,\n 0x4851927d,\n 0x5b016189,\n 0xa96ae28a,\n 0x7da08661,\n 0x8fcb0562,\n 0x9c9bf696,\n 0x6ef07595,\n 0x417b1dbc,\n 0xb3109ebf,\n 0xa0406d4b,\n 0x522bee48,\n 0x86e18aa3,\n 0x748a09a0,\n 0x67dafa54,\n 0x95b17957,\n 0xcba24573,\n 0x39c9c670,\n 0x2a993584,\n 0xd8f2b687,\n 0x0c38d26c,\n 0xfe53516f,\n 0xed03a29b,\n 0x1f682198,\n 0x5125dad3,\n 0xa34e59d0,\n 0xb01eaa24,\n 0x42752927,\n 0x96bf4dcc,\n 0x64d4cecf,\n 0x77843d3b,\n 0x85efbe38,\n 0xdbfc821c,\n 0x2997011f,\n 0x3ac7f2eb,\n 0xc8ac71e8,\n 0x1c661503,\n 0xee0d9600,\n 0xfd5d65f4,\n 0x0f36e6f7,\n 0x61c69362,\n 0x93ad1061,\n 0x80fde395,\n 0x72966096,\n 0xa65c047d,\n 0x5437877e,\n 0x4767748a,\n 0xb50cf789,\n 0xeb1fcbad,\n 0x197448ae,\n 0x0a24bb5a,\n 0xf84f3859,\n 0x2c855cb2,\n 0xdeeedfb1,\n 0xcdbe2c45,\n 0x3fd5af46,\n 0x7198540d,\n 0x83f3d70e,\n 0x90a324fa,\n 0x62c8a7f9,\n 0xb602c312,\n 0x44694011,\n 0x5739b3e5,\n 0xa55230e6,\n 0xfb410cc2,\n 0x092a8fc1,\n 0x1a7a7c35,\n 0xe811ff36,\n 0x3cdb9bdd,\n 0xceb018de,\n 0xdde0eb2a,\n 0x2f8b6829,\n 0x82f63b78,\n 0x709db87b,\n 0x63cd4b8f,\n 0x91a6c88c,\n 0x456cac67,\n 0xb7072f64,\n 0xa457dc90,\n 0x563c5f93,\n 0x082f63b7,\n 0xfa44e0b4,\n 0xe9141340,\n 0x1b7f9043,\n 0xcfb5f4a8,\n 0x3dde77ab,\n 0x2e8e845f,\n 0xdce5075c,\n 0x92a8fc17,\n 0x60c37f14,\n 0x73938ce0,\n 0x81f80fe3,\n 0x55326b08,\n 0xa759e80b,\n 0xb4091bff,\n 0x466298fc,\n 0x1871a4d8,\n 0xea1a27db,\n 0xf94ad42f,\n 0x0b21572c,\n 0xdfeb33c7,\n 0x2d80b0c4,\n 0x3ed04330,\n 0xccbbc033,\n 0xa24bb5a6,\n 0x502036a5,\n 0x4370c551,\n 0xb11b4652,\n 0x65d122b9,\n 0x97baa1ba,\n 0x84ea524e,\n 0x7681d14d,\n 0x2892ed69,\n 0xdaf96e6a,\n 0xc9a99d9e,\n 0x3bc21e9d,\n 0xef087a76,\n 0x1d63f975,\n 0x0e330a81,\n 0xfc588982,\n 0xb21572c9,\n 0x407ef1ca,\n 0x532e023e,\n 0xa145813d,\n 0x758fe5d6,\n 0x87e466d5,\n 0x94b49521,\n 0x66df1622,\n 0x38cc2a06,\n 0xcaa7a905,\n 0xd9f75af1,\n 0x2b9cd9f2,\n 0xff56bd19,\n 0x0d3d3e1a,\n 0x1e6dcdee,\n 0xec064eed,\n 0xc38d26c4,\n 0x31e6a5c7,\n 0x22b65633,\n 0xd0ddd530,\n 0x0417b1db,\n 0xf67c32d8,\n 0xe52cc12c,\n 0x1747422f,\n 0x49547e0b,\n 0xbb3ffd08,\n 0xa86f0efc,\n 0x5a048dff,\n 0x8ecee914,\n 0x7ca56a17,\n 0x6ff599e3,\n 0x9d9e1ae0,\n 0xd3d3e1ab,\n 0x21b862a8,\n 0x32e8915c,\n 0xc083125f,\n 0x144976b4,\n 0xe622f5b7,\n 0xf5720643,\n 0x07198540,\n 0x590ab964,\n 0xab613a67,\n 0xb831c993,\n 0x4a5a4a90,\n 0x9e902e7b,\n 0x6cfbad78,\n 0x7fab5e8c,\n 0x8dc0dd8f,\n 0xe330a81a,\n 0x115b2b19,\n 0x020bd8ed,\n 0xf0605bee,\n 0x24aa3f05,\n 0xd6c1bc06,\n 0xc5914ff2,\n 0x37faccf1,\n 0x69e9f0d5,\n 0x9b8273d6,\n 0x88d28022,\n 0x7ab90321,\n 0xae7367ca,\n 0x5c18e4c9,\n 0x4f48173d,\n 0xbd23943e,\n 0xf36e6f75,\n 0x0105ec76,\n 0x12551f82,\n 0xe03e9c81,\n 0x34f4f86a,\n 0xc69f7b69,\n 0xd5cf889d,\n 0x27a40b9e,\n 0x79b737ba,\n 0x8bdcb4b9,\n 0x988c474d,\n 0x6ae7c44e,\n 0xbe2da0a5,\n 0x4c4623a6,\n 0x5f16d052,\n 0xad7d5351,\n);\n\nexport function crc32c(buf: Buffer | string, initial: number = 0) {\n if (!Buffer.isBuffer(buf)) {\n buf = Buffer.from(buf);\n }\n let crc = (initial | 0) ^ -1;\n for (let i = 0; i < buf.length; i++) {\n crc = kCRCTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ -1) >>> 0;\n}\n"],"names":[],"mappings":"AAAA;AACA;AACA,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAC7B,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,CACX;SAEe,MAAM,CAAC,GAAoB,EAAE,UAAkB,CAAC,EAAA;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACzB,QAAA,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;IACA,IAAI,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE;AAC5B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,GAAG,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACtD;IACA,OAAO,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC;AACzB;;;;"}
@@ -49,7 +49,7 @@ class ClientDownload {
49
49
  this.httpClient = httpClient;
50
50
  this.logger = logger;
51
51
  this.wire = wireClientProviderFactory.createWireClientProvider((wireConn) => {
52
- if (wireConn.type === 'grpc') {
52
+ if (wireConn.type === "grpc") {
53
53
  return new protocol_client.DownloadClient(wireConn.Transport);
54
54
  }
55
55
  else {
@@ -74,15 +74,14 @@ class ClientDownload {
74
74
  async withBlobContent(info, options, ops, handler) {
75
75
  const { downloadUrl, headers } = await this.grpcGetDownloadUrl(info, options, ops.signal);
76
76
  const remoteHeaders = Object.fromEntries(headers.map(({ name, value }) => [name, value]));
77
- this.logger.info(`blob ${plClient.stringifyWithResourceId(info)} download started, `
78
- + `url: ${downloadUrl}, `
79
- + `range: ${JSON.stringify(ops.range ?? null)}`);
77
+ this.logger.info(`blob ${plClient.stringifyWithResourceId(info)} download started, ` +
78
+ `url: ${downloadUrl}, ` +
79
+ `range: ${JSON.stringify(ops.range ?? null)}`);
80
80
  const timer = helpers.PerfTimer.start();
81
81
  const result = isLocal(downloadUrl)
82
82
  ? await this.withLocalFileContent(downloadUrl, ops, handler)
83
83
  : await this.remoteFileDownloader.withContent(downloadUrl, remoteHeaders, ops, handler);
84
- this.logger.info(`blob ${plClient.stringifyWithResourceId(info)} download finished, `
85
- + `took: ${timer.elapsed()}`);
84
+ this.logger.info(`blob ${plClient.stringifyWithResourceId(info)} download finished, ` + `took: ${timer.elapsed()}`);
86
85
  return result;
87
86
  }
88
87
  async withLocalFileContent(url, ops, handler) {
@@ -121,7 +120,7 @@ class ClientDownload {
121
120
  return await client.getDownloadURL({ resourceId: id, isInternalUse: false }, plClient.addRTypeToMetadata(type, withAbort)).response;
122
121
  }
123
122
  else {
124
- return (await client.POST('/v1/get-download-url', {
123
+ return (await client.POST("/v1/get-download-url", {
125
124
  body: {
126
125
  resourceId: id.toString(),
127
126
  isInternalUse: false,
@@ -133,7 +132,7 @@ class ClientDownload {
133
132
  }
134
133
  function parseLocalUrl(url) {
135
134
  const parsed = new URL(url);
136
- if (parsed.pathname == '')
135
+ if (parsed.pathname == "")
137
136
  throw new WrongLocalFileUrl(`url for local filepath ${url} does not match url scheme`);
138
137
  return {
139
138
  storageId: parsed.host,
@@ -144,27 +143,27 @@ function getFullPath(storageId, localStorageIdsToRoot, relativePath) {
144
143
  const root = localStorageIdsToRoot.get(storageId);
145
144
  if (root === undefined)
146
145
  throw new UnknownStorageError(`Unknown storage location: ${storageId}`);
147
- if (root === '')
146
+ if (root === "")
148
147
  return relativePath;
149
148
  return path__namespace.join(root, relativePath);
150
149
  }
151
- const storageProtocol = 'storage://';
150
+ const storageProtocol = "storage://";
152
151
  function isLocal(url) {
153
152
  return url.startsWith(storageProtocol);
154
153
  }
155
154
  /** Throws when a local URL have invalid scheme. */
156
155
  class WrongLocalFileUrl extends Error {
157
- name = 'WrongLocalFileUrl';
156
+ name = "WrongLocalFileUrl";
158
157
  }
159
158
  /** Happens when a storage for a local file can't be found. */
160
159
  class UnknownStorageError extends Error {
161
- name = 'UnknownStorageError';
160
+ name = "UnknownStorageError";
162
161
  }
163
162
  function newLocalStorageIdsToRoot(projections) {
164
163
  const idToRoot = new Map();
165
164
  for (const lp of projections) {
166
165
  // Empty string means no prefix, i.e. any file on this machine can be got from the storage.
167
- if (lp.localPath !== '') {
166
+ if (lp.localPath !== "") {
168
167
  validate.validateAbsolute(lp.localPath);
169
168
  }
170
169
  idToRoot.set(lp.storageId, lp.localPath);
@@ -1 +1 @@
1
- {"version":3,"file":"download.cjs","sources":["../../src/clients/download.ts"],"sourcesContent":["/* eslint-disable n/no-unsupported-features/node-builtins */\nimport type { WireClientProvider, WireClientProviderFactory } from '@milaboratories/pl-client';\nimport { addRTypeToMetadata, stringifyWithResourceId, RestAPI, createRTypeRoutingHeader } from '@milaboratories/pl-client';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\nimport { PerfTimer } from '@milaboratories/helpers';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { ConcurrencyLimitingExecutor } from '@milaboratories/ts-helpers';\nimport type { RpcOptions } from '@protobuf-ts/runtime-rpc';\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Readable } from 'node:stream';\nimport type { Dispatcher } from 'undici';\nimport type { LocalStorageProjection } from '../drivers/types';\nimport { type ContentHandler, RemoteFileDownloader } from '../helpers/download';\nimport { validateAbsolute } from '../helpers/validate';\nimport type { DownloadAPI_GetDownloadURL_Response } from '../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol';\nimport { DownloadClient } from '../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client';\nimport type { DownloadApiPaths, DownloadRestClientType } from '../proto-rest';\nimport { type GetContentOptions } from '@milaboratories/pl-model-common';\n\n/** Gets URLs for downloading from pl-core, parses them and reads or downloads\n * files locally and from the web. */\nexport class ClientDownload {\n public readonly wire: WireClientProvider<DownloadRestClientType | DownloadClient>;\n private readonly remoteFileDownloader: RemoteFileDownloader;\n\n /** Helps to find a storage root directory by a storage id from URL scheme. */\n private readonly localStorageIdsToRoot: Map<string, string>;\n\n /** Concurrency limiter for local file reads - limit to 32 parallel reads */\n private readonly localFileReadLimiter = new ConcurrencyLimitingExecutor(32);\n\n constructor(\n wireClientProviderFactory: WireClientProviderFactory,\n public readonly httpClient: Dispatcher,\n public readonly logger: MiLogger,\n /** Pl storages available locally */\n localProjections: LocalStorageProjection[],\n ) {\n this.wire = wireClientProviderFactory.createWireClientProvider((wireConn) => {\n if (wireConn.type === 'grpc') {\n return new DownloadClient(wireConn.Transport);\n } else {\n return RestAPI.createClient<DownloadApiPaths>({\n hostAndPort: wireConn.Config.hostAndPort,\n ssl: wireConn.Config.ssl,\n dispatcher: wireConn.Dispatcher,\n middlewares: wireConn.Middlewares,\n });\n }\n });\n this.remoteFileDownloader = new RemoteFileDownloader(httpClient);\n this.localStorageIdsToRoot = newLocalStorageIdsToRoot(localProjections);\n }\n\n close() {}\n\n /**\n * Gets a presign URL and downloads the file.\n * An optional range with 2 numbers from what byte and to what byte to download can be provided.\n * @param fromBytes - from byte including this byte\n * @param toBytes - to byte excluding this byte\n */\n async withBlobContent<T>(\n info: ResourceInfo,\n options: RpcOptions | undefined,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { downloadUrl, headers } = await this.grpcGetDownloadUrl(info, options, ops.signal);\n\n const remoteHeaders = Object.fromEntries(headers.map(({ name, value }) => [name, value]));\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download started, `\n + `url: ${downloadUrl}, `\n + `range: ${JSON.stringify(ops.range ?? null)}`,\n );\n\n const timer = PerfTimer.start();\n const result = isLocal(downloadUrl)\n ? await this.withLocalFileContent(downloadUrl, ops, handler)\n : await this.remoteFileDownloader.withContent(downloadUrl, remoteHeaders, ops, handler);\n\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download finished, `\n + `took: ${timer.elapsed()}`,\n );\n return result;\n }\n\n async withLocalFileContent<T>(\n url: string,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { storageId, relativePath } = parseLocalUrl(url);\n const fullPath = getFullPath(storageId, this.localStorageIdsToRoot, relativePath);\n\n return await this.localFileReadLimiter.run(async () => {\n const readOps = {\n start: ops.range?.from,\n end: ops.range?.to !== undefined ? ops.range.to - 1 : undefined,\n signal: ops.signal,\n };\n let stream: fs.ReadStream | undefined;\n let handlerSuccess = false;\n\n try {\n const stat = await fsp.stat(fullPath);\n stream = fs.createReadStream(fullPath, readOps);\n const webStream = Readable.toWeb(stream);\n\n const result = await handler(webStream, stat.size);\n handlerSuccess = true;\n return result;\n } catch (error) {\n // Cleanup on error (including handler errors)\n if (!handlerSuccess && stream && !stream.destroyed) {\n stream.destroy();\n }\n throw error;\n }\n });\n }\n\n private async grpcGetDownloadUrl(\n { id, type }: ResourceInfo,\n options?: RpcOptions,\n signal?: AbortSignal,\n ): Promise<DownloadAPI_GetDownloadURL_Response> {\n const withAbort = options ?? {};\n withAbort.abort = signal;\n\n const client = this.wire.get();\n if (client instanceof DownloadClient) {\n return await client.getDownloadURL(\n { resourceId: id, isInternalUse: false },\n addRTypeToMetadata(type, withAbort),\n ).response;\n } else {\n return (await client.POST('/v1/get-download-url', {\n body: {\n resourceId: id.toString(),\n isInternalUse: false,\n },\n headers: { ...createRTypeRoutingHeader(type) },\n })).data!;\n }\n }\n}\n\nexport function parseLocalUrl(url: string) {\n const parsed = new URL(url);\n if (parsed.pathname == '')\n throw new WrongLocalFileUrl(`url for local filepath ${url} does not match url scheme`);\n\n return {\n storageId: parsed.host,\n relativePath: decodeURIComponent(parsed.pathname.slice(1)),\n };\n}\n\nexport function getFullPath(\n storageId: string,\n localStorageIdsToRoot: Map<string, string>,\n relativePath: string,\n) {\n const root = localStorageIdsToRoot.get(storageId);\n if (root === undefined) throw new UnknownStorageError(`Unknown storage location: ${storageId}`);\n\n if (root === '') return relativePath;\n\n return path.join(root, relativePath);\n}\n\nconst storageProtocol = 'storage://';\nfunction isLocal(url: string) {\n return url.startsWith(storageProtocol);\n}\n\n/** Throws when a local URL have invalid scheme. */\nexport class WrongLocalFileUrl extends Error {\n name = 'WrongLocalFileUrl';\n}\n\n/** Happens when a storage for a local file can't be found. */\nexport class UnknownStorageError extends Error {\n name = 'UnknownStorageError';\n}\n\nexport function newLocalStorageIdsToRoot(projections: LocalStorageProjection[]) {\n const idToRoot: Map<string, string> = new Map();\n for (const lp of projections) {\n // Empty string means no prefix, i.e. any file on this machine can be got from the storage.\n if (lp.localPath !== '') {\n validateAbsolute(lp.localPath);\n }\n idToRoot.set(lp.storageId, lp.localPath);\n }\n\n return idToRoot;\n}\n"],"names":["ConcurrencyLimitingExecutor","DownloadClient","RestAPI","RemoteFileDownloader","stringifyWithResourceId","PerfTimer","fsp","fs","Readable","addRTypeToMetadata","createRTypeRoutingHeader","path","validateAbsolute"],"mappings":"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"}
1
+ {"version":3,"file":"download.cjs","sources":["../../src/clients/download.ts"],"sourcesContent":["/* eslint-disable n/no-unsupported-features/node-builtins */\nimport type { WireClientProvider, WireClientProviderFactory } from \"@milaboratories/pl-client\";\nimport {\n addRTypeToMetadata,\n stringifyWithResourceId,\n RestAPI,\n createRTypeRoutingHeader,\n} from \"@milaboratories/pl-client\";\nimport type { ResourceInfo } from \"@milaboratories/pl-tree\";\nimport { PerfTimer } from \"@milaboratories/helpers\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { ConcurrencyLimitingExecutor } from \"@milaboratories/ts-helpers\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport * as fs from \"node:fs\";\nimport * as fsp from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport type { Dispatcher } from \"undici\";\nimport type { LocalStorageProjection } from \"../drivers/types\";\nimport { type ContentHandler, RemoteFileDownloader } from \"../helpers/download\";\nimport { validateAbsolute } from \"../helpers/validate\";\nimport type { DownloadAPI_GetDownloadURL_Response } from \"../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol\";\nimport { DownloadClient } from \"../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client\";\nimport type { DownloadApiPaths, DownloadRestClientType } from \"../proto-rest\";\nimport { type GetContentOptions } from \"@milaboratories/pl-model-common\";\n\n/** Gets URLs for downloading from pl-core, parses them and reads or downloads\n * files locally and from the web. */\nexport class ClientDownload {\n public readonly wire: WireClientProvider<DownloadRestClientType | DownloadClient>;\n private readonly remoteFileDownloader: RemoteFileDownloader;\n\n /** Helps to find a storage root directory by a storage id from URL scheme. */\n private readonly localStorageIdsToRoot: Map<string, string>;\n\n /** Concurrency limiter for local file reads - limit to 32 parallel reads */\n private readonly localFileReadLimiter = new ConcurrencyLimitingExecutor(32);\n\n constructor(\n wireClientProviderFactory: WireClientProviderFactory,\n public readonly httpClient: Dispatcher,\n public readonly logger: MiLogger,\n /** Pl storages available locally */\n localProjections: LocalStorageProjection[],\n ) {\n this.wire = wireClientProviderFactory.createWireClientProvider((wireConn) => {\n if (wireConn.type === \"grpc\") {\n return new DownloadClient(wireConn.Transport);\n } else {\n return RestAPI.createClient<DownloadApiPaths>({\n hostAndPort: wireConn.Config.hostAndPort,\n ssl: wireConn.Config.ssl,\n dispatcher: wireConn.Dispatcher,\n middlewares: wireConn.Middlewares,\n });\n }\n });\n this.remoteFileDownloader = new RemoteFileDownloader(httpClient);\n this.localStorageIdsToRoot = newLocalStorageIdsToRoot(localProjections);\n }\n\n close() {}\n\n /**\n * Gets a presign URL and downloads the file.\n * An optional range with 2 numbers from what byte and to what byte to download can be provided.\n * @param fromBytes - from byte including this byte\n * @param toBytes - to byte excluding this byte\n */\n async withBlobContent<T>(\n info: ResourceInfo,\n options: RpcOptions | undefined,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { downloadUrl, headers } = await this.grpcGetDownloadUrl(info, options, ops.signal);\n\n const remoteHeaders = Object.fromEntries(headers.map(({ name, value }) => [name, value]));\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download started, ` +\n `url: ${downloadUrl}, ` +\n `range: ${JSON.stringify(ops.range ?? null)}`,\n );\n\n const timer = PerfTimer.start();\n const result = isLocal(downloadUrl)\n ? await this.withLocalFileContent(downloadUrl, ops, handler)\n : await this.remoteFileDownloader.withContent(downloadUrl, remoteHeaders, ops, handler);\n\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download finished, ` + `took: ${timer.elapsed()}`,\n );\n return result;\n }\n\n async withLocalFileContent<T>(\n url: string,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { storageId, relativePath } = parseLocalUrl(url);\n const fullPath = getFullPath(storageId, this.localStorageIdsToRoot, relativePath);\n\n return await this.localFileReadLimiter.run(async () => {\n const readOps = {\n start: ops.range?.from,\n end: ops.range?.to !== undefined ? ops.range.to - 1 : undefined,\n signal: ops.signal,\n };\n let stream: fs.ReadStream | undefined;\n let handlerSuccess = false;\n\n try {\n const stat = await fsp.stat(fullPath);\n stream = fs.createReadStream(fullPath, readOps);\n const webStream = Readable.toWeb(stream);\n\n const result = await handler(webStream, stat.size);\n handlerSuccess = true;\n return result;\n } catch (error) {\n // Cleanup on error (including handler errors)\n if (!handlerSuccess && stream && !stream.destroyed) {\n stream.destroy();\n }\n throw error;\n }\n });\n }\n\n private async grpcGetDownloadUrl(\n { id, type }: ResourceInfo,\n options?: RpcOptions,\n signal?: AbortSignal,\n ): Promise<DownloadAPI_GetDownloadURL_Response> {\n const withAbort = options ?? {};\n withAbort.abort = signal;\n\n const client = this.wire.get();\n if (client instanceof DownloadClient) {\n return await client.getDownloadURL(\n { resourceId: id, isInternalUse: false },\n addRTypeToMetadata(type, withAbort),\n ).response;\n } else {\n return (\n await client.POST(\"/v1/get-download-url\", {\n body: {\n resourceId: id.toString(),\n isInternalUse: false,\n },\n headers: { ...createRTypeRoutingHeader(type) },\n })\n ).data!;\n }\n }\n}\n\nexport function parseLocalUrl(url: string) {\n const parsed = new URL(url);\n if (parsed.pathname == \"\")\n throw new WrongLocalFileUrl(`url for local filepath ${url} does not match url scheme`);\n\n return {\n storageId: parsed.host,\n relativePath: decodeURIComponent(parsed.pathname.slice(1)),\n };\n}\n\nexport function getFullPath(\n storageId: string,\n localStorageIdsToRoot: Map<string, string>,\n relativePath: string,\n) {\n const root = localStorageIdsToRoot.get(storageId);\n if (root === undefined) throw new UnknownStorageError(`Unknown storage location: ${storageId}`);\n\n if (root === \"\") return relativePath;\n\n return path.join(root, relativePath);\n}\n\nconst storageProtocol = \"storage://\";\nfunction isLocal(url: string) {\n return url.startsWith(storageProtocol);\n}\n\n/** Throws when a local URL have invalid scheme. */\nexport class WrongLocalFileUrl extends Error {\n name = \"WrongLocalFileUrl\";\n}\n\n/** Happens when a storage for a local file can't be found. */\nexport class UnknownStorageError extends Error {\n name = \"UnknownStorageError\";\n}\n\nexport function newLocalStorageIdsToRoot(projections: LocalStorageProjection[]) {\n const idToRoot: Map<string, string> = new Map();\n for (const lp of projections) {\n // Empty string means no prefix, i.e. any file on this machine can be got from the storage.\n if (lp.localPath !== \"\") {\n validateAbsolute(lp.localPath);\n }\n idToRoot.set(lp.storageId, lp.localPath);\n }\n\n return idToRoot;\n}\n"],"names":["ConcurrencyLimitingExecutor","DownloadClient","RestAPI","RemoteFileDownloader","stringifyWithResourceId","PerfTimer","fsp","fs","Readable","addRTypeToMetadata","createRTypeRoutingHeader","path","validateAbsolute"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import type { WireClientProvider, WireClientProviderFactory } from '@milaboratories/pl-client';
2
- import type { ResourceInfo } from '@milaboratories/pl-tree';
3
- import type { MiLogger } from '@milaboratories/ts-helpers';
4
- import type { RpcOptions } from '@protobuf-ts/runtime-rpc';
5
- import type { Dispatcher } from 'undici';
6
- import type { LocalStorageProjection } from '../drivers/types';
7
- import { type ContentHandler } from '../helpers/download';
8
- import { DownloadClient } from '../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client';
9
- import type { DownloadRestClientType } from '../proto-rest';
10
- import { type GetContentOptions } from '@milaboratories/pl-model-common';
1
+ import type { WireClientProvider, WireClientProviderFactory } from "@milaboratories/pl-client";
2
+ import type { ResourceInfo } from "@milaboratories/pl-tree";
3
+ import type { MiLogger } from "@milaboratories/ts-helpers";
4
+ import type { RpcOptions } from "@protobuf-ts/runtime-rpc";
5
+ import type { Dispatcher } from "undici";
6
+ import type { LocalStorageProjection } from "../drivers/types";
7
+ import { type ContentHandler } from "../helpers/download";
8
+ import { DownloadClient } from "../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client";
9
+ import type { DownloadRestClientType } from "../proto-rest";
10
+ import { type GetContentOptions } from "@milaboratories/pl-model-common";
11
11
  /** Gets URLs for downloading from pl-core, parses them and reads or downloads
12
12
  * files locally and from the web. */
13
13
  export declare class ClientDownload {
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/clients/download.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAE/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAK3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,qBAAqB,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,8FAA8F,CAAC;AAC9H,OAAO,KAAK,EAAoB,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE;qCACqC;AACrC,qBAAa,cAAc;aAYP,UAAU,EAAE,UAAU;aACtB,MAAM,EAAE,QAAQ;IAZlC,SAAgB,IAAI,EAAE,kBAAkB,CAAC,sBAAsB,GAAG,cAAc,CAAC,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAE5D,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAsB;IAE5D,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuC;gBAG1E,yBAAyB,EAAE,yBAAyB,EACpC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,QAAQ;IAChC,oCAAoC;IACpC,gBAAgB,EAAE,sBAAsB,EAAE;IAkB5C,KAAK;IAEL;;;;;OAKG;IACG,eAAe,CAAC,CAAC,EACrB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,UAAU,GAAG,SAAS,EAC/B,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,CAAC,CAAC;IAsBP,oBAAoB,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,CAAC,CAAC;YA+BC,kBAAkB;CAwBjC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM;;;EASxC;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,YAAY,EAAE,MAAM,UAQrB;AAOD,mDAAmD;AACnD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,IAAI,SAAuB;CAC5B;AAED,+DAA+D;AAC/D,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,IAAI,SAAyB;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,sBAAsB,EAAE,uBAW7E"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/clients/download.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAO/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAK3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,qBAAqB,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,8FAA8F,CAAC;AAC9H,OAAO,KAAK,EAAoB,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE;qCACqC;AACrC,qBAAa,cAAc;aAYP,UAAU,EAAE,UAAU;aACtB,MAAM,EAAE,QAAQ;IAZlC,SAAgB,IAAI,EAAE,kBAAkB,CAAC,sBAAsB,GAAG,cAAc,CAAC,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAE5D,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAsB;IAE5D,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuC;gBAG1E,yBAAyB,EAAE,yBAAyB,EACpC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,QAAQ;IAChC,oCAAoC;IACpC,gBAAgB,EAAE,sBAAsB,EAAE;IAkB5C,KAAK;IAEL;;;;;OAKG;IACG,eAAe,CAAC,CAAC,EACrB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,UAAU,GAAG,SAAS,EAC/B,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,CAAC,CAAC;IAqBP,oBAAoB,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,CAAC,CAAC;YA+BC,kBAAkB;CA0BjC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM;;;EASxC;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,YAAY,EAAE,MAAM,UAQrB;AAOD,mDAAmD;AACnD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,IAAI,SAAuB;CAC5B;AAED,+DAA+D;AAC/D,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,IAAI,SAAyB;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,sBAAsB,EAAE,uBAW7E"}
@@ -26,7 +26,7 @@ class ClientDownload {
26
26
  this.httpClient = httpClient;
27
27
  this.logger = logger;
28
28
  this.wire = wireClientProviderFactory.createWireClientProvider((wireConn) => {
29
- if (wireConn.type === 'grpc') {
29
+ if (wireConn.type === "grpc") {
30
30
  return new DownloadClient(wireConn.Transport);
31
31
  }
32
32
  else {
@@ -51,15 +51,14 @@ class ClientDownload {
51
51
  async withBlobContent(info, options, ops, handler) {
52
52
  const { downloadUrl, headers } = await this.grpcGetDownloadUrl(info, options, ops.signal);
53
53
  const remoteHeaders = Object.fromEntries(headers.map(({ name, value }) => [name, value]));
54
- this.logger.info(`blob ${stringifyWithResourceId(info)} download started, `
55
- + `url: ${downloadUrl}, `
56
- + `range: ${JSON.stringify(ops.range ?? null)}`);
54
+ this.logger.info(`blob ${stringifyWithResourceId(info)} download started, ` +
55
+ `url: ${downloadUrl}, ` +
56
+ `range: ${JSON.stringify(ops.range ?? null)}`);
57
57
  const timer = PerfTimer.start();
58
58
  const result = isLocal(downloadUrl)
59
59
  ? await this.withLocalFileContent(downloadUrl, ops, handler)
60
60
  : await this.remoteFileDownloader.withContent(downloadUrl, remoteHeaders, ops, handler);
61
- this.logger.info(`blob ${stringifyWithResourceId(info)} download finished, `
62
- + `took: ${timer.elapsed()}`);
61
+ this.logger.info(`blob ${stringifyWithResourceId(info)} download finished, ` + `took: ${timer.elapsed()}`);
63
62
  return result;
64
63
  }
65
64
  async withLocalFileContent(url, ops, handler) {
@@ -98,7 +97,7 @@ class ClientDownload {
98
97
  return await client.getDownloadURL({ resourceId: id, isInternalUse: false }, addRTypeToMetadata(type, withAbort)).response;
99
98
  }
100
99
  else {
101
- return (await client.POST('/v1/get-download-url', {
100
+ return (await client.POST("/v1/get-download-url", {
102
101
  body: {
103
102
  resourceId: id.toString(),
104
103
  isInternalUse: false,
@@ -110,7 +109,7 @@ class ClientDownload {
110
109
  }
111
110
  function parseLocalUrl(url) {
112
111
  const parsed = new URL(url);
113
- if (parsed.pathname == '')
112
+ if (parsed.pathname == "")
114
113
  throw new WrongLocalFileUrl(`url for local filepath ${url} does not match url scheme`);
115
114
  return {
116
115
  storageId: parsed.host,
@@ -121,27 +120,27 @@ function getFullPath(storageId, localStorageIdsToRoot, relativePath) {
121
120
  const root = localStorageIdsToRoot.get(storageId);
122
121
  if (root === undefined)
123
122
  throw new UnknownStorageError(`Unknown storage location: ${storageId}`);
124
- if (root === '')
123
+ if (root === "")
125
124
  return relativePath;
126
125
  return path.join(root, relativePath);
127
126
  }
128
- const storageProtocol = 'storage://';
127
+ const storageProtocol = "storage://";
129
128
  function isLocal(url) {
130
129
  return url.startsWith(storageProtocol);
131
130
  }
132
131
  /** Throws when a local URL have invalid scheme. */
133
132
  class WrongLocalFileUrl extends Error {
134
- name = 'WrongLocalFileUrl';
133
+ name = "WrongLocalFileUrl";
135
134
  }
136
135
  /** Happens when a storage for a local file can't be found. */
137
136
  class UnknownStorageError extends Error {
138
- name = 'UnknownStorageError';
137
+ name = "UnknownStorageError";
139
138
  }
140
139
  function newLocalStorageIdsToRoot(projections) {
141
140
  const idToRoot = new Map();
142
141
  for (const lp of projections) {
143
142
  // Empty string means no prefix, i.e. any file on this machine can be got from the storage.
144
- if (lp.localPath !== '') {
143
+ if (lp.localPath !== "") {
145
144
  validateAbsolute(lp.localPath);
146
145
  }
147
146
  idToRoot.set(lp.storageId, lp.localPath);
@@ -1 +1 @@
1
- {"version":3,"file":"download.js","sources":["../../src/clients/download.ts"],"sourcesContent":["/* eslint-disable n/no-unsupported-features/node-builtins */\nimport type { WireClientProvider, WireClientProviderFactory } from '@milaboratories/pl-client';\nimport { addRTypeToMetadata, stringifyWithResourceId, RestAPI, createRTypeRoutingHeader } from '@milaboratories/pl-client';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\nimport { PerfTimer } from '@milaboratories/helpers';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { ConcurrencyLimitingExecutor } from '@milaboratories/ts-helpers';\nimport type { RpcOptions } from '@protobuf-ts/runtime-rpc';\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Readable } from 'node:stream';\nimport type { Dispatcher } from 'undici';\nimport type { LocalStorageProjection } from '../drivers/types';\nimport { type ContentHandler, RemoteFileDownloader } from '../helpers/download';\nimport { validateAbsolute } from '../helpers/validate';\nimport type { DownloadAPI_GetDownloadURL_Response } from '../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol';\nimport { DownloadClient } from '../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client';\nimport type { DownloadApiPaths, DownloadRestClientType } from '../proto-rest';\nimport { type GetContentOptions } from '@milaboratories/pl-model-common';\n\n/** Gets URLs for downloading from pl-core, parses them and reads or downloads\n * files locally and from the web. */\nexport class ClientDownload {\n public readonly wire: WireClientProvider<DownloadRestClientType | DownloadClient>;\n private readonly remoteFileDownloader: RemoteFileDownloader;\n\n /** Helps to find a storage root directory by a storage id from URL scheme. */\n private readonly localStorageIdsToRoot: Map<string, string>;\n\n /** Concurrency limiter for local file reads - limit to 32 parallel reads */\n private readonly localFileReadLimiter = new ConcurrencyLimitingExecutor(32);\n\n constructor(\n wireClientProviderFactory: WireClientProviderFactory,\n public readonly httpClient: Dispatcher,\n public readonly logger: MiLogger,\n /** Pl storages available locally */\n localProjections: LocalStorageProjection[],\n ) {\n this.wire = wireClientProviderFactory.createWireClientProvider((wireConn) => {\n if (wireConn.type === 'grpc') {\n return new DownloadClient(wireConn.Transport);\n } else {\n return RestAPI.createClient<DownloadApiPaths>({\n hostAndPort: wireConn.Config.hostAndPort,\n ssl: wireConn.Config.ssl,\n dispatcher: wireConn.Dispatcher,\n middlewares: wireConn.Middlewares,\n });\n }\n });\n this.remoteFileDownloader = new RemoteFileDownloader(httpClient);\n this.localStorageIdsToRoot = newLocalStorageIdsToRoot(localProjections);\n }\n\n close() {}\n\n /**\n * Gets a presign URL and downloads the file.\n * An optional range with 2 numbers from what byte and to what byte to download can be provided.\n * @param fromBytes - from byte including this byte\n * @param toBytes - to byte excluding this byte\n */\n async withBlobContent<T>(\n info: ResourceInfo,\n options: RpcOptions | undefined,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { downloadUrl, headers } = await this.grpcGetDownloadUrl(info, options, ops.signal);\n\n const remoteHeaders = Object.fromEntries(headers.map(({ name, value }) => [name, value]));\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download started, `\n + `url: ${downloadUrl}, `\n + `range: ${JSON.stringify(ops.range ?? null)}`,\n );\n\n const timer = PerfTimer.start();\n const result = isLocal(downloadUrl)\n ? await this.withLocalFileContent(downloadUrl, ops, handler)\n : await this.remoteFileDownloader.withContent(downloadUrl, remoteHeaders, ops, handler);\n\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download finished, `\n + `took: ${timer.elapsed()}`,\n );\n return result;\n }\n\n async withLocalFileContent<T>(\n url: string,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { storageId, relativePath } = parseLocalUrl(url);\n const fullPath = getFullPath(storageId, this.localStorageIdsToRoot, relativePath);\n\n return await this.localFileReadLimiter.run(async () => {\n const readOps = {\n start: ops.range?.from,\n end: ops.range?.to !== undefined ? ops.range.to - 1 : undefined,\n signal: ops.signal,\n };\n let stream: fs.ReadStream | undefined;\n let handlerSuccess = false;\n\n try {\n const stat = await fsp.stat(fullPath);\n stream = fs.createReadStream(fullPath, readOps);\n const webStream = Readable.toWeb(stream);\n\n const result = await handler(webStream, stat.size);\n handlerSuccess = true;\n return result;\n } catch (error) {\n // Cleanup on error (including handler errors)\n if (!handlerSuccess && stream && !stream.destroyed) {\n stream.destroy();\n }\n throw error;\n }\n });\n }\n\n private async grpcGetDownloadUrl(\n { id, type }: ResourceInfo,\n options?: RpcOptions,\n signal?: AbortSignal,\n ): Promise<DownloadAPI_GetDownloadURL_Response> {\n const withAbort = options ?? {};\n withAbort.abort = signal;\n\n const client = this.wire.get();\n if (client instanceof DownloadClient) {\n return await client.getDownloadURL(\n { resourceId: id, isInternalUse: false },\n addRTypeToMetadata(type, withAbort),\n ).response;\n } else {\n return (await client.POST('/v1/get-download-url', {\n body: {\n resourceId: id.toString(),\n isInternalUse: false,\n },\n headers: { ...createRTypeRoutingHeader(type) },\n })).data!;\n }\n }\n}\n\nexport function parseLocalUrl(url: string) {\n const parsed = new URL(url);\n if (parsed.pathname == '')\n throw new WrongLocalFileUrl(`url for local filepath ${url} does not match url scheme`);\n\n return {\n storageId: parsed.host,\n relativePath: decodeURIComponent(parsed.pathname.slice(1)),\n };\n}\n\nexport function getFullPath(\n storageId: string,\n localStorageIdsToRoot: Map<string, string>,\n relativePath: string,\n) {\n const root = localStorageIdsToRoot.get(storageId);\n if (root === undefined) throw new UnknownStorageError(`Unknown storage location: ${storageId}`);\n\n if (root === '') return relativePath;\n\n return path.join(root, relativePath);\n}\n\nconst storageProtocol = 'storage://';\nfunction isLocal(url: string) {\n return url.startsWith(storageProtocol);\n}\n\n/** Throws when a local URL have invalid scheme. */\nexport class WrongLocalFileUrl extends Error {\n name = 'WrongLocalFileUrl';\n}\n\n/** Happens when a storage for a local file can't be found. */\nexport class UnknownStorageError extends Error {\n name = 'UnknownStorageError';\n}\n\nexport function newLocalStorageIdsToRoot(projections: LocalStorageProjection[]) {\n const idToRoot: Map<string, string> = new Map();\n for (const lp of projections) {\n // Empty string means no prefix, i.e. any file on this machine can be got from the storage.\n if (lp.localPath !== '') {\n validateAbsolute(lp.localPath);\n }\n idToRoot.set(lp.storageId, lp.localPath);\n }\n\n return idToRoot;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAqBA;AACqC;MACxB,cAAc,CAAA;AAYP,IAAA,UAAA;AACA,IAAA,MAAA;AAZF,IAAA,IAAI;AACH,IAAA,oBAAoB;;AAGpB,IAAA,qBAAqB;;AAGrB,IAAA,oBAAoB,GAAG,IAAI,2BAA2B,CAAC,EAAE,CAAC;AAE3E,IAAA,WAAA,CACE,yBAAoD,EACpC,UAAsB,EACtB,MAAgB;;IAEhC,gBAA0C,EAAA;QAH1B,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,MAAM,GAAN,MAAM;QAItB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC,wBAAwB,CAAC,CAAC,QAAQ,KAAI;AAC1E,YAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;AAC5B,gBAAA,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC/C;iBAAO;gBACL,OAAO,OAAO,CAAC,YAAY,CAAmB;AAC5C,oBAAA,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW;AACxC,oBAAA,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG;oBACxB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;AAClC,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,UAAU,CAAC;AAChE,QAAA,IAAI,CAAC,qBAAqB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC;IACzE;AAEA,IAAA,KAAK,KAAI;AAET;;;;;AAKG;IACH,MAAM,eAAe,CACnB,IAAkB,EAClB,OAA+B,EAC/B,GAAsB,EACtB,OAA0B,EAAA;AAE1B,QAAA,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC;QAEzF,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,QAAQ,uBAAuB,CAAC,IAAI,CAAC,CAAA,mBAAA;AACnC,cAAA,CAAA,KAAA,EAAQ,WAAW,CAAA,EAAA;AACnB,cAAA,CAAA,OAAA,EAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA,CAAE,CAChD;AAED,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW;cAC9B,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO;AAC3D,cAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC;QAEzF,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,QAAQ,uBAAuB,CAAC,IAAI,CAAC,CAAA,oBAAA;AACnC,cAAA,CAAA,MAAA,EAAS,KAAK,CAAC,OAAO,EAAE,CAAA,CAAE,CAC7B;AACD,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,MAAM,oBAAoB,CACxB,GAAW,EACX,GAAsB,EACtB,OAA0B,EAAA;QAE1B,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC;AACtD,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC;QAEjF,OAAO,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAW;AACpD,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI;gBACtB,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS;gBAC/D,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB;AACD,YAAA,IAAI,MAAiC;YACrC,IAAI,cAAc,GAAG,KAAK;AAE1B,YAAA,IAAI;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACrC,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC;gBAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBAExC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;gBAClD,cAAc,GAAG,IAAI;AACrB,gBAAA,OAAO,MAAM;YACf;YAAE,OAAO,KAAK,EAAE;;gBAEd,IAAI,CAAC,cAAc,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;oBAClD,MAAM,CAAC,OAAO,EAAE;gBAClB;AACA,gBAAA,MAAM,KAAK;YACb;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,kBAAkB,CAC9B,EAAE,EAAE,EAAE,IAAI,EAAgB,EAC1B,OAAoB,EACpB,MAAoB,EAAA;AAEpB,QAAA,MAAM,SAAS,GAAG,OAAO,IAAI,EAAE;AAC/B,QAAA,SAAS,CAAC,KAAK,GAAG,MAAM;QAExB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AAC9B,QAAA,IAAI,MAAM,YAAY,cAAc,EAAE;YACpC,OAAO,MAAM,MAAM,CAAC,cAAc,CAChC,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,EACxC,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,CACpC,CAAC,QAAQ;QACZ;aAAO;AACL,YAAA,OAAO,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AAChD,gBAAA,IAAI,EAAE;AACJ,oBAAA,UAAU,EAAE,EAAE,CAAC,QAAQ,EAAE;AACzB,oBAAA,aAAa,EAAE,KAAK;AACrB,iBAAA;AACD,gBAAA,OAAO,EAAE,EAAE,GAAG,wBAAwB,CAAC,IAAI,CAAC,EAAE;aAC/C,CAAC,EAAE,IAAK;QACX;IACF;AACD;AAEK,SAAU,aAAa,CAAC,GAAW,EAAA;AACvC,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,IAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;AACvB,QAAA,MAAM,IAAI,iBAAiB,CAAC,0BAA0B,GAAG,CAAA,0BAAA,CAA4B,CAAC;IAExF,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,IAAI;QACtB,YAAY,EAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC3D;AACH;SAEgB,WAAW,CACzB,SAAiB,EACjB,qBAA0C,EAC1C,YAAoB,EAAA;IAEpB,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC;IACjD,IAAI,IAAI,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,mBAAmB,CAAC,6BAA6B,SAAS,CAAA,CAAE,CAAC;IAE/F,IAAI,IAAI,KAAK,EAAE;AAAE,QAAA,OAAO,YAAY;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;AACtC;AAEA,MAAM,eAAe,GAAG,YAAY;AACpC,SAAS,OAAO,CAAC,GAAW,EAAA;AAC1B,IAAA,OAAO,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;AACxC;AAEA;AACM,MAAO,iBAAkB,SAAQ,KAAK,CAAA;IAC1C,IAAI,GAAG,mBAAmB;AAC3B;AAED;AACM,MAAO,mBAAoB,SAAQ,KAAK,CAAA;IAC5C,IAAI,GAAG,qBAAqB;AAC7B;AAEK,SAAU,wBAAwB,CAAC,WAAqC,EAAA;AAC5E,IAAA,MAAM,QAAQ,GAAwB,IAAI,GAAG,EAAE;AAC/C,IAAA,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE;;AAE5B,QAAA,IAAI,EAAE,CAAC,SAAS,KAAK,EAAE,EAAE;AACvB,YAAA,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC;QAChC;QACA,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC;IAC1C;AAEA,IAAA,OAAO,QAAQ;AACjB;;;;"}
1
+ {"version":3,"file":"download.js","sources":["../../src/clients/download.ts"],"sourcesContent":["/* eslint-disable n/no-unsupported-features/node-builtins */\nimport type { WireClientProvider, WireClientProviderFactory } from \"@milaboratories/pl-client\";\nimport {\n addRTypeToMetadata,\n stringifyWithResourceId,\n RestAPI,\n createRTypeRoutingHeader,\n} from \"@milaboratories/pl-client\";\nimport type { ResourceInfo } from \"@milaboratories/pl-tree\";\nimport { PerfTimer } from \"@milaboratories/helpers\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport { ConcurrencyLimitingExecutor } from \"@milaboratories/ts-helpers\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport * as fs from \"node:fs\";\nimport * as fsp from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport type { Dispatcher } from \"undici\";\nimport type { LocalStorageProjection } from \"../drivers/types\";\nimport { type ContentHandler, RemoteFileDownloader } from \"../helpers/download\";\nimport { validateAbsolute } from \"../helpers/validate\";\nimport type { DownloadAPI_GetDownloadURL_Response } from \"../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol\";\nimport { DownloadClient } from \"../proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client\";\nimport type { DownloadApiPaths, DownloadRestClientType } from \"../proto-rest\";\nimport { type GetContentOptions } from \"@milaboratories/pl-model-common\";\n\n/** Gets URLs for downloading from pl-core, parses them and reads or downloads\n * files locally and from the web. */\nexport class ClientDownload {\n public readonly wire: WireClientProvider<DownloadRestClientType | DownloadClient>;\n private readonly remoteFileDownloader: RemoteFileDownloader;\n\n /** Helps to find a storage root directory by a storage id from URL scheme. */\n private readonly localStorageIdsToRoot: Map<string, string>;\n\n /** Concurrency limiter for local file reads - limit to 32 parallel reads */\n private readonly localFileReadLimiter = new ConcurrencyLimitingExecutor(32);\n\n constructor(\n wireClientProviderFactory: WireClientProviderFactory,\n public readonly httpClient: Dispatcher,\n public readonly logger: MiLogger,\n /** Pl storages available locally */\n localProjections: LocalStorageProjection[],\n ) {\n this.wire = wireClientProviderFactory.createWireClientProvider((wireConn) => {\n if (wireConn.type === \"grpc\") {\n return new DownloadClient(wireConn.Transport);\n } else {\n return RestAPI.createClient<DownloadApiPaths>({\n hostAndPort: wireConn.Config.hostAndPort,\n ssl: wireConn.Config.ssl,\n dispatcher: wireConn.Dispatcher,\n middlewares: wireConn.Middlewares,\n });\n }\n });\n this.remoteFileDownloader = new RemoteFileDownloader(httpClient);\n this.localStorageIdsToRoot = newLocalStorageIdsToRoot(localProjections);\n }\n\n close() {}\n\n /**\n * Gets a presign URL and downloads the file.\n * An optional range with 2 numbers from what byte and to what byte to download can be provided.\n * @param fromBytes - from byte including this byte\n * @param toBytes - to byte excluding this byte\n */\n async withBlobContent<T>(\n info: ResourceInfo,\n options: RpcOptions | undefined,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { downloadUrl, headers } = await this.grpcGetDownloadUrl(info, options, ops.signal);\n\n const remoteHeaders = Object.fromEntries(headers.map(({ name, value }) => [name, value]));\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download started, ` +\n `url: ${downloadUrl}, ` +\n `range: ${JSON.stringify(ops.range ?? null)}`,\n );\n\n const timer = PerfTimer.start();\n const result = isLocal(downloadUrl)\n ? await this.withLocalFileContent(downloadUrl, ops, handler)\n : await this.remoteFileDownloader.withContent(downloadUrl, remoteHeaders, ops, handler);\n\n this.logger.info(\n `blob ${stringifyWithResourceId(info)} download finished, ` + `took: ${timer.elapsed()}`,\n );\n return result;\n }\n\n async withLocalFileContent<T>(\n url: string,\n ops: GetContentOptions,\n handler: ContentHandler<T>,\n ): Promise<T> {\n const { storageId, relativePath } = parseLocalUrl(url);\n const fullPath = getFullPath(storageId, this.localStorageIdsToRoot, relativePath);\n\n return await this.localFileReadLimiter.run(async () => {\n const readOps = {\n start: ops.range?.from,\n end: ops.range?.to !== undefined ? ops.range.to - 1 : undefined,\n signal: ops.signal,\n };\n let stream: fs.ReadStream | undefined;\n let handlerSuccess = false;\n\n try {\n const stat = await fsp.stat(fullPath);\n stream = fs.createReadStream(fullPath, readOps);\n const webStream = Readable.toWeb(stream);\n\n const result = await handler(webStream, stat.size);\n handlerSuccess = true;\n return result;\n } catch (error) {\n // Cleanup on error (including handler errors)\n if (!handlerSuccess && stream && !stream.destroyed) {\n stream.destroy();\n }\n throw error;\n }\n });\n }\n\n private async grpcGetDownloadUrl(\n { id, type }: ResourceInfo,\n options?: RpcOptions,\n signal?: AbortSignal,\n ): Promise<DownloadAPI_GetDownloadURL_Response> {\n const withAbort = options ?? {};\n withAbort.abort = signal;\n\n const client = this.wire.get();\n if (client instanceof DownloadClient) {\n return await client.getDownloadURL(\n { resourceId: id, isInternalUse: false },\n addRTypeToMetadata(type, withAbort),\n ).response;\n } else {\n return (\n await client.POST(\"/v1/get-download-url\", {\n body: {\n resourceId: id.toString(),\n isInternalUse: false,\n },\n headers: { ...createRTypeRoutingHeader(type) },\n })\n ).data!;\n }\n }\n}\n\nexport function parseLocalUrl(url: string) {\n const parsed = new URL(url);\n if (parsed.pathname == \"\")\n throw new WrongLocalFileUrl(`url for local filepath ${url} does not match url scheme`);\n\n return {\n storageId: parsed.host,\n relativePath: decodeURIComponent(parsed.pathname.slice(1)),\n };\n}\n\nexport function getFullPath(\n storageId: string,\n localStorageIdsToRoot: Map<string, string>,\n relativePath: string,\n) {\n const root = localStorageIdsToRoot.get(storageId);\n if (root === undefined) throw new UnknownStorageError(`Unknown storage location: ${storageId}`);\n\n if (root === \"\") return relativePath;\n\n return path.join(root, relativePath);\n}\n\nconst storageProtocol = \"storage://\";\nfunction isLocal(url: string) {\n return url.startsWith(storageProtocol);\n}\n\n/** Throws when a local URL have invalid scheme. */\nexport class WrongLocalFileUrl extends Error {\n name = \"WrongLocalFileUrl\";\n}\n\n/** Happens when a storage for a local file can't be found. */\nexport class UnknownStorageError extends Error {\n name = \"UnknownStorageError\";\n}\n\nexport function newLocalStorageIdsToRoot(projections: LocalStorageProjection[]) {\n const idToRoot: Map<string, string> = new Map();\n for (const lp of projections) {\n // Empty string means no prefix, i.e. any file on this machine can be got from the storage.\n if (lp.localPath !== \"\") {\n validateAbsolute(lp.localPath);\n }\n idToRoot.set(lp.storageId, lp.localPath);\n }\n\n return idToRoot;\n}\n"],"names":[],"mappings":"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"}