@milaboratories/pl-drivers 1.11.58 → 1.11.60

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 (330) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/clients/constructors.cjs +28 -28
  3. package/dist/clients/constructors.cjs.map +1 -1
  4. package/dist/clients/constructors.d.ts +17 -13
  5. package/dist/clients/constructors.js +28 -26
  6. package/dist/clients/constructors.js.map +1 -1
  7. package/dist/clients/crc32c.cjs +8 -13
  8. package/dist/clients/crc32c.cjs.map +1 -1
  9. package/dist/clients/crc32c.js +8 -12
  10. package/dist/clients/crc32c.js.map +1 -1
  11. package/dist/clients/download.cjs +119 -160
  12. package/dist/clients/download.cjs.map +1 -1
  13. package/dist/clients/download.d.ts +45 -41
  14. package/dist/clients/download.js +115 -137
  15. package/dist/clients/download.js.map +1 -1
  16. package/dist/clients/logs.cjs +78 -82
  17. package/dist/clients/logs.cjs.map +1 -1
  18. package/dist/clients/logs.d.ts +34 -24
  19. package/dist/clients/logs.js +77 -80
  20. package/dist/clients/logs.js.map +1 -1
  21. package/dist/clients/ls_api.cjs +62 -68
  22. package/dist/clients/ls_api.cjs.map +1 -1
  23. package/dist/clients/ls_api.d.ts +15 -11
  24. package/dist/clients/ls_api.js +61 -66
  25. package/dist/clients/ls_api.js.map +1 -1
  26. package/dist/clients/progress.cjs +49 -59
  27. package/dist/clients/progress.cjs.map +1 -1
  28. package/dist/clients/progress.d.ts +27 -20
  29. package/dist/clients/progress.js +48 -57
  30. package/dist/clients/progress.js.map +1 -1
  31. package/dist/clients/upload.cjs +189 -250
  32. package/dist/clients/upload.cjs.map +1 -1
  33. package/dist/clients/upload.d.ts +44 -34
  34. package/dist/clients/upload.js +187 -229
  35. package/dist/clients/upload.js.map +1 -1
  36. package/dist/drivers/download_blob/blob_key.cjs +9 -26
  37. package/dist/drivers/download_blob/blob_key.cjs.map +1 -1
  38. package/dist/drivers/download_blob/blob_key.js +7 -5
  39. package/dist/drivers/download_blob/blob_key.js.map +1 -1
  40. package/dist/drivers/download_blob/download_blob.cjs +395 -478
  41. package/dist/drivers/download_blob/download_blob.cjs.map +1 -1
  42. package/dist/drivers/download_blob/download_blob.d.ts +102 -100
  43. package/dist/drivers/download_blob/download_blob.js +388 -453
  44. package/dist/drivers/download_blob/download_blob.js.map +1 -1
  45. package/dist/drivers/download_blob/download_blob_task.cjs +128 -163
  46. package/dist/drivers/download_blob/download_blob_task.cjs.map +1 -1
  47. package/dist/drivers/download_blob/download_blob_task.js +125 -141
  48. package/dist/drivers/download_blob/download_blob_task.js.map +1 -1
  49. package/dist/drivers/download_blob/sparse_cache/cache.cjs +166 -195
  50. package/dist/drivers/download_blob/sparse_cache/cache.cjs.map +1 -1
  51. package/dist/drivers/download_blob/sparse_cache/cache.js +164 -193
  52. package/dist/drivers/download_blob/sparse_cache/cache.js.map +1 -1
  53. package/dist/drivers/download_blob/sparse_cache/file.cjs +29 -50
  54. package/dist/drivers/download_blob/sparse_cache/file.cjs.map +1 -1
  55. package/dist/drivers/download_blob/sparse_cache/file.js +28 -29
  56. package/dist/drivers/download_blob/sparse_cache/file.js.map +1 -1
  57. package/dist/drivers/download_blob/sparse_cache/ranges.cjs +48 -76
  58. package/dist/drivers/download_blob/sparse_cache/ranges.cjs.map +1 -1
  59. package/dist/drivers/download_blob/sparse_cache/ranges.js +47 -54
  60. package/dist/drivers/download_blob/sparse_cache/ranges.js.map +1 -1
  61. package/dist/drivers/download_blob_url/driver.cjs +125 -165
  62. package/dist/drivers/download_blob_url/driver.cjs.map +1 -1
  63. package/dist/drivers/download_blob_url/driver.d.ts +45 -42
  64. package/dist/drivers/download_blob_url/driver.js +123 -144
  65. package/dist/drivers/download_blob_url/driver.js.map +1 -1
  66. package/dist/drivers/download_blob_url/driver_id.cjs +4 -4
  67. package/dist/drivers/download_blob_url/driver_id.cjs.map +1 -1
  68. package/dist/drivers/download_blob_url/driver_id.js +4 -3
  69. package/dist/drivers/download_blob_url/driver_id.js.map +1 -1
  70. package/dist/drivers/download_blob_url/snapshot.cjs +7 -11
  71. package/dist/drivers/download_blob_url/snapshot.cjs.map +1 -1
  72. package/dist/drivers/download_blob_url/snapshot.d.ts +10 -5
  73. package/dist/drivers/download_blob_url/snapshot.js +5 -8
  74. package/dist/drivers/download_blob_url/snapshot.js.map +1 -1
  75. package/dist/drivers/download_blob_url/task.cjs +147 -194
  76. package/dist/drivers/download_blob_url/task.cjs.map +1 -1
  77. package/dist/drivers/download_blob_url/task.d.ts +55 -57
  78. package/dist/drivers/download_blob_url/task.js +140 -170
  79. package/dist/drivers/download_blob_url/task.js.map +1 -1
  80. package/dist/drivers/download_url/driver.cjs +109 -146
  81. package/dist/drivers/download_url/driver.cjs.map +1 -1
  82. package/dist/drivers/download_url/driver.d.ts +59 -57
  83. package/dist/drivers/download_url/driver.js +107 -125
  84. package/dist/drivers/download_url/driver.js.map +1 -1
  85. package/dist/drivers/download_url/task.cjs +104 -137
  86. package/dist/drivers/download_url/task.cjs.map +1 -1
  87. package/dist/drivers/download_url/task.d.ts +33 -37
  88. package/dist/drivers/download_url/task.js +99 -113
  89. package/dist/drivers/download_url/task.js.map +1 -1
  90. package/dist/drivers/helpers/download_local_handle.cjs +13 -14
  91. package/dist/drivers/helpers/download_local_handle.cjs.map +1 -1
  92. package/dist/drivers/helpers/download_local_handle.js +13 -13
  93. package/dist/drivers/helpers/download_local_handle.js.map +1 -1
  94. package/dist/drivers/helpers/download_remote_handle.cjs +23 -24
  95. package/dist/drivers/helpers/download_remote_handle.cjs.map +1 -1
  96. package/dist/drivers/helpers/download_remote_handle.js +22 -22
  97. package/dist/drivers/helpers/download_remote_handle.js.map +1 -1
  98. package/dist/drivers/helpers/files_cache.cjs +53 -64
  99. package/dist/drivers/helpers/files_cache.cjs.map +1 -1
  100. package/dist/drivers/helpers/files_cache.js +52 -62
  101. package/dist/drivers/helpers/files_cache.js.map +1 -1
  102. package/dist/drivers/helpers/helpers.cjs +24 -28
  103. package/dist/drivers/helpers/helpers.cjs.map +1 -1
  104. package/dist/drivers/helpers/helpers.d.ts +10 -7
  105. package/dist/drivers/helpers/helpers.js +24 -27
  106. package/dist/drivers/helpers/helpers.js.map +1 -1
  107. package/dist/drivers/helpers/logs_handle.cjs +24 -33
  108. package/dist/drivers/helpers/logs_handle.cjs.map +1 -1
  109. package/dist/drivers/helpers/logs_handle.js +24 -29
  110. package/dist/drivers/helpers/logs_handle.js.map +1 -1
  111. package/dist/drivers/helpers/ls_remote_import_handle.cjs +20 -20
  112. package/dist/drivers/helpers/ls_remote_import_handle.cjs.map +1 -1
  113. package/dist/drivers/helpers/ls_remote_import_handle.js +20 -18
  114. package/dist/drivers/helpers/ls_remote_import_handle.js.map +1 -1
  115. package/dist/drivers/helpers/ls_storage_entry.cjs +36 -40
  116. package/dist/drivers/helpers/ls_storage_entry.cjs.map +1 -1
  117. package/dist/drivers/helpers/ls_storage_entry.js +36 -37
  118. package/dist/drivers/helpers/ls_storage_entry.js.map +1 -1
  119. package/dist/drivers/helpers/polling_ops.d.ts +6 -5
  120. package/dist/drivers/helpers/read_file.cjs +34 -57
  121. package/dist/drivers/helpers/read_file.cjs.map +1 -1
  122. package/dist/drivers/helpers/read_file.js +30 -34
  123. package/dist/drivers/helpers/read_file.js.map +1 -1
  124. package/dist/drivers/logs.cjs +94 -112
  125. package/dist/drivers/logs.cjs.map +1 -1
  126. package/dist/drivers/logs.d.ts +35 -32
  127. package/dist/drivers/logs.js +93 -110
  128. package/dist/drivers/logs.js.map +1 -1
  129. package/dist/drivers/logs_stream.cjs +210 -242
  130. package/dist/drivers/logs_stream.cjs.map +1 -1
  131. package/dist/drivers/logs_stream.d.ts +55 -53
  132. package/dist/drivers/logs_stream.js +209 -240
  133. package/dist/drivers/logs_stream.js.map +1 -1
  134. package/dist/drivers/ls.cjs +151 -238
  135. package/dist/drivers/ls.cjs.map +1 -1
  136. package/dist/drivers/ls.d.ts +53 -49
  137. package/dist/drivers/ls.js +148 -216
  138. package/dist/drivers/ls.js.map +1 -1
  139. package/dist/drivers/types.cjs +25 -53
  140. package/dist/drivers/types.cjs.map +1 -1
  141. package/dist/drivers/types.d.ts +91 -106
  142. package/dist/drivers/types.js +23 -50
  143. package/dist/drivers/types.js.map +1 -1
  144. package/dist/drivers/upload.cjs +127 -153
  145. package/dist/drivers/upload.cjs.map +1 -1
  146. package/dist/drivers/upload.d.ts +52 -50
  147. package/dist/drivers/upload.js +126 -151
  148. package/dist/drivers/upload.js.map +1 -1
  149. package/dist/drivers/upload_task.cjs +223 -260
  150. package/dist/drivers/upload_task.cjs.map +1 -1
  151. package/dist/drivers/upload_task.d.ts +54 -52
  152. package/dist/drivers/upload_task.js +221 -258
  153. package/dist/drivers/upload_task.js.map +1 -1
  154. package/dist/drivers/urls/url.cjs +30 -35
  155. package/dist/drivers/urls/url.cjs.map +1 -1
  156. package/dist/drivers/urls/url.js +28 -33
  157. package/dist/drivers/urls/url.js.map +1 -1
  158. package/dist/drivers/virtual_storages.cjs +36 -48
  159. package/dist/drivers/virtual_storages.cjs.map +1 -1
  160. package/dist/drivers/virtual_storages.d.ts +6 -2
  161. package/dist/drivers/virtual_storages.js +32 -46
  162. package/dist/drivers/virtual_storages.js.map +1 -1
  163. package/dist/helpers/download.cjs +72 -95
  164. package/dist/helpers/download.cjs.map +1 -1
  165. package/dist/helpers/download.d.ts +13 -9
  166. package/dist/helpers/download.js +71 -93
  167. package/dist/helpers/download.js.map +1 -1
  168. package/dist/helpers/download_errors.cjs +28 -27
  169. package/dist/helpers/download_errors.cjs.map +1 -1
  170. package/dist/helpers/download_errors.d.ts +16 -13
  171. package/dist/helpers/download_errors.js +28 -26
  172. package/dist/helpers/download_errors.js.map +1 -1
  173. package/dist/helpers/validate.cjs +8 -7
  174. package/dist/helpers/validate.cjs.map +1 -1
  175. package/dist/helpers/validate.d.ts +4 -1
  176. package/dist/helpers/validate.js +6 -5
  177. package/dist/helpers/validate.js.map +1 -1
  178. package/dist/index.cjs +75 -79
  179. package/dist/index.d.ts +22 -22
  180. package/dist/index.js +22 -21
  181. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.cjs +238 -249
  182. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.cjs.map +1 -1
  183. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.cjs +27 -27
  184. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.cjs.map +1 -1
  185. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.d.ts +25 -23
  186. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.js +26 -25
  187. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.js.map +1 -1
  188. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.d.ts +51 -87
  189. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.js +238 -245
  190. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.js.map +1 -1
  191. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.cjs +295 -289
  192. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.cjs.map +1 -1
  193. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.cjs +30 -30
  194. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.cjs.map +1 -1
  195. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.js +29 -28
  196. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.js.map +1 -1
  197. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.d.ts +86 -150
  198. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.js +295 -285
  199. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.js.map +1 -1
  200. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.cjs +385 -393
  201. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.cjs.map +1 -1
  202. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.cjs +34 -34
  203. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.cjs.map +1 -1
  204. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.d.ts +33 -34
  205. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.js +33 -32
  206. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.js.map +1 -1
  207. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.d.ts +78 -129
  208. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.js +385 -387
  209. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.js.map +1 -1
  210. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.cjs +570 -468
  211. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.cjs.map +1 -1
  212. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.cjs +82 -82
  213. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.cjs.map +1 -1
  214. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.d.ts +109 -112
  215. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.js +81 -80
  216. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.js.map +1 -1
  217. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.d.ts +243 -264
  218. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.js +569 -460
  219. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.js.map +1 -1
  220. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.cjs +751 -729
  221. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.cjs.map +1 -1
  222. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.cjs +67 -67
  223. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.cjs.map +1 -1
  224. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.js +66 -65
  225. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.js.map +1 -1
  226. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.d.ts +15 -381
  227. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.js +749 -718
  228. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.js.map +1 -1
  229. package/dist/proto-grpc/google/protobuf/duration.cjs +92 -100
  230. package/dist/proto-grpc/google/protobuf/duration.cjs.map +1 -1
  231. package/dist/proto-grpc/google/protobuf/duration.d.ts +38 -43
  232. package/dist/proto-grpc/google/protobuf/duration.js +91 -98
  233. package/dist/proto-grpc/google/protobuf/duration.js.map +1 -1
  234. package/dist/proto-grpc/google/protobuf/timestamp.cjs +117 -128
  235. package/dist/proto-grpc/google/protobuf/timestamp.cjs.map +1 -1
  236. package/dist/proto-grpc/google/protobuf/timestamp.d.ts +50 -55
  237. package/dist/proto-grpc/google/protobuf/timestamp.js +116 -126
  238. package/dist/proto-grpc/google/protobuf/timestamp.js.map +1 -1
  239. package/dist/proto-rest/downloadapi.d.ts +85 -91
  240. package/dist/proto-rest/index.d.ts +11 -16
  241. package/dist/proto-rest/progressapi.d.ts +130 -140
  242. package/dist/proto-rest/streamingapi.d.ts +413 -434
  243. package/package.json +12 -12
  244. package/dist/clients/constructors.d.ts.map +0 -1
  245. package/dist/clients/crc32c.d.ts +0 -2
  246. package/dist/clients/crc32c.d.ts.map +0 -1
  247. package/dist/clients/download.d.ts.map +0 -1
  248. package/dist/clients/logs.d.ts.map +0 -1
  249. package/dist/clients/ls_api.d.ts.map +0 -1
  250. package/dist/clients/progress.d.ts.map +0 -1
  251. package/dist/clients/upload.d.ts.map +0 -1
  252. package/dist/drivers/download_blob/blob_key.d.ts +0 -5
  253. package/dist/drivers/download_blob/blob_key.d.ts.map +0 -1
  254. package/dist/drivers/download_blob/download_blob.d.ts.map +0 -1
  255. package/dist/drivers/download_blob/download_blob_task.d.ts +0 -56
  256. package/dist/drivers/download_blob/download_blob_task.d.ts.map +0 -1
  257. package/dist/drivers/download_blob/sparse_cache/cache.d.ts +0 -82
  258. package/dist/drivers/download_blob/sparse_cache/cache.d.ts.map +0 -1
  259. package/dist/drivers/download_blob/sparse_cache/file.d.ts +0 -8
  260. package/dist/drivers/download_blob/sparse_cache/file.d.ts.map +0 -1
  261. package/dist/drivers/download_blob/sparse_cache/ranges.d.ts +0 -46
  262. package/dist/drivers/download_blob/sparse_cache/ranges.d.ts.map +0 -1
  263. package/dist/drivers/download_blob_url/driver.d.ts.map +0 -1
  264. package/dist/drivers/download_blob_url/driver_id.d.ts +0 -6
  265. package/dist/drivers/download_blob_url/driver_id.d.ts.map +0 -1
  266. package/dist/drivers/download_blob_url/snapshot.d.ts.map +0 -1
  267. package/dist/drivers/download_blob_url/task.d.ts.map +0 -1
  268. package/dist/drivers/download_url/driver.d.ts.map +0 -1
  269. package/dist/drivers/download_url/task.d.ts.map +0 -1
  270. package/dist/drivers/helpers/download_local_handle.d.ts +0 -11
  271. package/dist/drivers/helpers/download_local_handle.d.ts.map +0 -1
  272. package/dist/drivers/helpers/download_remote_handle.d.ts +0 -13
  273. package/dist/drivers/helpers/download_remote_handle.d.ts.map +0 -1
  274. package/dist/drivers/helpers/files_cache.d.ts +0 -29
  275. package/dist/drivers/helpers/files_cache.d.ts.map +0 -1
  276. package/dist/drivers/helpers/helpers.d.ts.map +0 -1
  277. package/dist/drivers/helpers/logs_handle.d.ts +0 -15
  278. package/dist/drivers/helpers/logs_handle.d.ts.map +0 -1
  279. package/dist/drivers/helpers/ls_remote_import_handle.d.ts +0 -8
  280. package/dist/drivers/helpers/ls_remote_import_handle.d.ts.map +0 -1
  281. package/dist/drivers/helpers/ls_storage_entry.d.ts +0 -23
  282. package/dist/drivers/helpers/ls_storage_entry.d.ts.map +0 -1
  283. package/dist/drivers/helpers/polling_ops.d.ts.map +0 -1
  284. package/dist/drivers/helpers/read_file.d.ts +0 -12
  285. package/dist/drivers/helpers/read_file.d.ts.map +0 -1
  286. package/dist/drivers/helpers/test_helpers.d.ts +0 -2
  287. package/dist/drivers/helpers/test_helpers.d.ts.map +0 -1
  288. package/dist/drivers/logs.d.ts.map +0 -1
  289. package/dist/drivers/logs_stream.d.ts.map +0 -1
  290. package/dist/drivers/ls.d.ts.map +0 -1
  291. package/dist/drivers/types.d.ts.map +0 -1
  292. package/dist/drivers/upload.d.ts.map +0 -1
  293. package/dist/drivers/upload_task.d.ts.map +0 -1
  294. package/dist/drivers/urls/url.d.ts +0 -13
  295. package/dist/drivers/urls/url.d.ts.map +0 -1
  296. package/dist/drivers/virtual_storages.d.ts.map +0 -1
  297. package/dist/helpers/download.d.ts.map +0 -1
  298. package/dist/helpers/download_errors.d.ts.map +0 -1
  299. package/dist/helpers/validate.d.ts.map +0 -1
  300. package/dist/index.cjs.map +0 -1
  301. package/dist/index.d.ts.map +0 -1
  302. package/dist/index.js.map +0 -1
  303. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.d.ts.map +0 -1
  304. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.d.ts.map +0 -1
  305. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.d.ts +0 -46
  306. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.d.ts.map +0 -1
  307. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.d.ts.map +0 -1
  308. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.d.ts.map +0 -1
  309. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.d.ts.map +0 -1
  310. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.d.ts.map +0 -1
  311. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.d.ts.map +0 -1
  312. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.d.ts +0 -108
  313. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.d.ts.map +0 -1
  314. package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.d.ts.map +0 -1
  315. package/dist/proto-grpc/google/api/http.d.ts +0 -460
  316. package/dist/proto-grpc/google/api/http.d.ts.map +0 -1
  317. package/dist/proto-grpc/google/protobuf/descriptor.d.ts +0 -2340
  318. package/dist/proto-grpc/google/protobuf/descriptor.d.ts.map +0 -1
  319. package/dist/proto-grpc/google/protobuf/duration.d.ts.map +0 -1
  320. package/dist/proto-grpc/google/protobuf/timestamp.d.ts.map +0 -1
  321. package/dist/proto-rest/downloadapi.d.ts.map +0 -1
  322. package/dist/proto-rest/index.d.ts.map +0 -1
  323. package/dist/proto-rest/lsapi.d.ts +0 -148
  324. package/dist/proto-rest/lsapi.d.ts.map +0 -1
  325. package/dist/proto-rest/progressapi.d.ts.map +0 -1
  326. package/dist/proto-rest/streamingapi.d.ts.map +0 -1
  327. package/dist/proto-rest/uploadapi.d.ts +0 -355
  328. package/dist/proto-rest/uploadapi.d.ts.map +0 -1
  329. package/dist/test_env.d.ts +0 -6
  330. package/dist/test_env.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"upload_task.js","sources":["../../src/drivers/upload_task.ts"],"sourcesContent":["import type { Watcher } from \"@milaboratories/computable\";\nimport { ChangeSource } from \"@milaboratories/computable\";\nimport {\n isTimeoutError,\n resourceIdToString,\n stringifyWithResourceId,\n} from \"@milaboratories/pl-client\";\nimport type * as sdk from \"@milaboratories/pl-model-common\";\nimport type { AsyncPoolController, MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { asyncPool, CallersCounter } from \"@milaboratories/ts-helpers\";\nimport type { ClientProgress, ProgressStatus } from \"../clients/progress\";\nimport type { ClientUpload } from \"../clients/upload\";\nimport { BadRequestError, MTimeError, NoFileForUploading, UnexpectedEOF } from \"../clients/upload\";\nimport type { ImportResourceSnapshot } from \"./types\";\nimport { ImportFileHandleUploadData } from \"./types\";\nimport assert from \"node:assert\";\nimport { ResourceInfo } from \"@milaboratories/pl-tree\";\n\n/** Holds all info needed to upload a file and a status of uploading\n * and indexing. Also, has a method to update a status of the progress.\n * And holds a change source. */\nexport class UploadTask {\n private readonly change: ChangeSource = new ChangeSource();\n private readonly counter: CallersCounter = new CallersCounter();\n private nMaxUploads: number;\n private nPartsWithThisUploadSpeed = 0;\n private nPartsToIncreaseUpload = 10; // how many parts we have to wait to increase concurrency, 50 mb, 10 parts by 5 mb each.\n\n /** If this is upload progress this field will be defined */\n private uploadData?: ImportFileHandleUploadData;\n public progress: sdk.ImportProgress;\n\n /** If failed, then getting a progress is terminally failed. */\n public failed?: boolean;\n\n /** True if the blob was existed.\n * At this case, the task will show progress == 1.0. */\n private alreadyExisted = false;\n\n constructor(\n private readonly logger: MiLogger,\n private readonly clientBlob: ClientUpload,\n private readonly clientProgress: ClientProgress,\n private readonly maxNConcurrentPartsUpload: number,\n signer: Signer,\n public readonly res: ImportResourceSnapshot,\n ) {\n this.nMaxUploads = this.maxNConcurrentPartsUpload;\n const { uploadData, progress } = newProgress(res, signer);\n this.uploadData = uploadData;\n this.progress = progress;\n }\n\n public getProgress(w: Watcher, callerId: string) {\n this.incCounter(w, callerId);\n\n if (this.failed) {\n this.logger.error(`Uploading terminally failed: ${this.progress.lastError}`);\n throw new Error(this.progress.lastError);\n }\n\n return cloneProgress(this.progress);\n }\n\n public shouldScheduleUpload(): boolean {\n return isMyUpload(this.progress);\n }\n\n /** Uploads a blob if it's not BlobIndex. */\n public async uploadBlobTask() {\n try {\n await uploadBlob(\n this.logger,\n this.clientBlob,\n this.res,\n this.uploadData!,\n this.isComputableDone.bind(this),\n {\n nPartsWithThisUploadSpeed: this.nPartsWithThisUploadSpeed,\n nPartsToIncreaseUpload: this.nPartsToIncreaseUpload,\n currentSpeed: this.nMaxUploads,\n maxSpeed: this.maxNConcurrentPartsUpload,\n },\n );\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} finished`);\n } catch (e: any) {\n if (isTerminalUploadError(e)) {\n this.logger.warn(`terminal error while uploading a blob: ${e}`);\n this.change.markChanged(\n `blob upload for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n\n return;\n }\n\n this.logger.error(`error while uploading a blob: ${e}`);\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} failed`);\n\n if (nonRecoverableError(e)) {\n this.setTerminalError(e);\n return;\n }\n\n this.setRetriableError(e);\n\n if (isHeadersTimeoutError(e)) {\n // we probably have a slow internet, we need to slow things a bit.\n this.nMaxUploads = decreaseConcurrency(this.logger, this.nMaxUploads, 1);\n }\n\n throw e;\n }\n }\n\n public async updateStatus() {\n try {\n // we do it with timeout in case we have slow internet.\n const status = await this.clientProgress.getStatus(this.res, { timeout: 10000 });\n\n const oldStatus = this.progress.status;\n const newStatus = doneProgressIfExisted(this.alreadyExisted, protoToStatus(status));\n this.progress.status = newStatus;\n this.setDone(status.done);\n\n if (status.done || this.progress.status.progress != oldStatus?.progress) {\n this.change.markChanged(`upload status for ${resourceIdToString(this.res.id)} changed`);\n }\n } catch (e: any) {\n this.setRetriableError(e);\n\n if (isTimeoutError(e)) {\n this.logger.warn(`deadline exceeded while getting a status of BlobImport: ${e.message}`);\n return;\n }\n\n if (isTerminalUploadError(e)) {\n this.logger.warn(\n `terminal error while updating BlobImport status: ${e}, ${stringifyWithResourceId(this.res)}`,\n );\n this.change.markChanged(\n `upload status for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n return;\n }\n\n this.logger.error(`retryable error while updating a status of BlobImport: ${e}`);\n // It was a terminal error, but when a connection drops,\n // this will stop the whole task, so we make it retryable.\n // It was like that:\n // this.change.markChanged();\n // this.setTerminalError(e);\n }\n }\n\n /** Set non-terminal error, that task can be retried. */\n private setRetriableError(e: unknown) {\n this.progress.lastError = String(e);\n }\n\n /** Set a terminal error, the task will throw a error instead of a progress. */\n private setTerminalError(e: unknown) {\n this.progress.lastError = String(e);\n this.progress.done = false;\n this.failed = true;\n }\n\n public setDoneIfOutputSet(res: ImportResourceSnapshot) {\n if (isImportResourceOutputSet(res)) {\n this.setDone(true);\n this.alreadyExisted = true;\n }\n }\n\n private setDone(done: boolean) {\n this.progress.done = done;\n if (done) this.progress.lastError = undefined;\n }\n\n public incCounter(w: Watcher, callerId: string) {\n this.change.attachWatcher(w);\n this.counter.inc(callerId);\n }\n\n public decCounter(callerId: string) {\n return this.counter.dec(callerId);\n }\n\n private isComputableDone() {\n return this.counter.isZero();\n }\n}\n\n/** Uploads a blob if it's not BlobIndex. */\nexport async function uploadBlob(\n logger: MiLogger,\n clientBlob: ClientUpload,\n res: ResourceInfo,\n uploadData: ImportFileHandleUploadData,\n isDoneFn: () => boolean,\n speed: {\n nPartsWithThisUploadSpeed: number;\n nPartsToIncreaseUpload: number;\n currentSpeed: number;\n maxSpeed: number;\n },\n) {\n assert(isUpload(res), \"the upload operation can be done only for BlobUploads\");\n const timeout = 10000; // 10 sec instead of standard 5 sec, things might be slow with a slow connection.\n\n if (isDoneFn()) return;\n const parts = await clientBlob.initUpload(res, { timeout });\n logger.info(\n `started to upload blob ${res.id},` +\n ` parts overall: ${parts.overall}, parts remained: ${parts.toUpload.length},` +\n ` number of concurrent uploads: ${speed.currentSpeed}`,\n );\n\n const partUploadFn = (part: bigint) => async (controller: AsyncPoolController) => {\n if (isDoneFn()) return;\n await clientBlob.partUpload(\n res,\n uploadData.localPath,\n BigInt(uploadData.modificationTime),\n part,\n parts.checksumAlgorithm,\n parts.checksumHeader,\n { timeout },\n );\n logger.info(`uploaded chunk ${part}/${parts.overall} of resource: ${res.id}`);\n\n // if we had a network freeze, it will be increased slowly.\n speed.nPartsWithThisUploadSpeed++;\n if (speed.nPartsWithThisUploadSpeed >= speed.nPartsToIncreaseUpload) {\n speed.nPartsWithThisUploadSpeed = 0;\n speed.currentSpeed = increaseConcurrency(logger, speed.currentSpeed, speed.maxSpeed);\n controller.setConcurrency(speed.currentSpeed);\n }\n };\n\n await asyncPool(speed.currentSpeed, parts.toUpload.map(partUploadFn));\n\n if (isDoneFn()) return;\n await clientBlob.finalize(res, { timeout });\n\n logger.info(`uploading of resource ${res.id} finished.`);\n}\n\nfunction newProgress(res: ImportResourceSnapshot, signer: Signer) {\n let isUploadSignMatch: boolean | undefined;\n let uploadData: ImportFileHandleUploadData | undefined;\n if (isUpload(res)) {\n uploadData = ImportFileHandleUploadData.parse(res.data);\n isUploadSignMatch = isSignMatch(signer, uploadData.localPath, uploadData.pathSignature);\n }\n\n return {\n uploadData: uploadData,\n progress: {\n done: false,\n status: undefined,\n isUpload: isUpload(res),\n isUploadSignMatch: isUploadSignMatch,\n lastError: undefined,\n } satisfies sdk.ImportProgress,\n };\n}\n\n/** Returns true if we need to upload the blob that got from this progress. */\nexport function isMyUpload(p: sdk.ImportProgress): boolean {\n return p.isUpload && (p.isUploadSignMatch ?? false);\n}\n\n/** Creates a deep copy of progress,\n * since we do not want to pass a mutable object\n * to API, it led to bugs before.\n * We do not use '...' cloning syntax\n * for the compiler to fail here if we change API. */\nfunction cloneProgress(progress: sdk.ImportProgress): sdk.ImportProgress {\n const cloned: sdk.ImportProgress = {\n done: progress.done,\n isUpload: progress.isUpload,\n isUploadSignMatch: progress.isUploadSignMatch,\n lastError: progress.lastError,\n };\n\n if (progress.status)\n cloned.status = {\n progress: progress.status.progress,\n bytesProcessed: progress.status.bytesProcessed,\n bytesTotal: progress.status.bytesTotal,\n };\n\n return progress;\n}\n\nfunction isImportResourceOutputSet(res: ImportResourceSnapshot) {\n return \"blob\" in res.fields\n ? res.fields.blob !== undefined\n : res.fields.incarnation !== undefined;\n}\n\nexport function isUpload(res: ResourceInfo) {\n return res.type.name.startsWith(\"BlobUpload\");\n}\n\nexport function isSignMatch(signer: Signer, path: string, signature: string): boolean {\n try {\n signer.verify(path, signature);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction protoToStatus(proto: ProgressStatus): sdk.ImportStatus {\n return {\n progress: proto.progress ?? 0,\n bytesProcessed: Number(proto.bytesProcessed),\n bytesTotal: Number(proto.bytesTotal),\n };\n}\n\n/** Special hack: if we didn't even start to upload the blob\n * to backend because the result was already there,\n * the backend does show us a status that nothing were uploaded,\n * but we need to show the client that everything is OK.\n * Thus, here we set progress to be 1.0 and all bytes are become processed. */\nfunction doneProgressIfExisted(alreadyExisted: boolean, status: sdk.ImportStatus) {\n if (alreadyExisted && status.bytesTotal != 0 && status.bytesProcessed == 0) {\n return {\n progress: 1.0,\n bytesProcessed: Number(status.bytesTotal),\n bytesTotal: Number(status.bytesTotal),\n };\n }\n\n return status;\n}\n\nexport function isTerminalUploadError(e: any) {\n if (e?.name !== \"RpcError\") return false;\n switch (e.code) {\n case \"NOT_FOUND\":\n case \"ABORTED\":\n case \"ALREADY_EXISTS\":\n return true;\n default:\n return false;\n }\n}\n\nexport function nonRecoverableError(e: any) {\n return (\n e instanceof MTimeError ||\n e instanceof UnexpectedEOF ||\n e instanceof NoFileForUploading ||\n e instanceof BadRequestError\n );\n}\n\nfunction isHeadersTimeoutError(e: any) {\n return (e as Error)?.message.includes(`UND_ERR_HEADERS_TIMEOUT`);\n}\n\n/** It's called for every upload success so if everyone is succeeded, we'll double the concurrency. */\nfunction increaseConcurrency(logger: MiLogger, current: number, max: number): number {\n const newConcurrency = Math.min(current + 2, max);\n if (newConcurrency != current)\n logger.info(`uploadTask.increaseConcurrency: increased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n\n/** When a error happens, this will half the concurrency level, so the next time\n * we'll try to upload blobs slower. */\nfunction decreaseConcurrency(logger: MiLogger, current: number, min: number): number {\n const newConcurrency = Math.max(Math.round(current / 2), min);\n if (newConcurrency != current)\n logger.info(`uploadTask.decreaseConcurrency: decreased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n"],"names":[],"mappings":";;;;;;;AAkBA;;AAEgC;MACnB,UAAU,CAAA;AAmBF,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,cAAA;AACA,IAAA,yBAAA;AAED,IAAA,GAAA;AAvBD,IAAA,MAAM,GAAiB,IAAI,YAAY,EAAE;AACzC,IAAA,OAAO,GAAmB,IAAI,cAAc,EAAE;AACvD,IAAA,WAAW;IACX,yBAAyB,GAAG,CAAC;AAC7B,IAAA,sBAAsB,GAAG,EAAE,CAAC;;AAG5B,IAAA,UAAU;AACX,IAAA,QAAQ;;AAGR,IAAA,MAAM;AAEb;AACuD;IAC/C,cAAc,GAAG,KAAK;IAE9B,WAAA,CACmB,MAAgB,EAChB,UAAwB,EACxB,cAA8B,EAC9B,yBAAiC,EAClD,MAAc,EACE,GAA2B,EAAA;QAL1B,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,yBAAyB,GAAzB,yBAAyB;QAE1B,IAAA,CAAA,GAAG,GAAH,GAAG;AAEnB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,yBAAyB;AACjD,QAAA,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;AACzD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;IAC1B;IAEO,WAAW,CAAC,CAAU,EAAE,QAAgB,EAAA;AAC7C,QAAA,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC;AAE5B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAgC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAA,CAAE,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC1C;AAEA,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;IACrC;IAEO,oBAAoB,GAAA;AACzB,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC;;AAGO,IAAA,MAAM,cAAc,GAAA;AACzB,QAAA,IAAI;YACF,MAAM,UAAU,CACd,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,UAAW,EAChB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAChC;gBACE,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;gBACzD,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;gBACnD,YAAY,EAAE,IAAI,CAAC,WAAW;gBAC9B,QAAQ,EAAE,IAAI,CAAC,yBAAyB;AACzC,aAAA,CACF;AACD,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,SAAA,CAAW,CAAC;QACxF;QAAE,OAAO,CAAM,EAAE;AACf,YAAA,IAAI,qBAAqB,CAAC,CAAC,CAAC,EAAE;gBAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,uCAAA,EAA0C,CAAC,CAAA,CAAE,CAAC;gBAC/D,IAAI,CAAC,MAAM,CAAC,WAAW,CACrB,CAAA,gBAAA,EAAmB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,UAAA,EAAa,CAAC,CAAC,IAAI,CAAA,CAAE,CACxE;AACD,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBAElB;YACF;YAEA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,CAAC,CAAA,CAAE,CAAC;AACvD,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,OAAA,CAAS,CAAC;AAEpF,YAAA,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE;AAC1B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACxB;YACF;AAEA,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAEzB,YAAA,IAAI,qBAAqB,CAAC,CAAC,CAAC,EAAE;;AAE5B,gBAAA,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1E;AAEA,YAAA,MAAM,CAAC;QACT;IACF;AAEO,IAAA,MAAM,YAAY,GAAA;AACvB,QAAA,IAAI;;AAEF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEhF,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;AACtC,YAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;AACnF,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;AAChC,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AAEzB,YAAA,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,QAAQ,EAAE;AACvE,gBAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,QAAA,CAAU,CAAC;YACzF;QACF;QAAE,OAAO,CAAM,EAAE;AACf,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAEzB,YAAA,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE;gBACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,wDAAA,EAA2D,CAAC,CAAC,OAAO,CAAA,CAAE,CAAC;gBACxF;YACF;AAEA,YAAA,IAAI,qBAAqB,CAAC,CAAC,CAAC,EAAE;AAC5B,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,oDAAoD,CAAC,CAAA,EAAA,EAAK,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE,CAC9F;gBACD,IAAI,CAAC,MAAM,CAAC,WAAW,CACrB,CAAA,kBAAA,EAAqB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,UAAA,EAAa,CAAC,CAAC,IAAI,CAAA,CAAE,CAC1E;AACD,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBAClB;YACF;YAEA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,uDAAA,EAA0D,CAAC,CAAA,CAAE,CAAC;;;;;;QAMlF;IACF;;AAGQ,IAAA,iBAAiB,CAAC,CAAU,EAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;IACrC;;AAGQ,IAAA,gBAAgB,CAAC,CAAU,EAAA;QACjC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;IACpB;AAEO,IAAA,kBAAkB,CAAC,GAA2B,EAAA;AACnD,QAAA,IAAI,yBAAyB,CAAC,GAAG,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAClB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;AAEQ,IAAA,OAAO,CAAC,IAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI;AACzB,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,SAAS;IAC/C;IAEO,UAAU,CAAC,CAAU,EAAE,QAAgB,EAAA;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5B;AAEO,IAAA,UAAU,CAAC,QAAgB,EAAA;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnC;IAEQ,gBAAgB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;IAC9B;AACD;AAED;AACO,eAAe,UAAU,CAC9B,MAAgB,EAChB,UAAwB,EACxB,GAAiB,EACjB,UAAsC,EACtC,QAAuB,EACvB,KAKC,EAAA;IAED,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,uDAAuD,CAAC;AAC9E,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC;AAEtB,IAAA,IAAI,QAAQ,EAAE;QAAE;AAChB,IAAA,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;AAC3D,IAAA,MAAM,CAAC,IAAI,CACT,0BAA0B,GAAG,CAAC,EAAE,CAAA,CAAA,CAAG;QACjC,CAAA,gBAAA,EAAmB,KAAK,CAAC,OAAO,CAAA,kBAAA,EAAqB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAA,CAAA,CAAG;AAC7E,QAAA,CAAA,+BAAA,EAAkC,KAAK,CAAC,YAAY,CAAA,CAAE,CACzD;IAED,MAAM,YAAY,GAAG,CAAC,IAAY,KAAK,OAAO,UAA+B,KAAI;AAC/E,QAAA,IAAI,QAAQ,EAAE;YAAE;AAChB,QAAA,MAAM,UAAU,CAAC,UAAU,CACzB,GAAG,EACH,UAAU,CAAC,SAAS,EACpB,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,EACnC,IAAI,EACJ,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,cAAc,EACpB,EAAE,OAAO,EAAE,CACZ;AACD,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,iBAAiB,GAAG,CAAC,EAAE,CAAA,CAAE,CAAC;;QAG7E,KAAK,CAAC,yBAAyB,EAAE;QACjC,IAAI,KAAK,CAAC,yBAAyB,IAAI,KAAK,CAAC,sBAAsB,EAAE;AACnE,YAAA,KAAK,CAAC,yBAAyB,GAAG,CAAC;AACnC,YAAA,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC;AACpF,YAAA,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC;QAC/C;AACF,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAErE,IAAA,IAAI,QAAQ,EAAE;QAAE;IAChB,MAAM,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,CAAA,sBAAA,EAAyB,GAAG,CAAC,EAAE,CAAA,UAAA,CAAY,CAAC;AAC1D;AAEA,SAAS,WAAW,CAAC,GAA2B,EAAE,MAAc,EAAA;AAC9D,IAAA,IAAI,iBAAsC;AAC1C,IAAA,IAAI,UAAkD;AACtD,IAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;QACjB,UAAU,GAAG,0BAA0B,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACvD,QAAA,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,aAAa,CAAC;IACzF;IAEA,OAAO;AACL,QAAA,UAAU,EAAE,UAAU;AACtB,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC;AACvB,YAAA,iBAAiB,EAAE,iBAAiB;AACpC,YAAA,SAAS,EAAE,SAAS;AACQ,SAAA;KAC/B;AACH;AAEA;AACM,SAAU,UAAU,CAAC,CAAqB,EAAA;IAC9C,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,iBAAiB,IAAI,KAAK,CAAC;AACrD;AAEA;;;;AAIqD;AACrD,SAAS,aAAa,CAAC,QAA4B,EAAA;AACjD,KAAmC;QACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,SAAS,EAAE,QAAQ,CAAC,SAAS;;IAG/B,IAAI,QAAQ,CAAC,MAAM;SACD;AACd,YAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;AAClC,YAAA,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc;AAC9C,YAAA,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU;UACvC;AAEH,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,yBAAyB,CAAC,GAA2B,EAAA;AAC5D,IAAA,OAAO,MAAM,IAAI,GAAG,CAAC;AACnB,UAAE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK;UACpB,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS;AAC1C;AAEM,SAAU,QAAQ,CAAC,GAAiB,EAAA;IACxC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;AAC/C;SAEgB,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,SAAiB,EAAA;AACzE,IAAA,IAAI;AACF,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;AAC9B,QAAA,OAAO,IAAI;IACb;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACF;AAEA,SAAS,aAAa,CAAC,KAAqB,EAAA;IAC1C,OAAO;AACL,QAAA,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;AAC7B,QAAA,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;AAC5C,QAAA,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;KACrC;AACH;AAEA;;;;AAI8E;AAC9E,SAAS,qBAAqB,CAAC,cAAuB,EAAE,MAAwB,EAAA;AAC9E,IAAA,IAAI,cAAc,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,EAAE;QAC1E,OAAO;AACL,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACzC,YAAA,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;SACtC;IACH;AAEA,IAAA,OAAO,MAAM;AACf;AAEM,SAAU,qBAAqB,CAAC,CAAM,EAAA;AAC1C,IAAA,IAAI,CAAC,EAAE,IAAI,KAAK,UAAU;AAAE,QAAA,OAAO,KAAK;AACxC,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,WAAW;AAChB,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,gBAAgB;AACnB,YAAA,OAAO,IAAI;AACb,QAAA;AACE,YAAA,OAAO,KAAK;;AAElB;AAEM,SAAU,mBAAmB,CAAC,CAAM,EAAA;IACxC,QACE,CAAC,YAAY,UAAU;AACvB,QAAA,CAAC,YAAY,aAAa;AAC1B,QAAA,CAAC,YAAY,kBAAkB;QAC/B,CAAC,YAAY,eAAe;AAEhC;AAEA,SAAS,qBAAqB,CAAC,CAAM,EAAA;IACnC,OAAQ,CAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA,uBAAA,CAAyB,CAAC;AAClE;AAEA;AACA,SAAS,mBAAmB,CAAC,MAAgB,EAAE,OAAe,EAAE,GAAW,EAAA;AACzE,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC;IACjD,IAAI,cAAc,IAAI,OAAO;QAC3B,MAAM,CAAC,IAAI,CAAC,CAAA,+CAAA,EAAkD,OAAO,CAAA,IAAA,EAAO,cAAc,CAAA,CAAE,CAAC;AAE/F,IAAA,OAAO,cAAc;AACvB;AAEA;AACuC;AACvC,SAAS,mBAAmB,CAAC,MAAgB,EAAE,OAAe,EAAE,GAAW,EAAA;AACzE,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;IAC7D,IAAI,cAAc,IAAI,OAAO;QAC3B,MAAM,CAAC,IAAI,CAAC,CAAA,+CAAA,EAAkD,OAAO,CAAA,IAAA,EAAO,cAAc,CAAA,CAAE,CAAC;AAE/F,IAAA,OAAO,cAAc;AACvB;;;;"}
1
+ {"version":3,"file":"upload_task.js","names":[],"sources":["../../src/drivers/upload_task.ts"],"sourcesContent":["import type { Watcher } from \"@milaboratories/computable\";\nimport { ChangeSource } from \"@milaboratories/computable\";\nimport {\n isTimeoutError,\n resourceIdToString,\n stringifyWithResourceId,\n} from \"@milaboratories/pl-client\";\nimport type * as sdk from \"@milaboratories/pl-model-common\";\nimport type { AsyncPoolController, MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { asyncPool, CallersCounter } from \"@milaboratories/ts-helpers\";\nimport type { ClientProgress, ProgressStatus } from \"../clients/progress\";\nimport type { ClientUpload } from \"../clients/upload\";\nimport { BadRequestError, MTimeError, NoFileForUploading, UnexpectedEOF } from \"../clients/upload\";\nimport type { ImportResourceSnapshot } from \"./types\";\nimport { ImportFileHandleUploadData } from \"./types\";\nimport assert from \"node:assert\";\nimport { ResourceInfo } from \"@milaboratories/pl-tree\";\n\n/** Holds all info needed to upload a file and a status of uploading\n * and indexing. Also, has a method to update a status of the progress.\n * And holds a change source. */\nexport class UploadTask {\n private readonly change: ChangeSource = new ChangeSource();\n private readonly counter: CallersCounter = new CallersCounter();\n private nMaxUploads: number;\n private nPartsWithThisUploadSpeed = 0;\n private nPartsToIncreaseUpload = 10; // how many parts we have to wait to increase concurrency, 50 mb, 10 parts by 5 mb each.\n\n /** If this is upload progress this field will be defined */\n private uploadData?: ImportFileHandleUploadData;\n public progress: sdk.ImportProgress;\n\n /** If failed, then getting a progress is terminally failed. */\n public failed?: boolean;\n\n /** True if the blob was existed.\n * At this case, the task will show progress == 1.0. */\n private alreadyExisted = false;\n\n constructor(\n private readonly logger: MiLogger,\n private readonly clientBlob: ClientUpload,\n private readonly clientProgress: ClientProgress,\n private readonly maxNConcurrentPartsUpload: number,\n signer: Signer,\n public readonly res: ImportResourceSnapshot,\n ) {\n this.nMaxUploads = this.maxNConcurrentPartsUpload;\n const { uploadData, progress } = newProgress(res, signer);\n this.uploadData = uploadData;\n this.progress = progress;\n }\n\n public getProgress(w: Watcher, callerId: string) {\n this.incCounter(w, callerId);\n\n if (this.failed) {\n this.logger.error(`Uploading terminally failed: ${this.progress.lastError}`);\n throw new Error(this.progress.lastError);\n }\n\n return cloneProgress(this.progress);\n }\n\n public shouldScheduleUpload(): boolean {\n return isMyUpload(this.progress);\n }\n\n /** Uploads a blob if it's not BlobIndex. */\n public async uploadBlobTask() {\n try {\n await uploadBlob(\n this.logger,\n this.clientBlob,\n this.res,\n this.uploadData!,\n this.isComputableDone.bind(this),\n {\n nPartsWithThisUploadSpeed: this.nPartsWithThisUploadSpeed,\n nPartsToIncreaseUpload: this.nPartsToIncreaseUpload,\n currentSpeed: this.nMaxUploads,\n maxSpeed: this.maxNConcurrentPartsUpload,\n },\n );\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} finished`);\n } catch (e: any) {\n if (isTerminalUploadError(e)) {\n this.logger.warn(`terminal error while uploading a blob: ${e}`);\n this.change.markChanged(\n `blob upload for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n\n return;\n }\n\n this.logger.error(`error while uploading a blob: ${e}`);\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} failed`);\n\n if (nonRecoverableError(e)) {\n this.setTerminalError(e);\n return;\n }\n\n this.setRetriableError(e);\n\n if (isHeadersTimeoutError(e)) {\n // we probably have a slow internet, we need to slow things a bit.\n this.nMaxUploads = decreaseConcurrency(this.logger, this.nMaxUploads, 1);\n }\n\n throw e;\n }\n }\n\n public async updateStatus() {\n try {\n // we do it with timeout in case we have slow internet.\n const status = await this.clientProgress.getStatus(this.res, { timeout: 10000 });\n\n const oldStatus = this.progress.status;\n const newStatus = doneProgressIfExisted(this.alreadyExisted, protoToStatus(status));\n this.progress.status = newStatus;\n this.setDone(status.done);\n\n if (status.done || this.progress.status.progress != oldStatus?.progress) {\n this.change.markChanged(`upload status for ${resourceIdToString(this.res.id)} changed`);\n }\n } catch (e: any) {\n this.setRetriableError(e);\n\n if (isTimeoutError(e)) {\n this.logger.warn(`deadline exceeded while getting a status of BlobImport: ${e.message}`);\n return;\n }\n\n if (isTerminalUploadError(e)) {\n this.logger.warn(\n `terminal error while updating BlobImport status: ${e}, ${stringifyWithResourceId(this.res)}`,\n );\n this.change.markChanged(\n `upload status for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n return;\n }\n\n this.logger.error(`retryable error while updating a status of BlobImport: ${e}`);\n // It was a terminal error, but when a connection drops,\n // this will stop the whole task, so we make it retryable.\n // It was like that:\n // this.change.markChanged();\n // this.setTerminalError(e);\n }\n }\n\n /** Set non-terminal error, that task can be retried. */\n private setRetriableError(e: unknown) {\n this.progress.lastError = String(e);\n }\n\n /** Set a terminal error, the task will throw a error instead of a progress. */\n private setTerminalError(e: unknown) {\n this.progress.lastError = String(e);\n this.progress.done = false;\n this.failed = true;\n }\n\n public setDoneIfOutputSet(res: ImportResourceSnapshot) {\n if (isImportResourceOutputSet(res)) {\n this.setDone(true);\n this.alreadyExisted = true;\n }\n }\n\n private setDone(done: boolean) {\n this.progress.done = done;\n if (done) this.progress.lastError = undefined;\n }\n\n public incCounter(w: Watcher, callerId: string) {\n this.change.attachWatcher(w);\n this.counter.inc(callerId);\n }\n\n public decCounter(callerId: string) {\n return this.counter.dec(callerId);\n }\n\n private isComputableDone() {\n return this.counter.isZero();\n }\n}\n\n/** Uploads a blob if it's not BlobIndex. */\nexport async function uploadBlob(\n logger: MiLogger,\n clientBlob: ClientUpload,\n res: ResourceInfo,\n uploadData: ImportFileHandleUploadData,\n isDoneFn: () => boolean,\n speed: {\n nPartsWithThisUploadSpeed: number;\n nPartsToIncreaseUpload: number;\n currentSpeed: number;\n maxSpeed: number;\n },\n) {\n assert(isUpload(res), \"the upload operation can be done only for BlobUploads\");\n const timeout = 10000; // 10 sec instead of standard 5 sec, things might be slow with a slow connection.\n\n if (isDoneFn()) return;\n const parts = await clientBlob.initUpload(res, { timeout });\n logger.info(\n `started to upload blob ${res.id},` +\n ` parts overall: ${parts.overall}, parts remained: ${parts.toUpload.length},` +\n ` number of concurrent uploads: ${speed.currentSpeed}`,\n );\n\n const partUploadFn = (part: bigint) => async (controller: AsyncPoolController) => {\n if (isDoneFn()) return;\n await clientBlob.partUpload(\n res,\n uploadData.localPath,\n BigInt(uploadData.modificationTime),\n part,\n parts.checksumAlgorithm,\n parts.checksumHeader,\n { timeout },\n );\n logger.info(`uploaded chunk ${part}/${parts.overall} of resource: ${res.id}`);\n\n // if we had a network freeze, it will be increased slowly.\n speed.nPartsWithThisUploadSpeed++;\n if (speed.nPartsWithThisUploadSpeed >= speed.nPartsToIncreaseUpload) {\n speed.nPartsWithThisUploadSpeed = 0;\n speed.currentSpeed = increaseConcurrency(logger, speed.currentSpeed, speed.maxSpeed);\n controller.setConcurrency(speed.currentSpeed);\n }\n };\n\n await asyncPool(speed.currentSpeed, parts.toUpload.map(partUploadFn));\n\n if (isDoneFn()) return;\n await clientBlob.finalize(res, { timeout });\n\n logger.info(`uploading of resource ${res.id} finished.`);\n}\n\nfunction newProgress(res: ImportResourceSnapshot, signer: Signer) {\n let isUploadSignMatch: boolean | undefined;\n let uploadData: ImportFileHandleUploadData | undefined;\n if (isUpload(res)) {\n uploadData = ImportFileHandleUploadData.parse(res.data);\n isUploadSignMatch = isSignMatch(signer, uploadData.localPath, uploadData.pathSignature);\n }\n\n return {\n uploadData: uploadData,\n progress: {\n done: false,\n status: undefined,\n isUpload: isUpload(res),\n isUploadSignMatch: isUploadSignMatch,\n lastError: undefined,\n } satisfies sdk.ImportProgress,\n };\n}\n\n/** Returns true if we need to upload the blob that got from this progress. */\nexport function isMyUpload(p: sdk.ImportProgress): boolean {\n return p.isUpload && (p.isUploadSignMatch ?? false);\n}\n\n/** Creates a deep copy of progress,\n * since we do not want to pass a mutable object\n * to API, it led to bugs before.\n * We do not use '...' cloning syntax\n * for the compiler to fail here if we change API. */\nfunction cloneProgress(progress: sdk.ImportProgress): sdk.ImportProgress {\n const cloned: sdk.ImportProgress = {\n done: progress.done,\n isUpload: progress.isUpload,\n isUploadSignMatch: progress.isUploadSignMatch,\n lastError: progress.lastError,\n };\n\n if (progress.status)\n cloned.status = {\n progress: progress.status.progress,\n bytesProcessed: progress.status.bytesProcessed,\n bytesTotal: progress.status.bytesTotal,\n };\n\n return progress;\n}\n\nfunction isImportResourceOutputSet(res: ImportResourceSnapshot) {\n return \"blob\" in res.fields\n ? res.fields.blob !== undefined\n : res.fields.incarnation !== undefined;\n}\n\nexport function isUpload(res: ResourceInfo) {\n return res.type.name.startsWith(\"BlobUpload\");\n}\n\nexport function isSignMatch(signer: Signer, path: string, signature: string): boolean {\n try {\n signer.verify(path, signature);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction protoToStatus(proto: ProgressStatus): sdk.ImportStatus {\n return {\n progress: proto.progress ?? 0,\n bytesProcessed: Number(proto.bytesProcessed),\n bytesTotal: Number(proto.bytesTotal),\n };\n}\n\n/** Special hack: if we didn't even start to upload the blob\n * to backend because the result was already there,\n * the backend does show us a status that nothing were uploaded,\n * but we need to show the client that everything is OK.\n * Thus, here we set progress to be 1.0 and all bytes are become processed. */\nfunction doneProgressIfExisted(alreadyExisted: boolean, status: sdk.ImportStatus) {\n if (alreadyExisted && status.bytesTotal != 0 && status.bytesProcessed == 0) {\n return {\n progress: 1.0,\n bytesProcessed: Number(status.bytesTotal),\n bytesTotal: Number(status.bytesTotal),\n };\n }\n\n return status;\n}\n\nexport function isTerminalUploadError(e: any) {\n if (e?.name !== \"RpcError\") return false;\n switch (e.code) {\n case \"NOT_FOUND\":\n case \"ABORTED\":\n case \"ALREADY_EXISTS\":\n return true;\n default:\n return false;\n }\n}\n\nexport function nonRecoverableError(e: any) {\n return (\n e instanceof MTimeError ||\n e instanceof UnexpectedEOF ||\n e instanceof NoFileForUploading ||\n e instanceof BadRequestError\n );\n}\n\nfunction isHeadersTimeoutError(e: any) {\n return (e as Error)?.message.includes(`UND_ERR_HEADERS_TIMEOUT`);\n}\n\n/** It's called for every upload success so if everyone is succeeded, we'll double the concurrency. */\nfunction increaseConcurrency(logger: MiLogger, current: number, max: number): number {\n const newConcurrency = Math.min(current + 2, max);\n if (newConcurrency != current)\n logger.info(`uploadTask.increaseConcurrency: increased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n\n/** When a error happens, this will half the concurrency level, so the next time\n * we'll try to upload blobs slower. */\nfunction decreaseConcurrency(logger: MiLogger, current: number, min: number): number {\n const newConcurrency = Math.max(Math.round(current / 2), min);\n if (newConcurrency != current)\n logger.info(`uploadTask.decreaseConcurrency: decreased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n"],"mappings":"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"}
@@ -1,59 +1,54 @@
1
- 'use strict';
2
-
3
- var path = require('node:path');
1
+ const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
+ let path = require("path");
3
+ path = require_runtime.__toESM(path);
4
4
 
5
+ //#region src/drivers/urls/url.ts
5
6
  /** Creates a new plblob+folder URL. */
6
7
  function newFolderURL(signer, saveDir, fPath) {
7
- const p = path.relative(saveDir, fPath);
8
- const sign = signer.sign(p);
9
- return `plblob+folder://${sign}.${p}.blob`;
8
+ const p = path.default.relative(saveDir, fPath);
9
+ return `plblob+folder://${signer.sign(p)}.${p}.blob`;
10
10
  }
11
11
  /** Creates a new block-ui URL. */
12
12
  function newBlockUIURL(signer, saveDir, fPath) {
13
- const p = path.relative(saveDir, fPath);
14
- const sign = signer.sign(p);
15
- return `block-ui://${sign}.${p}.uidir`;
13
+ const p = path.default.relative(saveDir, fPath);
14
+ return `block-ui://${signer.sign(p)}.${p}.uidir`;
16
15
  }
17
16
  /** Checks the signature and path injections.
18
- * @returns the path to the file inside the root directory. */
17
+ * @returns the path to the file inside the root directory. */
19
18
  function getPathForFolderURL(signer, url, rootDir) {
20
- return getPath(signer, url, rootDir);
19
+ return getPath(signer, url, rootDir);
21
20
  }
22
21
  /** Checks the signature and path injections.
23
- * @returns the path to the file inside the root directory. */
22
+ * @returns the path to the file inside the root directory. */
24
23
  function getPathForBlockUIURL(signer, url, rootDir) {
25
- return getPath(signer, url, rootDir);
24
+ return getPath(signer, url, rootDir);
26
25
  }
27
26
  /** Parses URL,
28
- * checks the signature,
29
- * gets the absolute path by the given root directory.
30
- * If the path is empty, it returns the index.html file.
31
- * @returns an absolute path for the user. */
27
+ * checks the signature,
28
+ * gets the absolute path by the given root directory.
29
+ * If the path is empty, it returns the index.html file.
30
+ * @returns an absolute path for the user. */
32
31
  function getPath(signer, url, rootDir) {
33
- const parsed = new URL(url);
34
- const [sign, subfolder, _] = parsed.host.split(".");
35
- signer.verify(subfolder, sign, `signature verification failed for url: ${url}, subfolder: ${subfolder}`);
36
- // Decoding changes '%20' to ' ' for example.
37
- const pathname = decodeURIComponent(parsed.pathname.slice(1));
38
- let fPath = parseNestedPathNoEscape(path.join(rootDir, `${subfolder}`), pathname);
39
- if (parsed.pathname == "" || parsed.pathname == "/") {
40
- fPath = path.join(fPath, "index.html");
41
- }
42
- return path.resolve(fPath);
32
+ const parsed = new URL(url);
33
+ const [sign, subfolder, _] = parsed.host.split(".");
34
+ signer.verify(subfolder, sign, `signature verification failed for url: ${url}, subfolder: ${subfolder}`);
35
+ const pathname = decodeURIComponent(parsed.pathname.slice(1));
36
+ let fPath = parseNestedPathNoEscape(path.default.join(rootDir, `${subfolder}`), pathname);
37
+ if (parsed.pathname == "" || parsed.pathname == "/") fPath = path.default.join(fPath, "index.html");
38
+ return path.default.resolve(fPath);
43
39
  }
44
40
  /** Checks that the userInputPath is in baseDir.
45
- * @returns an absolute path for the user. */
41
+ * @returns an absolute path for the user. */
46
42
  function parseNestedPathNoEscape(baseDir, userInputPath) {
47
- const absolutePath = path.resolve(baseDir, userInputPath);
48
- const normalizedBase = path.resolve(baseDir);
49
- if (!absolutePath.startsWith(normalizedBase)) {
50
- throw new Error("Path validation failed.");
51
- }
52
- return absolutePath;
43
+ const absolutePath = path.default.resolve(baseDir, userInputPath);
44
+ const normalizedBase = path.default.resolve(baseDir);
45
+ if (!absolutePath.startsWith(normalizedBase)) throw new Error("Path validation failed.");
46
+ return absolutePath;
53
47
  }
54
48
 
49
+ //#endregion
55
50
  exports.getPathForBlockUIURL = getPathForBlockUIURL;
56
51
  exports.getPathForFolderURL = getPathForFolderURL;
57
52
  exports.newBlockUIURL = newBlockUIURL;
58
53
  exports.newFolderURL = newFolderURL;
59
- //# sourceMappingURL=url.cjs.map
54
+ //# sourceMappingURL=url.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.cjs","sources":["../../../src/drivers/urls/url.ts"],"sourcesContent":["import type { FolderURL, BlockUIURL } from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport path from \"path\";\n\n/** Creates a new plblob+folder URL. */\nexport function newFolderURL(signer: Signer, saveDir: string, fPath: string): FolderURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `plblob+folder://${sign}.${p}.blob`;\n}\n\n/** Creates a new block-ui URL. */\nexport function newBlockUIURL(signer: Signer, saveDir: string, fPath: string): BlockUIURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `block-ui://${sign}.${p}.uidir`;\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForFolderURL(signer: Signer, url: FolderURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForBlockUIURL(signer: Signer, url: BlockUIURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Parses URL,\n * checks the signature,\n * gets the absolute path by the given root directory.\n * If the path is empty, it returns the index.html file.\n * @returns an absolute path for the user. */\nfunction getPath(signer: Signer, url: string, rootDir: string): string {\n const parsed = new URL(url);\n const [sign, subfolder, _] = parsed.host.split(\".\");\n\n signer.verify(\n subfolder,\n sign,\n `signature verification failed for url: ${url}, subfolder: ${subfolder}`,\n );\n\n // Decoding changes '%20' to ' ' for example.\n const pathname = decodeURIComponent(parsed.pathname.slice(1));\n\n let fPath = parseNestedPathNoEscape(path.join(rootDir, `${subfolder}`), pathname);\n\n if (parsed.pathname == \"\" || parsed.pathname == \"/\") {\n fPath = path.join(fPath, \"index.html\");\n }\n\n return path.resolve(fPath);\n}\n\n/** Checks that the userInputPath is in baseDir.\n * @returns an absolute path for the user. */\nfunction parseNestedPathNoEscape(baseDir: string, userInputPath: string): string {\n const absolutePath = path.resolve(baseDir, userInputPath);\n\n const normalizedBase = path.resolve(baseDir);\n\n if (!absolutePath.startsWith(normalizedBase)) {\n throw new Error(\"Path validation failed.\");\n }\n\n return absolutePath;\n}\n"],"names":[],"mappings":";;;;AAIA;SACgB,YAAY,CAAC,MAAc,EAAE,OAAe,EAAE,KAAa,EAAA;IACzE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAE3B,IAAA,OAAO,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA,EAAI,CAAC,OAAO;AAC5C;AAEA;SACgB,aAAa,CAAC,MAAc,EAAE,OAAe,EAAE,KAAa,EAAA;IAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAE3B,IAAA,OAAO,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA,EAAI,CAAC,QAAQ;AACxC;AAEA;AAC8D;SAC9C,mBAAmB,CAAC,MAAc,EAAE,GAAc,EAAE,OAAe,EAAA;IACjF,OAAO,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;AACtC;AAEA;AAC8D;SAC9C,oBAAoB,CAAC,MAAc,EAAE,GAAe,EAAE,OAAe,EAAA;IACnF,OAAO,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;AACtC;AAEA;;;;AAI6C;AAC7C,SAAS,OAAO,CAAC,MAAc,EAAE,GAAW,EAAE,OAAe,EAAA;AAC3D,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,IAAA,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAEnD,IAAA,MAAM,CAAC,MAAM,CACX,SAAS,EACT,IAAI,EACJ,CAAA,uCAAA,EAA0C,GAAG,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CACzE;;AAGD,IAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE7D,IAAA,IAAI,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,CAAA,CAAE,CAAC,EAAE,QAAQ,CAAC;AAEjF,IAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,GAAG,EAAE;QACnD,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;IACxC;AAEA,IAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5B;AAEA;AAC6C;AAC7C,SAAS,uBAAuB,CAAC,OAAe,EAAE,aAAqB,EAAA;IACrE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC;IAEzD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAE5C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AAC5C,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC5C;AAEA,IAAA,OAAO,YAAY;AACrB;;;;;;;"}
1
+ {"version":3,"file":"url.cjs","names":[],"sources":["../../../src/drivers/urls/url.ts"],"sourcesContent":["import type { FolderURL, BlockUIURL } from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport path from \"path\";\n\n/** Creates a new plblob+folder URL. */\nexport function newFolderURL(signer: Signer, saveDir: string, fPath: string): FolderURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `plblob+folder://${sign}.${p}.blob`;\n}\n\n/** Creates a new block-ui URL. */\nexport function newBlockUIURL(signer: Signer, saveDir: string, fPath: string): BlockUIURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `block-ui://${sign}.${p}.uidir`;\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForFolderURL(signer: Signer, url: FolderURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForBlockUIURL(signer: Signer, url: BlockUIURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Parses URL,\n * checks the signature,\n * gets the absolute path by the given root directory.\n * If the path is empty, it returns the index.html file.\n * @returns an absolute path for the user. */\nfunction getPath(signer: Signer, url: string, rootDir: string): string {\n const parsed = new URL(url);\n const [sign, subfolder, _] = parsed.host.split(\".\");\n\n signer.verify(\n subfolder,\n sign,\n `signature verification failed for url: ${url}, subfolder: ${subfolder}`,\n );\n\n // Decoding changes '%20' to ' ' for example.\n const pathname = decodeURIComponent(parsed.pathname.slice(1));\n\n let fPath = parseNestedPathNoEscape(path.join(rootDir, `${subfolder}`), pathname);\n\n if (parsed.pathname == \"\" || parsed.pathname == \"/\") {\n fPath = path.join(fPath, \"index.html\");\n }\n\n return path.resolve(fPath);\n}\n\n/** Checks that the userInputPath is in baseDir.\n * @returns an absolute path for the user. */\nfunction parseNestedPathNoEscape(baseDir: string, userInputPath: string): string {\n const absolutePath = path.resolve(baseDir, userInputPath);\n\n const normalizedBase = path.resolve(baseDir);\n\n if (!absolutePath.startsWith(normalizedBase)) {\n throw new Error(\"Path validation failed.\");\n }\n\n return absolutePath;\n}\n"],"mappings":";;;;;;AAKA,SAAgB,aAAa,QAAgB,SAAiB,OAA0B;CACtF,MAAM,IAAI,aAAK,SAAS,SAAS,MAAM;AAGvC,QAAO,mBAFM,OAAO,KAAK,EAAE,CAEI,GAAG,EAAE;;;AAItC,SAAgB,cAAc,QAAgB,SAAiB,OAA2B;CACxF,MAAM,IAAI,aAAK,SAAS,SAAS,MAAM;AAGvC,QAAO,cAFM,OAAO,KAAK,EAAE,CAED,GAAG,EAAE;;;;AAKjC,SAAgB,oBAAoB,QAAgB,KAAgB,SAAyB;AAC3F,QAAO,QAAQ,QAAQ,KAAK,QAAQ;;;;AAKtC,SAAgB,qBAAqB,QAAgB,KAAiB,SAAyB;AAC7F,QAAO,QAAQ,QAAQ,KAAK,QAAQ;;;;;;;AAQtC,SAAS,QAAQ,QAAgB,KAAa,SAAyB;CACrE,MAAM,SAAS,IAAI,IAAI,IAAI;CAC3B,MAAM,CAAC,MAAM,WAAW,KAAK,OAAO,KAAK,MAAM,IAAI;AAEnD,QAAO,OACL,WACA,MACA,0CAA0C,IAAI,eAAe,YAC9D;CAGD,MAAM,WAAW,mBAAmB,OAAO,SAAS,MAAM,EAAE,CAAC;CAE7D,IAAI,QAAQ,wBAAwB,aAAK,KAAK,SAAS,GAAG,YAAY,EAAE,SAAS;AAEjF,KAAI,OAAO,YAAY,MAAM,OAAO,YAAY,IAC9C,SAAQ,aAAK,KAAK,OAAO,aAAa;AAGxC,QAAO,aAAK,QAAQ,MAAM;;;;AAK5B,SAAS,wBAAwB,SAAiB,eAA+B;CAC/E,MAAM,eAAe,aAAK,QAAQ,SAAS,cAAc;CAEzD,MAAM,iBAAiB,aAAK,QAAQ,QAAQ;AAE5C,KAAI,CAAC,aAAa,WAAW,eAAe,CAC1C,OAAM,IAAI,MAAM,0BAA0B;AAG5C,QAAO"}
@@ -1,54 +1,49 @@
1
- import path__default from 'node:path';
1
+ import path from "path";
2
2
 
3
+ //#region src/drivers/urls/url.ts
3
4
  /** Creates a new plblob+folder URL. */
4
5
  function newFolderURL(signer, saveDir, fPath) {
5
- const p = path__default.relative(saveDir, fPath);
6
- const sign = signer.sign(p);
7
- return `plblob+folder://${sign}.${p}.blob`;
6
+ const p = path.relative(saveDir, fPath);
7
+ return `plblob+folder://${signer.sign(p)}.${p}.blob`;
8
8
  }
9
9
  /** Creates a new block-ui URL. */
10
10
  function newBlockUIURL(signer, saveDir, fPath) {
11
- const p = path__default.relative(saveDir, fPath);
12
- const sign = signer.sign(p);
13
- return `block-ui://${sign}.${p}.uidir`;
11
+ const p = path.relative(saveDir, fPath);
12
+ return `block-ui://${signer.sign(p)}.${p}.uidir`;
14
13
  }
15
14
  /** Checks the signature and path injections.
16
- * @returns the path to the file inside the root directory. */
15
+ * @returns the path to the file inside the root directory. */
17
16
  function getPathForFolderURL(signer, url, rootDir) {
18
- return getPath(signer, url, rootDir);
17
+ return getPath(signer, url, rootDir);
19
18
  }
20
19
  /** Checks the signature and path injections.
21
- * @returns the path to the file inside the root directory. */
20
+ * @returns the path to the file inside the root directory. */
22
21
  function getPathForBlockUIURL(signer, url, rootDir) {
23
- return getPath(signer, url, rootDir);
22
+ return getPath(signer, url, rootDir);
24
23
  }
25
24
  /** Parses URL,
26
- * checks the signature,
27
- * gets the absolute path by the given root directory.
28
- * If the path is empty, it returns the index.html file.
29
- * @returns an absolute path for the user. */
25
+ * checks the signature,
26
+ * gets the absolute path by the given root directory.
27
+ * If the path is empty, it returns the index.html file.
28
+ * @returns an absolute path for the user. */
30
29
  function getPath(signer, url, rootDir) {
31
- const parsed = new URL(url);
32
- const [sign, subfolder, _] = parsed.host.split(".");
33
- signer.verify(subfolder, sign, `signature verification failed for url: ${url}, subfolder: ${subfolder}`);
34
- // Decoding changes '%20' to ' ' for example.
35
- const pathname = decodeURIComponent(parsed.pathname.slice(1));
36
- let fPath = parseNestedPathNoEscape(path__default.join(rootDir, `${subfolder}`), pathname);
37
- if (parsed.pathname == "" || parsed.pathname == "/") {
38
- fPath = path__default.join(fPath, "index.html");
39
- }
40
- return path__default.resolve(fPath);
30
+ const parsed = new URL(url);
31
+ const [sign, subfolder, _] = parsed.host.split(".");
32
+ signer.verify(subfolder, sign, `signature verification failed for url: ${url}, subfolder: ${subfolder}`);
33
+ const pathname = decodeURIComponent(parsed.pathname.slice(1));
34
+ let fPath = parseNestedPathNoEscape(path.join(rootDir, `${subfolder}`), pathname);
35
+ if (parsed.pathname == "" || parsed.pathname == "/") fPath = path.join(fPath, "index.html");
36
+ return path.resolve(fPath);
41
37
  }
42
38
  /** Checks that the userInputPath is in baseDir.
43
- * @returns an absolute path for the user. */
39
+ * @returns an absolute path for the user. */
44
40
  function parseNestedPathNoEscape(baseDir, userInputPath) {
45
- const absolutePath = path__default.resolve(baseDir, userInputPath);
46
- const normalizedBase = path__default.resolve(baseDir);
47
- if (!absolutePath.startsWith(normalizedBase)) {
48
- throw new Error("Path validation failed.");
49
- }
50
- return absolutePath;
41
+ const absolutePath = path.resolve(baseDir, userInputPath);
42
+ const normalizedBase = path.resolve(baseDir);
43
+ if (!absolutePath.startsWith(normalizedBase)) throw new Error("Path validation failed.");
44
+ return absolutePath;
51
45
  }
52
46
 
47
+ //#endregion
53
48
  export { getPathForBlockUIURL, getPathForFolderURL, newBlockUIURL, newFolderURL };
54
- //# sourceMappingURL=url.js.map
49
+ //# sourceMappingURL=url.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sources":["../../../src/drivers/urls/url.ts"],"sourcesContent":["import type { FolderURL, BlockUIURL } from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport path from \"path\";\n\n/** Creates a new plblob+folder URL. */\nexport function newFolderURL(signer: Signer, saveDir: string, fPath: string): FolderURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `plblob+folder://${sign}.${p}.blob`;\n}\n\n/** Creates a new block-ui URL. */\nexport function newBlockUIURL(signer: Signer, saveDir: string, fPath: string): BlockUIURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `block-ui://${sign}.${p}.uidir`;\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForFolderURL(signer: Signer, url: FolderURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForBlockUIURL(signer: Signer, url: BlockUIURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Parses URL,\n * checks the signature,\n * gets the absolute path by the given root directory.\n * If the path is empty, it returns the index.html file.\n * @returns an absolute path for the user. */\nfunction getPath(signer: Signer, url: string, rootDir: string): string {\n const parsed = new URL(url);\n const [sign, subfolder, _] = parsed.host.split(\".\");\n\n signer.verify(\n subfolder,\n sign,\n `signature verification failed for url: ${url}, subfolder: ${subfolder}`,\n );\n\n // Decoding changes '%20' to ' ' for example.\n const pathname = decodeURIComponent(parsed.pathname.slice(1));\n\n let fPath = parseNestedPathNoEscape(path.join(rootDir, `${subfolder}`), pathname);\n\n if (parsed.pathname == \"\" || parsed.pathname == \"/\") {\n fPath = path.join(fPath, \"index.html\");\n }\n\n return path.resolve(fPath);\n}\n\n/** Checks that the userInputPath is in baseDir.\n * @returns an absolute path for the user. */\nfunction parseNestedPathNoEscape(baseDir: string, userInputPath: string): string {\n const absolutePath = path.resolve(baseDir, userInputPath);\n\n const normalizedBase = path.resolve(baseDir);\n\n if (!absolutePath.startsWith(normalizedBase)) {\n throw new Error(\"Path validation failed.\");\n }\n\n return absolutePath;\n}\n"],"names":["path"],"mappings":";;AAIA;SACgB,YAAY,CAAC,MAAc,EAAE,OAAe,EAAE,KAAa,EAAA;IACzE,MAAM,CAAC,GAAGA,aAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAE3B,IAAA,OAAO,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA,EAAI,CAAC,OAAO;AAC5C;AAEA;SACgB,aAAa,CAAC,MAAc,EAAE,OAAe,EAAE,KAAa,EAAA;IAC1E,MAAM,CAAC,GAAGA,aAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAE3B,IAAA,OAAO,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA,EAAI,CAAC,QAAQ;AACxC;AAEA;AAC8D;SAC9C,mBAAmB,CAAC,MAAc,EAAE,GAAc,EAAE,OAAe,EAAA;IACjF,OAAO,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;AACtC;AAEA;AAC8D;SAC9C,oBAAoB,CAAC,MAAc,EAAE,GAAe,EAAE,OAAe,EAAA;IACnF,OAAO,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;AACtC;AAEA;;;;AAI6C;AAC7C,SAAS,OAAO,CAAC,MAAc,EAAE,GAAW,EAAE,OAAe,EAAA;AAC3D,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,IAAA,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAEnD,IAAA,MAAM,CAAC,MAAM,CACX,SAAS,EACT,IAAI,EACJ,CAAA,uCAAA,EAA0C,GAAG,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CACzE;;AAGD,IAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE7D,IAAA,IAAI,KAAK,GAAG,uBAAuB,CAACA,aAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,CAAA,CAAE,CAAC,EAAE,QAAQ,CAAC;AAEjF,IAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,GAAG,EAAE;QACnD,KAAK,GAAGA,aAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;IACxC;AAEA,IAAA,OAAOA,aAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5B;AAEA;AAC6C;AAC7C,SAAS,uBAAuB,CAAC,OAAe,EAAE,aAAqB,EAAA;IACrE,MAAM,YAAY,GAAGA,aAAI,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC;IAEzD,MAAM,cAAc,GAAGA,aAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAE5C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AAC5C,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC5C;AAEA,IAAA,OAAO,YAAY;AACrB;;;;"}
1
+ {"version":3,"file":"url.js","names":[],"sources":["../../../src/drivers/urls/url.ts"],"sourcesContent":["import type { FolderURL, BlockUIURL } from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport path from \"path\";\n\n/** Creates a new plblob+folder URL. */\nexport function newFolderURL(signer: Signer, saveDir: string, fPath: string): FolderURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `plblob+folder://${sign}.${p}.blob`;\n}\n\n/** Creates a new block-ui URL. */\nexport function newBlockUIURL(signer: Signer, saveDir: string, fPath: string): BlockUIURL {\n const p = path.relative(saveDir, fPath);\n const sign = signer.sign(p);\n\n return `block-ui://${sign}.${p}.uidir`;\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForFolderURL(signer: Signer, url: FolderURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Checks the signature and path injections.\n * @returns the path to the file inside the root directory. */\nexport function getPathForBlockUIURL(signer: Signer, url: BlockUIURL, rootDir: string): string {\n return getPath(signer, url, rootDir);\n}\n\n/** Parses URL,\n * checks the signature,\n * gets the absolute path by the given root directory.\n * If the path is empty, it returns the index.html file.\n * @returns an absolute path for the user. */\nfunction getPath(signer: Signer, url: string, rootDir: string): string {\n const parsed = new URL(url);\n const [sign, subfolder, _] = parsed.host.split(\".\");\n\n signer.verify(\n subfolder,\n sign,\n `signature verification failed for url: ${url}, subfolder: ${subfolder}`,\n );\n\n // Decoding changes '%20' to ' ' for example.\n const pathname = decodeURIComponent(parsed.pathname.slice(1));\n\n let fPath = parseNestedPathNoEscape(path.join(rootDir, `${subfolder}`), pathname);\n\n if (parsed.pathname == \"\" || parsed.pathname == \"/\") {\n fPath = path.join(fPath, \"index.html\");\n }\n\n return path.resolve(fPath);\n}\n\n/** Checks that the userInputPath is in baseDir.\n * @returns an absolute path for the user. */\nfunction parseNestedPathNoEscape(baseDir: string, userInputPath: string): string {\n const absolutePath = path.resolve(baseDir, userInputPath);\n\n const normalizedBase = path.resolve(baseDir);\n\n if (!absolutePath.startsWith(normalizedBase)) {\n throw new Error(\"Path validation failed.\");\n }\n\n return absolutePath;\n}\n"],"mappings":";;;;AAKA,SAAgB,aAAa,QAAgB,SAAiB,OAA0B;CACtF,MAAM,IAAI,KAAK,SAAS,SAAS,MAAM;AAGvC,QAAO,mBAFM,OAAO,KAAK,EAAE,CAEI,GAAG,EAAE;;;AAItC,SAAgB,cAAc,QAAgB,SAAiB,OAA2B;CACxF,MAAM,IAAI,KAAK,SAAS,SAAS,MAAM;AAGvC,QAAO,cAFM,OAAO,KAAK,EAAE,CAED,GAAG,EAAE;;;;AAKjC,SAAgB,oBAAoB,QAAgB,KAAgB,SAAyB;AAC3F,QAAO,QAAQ,QAAQ,KAAK,QAAQ;;;;AAKtC,SAAgB,qBAAqB,QAAgB,KAAiB,SAAyB;AAC7F,QAAO,QAAQ,QAAQ,KAAK,QAAQ;;;;;;;AAQtC,SAAS,QAAQ,QAAgB,KAAa,SAAyB;CACrE,MAAM,SAAS,IAAI,IAAI,IAAI;CAC3B,MAAM,CAAC,MAAM,WAAW,KAAK,OAAO,KAAK,MAAM,IAAI;AAEnD,QAAO,OACL,WACA,MACA,0CAA0C,IAAI,eAAe,YAC9D;CAGD,MAAM,WAAW,mBAAmB,OAAO,SAAS,MAAM,EAAE,CAAC;CAE7D,IAAI,QAAQ,wBAAwB,KAAK,KAAK,SAAS,GAAG,YAAY,EAAE,SAAS;AAEjF,KAAI,OAAO,YAAY,MAAM,OAAO,YAAY,IAC9C,SAAQ,KAAK,KAAK,OAAO,aAAa;AAGxC,QAAO,KAAK,QAAQ,MAAM;;;;AAK5B,SAAS,wBAAwB,SAAiB,eAA+B;CAC/E,MAAM,eAAe,KAAK,QAAQ,SAAS,cAAc;CAEzD,MAAM,iBAAiB,KAAK,QAAQ,QAAQ;AAE5C,KAAI,CAAC,aAAa,WAAW,eAAe,CAC1C,OAAM,IAAI,MAAM,0BAA0B;AAG5C,QAAO"}
@@ -1,53 +1,41 @@
1
- 'use strict';
2
-
3
- var path = require('node:path');
4
- var os = require('node:os');
5
- var util = require('node:util');
6
- var node_child_process = require('node:child_process');
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ let path = require("path");
3
+ path = require_runtime.__toESM(path);
4
+ let os = require("os");
5
+ os = require_runtime.__toESM(os);
6
+ let util = require("util");
7
+ util = require_runtime.__toESM(util);
8
+ let child_process = require("child_process");
7
9
 
10
+ //#region src/drivers/virtual_storages.ts
8
11
  async function DefaultVirtualLocalStorages() {
9
- const home = os.homedir();
10
- if (path.sep == "/")
11
- return [
12
- {
13
- name: "local",
14
- root: "/",
15
- initialPath: home,
16
- },
17
- ];
18
- else {
19
- // determine the drive on which user's home folder is stored
20
- const homeRoot = path.parse(home).root; // e.g. C:\
21
- const homeDrive = homeRoot.replaceAll(":\\", ""); // e.g. C drive.
22
- // code below inspired by
23
- // https://stackoverflow.com/a/52411712/769192
24
- try {
25
- const wmic = await util.promisify(node_child_process.exec)("wmic logicaldisk get name");
26
- // parsing wmic output
27
- const drives = wmic.stdout
28
- .split("\r\n")
29
- .filter((line) => line.includes(":"))
30
- .map((line) => line.trim().replaceAll(":", ""));
31
- return drives.map((drive) => {
32
- const isHomeDrive = drive == homeDrive;
33
- return {
34
- name: `local_disk_${drive}`,
35
- root: `${drive}:\\`,
36
- initialPath: isHomeDrive ? home : `${drive}:\\`,
37
- };
38
- });
39
- }
40
- catch {
41
- return [
42
- {
43
- name: `local_disk_${homeDrive}`,
44
- root: `${homeDrive}:\\`,
45
- initialPath: home,
46
- },
47
- ];
48
- }
49
- }
12
+ const home = os.default.homedir();
13
+ if (path.default.sep == "/") return [{
14
+ name: "local",
15
+ root: "/",
16
+ initialPath: home
17
+ }];
18
+ else {
19
+ const homeDrive = path.default.parse(home).root.replaceAll(":\\", "");
20
+ try {
21
+ return (await util.default.promisify(child_process.exec)("wmic logicaldisk get name")).stdout.split("\r\n").filter((line) => line.includes(":")).map((line) => line.trim().replaceAll(":", "")).map((drive) => {
22
+ const isHomeDrive = drive == homeDrive;
23
+ return {
24
+ name: `local_disk_${drive}`,
25
+ root: `${drive}:\\`,
26
+ initialPath: isHomeDrive ? home : `${drive}:\\`
27
+ };
28
+ });
29
+ } catch {
30
+ return [{
31
+ name: `local_disk_${homeDrive}`,
32
+ root: `${homeDrive}:\\`,
33
+ initialPath: home
34
+ }];
35
+ }
36
+ }
50
37
  }
51
38
 
39
+ //#endregion
52
40
  exports.DefaultVirtualLocalStorages = DefaultVirtualLocalStorages;
53
- //# sourceMappingURL=virtual_storages.cjs.map
41
+ //# sourceMappingURL=virtual_storages.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtual_storages.cjs","sources":["../../src/drivers/virtual_storages.ts"],"sourcesContent":["import path from \"path\";\nimport os from \"os\";\nimport util from \"util\";\nimport { exec } from \"child_process\";\nimport type { VirtualLocalStorageSpec } from \"./types\";\n\nexport async function DefaultVirtualLocalStorages(): Promise<VirtualLocalStorageSpec[]> {\n const home = os.homedir();\n if (path.sep == \"/\")\n return [\n {\n name: \"local\",\n root: \"/\",\n initialPath: home,\n },\n ];\n else {\n // determine the drive on which user's home folder is stored\n const homeRoot = path.parse(home).root; // e.g. C:\\\n const homeDrive = homeRoot.replaceAll(\":\\\\\", \"\"); // e.g. C drive.\n\n // code below inspired by\n // https://stackoverflow.com/a/52411712/769192\n\n try {\n const wmic = await util.promisify(exec)(\"wmic logicaldisk get name\");\n // parsing wmic output\n const drives = wmic.stdout\n .split(\"\\r\\n\")\n .filter((line) => line.includes(\":\"))\n .map((line) => line.trim().replaceAll(\":\", \"\"));\n\n return drives.map((drive) => {\n const isHomeDrive = drive == homeDrive;\n return {\n name: `local_disk_${drive}`,\n root: `${drive}:\\\\`,\n initialPath: isHomeDrive ? home : `${drive}:\\\\`,\n };\n });\n } catch {\n return [\n {\n name: `local_disk_${homeDrive}`,\n root: `${homeDrive}:\\\\`,\n initialPath: home,\n },\n ];\n }\n }\n}\n"],"names":["exec"],"mappings":";;;;;;;AAMO,eAAe,2BAA2B,GAAA;AAC/C,IAAA,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE;AACzB,IAAA,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG;QACjB,OAAO;AACL,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,WAAW,EAAE,IAAI;AAClB,aAAA;SACF;SACE;;AAEH,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AACvC,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;;AAKjD,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAACA,uBAAI,CAAC,CAAC,2BAA2B,CAAC;;AAEpE,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC;iBACjB,KAAK,CAAC,MAAM;AACZ,iBAAA,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AACnC,iBAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAEjD,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,WAAW,GAAG,KAAK,IAAI,SAAS;gBACtC,OAAO;oBACL,IAAI,EAAE,CAAA,WAAA,EAAc,KAAK,CAAA,CAAE;oBAC3B,IAAI,EAAE,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK;oBACnB,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK;iBAChD;AACH,YAAA,CAAC,CAAC;QACJ;AAAE,QAAA,MAAM;YACN,OAAO;AACL,gBAAA;oBACE,IAAI,EAAE,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE;oBAC/B,IAAI,EAAE,CAAA,EAAG,SAAS,CAAA,GAAA,CAAK;AACvB,oBAAA,WAAW,EAAE,IAAI;AAClB,iBAAA;aACF;QACH;IACF;AACF;;;;"}
1
+ {"version":3,"file":"virtual_storages.cjs","names":["exec"],"sources":["../../src/drivers/virtual_storages.ts"],"sourcesContent":["import path from \"path\";\nimport os from \"os\";\nimport util from \"util\";\nimport { exec } from \"child_process\";\nimport type { VirtualLocalStorageSpec } from \"./types\";\n\nexport async function DefaultVirtualLocalStorages(): Promise<VirtualLocalStorageSpec[]> {\n const home = os.homedir();\n if (path.sep == \"/\")\n return [\n {\n name: \"local\",\n root: \"/\",\n initialPath: home,\n },\n ];\n else {\n // determine the drive on which user's home folder is stored\n const homeRoot = path.parse(home).root; // e.g. C:\\\n const homeDrive = homeRoot.replaceAll(\":\\\\\", \"\"); // e.g. C drive.\n\n // code below inspired by\n // https://stackoverflow.com/a/52411712/769192\n\n try {\n const wmic = await util.promisify(exec)(\"wmic logicaldisk get name\");\n // parsing wmic output\n const drives = wmic.stdout\n .split(\"\\r\\n\")\n .filter((line) => line.includes(\":\"))\n .map((line) => line.trim().replaceAll(\":\", \"\"));\n\n return drives.map((drive) => {\n const isHomeDrive = drive == homeDrive;\n return {\n name: `local_disk_${drive}`,\n root: `${drive}:\\\\`,\n initialPath: isHomeDrive ? home : `${drive}:\\\\`,\n };\n });\n } catch {\n return [\n {\n name: `local_disk_${homeDrive}`,\n root: `${homeDrive}:\\\\`,\n initialPath: home,\n },\n ];\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAMA,eAAsB,8BAAkE;CACtF,MAAM,OAAO,WAAG,SAAS;AACzB,KAAI,aAAK,OAAO,IACd,QAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,aAAa;EACd,CACF;MACE;EAGH,MAAM,YADW,aAAK,MAAM,KAAK,CAAC,KACP,WAAW,OAAO,GAAG;AAKhD,MAAI;AAQF,WAPa,MAAM,aAAK,UAAUA,mBAAK,CAAC,4BAA4B,EAEhD,OACjB,MAAM,OAAO,CACb,QAAQ,SAAS,KAAK,SAAS,IAAI,CAAC,CACpC,KAAK,SAAS,KAAK,MAAM,CAAC,WAAW,KAAK,GAAG,CAAC,CAEnC,KAAK,UAAU;IAC3B,MAAM,cAAc,SAAS;AAC7B,WAAO;KACL,MAAM,cAAc;KACpB,MAAM,GAAG,MAAM;KACf,aAAa,cAAc,OAAO,GAAG,MAAM;KAC5C;KACD;UACI;AACN,UAAO,CACL;IACE,MAAM,cAAc;IACpB,MAAM,GAAG,UAAU;IACnB,aAAa;IACd,CACF"}
@@ -1,3 +1,7 @@
1
- import type { VirtualLocalStorageSpec } from "./types";
2
- export declare function DefaultVirtualLocalStorages(): Promise<VirtualLocalStorageSpec[]>;
1
+ import { VirtualLocalStorageSpec } from "./types.js";
2
+
3
+ //#region src/drivers/virtual_storages.d.ts
4
+ declare function DefaultVirtualLocalStorages(): Promise<VirtualLocalStorageSpec[]>;
5
+ //#endregion
6
+ export { DefaultVirtualLocalStorages };
3
7
  //# sourceMappingURL=virtual_storages.d.ts.map
@@ -1,51 +1,37 @@
1
- import path__default from 'node:path';
2
- import os__default from 'node:os';
3
- import util from 'node:util';
4
- import { exec } from 'node:child_process';
1
+ import path from "path";
2
+ import os from "os";
3
+ import util from "util";
4
+ import { exec } from "child_process";
5
5
 
6
+ //#region src/drivers/virtual_storages.ts
6
7
  async function DefaultVirtualLocalStorages() {
7
- const home = os__default.homedir();
8
- if (path__default.sep == "/")
9
- return [
10
- {
11
- name: "local",
12
- root: "/",
13
- initialPath: home,
14
- },
15
- ];
16
- else {
17
- // determine the drive on which user's home folder is stored
18
- const homeRoot = path__default.parse(home).root; // e.g. C:\
19
- const homeDrive = homeRoot.replaceAll(":\\", ""); // e.g. C drive.
20
- // code below inspired by
21
- // https://stackoverflow.com/a/52411712/769192
22
- try {
23
- const wmic = await util.promisify(exec)("wmic logicaldisk get name");
24
- // parsing wmic output
25
- const drives = wmic.stdout
26
- .split("\r\n")
27
- .filter((line) => line.includes(":"))
28
- .map((line) => line.trim().replaceAll(":", ""));
29
- return drives.map((drive) => {
30
- const isHomeDrive = drive == homeDrive;
31
- return {
32
- name: `local_disk_${drive}`,
33
- root: `${drive}:\\`,
34
- initialPath: isHomeDrive ? home : `${drive}:\\`,
35
- };
36
- });
37
- }
38
- catch {
39
- return [
40
- {
41
- name: `local_disk_${homeDrive}`,
42
- root: `${homeDrive}:\\`,
43
- initialPath: home,
44
- },
45
- ];
46
- }
47
- }
8
+ const home = os.homedir();
9
+ if (path.sep == "/") return [{
10
+ name: "local",
11
+ root: "/",
12
+ initialPath: home
13
+ }];
14
+ else {
15
+ const homeDrive = path.parse(home).root.replaceAll(":\\", "");
16
+ try {
17
+ return (await util.promisify(exec)("wmic logicaldisk get name")).stdout.split("\r\n").filter((line) => line.includes(":")).map((line) => line.trim().replaceAll(":", "")).map((drive) => {
18
+ const isHomeDrive = drive == homeDrive;
19
+ return {
20
+ name: `local_disk_${drive}`,
21
+ root: `${drive}:\\`,
22
+ initialPath: isHomeDrive ? home : `${drive}:\\`
23
+ };
24
+ });
25
+ } catch {
26
+ return [{
27
+ name: `local_disk_${homeDrive}`,
28
+ root: `${homeDrive}:\\`,
29
+ initialPath: home
30
+ }];
31
+ }
32
+ }
48
33
  }
49
34
 
35
+ //#endregion
50
36
  export { DefaultVirtualLocalStorages };
51
- //# sourceMappingURL=virtual_storages.js.map
37
+ //# sourceMappingURL=virtual_storages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtual_storages.js","sources":["../../src/drivers/virtual_storages.ts"],"sourcesContent":["import path from \"path\";\nimport os from \"os\";\nimport util from \"util\";\nimport { exec } from \"child_process\";\nimport type { VirtualLocalStorageSpec } from \"./types\";\n\nexport async function DefaultVirtualLocalStorages(): Promise<VirtualLocalStorageSpec[]> {\n const home = os.homedir();\n if (path.sep == \"/\")\n return [\n {\n name: \"local\",\n root: \"/\",\n initialPath: home,\n },\n ];\n else {\n // determine the drive on which user's home folder is stored\n const homeRoot = path.parse(home).root; // e.g. C:\\\n const homeDrive = homeRoot.replaceAll(\":\\\\\", \"\"); // e.g. C drive.\n\n // code below inspired by\n // https://stackoverflow.com/a/52411712/769192\n\n try {\n const wmic = await util.promisify(exec)(\"wmic logicaldisk get name\");\n // parsing wmic output\n const drives = wmic.stdout\n .split(\"\\r\\n\")\n .filter((line) => line.includes(\":\"))\n .map((line) => line.trim().replaceAll(\":\", \"\"));\n\n return drives.map((drive) => {\n const isHomeDrive = drive == homeDrive;\n return {\n name: `local_disk_${drive}`,\n root: `${drive}:\\\\`,\n initialPath: isHomeDrive ? home : `${drive}:\\\\`,\n };\n });\n } catch {\n return [\n {\n name: `local_disk_${homeDrive}`,\n root: `${homeDrive}:\\\\`,\n initialPath: home,\n },\n ];\n }\n }\n}\n"],"names":["os","path"],"mappings":";;;;;AAMO,eAAe,2BAA2B,GAAA;AAC/C,IAAA,MAAM,IAAI,GAAGA,WAAE,CAAC,OAAO,EAAE;AACzB,IAAA,IAAIC,aAAI,CAAC,GAAG,IAAI,GAAG;QACjB,OAAO;AACL,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,WAAW,EAAE,IAAI;AAClB,aAAA;SACF;SACE;;AAEH,QAAA,MAAM,QAAQ,GAAGA,aAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AACvC,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;;AAKjD,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,2BAA2B,CAAC;;AAEpE,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC;iBACjB,KAAK,CAAC,MAAM;AACZ,iBAAA,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AACnC,iBAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAEjD,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,WAAW,GAAG,KAAK,IAAI,SAAS;gBACtC,OAAO;oBACL,IAAI,EAAE,CAAA,WAAA,EAAc,KAAK,CAAA,CAAE;oBAC3B,IAAI,EAAE,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK;oBACnB,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK;iBAChD;AACH,YAAA,CAAC,CAAC;QACJ;AAAE,QAAA,MAAM;YACN,OAAO;AACL,gBAAA;oBACE,IAAI,EAAE,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE;oBAC/B,IAAI,EAAE,CAAA,EAAG,SAAS,CAAA,GAAA,CAAK;AACvB,oBAAA,WAAW,EAAE,IAAI;AAClB,iBAAA;aACF;QACH;IACF;AACF;;;;"}
1
+ {"version":3,"file":"virtual_storages.js","names":[],"sources":["../../src/drivers/virtual_storages.ts"],"sourcesContent":["import path from \"path\";\nimport os from \"os\";\nimport util from \"util\";\nimport { exec } from \"child_process\";\nimport type { VirtualLocalStorageSpec } from \"./types\";\n\nexport async function DefaultVirtualLocalStorages(): Promise<VirtualLocalStorageSpec[]> {\n const home = os.homedir();\n if (path.sep == \"/\")\n return [\n {\n name: \"local\",\n root: \"/\",\n initialPath: home,\n },\n ];\n else {\n // determine the drive on which user's home folder is stored\n const homeRoot = path.parse(home).root; // e.g. C:\\\n const homeDrive = homeRoot.replaceAll(\":\\\\\", \"\"); // e.g. C drive.\n\n // code below inspired by\n // https://stackoverflow.com/a/52411712/769192\n\n try {\n const wmic = await util.promisify(exec)(\"wmic logicaldisk get name\");\n // parsing wmic output\n const drives = wmic.stdout\n .split(\"\\r\\n\")\n .filter((line) => line.includes(\":\"))\n .map((line) => line.trim().replaceAll(\":\", \"\"));\n\n return drives.map((drive) => {\n const isHomeDrive = drive == homeDrive;\n return {\n name: `local_disk_${drive}`,\n root: `${drive}:\\\\`,\n initialPath: isHomeDrive ? home : `${drive}:\\\\`,\n };\n });\n } catch {\n return [\n {\n name: `local_disk_${homeDrive}`,\n root: `${homeDrive}:\\\\`,\n initialPath: home,\n },\n ];\n }\n }\n}\n"],"mappings":";;;;;;AAMA,eAAsB,8BAAkE;CACtF,MAAM,OAAO,GAAG,SAAS;AACzB,KAAI,KAAK,OAAO,IACd,QAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,aAAa;EACd,CACF;MACE;EAGH,MAAM,YADW,KAAK,MAAM,KAAK,CAAC,KACP,WAAW,OAAO,GAAG;AAKhD,MAAI;AAQF,WAPa,MAAM,KAAK,UAAU,KAAK,CAAC,4BAA4B,EAEhD,OACjB,MAAM,OAAO,CACb,QAAQ,SAAS,KAAK,SAAS,IAAI,CAAC,CACpC,KAAK,SAAS,KAAK,MAAM,CAAC,WAAW,KAAK,GAAG,CAAC,CAEnC,KAAK,UAAU;IAC3B,MAAM,cAAc,SAAS;AAC7B,WAAO;KACL,MAAM,cAAc;KACpB,MAAM,GAAG,MAAM;KACf,aAAa,cAAc,OAAO,GAAG,MAAM;KAC5C;KACD;UACI;AACN,UAAO,CACL;IACE,MAAM,cAAc;IACpB,MAAM,GAAG,UAAU;IACnB,aAAa;IACd,CACF"}