@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,58 +1,62 @@
1
- import type { PlClient } from "@milaboratories/pl-client";
2
- import type * as sdk from "@milaboratories/pl-model-common";
3
- import type { LocalImportFileHandle, LsEntry, OpenDialogOps, OpenMultipleFilesResponse, OpenSingleFileResponse, TableRange } from "@milaboratories/pl-model-common";
4
- import type { MiLogger, Signer } from "@milaboratories/ts-helpers";
5
- import type { LocalStorageProjection, VirtualLocalStorageSpec } from "./types";
1
+ import { LocalStorageProjection, VirtualLocalStorageSpec } from "./types.js";
2
+ import { PlClient } from "@milaboratories/pl-client";
3
+ import { MiLogger, Signer } from "@milaboratories/ts-helpers";
4
+ import * as sdk from "@milaboratories/pl-model-common";
5
+ import { LocalImportFileHandle, LsEntry, OpenDialogOps, OpenMultipleFilesResponse, OpenSingleFileResponse, TableRange } from "@milaboratories/pl-model-common";
6
+
7
+ //#region src/drivers/ls.d.ts
6
8
  /**
7
9
  * Extends public and safe SDK's driver API with methods used internally in the middle
8
10
  * layer and in tests.
9
11
  */
10
- export interface InternalLsDriver extends sdk.LsDriver {
11
- /**
12
- * Given local path, generates well-structured and signed upload handle.
13
- * To be used in tests and in implementation of the native file selection UI API.
14
- * */
15
- getLocalFileHandle(localPath: string): Promise<sdk.LocalImportFileHandle>;
16
- listRemoteFilesWithAdditionalInfo(storage: sdk.StorageHandle, fullPath: string): Promise<ListRemoteFilesResultWithAdditionalInfo>;
12
+ interface InternalLsDriver extends sdk.LsDriver {
13
+ /**
14
+ * Given local path, generates well-structured and signed upload handle.
15
+ * To be used in tests and in implementation of the native file selection UI API.
16
+ * */
17
+ getLocalFileHandle(localPath: string): Promise<sdk.LocalImportFileHandle>;
18
+ listRemoteFilesWithAdditionalInfo(storage: sdk.StorageHandle, fullPath: string): Promise<ListRemoteFilesResultWithAdditionalInfo>;
17
19
  }
18
- export type ListRemoteFilesResultWithAdditionalInfo = {
19
- parent?: string;
20
- entries: LsEntryWithAdditionalInfo[];
20
+ type ListRemoteFilesResultWithAdditionalInfo = {
21
+ parent?: string;
22
+ entries: LsEntryWithAdditionalInfo[];
21
23
  };
22
- export type LsEntryWithAdditionalInfo = LsEntry & {
23
- size: number;
24
+ type LsEntryWithAdditionalInfo = LsEntry & {
25
+ size: number;
24
26
  };
25
- export type OpenFileDialogCallback = (multipleFiles: boolean, ops?: OpenDialogOps) => Promise<undefined | string[]>;
26
- export declare class LsDriver implements InternalLsDriver {
27
- private readonly logger;
28
- private readonly lsClient;
29
- /** Pl storage id, to resource id. The resource id can be used to make LS GRPC calls to. */
30
- private readonly storageIdToResourceId;
31
- private readonly signer;
32
- /** Virtual storages by name */
33
- private readonly virtualStoragesMap;
34
- /** Local projections by storageId */
35
- private readonly localProjectionsMap;
36
- private readonly openFileDialogCallback;
37
- private constructor();
38
- getLocalFileContent(file: LocalImportFileHandle, range?: TableRange): Promise<Uint8Array>;
39
- getLocalFileSize(file: LocalImportFileHandle): Promise<number>;
40
- showOpenMultipleFilesDialog(ops?: OpenDialogOps): Promise<OpenMultipleFilesResponse>;
41
- showOpenSingleFileDialog(ops?: OpenDialogOps): Promise<OpenSingleFileResponse>;
42
- /**
43
- * Resolves local handle to local file path.
44
- *
45
- * @param handle handle to be resolved
46
- * @private
47
- */
48
- private tryResolveLocalFileHandle;
49
- getLocalFileHandle(localPath: string): Promise<sdk.ImportFileHandle & LocalImportFileHandle>;
50
- getStorageList(): Promise<sdk.StorageEntry[]>;
51
- listFiles(storageHandle: sdk.StorageHandle, fullPath: string): Promise<sdk.ListFilesResult>;
52
- listRemoteFilesWithAdditionalInfo(storageHandle: sdk.StorageHandle, fullPath: string): Promise<ListRemoteFilesResultWithAdditionalInfo>;
53
- fileToImportHandle(_file: sdk.FileLike): Promise<sdk.ImportFileHandle>;
54
- static init(logger: MiLogger, client: PlClient, signer: Signer,
55
- /** Pl storages available locally */
56
- localProjections: LocalStorageProjection[], openFileDialogCallback: OpenFileDialogCallback, virtualStorages?: VirtualLocalStorageSpec[]): Promise<LsDriver>;
27
+ type OpenFileDialogCallback = (multipleFiles: boolean, ops?: OpenDialogOps) => Promise<undefined | string[]>;
28
+ declare class LsDriver implements InternalLsDriver {
29
+ private readonly logger;
30
+ private readonly lsClient;
31
+ /** Pl storage id, to resource id. The resource id can be used to make LS GRPC calls to. */
32
+ private readonly storageIdToResourceId;
33
+ private readonly signer;
34
+ /** Virtual storages by name */
35
+ private readonly virtualStoragesMap;
36
+ /** Local projections by storageId */
37
+ private readonly localProjectionsMap;
38
+ private readonly openFileDialogCallback;
39
+ private constructor();
40
+ getLocalFileContent(file: LocalImportFileHandle, range?: TableRange): Promise<Uint8Array>;
41
+ getLocalFileSize(file: LocalImportFileHandle): Promise<number>;
42
+ showOpenMultipleFilesDialog(ops?: OpenDialogOps): Promise<OpenMultipleFilesResponse>;
43
+ showOpenSingleFileDialog(ops?: OpenDialogOps): Promise<OpenSingleFileResponse>;
44
+ /**
45
+ * Resolves local handle to local file path.
46
+ *
47
+ * @param handle handle to be resolved
48
+ * @private
49
+ */
50
+ private tryResolveLocalFileHandle;
51
+ getLocalFileHandle(localPath: string): Promise<sdk.ImportFileHandle & LocalImportFileHandle>;
52
+ getStorageList(): Promise<sdk.StorageEntry[]>;
53
+ listFiles(storageHandle: sdk.StorageHandle, fullPath: string): Promise<sdk.ListFilesResult>;
54
+ listRemoteFilesWithAdditionalInfo(storageHandle: sdk.StorageHandle, fullPath: string): Promise<ListRemoteFilesResultWithAdditionalInfo>;
55
+ fileToImportHandle(_file: sdk.FileLike): Promise<sdk.ImportFileHandle>;
56
+ static init(logger: MiLogger, client: PlClient, signer: Signer, /** Pl storages available locally */
57
+
58
+ localProjections: LocalStorageProjection[], openFileDialogCallback: OpenFileDialogCallback, virtualStorages?: VirtualLocalStorageSpec[]): Promise<LsDriver>;
57
59
  }
60
+ //#endregion
61
+ export { InternalLsDriver, ListRemoteFilesResultWithAdditionalInfo, LsDriver, LsEntryWithAdditionalInfo, OpenFileDialogCallback };
58
62
  //# sourceMappingURL=ls.d.ts.map
@@ -1,223 +1,155 @@
1
- import { isNotNullResourceId } from '@milaboratories/pl-client';
2
- import { isImportFileHandleIndex } from '@milaboratories/pl-model-common';
3
- import * as fsp from 'node:fs/promises';
4
- import * as path from 'node:path';
5
- import { createLsFilesClient } from '../clients/constructors.js';
6
- import { validateAbsolute } from '../helpers/validate.js';
7
- import { parseIndexHandle, parseUploadHandle, createIndexImportHandle, createUploadImportHandle } from './helpers/ls_remote_import_handle.js';
8
- import { createLocalStorageHandle, createRemoteStorageHandle, parseStorageHandle } from './helpers/ls_storage_entry.js';
9
- import { DefaultVirtualLocalStorages } from './virtual_storages.js';
1
+ import { validateAbsolute } from "../helpers/validate.js";
2
+ import { createLsFilesClient } from "../clients/constructors.js";
3
+ import { createIndexImportHandle, createUploadImportHandle, parseIndexHandle, parseUploadHandle } from "./helpers/ls_remote_import_handle.js";
4
+ import { createLocalStorageHandle, createRemoteStorageHandle, parseStorageHandle } from "./helpers/ls_storage_entry.js";
5
+ import { DefaultVirtualLocalStorages } from "./virtual_storages.js";
6
+ import { isNotNullResourceId } from "@milaboratories/pl-client";
7
+ import * as fsp from "node:fs/promises";
8
+ import * as path$1 from "node:path";
9
+ import { isImportFileHandleIndex } from "@milaboratories/pl-model-common";
10
10
 
11
- class LsDriver {
12
- logger;
13
- lsClient;
14
- storageIdToResourceId;
15
- signer;
16
- virtualStoragesMap;
17
- localProjectionsMap;
18
- openFileDialogCallback;
19
- constructor(logger, lsClient,
20
- /** Pl storage id, to resource id. The resource id can be used to make LS GRPC calls to. */
21
- storageIdToResourceId, signer,
22
- /** Virtual storages by name */
23
- virtualStoragesMap,
24
- /** Local projections by storageId */
25
- localProjectionsMap, openFileDialogCallback) {
26
- this.logger = logger;
27
- this.lsClient = lsClient;
28
- this.storageIdToResourceId = storageIdToResourceId;
29
- this.signer = signer;
30
- this.virtualStoragesMap = virtualStoragesMap;
31
- this.localProjectionsMap = localProjectionsMap;
32
- this.openFileDialogCallback = openFileDialogCallback;
33
- }
34
- async getLocalFileContent(file, range) {
35
- const localPath = await this.tryResolveLocalFileHandle(file);
36
- if (range) {
37
- const fileHandle = await fsp.open(localPath, "r");
38
- try {
39
- const buffer = Buffer.alloc(range.length);
40
- const { bytesRead } = await fileHandle.read(buffer, 0, range.length, range.offset);
41
- return new Uint8Array(buffer.subarray(0, bytesRead));
42
- }
43
- finally {
44
- await fileHandle.close();
45
- }
46
- }
47
- return await fsp.readFile(localPath);
48
- }
49
- async getLocalFileSize(file) {
50
- const localPath = await this.tryResolveLocalFileHandle(file);
51
- const stat = await fsp.stat(localPath);
52
- return stat.size;
53
- }
54
- async showOpenMultipleFilesDialog(ops) {
55
- const result = await this.openFileDialogCallback(true, ops);
56
- if (result === undefined)
57
- return {};
58
- return {
59
- files: await Promise.all(result.map((localPath) => this.getLocalFileHandle(localPath))),
60
- };
61
- }
62
- async showOpenSingleFileDialog(ops) {
63
- const result = await this.openFileDialogCallback(false, ops);
64
- if (result === undefined)
65
- return {};
66
- return {
67
- file: await this.getLocalFileHandle(result[0]),
68
- };
69
- }
70
- /**
71
- * Resolves local handle to local file path.
72
- *
73
- * @param handle handle to be resolved
74
- * @private
75
- */
76
- async tryResolveLocalFileHandle(handle) {
77
- if (isImportFileHandleIndex(handle)) {
78
- const handleData = parseIndexHandle(handle);
79
- const localProjection = this.localProjectionsMap.get(handleData.storageId);
80
- if (!localProjection)
81
- throw new Error(`Storage ${handleData.storageId} is not mounted locally.`);
82
- return path.join(localProjection.localPath, handleData.path);
83
- }
84
- else {
85
- const handleData = parseUploadHandle(handle);
86
- // checking it is a valid local handle from out machine
87
- this.signer.verify(handleData.localPath, handleData.pathSignature, "Failed to validate local file handle signature.");
88
- const localPath = handleData.localPath;
89
- const stat = await fsp.stat(localPath, { bigint: true });
90
- if (String(stat.mtimeMs / 1000n) !== handleData.modificationTime)
91
- throw new Error("File has changed since the handle was created.");
92
- return localPath;
93
- }
94
- }
95
- async getLocalFileHandle(localPath) {
96
- validateAbsolute(localPath);
97
- // Checking if local path is directly reachable by pl, because it is in one of the
98
- // locally mounted storages
99
- for (const lp of this.localProjectionsMap.values()) {
100
- // note: empty lp.localPath will match any address
101
- if (localPath.startsWith(lp.localPath)) {
102
- // Just in case:
103
- // > path.relative("/a/b", "/a/b/c");
104
- // 'c'
105
- const pathWithinStorage = lp.localPath === "" ? localPath : path.relative(lp.localPath, localPath);
106
- return createIndexImportHandle(lp.storageId, pathWithinStorage);
107
- }
108
- }
109
- // we get here if none of the local projections matched the path
110
- const stat = await fsp.stat(localPath, { bigint: true });
111
- return createUploadImportHandle(localPath, this.signer, stat.size, stat.mtimeMs / 1000n);
112
- }
113
- async getStorageList() {
114
- const virtualStorages = [...this.virtualStoragesMap.values()].map((s) => ({
115
- name: s.name,
116
- handle: createLocalStorageHandle(s.name, s.root),
117
- initialFullPath: s.initialPath,
118
- }));
119
- const otherStorages = Object.entries(this.storageIdToResourceId).map(([storageId, resourceId]) => ({
120
- name: storageId,
121
- handle: createRemoteStorageHandle(storageId, resourceId),
122
- initialFullPath: "", // we don't have any additional information from where to start browsing remote storages
123
- isInitialPathHome: false,
124
- }));
125
- // root must be a storage so we can index any file,
126
- // but for UI it's enough
127
- // to have local virtual storage on *nix,
128
- // and local_disk_${drive} on Windows.
129
- const noRoot = otherStorages.filter((it) => it.name !== "root");
130
- return [...virtualStorages, ...noRoot];
131
- }
132
- async listFiles(storageHandle, fullPath) {
133
- const storageData = parseStorageHandle(storageHandle);
134
- if (storageData.isRemote) {
135
- const response = await this.lsClient.list(storageData, fullPath);
136
- return {
137
- entries: response.items.map((e) => ({
138
- type: e.isDir ? "dir" : "file",
139
- name: e.name,
140
- fullPath: e.fullName,
141
- handle: createIndexImportHandle(storageData.name, e.fullName),
142
- })),
143
- };
144
- }
145
- if (path.sep === "/" && fullPath === "")
146
- fullPath = "/";
147
- if (storageData.rootPath === "") {
148
- validateAbsolute(fullPath);
149
- }
150
- const lsRoot = path.isAbsolute(fullPath) ? fullPath : path.join(storageData.rootPath, fullPath);
151
- const entries = [];
152
- for await (const dirent of await fsp.opendir(lsRoot)) {
153
- if (!dirent.isFile() && !dirent.isDirectory())
154
- continue;
155
- // We cannot use no dirent.fullPath no dirent.parentPath,
156
- // since the former is deprecated
157
- // and the later works differently on different versions.
158
- const absolutePath = path.join(lsRoot, dirent.name);
159
- entries.push({
160
- type: dirent.isFile() ? "file" : "dir",
161
- name: dirent.name,
162
- fullPath: absolutePath,
163
- handle: await this.getLocalFileHandle(absolutePath),
164
- });
165
- }
166
- return { entries };
167
- }
168
- async listRemoteFilesWithAdditionalInfo(storageHandle, fullPath) {
169
- const storageData = parseStorageHandle(storageHandle);
170
- if (!storageData.isRemote) {
171
- throw new Error(`Storage ${storageData.name} is not remote`);
172
- }
173
- const response = await this.lsClient.list(storageData, fullPath);
174
- return {
175
- entries: response.items.map((e) => ({
176
- type: e.isDir ? "dir" : "file",
177
- name: e.name,
178
- fullPath: e.fullName,
179
- handle: createIndexImportHandle(storageData.name, e.fullName),
180
- size: Number(e.size),
181
- })),
182
- };
183
- }
184
- async fileToImportHandle(_file) {
185
- throw new Error("Not implemented. This method must be implemented and intercepted in desktop preload script.");
186
- }
187
- static async init(logger, client, signer,
188
- /** Pl storages available locally */
189
- localProjections, openFileDialogCallback, virtualStorages) {
190
- const lsClient = createLsFilesClient(client, logger);
191
- if (!virtualStorages)
192
- virtualStorages = await DefaultVirtualLocalStorages();
193
- // validating inputs
194
- for (const vp of virtualStorages)
195
- validateAbsolute(vp.root);
196
- for (const lp of localProjections)
197
- if (lp.localPath !== "")
198
- validateAbsolute(lp.localPath);
199
- // creating indexed maps for quick access
200
- const virtualStoragesMap = new Map(virtualStorages.map((s) => [s.name, s]));
201
- const localProjectionsMap = new Map(localProjections.map((s) => [s.storageId, s]));
202
- // validating there is no intersection
203
- if (new Set([...virtualStoragesMap.keys(), ...localProjectionsMap.keys()]).size !==
204
- virtualStoragesMap.size + localProjectionsMap.size)
205
- throw new Error("Intersection between local projection storage ids and virtual storages names detected.");
206
- return new LsDriver(logger, lsClient, await doGetAvailableStorageIds(client), signer, virtualStoragesMap, localProjectionsMap, openFileDialogCallback);
207
- }
208
- }
11
+ //#region src/drivers/ls.ts
12
+ var LsDriver = class LsDriver {
13
+ constructor(logger, lsClient, storageIdToResourceId, signer, virtualStoragesMap, localProjectionsMap, openFileDialogCallback) {
14
+ this.logger = logger;
15
+ this.lsClient = lsClient;
16
+ this.storageIdToResourceId = storageIdToResourceId;
17
+ this.signer = signer;
18
+ this.virtualStoragesMap = virtualStoragesMap;
19
+ this.localProjectionsMap = localProjectionsMap;
20
+ this.openFileDialogCallback = openFileDialogCallback;
21
+ }
22
+ async getLocalFileContent(file, range) {
23
+ const localPath = await this.tryResolveLocalFileHandle(file);
24
+ if (range) {
25
+ const fileHandle = await fsp.open(localPath, "r");
26
+ try {
27
+ const buffer = Buffer.alloc(range.length);
28
+ const { bytesRead } = await fileHandle.read(buffer, 0, range.length, range.offset);
29
+ return new Uint8Array(buffer.subarray(0, bytesRead));
30
+ } finally {
31
+ await fileHandle.close();
32
+ }
33
+ }
34
+ return await fsp.readFile(localPath);
35
+ }
36
+ async getLocalFileSize(file) {
37
+ const localPath = await this.tryResolveLocalFileHandle(file);
38
+ return (await fsp.stat(localPath)).size;
39
+ }
40
+ async showOpenMultipleFilesDialog(ops) {
41
+ const result = await this.openFileDialogCallback(true, ops);
42
+ if (result === void 0) return {};
43
+ return { files: await Promise.all(result.map((localPath) => this.getLocalFileHandle(localPath))) };
44
+ }
45
+ async showOpenSingleFileDialog(ops) {
46
+ const result = await this.openFileDialogCallback(false, ops);
47
+ if (result === void 0) return {};
48
+ return { file: await this.getLocalFileHandle(result[0]) };
49
+ }
50
+ /**
51
+ * Resolves local handle to local file path.
52
+ *
53
+ * @param handle handle to be resolved
54
+ * @private
55
+ */
56
+ async tryResolveLocalFileHandle(handle) {
57
+ if (isImportFileHandleIndex(handle)) {
58
+ const handleData = parseIndexHandle(handle);
59
+ const localProjection = this.localProjectionsMap.get(handleData.storageId);
60
+ if (!localProjection) throw new Error(`Storage ${handleData.storageId} is not mounted locally.`);
61
+ return path$1.join(localProjection.localPath, handleData.path);
62
+ } else {
63
+ const handleData = parseUploadHandle(handle);
64
+ this.signer.verify(handleData.localPath, handleData.pathSignature, "Failed to validate local file handle signature.");
65
+ const localPath = handleData.localPath;
66
+ const stat = await fsp.stat(localPath, { bigint: true });
67
+ if (String(stat.mtimeMs / 1000n) !== handleData.modificationTime) throw new Error("File has changed since the handle was created.");
68
+ return localPath;
69
+ }
70
+ }
71
+ async getLocalFileHandle(localPath) {
72
+ validateAbsolute(localPath);
73
+ for (const lp of this.localProjectionsMap.values()) if (localPath.startsWith(lp.localPath)) {
74
+ const pathWithinStorage = lp.localPath === "" ? localPath : path$1.relative(lp.localPath, localPath);
75
+ return createIndexImportHandle(lp.storageId, pathWithinStorage);
76
+ }
77
+ const stat = await fsp.stat(localPath, { bigint: true });
78
+ return createUploadImportHandle(localPath, this.signer, stat.size, stat.mtimeMs / 1000n);
79
+ }
80
+ async getStorageList() {
81
+ const virtualStorages = [...this.virtualStoragesMap.values()].map((s) => ({
82
+ name: s.name,
83
+ handle: createLocalStorageHandle(s.name, s.root),
84
+ initialFullPath: s.initialPath
85
+ }));
86
+ const noRoot = Object.entries(this.storageIdToResourceId).map(([storageId, resourceId]) => ({
87
+ name: storageId,
88
+ handle: createRemoteStorageHandle(storageId, resourceId),
89
+ initialFullPath: "",
90
+ isInitialPathHome: false
91
+ })).filter((it) => it.name !== "root");
92
+ return [...virtualStorages, ...noRoot];
93
+ }
94
+ async listFiles(storageHandle, fullPath) {
95
+ const storageData = parseStorageHandle(storageHandle);
96
+ if (storageData.isRemote) return { entries: (await this.lsClient.list(storageData, fullPath)).items.map((e) => ({
97
+ type: e.isDir ? "dir" : "file",
98
+ name: e.name,
99
+ fullPath: e.fullName,
100
+ handle: createIndexImportHandle(storageData.name, e.fullName)
101
+ })) };
102
+ if (path$1.sep === "/" && fullPath === "") fullPath = "/";
103
+ if (storageData.rootPath === "") validateAbsolute(fullPath);
104
+ const lsRoot = path$1.isAbsolute(fullPath) ? fullPath : path$1.join(storageData.rootPath, fullPath);
105
+ const entries = [];
106
+ for await (const dirent of await fsp.opendir(lsRoot)) {
107
+ if (!dirent.isFile() && !dirent.isDirectory()) continue;
108
+ const absolutePath = path$1.join(lsRoot, dirent.name);
109
+ entries.push({
110
+ type: dirent.isFile() ? "file" : "dir",
111
+ name: dirent.name,
112
+ fullPath: absolutePath,
113
+ handle: await this.getLocalFileHandle(absolutePath)
114
+ });
115
+ }
116
+ return { entries };
117
+ }
118
+ async listRemoteFilesWithAdditionalInfo(storageHandle, fullPath) {
119
+ const storageData = parseStorageHandle(storageHandle);
120
+ if (!storageData.isRemote) throw new Error(`Storage ${storageData.name} is not remote`);
121
+ return { entries: (await this.lsClient.list(storageData, fullPath)).items.map((e) => ({
122
+ type: e.isDir ? "dir" : "file",
123
+ name: e.name,
124
+ fullPath: e.fullName,
125
+ handle: createIndexImportHandle(storageData.name, e.fullName),
126
+ size: Number(e.size)
127
+ })) };
128
+ }
129
+ async fileToImportHandle(_file) {
130
+ throw new Error("Not implemented. This method must be implemented and intercepted in desktop preload script.");
131
+ }
132
+ static async init(logger, client, signer, localProjections, openFileDialogCallback, virtualStorages) {
133
+ const lsClient = createLsFilesClient(client, logger);
134
+ if (!virtualStorages) virtualStorages = await DefaultVirtualLocalStorages();
135
+ for (const vp of virtualStorages) validateAbsolute(vp.root);
136
+ for (const lp of localProjections) if (lp.localPath !== "") validateAbsolute(lp.localPath);
137
+ const virtualStoragesMap = new Map(virtualStorages.map((s) => [s.name, s]));
138
+ const localProjectionsMap = new Map(localProjections.map((s) => [s.storageId, s]));
139
+ if (new Set([...virtualStoragesMap.keys(), ...localProjectionsMap.keys()]).size !== virtualStoragesMap.size + localProjectionsMap.size) throw new Error("Intersection between local projection storage ids and virtual storages names detected.");
140
+ return new LsDriver(logger, lsClient, await doGetAvailableStorageIds(client), signer, virtualStoragesMap, localProjectionsMap, openFileDialogCallback);
141
+ }
142
+ };
209
143
  async function doGetAvailableStorageIds(client) {
210
- return client.withReadTx("GetAvailableStorageIds", async (tx) => {
211
- const lsProviderId = await tx.getResourceByName("LSProvider");
212
- const provider = await tx.getResourceData(lsProviderId, true);
213
- return providerToStorageIds(provider);
214
- });
144
+ return client.withReadTx("GetAvailableStorageIds", async (tx) => {
145
+ const lsProviderId = await tx.getResourceByName("LSProvider");
146
+ return providerToStorageIds(await tx.getResourceData(lsProviderId, true));
147
+ });
215
148
  }
216
149
  function providerToStorageIds(provider) {
217
- return Object.fromEntries(provider.fields
218
- .filter((f) => f.type == "Dynamic" && isNotNullResourceId(f.value))
219
- .map((f) => [f.name.substring("storage/".length), f.value]));
150
+ return Object.fromEntries(provider.fields.filter((f) => f.type == "Dynamic" && isNotNullResourceId(f.value)).map((f) => [f.name.substring(8), f.value]));
220
151
  }
221
152
 
153
+ //#endregion
222
154
  export { LsDriver };
223
- //# sourceMappingURL=ls.js.map
155
+ //# sourceMappingURL=ls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ls.js","sources":["../../src/drivers/ls.ts"],"sourcesContent":["import type { PlClient, ResourceData, ResourceId } from \"@milaboratories/pl-client\";\nimport { isNotNullResourceId } from \"@milaboratories/pl-client\";\nimport type * as sdk from \"@milaboratories/pl-model-common\";\nimport type {\n LocalImportFileHandle,\n LsEntry,\n OpenDialogOps,\n OpenMultipleFilesResponse,\n OpenSingleFileResponse,\n TableRange,\n} from \"@milaboratories/pl-model-common\";\nimport { isImportFileHandleIndex } from \"@milaboratories/pl-model-common\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport * as fsp from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { createLsFilesClient } from \"../clients/constructors\";\nimport type { ClientLs } from \"../clients/ls_api\";\nimport { validateAbsolute } from \"../helpers/validate\";\nimport {\n createIndexImportHandle,\n createUploadImportHandle,\n parseIndexHandle,\n parseUploadHandle,\n} from \"./helpers/ls_remote_import_handle\";\nimport {\n createLocalStorageHandle,\n createRemoteStorageHandle,\n parseStorageHandle,\n} from \"./helpers/ls_storage_entry\";\nimport type { LocalStorageProjection, VirtualLocalStorageSpec } from \"./types\";\nimport { DefaultVirtualLocalStorages } from \"./virtual_storages\";\n\n/**\n * Extends public and safe SDK's driver API with methods used internally in the middle\n * layer and in tests.\n */\nexport interface InternalLsDriver extends sdk.LsDriver {\n /**\n * Given local path, generates well-structured and signed upload handle.\n * To be used in tests and in implementation of the native file selection UI API.\n * */\n getLocalFileHandle(localPath: string): Promise<sdk.LocalImportFileHandle>;\n\n listRemoteFilesWithAdditionalInfo(\n storage: sdk.StorageHandle,\n fullPath: string,\n ): Promise<ListRemoteFilesResultWithAdditionalInfo>;\n}\n\nexport type ListRemoteFilesResultWithAdditionalInfo = {\n parent?: string;\n entries: LsEntryWithAdditionalInfo[];\n};\n\nexport type LsEntryWithAdditionalInfo = LsEntry & {\n size: number;\n};\n\nexport type OpenFileDialogCallback = (\n multipleFiles: boolean,\n ops?: OpenDialogOps,\n) => Promise<undefined | string[]>;\n\nexport class LsDriver implements InternalLsDriver {\n private constructor(\n private readonly logger: MiLogger,\n private readonly lsClient: ClientLs,\n /** Pl storage id, to resource id. The resource id can be used to make LS GRPC calls to. */\n private readonly storageIdToResourceId: Record<string, ResourceId>,\n private readonly signer: Signer,\n /** Virtual storages by name */\n private readonly virtualStoragesMap: Map<string, VirtualLocalStorageSpec>,\n /** Local projections by storageId */\n private readonly localProjectionsMap: Map<string, LocalStorageProjection>,\n private readonly openFileDialogCallback: OpenFileDialogCallback,\n ) {}\n\n public async getLocalFileContent(\n file: LocalImportFileHandle,\n range?: TableRange,\n ): Promise<Uint8Array> {\n const localPath = await this.tryResolveLocalFileHandle(file);\n\n if (range) {\n const fileHandle = await fsp.open(localPath, \"r\");\n try {\n const buffer = Buffer.alloc(range.length);\n const { bytesRead } = await fileHandle.read(buffer, 0, range.length, range.offset);\n return new Uint8Array(buffer.subarray(0, bytesRead));\n } finally {\n await fileHandle.close();\n }\n }\n\n return await fsp.readFile(localPath);\n }\n\n public async getLocalFileSize(file: LocalImportFileHandle): Promise<number> {\n const localPath = await this.tryResolveLocalFileHandle(file);\n const stat = await fsp.stat(localPath);\n return stat.size;\n }\n\n public async showOpenMultipleFilesDialog(\n ops?: OpenDialogOps,\n ): Promise<OpenMultipleFilesResponse> {\n const result = await this.openFileDialogCallback(true, ops);\n if (result === undefined) return {};\n return {\n files: await Promise.all(result.map((localPath) => this.getLocalFileHandle(localPath))),\n };\n }\n\n public async showOpenSingleFileDialog(ops?: OpenDialogOps): Promise<OpenSingleFileResponse> {\n const result = await this.openFileDialogCallback(false, ops);\n if (result === undefined) return {};\n return {\n file: await this.getLocalFileHandle(result[0]),\n };\n }\n\n /**\n * Resolves local handle to local file path.\n *\n * @param handle handle to be resolved\n * @private\n */\n private async tryResolveLocalFileHandle(handle: LocalImportFileHandle): Promise<string> {\n if (isImportFileHandleIndex(handle)) {\n const handleData = parseIndexHandle(handle);\n const localProjection = this.localProjectionsMap.get(handleData.storageId);\n if (!localProjection)\n throw new Error(`Storage ${handleData.storageId} is not mounted locally.`);\n return path.join(localProjection.localPath, handleData.path);\n } else {\n const handleData = parseUploadHandle(handle);\n // checking it is a valid local handle from out machine\n this.signer.verify(\n handleData.localPath,\n handleData.pathSignature,\n \"Failed to validate local file handle signature.\",\n );\n\n const localPath = handleData.localPath;\n\n const stat = await fsp.stat(localPath, { bigint: true });\n if (String(stat.mtimeMs / 1000n) !== handleData.modificationTime)\n throw new Error(\"File has changed since the handle was created.\");\n\n return localPath;\n }\n }\n\n public async getLocalFileHandle(\n localPath: string,\n ): Promise<sdk.ImportFileHandle & LocalImportFileHandle> {\n validateAbsolute(localPath);\n\n // Checking if local path is directly reachable by pl, because it is in one of the\n // locally mounted storages\n for (const lp of this.localProjectionsMap.values()) {\n // note: empty lp.localPath will match any address\n if (localPath.startsWith(lp.localPath)) {\n // Just in case:\n // > path.relative(\"/a/b\", \"/a/b/c\");\n // 'c'\n const pathWithinStorage =\n lp.localPath === \"\" ? localPath : path.relative(lp.localPath, localPath);\n return createIndexImportHandle(\n lp.storageId,\n pathWithinStorage,\n ) as sdk.ImportFileHandleIndex & LocalImportFileHandle;\n }\n }\n\n // we get here if none of the local projections matched the path\n\n const stat = await fsp.stat(localPath, { bigint: true });\n return createUploadImportHandle(\n localPath,\n this.signer,\n stat.size,\n stat.mtimeMs / 1000n, // integer division\n ) as sdk.ImportFileHandleUpload & LocalImportFileHandle;\n }\n\n public async getStorageList(): Promise<sdk.StorageEntry[]> {\n const virtualStorages = [...this.virtualStoragesMap.values()].map((s) => ({\n name: s.name,\n handle: createLocalStorageHandle(s.name, s.root),\n initialFullPath: s.initialPath,\n }));\n\n const otherStorages = Object.entries(this.storageIdToResourceId!).map(\n ([storageId, resourceId]) => ({\n name: storageId,\n handle: createRemoteStorageHandle(storageId, resourceId),\n initialFullPath: \"\", // we don't have any additional information from where to start browsing remote storages\n isInitialPathHome: false,\n }),\n );\n\n // root must be a storage so we can index any file,\n // but for UI it's enough\n // to have local virtual storage on *nix,\n // and local_disk_${drive} on Windows.\n const noRoot = otherStorages.filter((it) => it.name !== \"root\");\n\n return [...virtualStorages, ...noRoot];\n }\n\n public async listFiles(\n storageHandle: sdk.StorageHandle,\n fullPath: string,\n ): Promise<sdk.ListFilesResult> {\n const storageData = parseStorageHandle(storageHandle);\n\n if (storageData.isRemote) {\n const response = await this.lsClient.list(storageData, fullPath);\n return {\n entries: response.items.map((e) => ({\n type: e.isDir ? \"dir\" : \"file\",\n name: e.name,\n fullPath: e.fullName,\n handle: createIndexImportHandle(storageData.name, e.fullName),\n })),\n };\n }\n\n if (path.sep === \"/\" && fullPath === \"\") fullPath = \"/\";\n\n if (storageData.rootPath === \"\") {\n validateAbsolute(fullPath);\n }\n const lsRoot = path.isAbsolute(fullPath) ? fullPath : path.join(storageData.rootPath, fullPath);\n\n const entries: LsEntry[] = [];\n for await (const dirent of await fsp.opendir(lsRoot)) {\n if (!dirent.isFile() && !dirent.isDirectory()) continue;\n\n // We cannot use no dirent.fullPath no dirent.parentPath,\n // since the former is deprecated\n // and the later works differently on different versions.\n const absolutePath = path.join(lsRoot, dirent.name);\n\n entries.push({\n type: dirent.isFile() ? \"file\" : \"dir\",\n name: dirent.name,\n fullPath: absolutePath,\n handle: await this.getLocalFileHandle(absolutePath),\n });\n }\n\n return { entries };\n }\n\n public async listRemoteFilesWithAdditionalInfo(\n storageHandle: sdk.StorageHandle,\n fullPath: string,\n ): Promise<ListRemoteFilesResultWithAdditionalInfo> {\n const storageData = parseStorageHandle(storageHandle);\n if (!storageData.isRemote) {\n throw new Error(`Storage ${storageData.name} is not remote`);\n }\n\n const response = await this.lsClient.list(storageData, fullPath);\n\n return {\n entries: response.items.map((e) => ({\n type: e.isDir ? \"dir\" : \"file\",\n name: e.name,\n fullPath: e.fullName,\n handle: createIndexImportHandle(storageData.name, e.fullName),\n size: Number(e.size),\n })),\n };\n }\n\n public async fileToImportHandle(_file: sdk.FileLike): Promise<sdk.ImportFileHandle> {\n throw new Error(\n \"Not implemented. This method must be implemented and intercepted in desktop preload script.\",\n );\n }\n\n public static async init(\n logger: MiLogger,\n client: PlClient,\n signer: Signer,\n /** Pl storages available locally */\n localProjections: LocalStorageProjection[],\n openFileDialogCallback: OpenFileDialogCallback,\n virtualStorages?: VirtualLocalStorageSpec[],\n ): Promise<LsDriver> {\n const lsClient = createLsFilesClient(client, logger);\n\n if (!virtualStorages) virtualStorages = await DefaultVirtualLocalStorages();\n\n // validating inputs\n for (const vp of virtualStorages) validateAbsolute(vp.root);\n for (const lp of localProjections) if (lp.localPath !== \"\") validateAbsolute(lp.localPath);\n\n // creating indexed maps for quick access\n const virtualStoragesMap = new Map(virtualStorages.map((s) => [s.name, s]));\n const localProjectionsMap = new Map(localProjections.map((s) => [s.storageId, s]));\n\n // validating there is no intersection\n if (\n new Set([...virtualStoragesMap.keys(), ...localProjectionsMap.keys()]).size !==\n virtualStoragesMap.size + localProjectionsMap.size\n )\n throw new Error(\n \"Intersection between local projection storage ids and virtual storages names detected.\",\n );\n\n return new LsDriver(\n logger,\n lsClient,\n await doGetAvailableStorageIds(client),\n signer,\n virtualStoragesMap,\n localProjectionsMap,\n openFileDialogCallback,\n );\n }\n}\n\nasync function doGetAvailableStorageIds(client: PlClient): Promise<Record<string, ResourceId>> {\n return client.withReadTx(\"GetAvailableStorageIds\", async (tx) => {\n const lsProviderId = await tx.getResourceByName(\"LSProvider\");\n const provider = await tx.getResourceData(lsProviderId, true);\n\n return providerToStorageIds(provider);\n });\n}\n\nfunction providerToStorageIds(provider: ResourceData) {\n return Object.fromEntries(\n provider.fields\n .filter((f) => f.type == \"Dynamic\" && isNotNullResourceId(f.value))\n .map((f) => [f.name.substring(\"storage/\".length), f.value as ResourceId]),\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ls.js","names":["path"],"sources":["../../src/drivers/ls.ts"],"sourcesContent":["import type { PlClient, ResourceData, ResourceId } from \"@milaboratories/pl-client\";\nimport { isNotNullResourceId } from \"@milaboratories/pl-client\";\nimport type * as sdk from \"@milaboratories/pl-model-common\";\nimport type {\n LocalImportFileHandle,\n LsEntry,\n OpenDialogOps,\n OpenMultipleFilesResponse,\n OpenSingleFileResponse,\n TableRange,\n} from \"@milaboratories/pl-model-common\";\nimport { isImportFileHandleIndex } from \"@milaboratories/pl-model-common\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport * as fsp from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { createLsFilesClient } from \"../clients/constructors\";\nimport type { ClientLs } from \"../clients/ls_api\";\nimport { validateAbsolute } from \"../helpers/validate\";\nimport {\n createIndexImportHandle,\n createUploadImportHandle,\n parseIndexHandle,\n parseUploadHandle,\n} from \"./helpers/ls_remote_import_handle\";\nimport {\n createLocalStorageHandle,\n createRemoteStorageHandle,\n parseStorageHandle,\n} from \"./helpers/ls_storage_entry\";\nimport type { LocalStorageProjection, VirtualLocalStorageSpec } from \"./types\";\nimport { DefaultVirtualLocalStorages } from \"./virtual_storages\";\n\n/**\n * Extends public and safe SDK's driver API with methods used internally in the middle\n * layer and in tests.\n */\nexport interface InternalLsDriver extends sdk.LsDriver {\n /**\n * Given local path, generates well-structured and signed upload handle.\n * To be used in tests and in implementation of the native file selection UI API.\n * */\n getLocalFileHandle(localPath: string): Promise<sdk.LocalImportFileHandle>;\n\n listRemoteFilesWithAdditionalInfo(\n storage: sdk.StorageHandle,\n fullPath: string,\n ): Promise<ListRemoteFilesResultWithAdditionalInfo>;\n}\n\nexport type ListRemoteFilesResultWithAdditionalInfo = {\n parent?: string;\n entries: LsEntryWithAdditionalInfo[];\n};\n\nexport type LsEntryWithAdditionalInfo = LsEntry & {\n size: number;\n};\n\nexport type OpenFileDialogCallback = (\n multipleFiles: boolean,\n ops?: OpenDialogOps,\n) => Promise<undefined | string[]>;\n\nexport class LsDriver implements InternalLsDriver {\n private constructor(\n private readonly logger: MiLogger,\n private readonly lsClient: ClientLs,\n /** Pl storage id, to resource id. The resource id can be used to make LS GRPC calls to. */\n private readonly storageIdToResourceId: Record<string, ResourceId>,\n private readonly signer: Signer,\n /** Virtual storages by name */\n private readonly virtualStoragesMap: Map<string, VirtualLocalStorageSpec>,\n /** Local projections by storageId */\n private readonly localProjectionsMap: Map<string, LocalStorageProjection>,\n private readonly openFileDialogCallback: OpenFileDialogCallback,\n ) {}\n\n public async getLocalFileContent(\n file: LocalImportFileHandle,\n range?: TableRange,\n ): Promise<Uint8Array> {\n const localPath = await this.tryResolveLocalFileHandle(file);\n\n if (range) {\n const fileHandle = await fsp.open(localPath, \"r\");\n try {\n const buffer = Buffer.alloc(range.length);\n const { bytesRead } = await fileHandle.read(buffer, 0, range.length, range.offset);\n return new Uint8Array(buffer.subarray(0, bytesRead));\n } finally {\n await fileHandle.close();\n }\n }\n\n return await fsp.readFile(localPath);\n }\n\n public async getLocalFileSize(file: LocalImportFileHandle): Promise<number> {\n const localPath = await this.tryResolveLocalFileHandle(file);\n const stat = await fsp.stat(localPath);\n return stat.size;\n }\n\n public async showOpenMultipleFilesDialog(\n ops?: OpenDialogOps,\n ): Promise<OpenMultipleFilesResponse> {\n const result = await this.openFileDialogCallback(true, ops);\n if (result === undefined) return {};\n return {\n files: await Promise.all(result.map((localPath) => this.getLocalFileHandle(localPath))),\n };\n }\n\n public async showOpenSingleFileDialog(ops?: OpenDialogOps): Promise<OpenSingleFileResponse> {\n const result = await this.openFileDialogCallback(false, ops);\n if (result === undefined) return {};\n return {\n file: await this.getLocalFileHandle(result[0]),\n };\n }\n\n /**\n * Resolves local handle to local file path.\n *\n * @param handle handle to be resolved\n * @private\n */\n private async tryResolveLocalFileHandle(handle: LocalImportFileHandle): Promise<string> {\n if (isImportFileHandleIndex(handle)) {\n const handleData = parseIndexHandle(handle);\n const localProjection = this.localProjectionsMap.get(handleData.storageId);\n if (!localProjection)\n throw new Error(`Storage ${handleData.storageId} is not mounted locally.`);\n return path.join(localProjection.localPath, handleData.path);\n } else {\n const handleData = parseUploadHandle(handle);\n // checking it is a valid local handle from out machine\n this.signer.verify(\n handleData.localPath,\n handleData.pathSignature,\n \"Failed to validate local file handle signature.\",\n );\n\n const localPath = handleData.localPath;\n\n const stat = await fsp.stat(localPath, { bigint: true });\n if (String(stat.mtimeMs / 1000n) !== handleData.modificationTime)\n throw new Error(\"File has changed since the handle was created.\");\n\n return localPath;\n }\n }\n\n public async getLocalFileHandle(\n localPath: string,\n ): Promise<sdk.ImportFileHandle & LocalImportFileHandle> {\n validateAbsolute(localPath);\n\n // Checking if local path is directly reachable by pl, because it is in one of the\n // locally mounted storages\n for (const lp of this.localProjectionsMap.values()) {\n // note: empty lp.localPath will match any address\n if (localPath.startsWith(lp.localPath)) {\n // Just in case:\n // > path.relative(\"/a/b\", \"/a/b/c\");\n // 'c'\n const pathWithinStorage =\n lp.localPath === \"\" ? localPath : path.relative(lp.localPath, localPath);\n return createIndexImportHandle(\n lp.storageId,\n pathWithinStorage,\n ) as sdk.ImportFileHandleIndex & LocalImportFileHandle;\n }\n }\n\n // we get here if none of the local projections matched the path\n\n const stat = await fsp.stat(localPath, { bigint: true });\n return createUploadImportHandle(\n localPath,\n this.signer,\n stat.size,\n stat.mtimeMs / 1000n, // integer division\n ) as sdk.ImportFileHandleUpload & LocalImportFileHandle;\n }\n\n public async getStorageList(): Promise<sdk.StorageEntry[]> {\n const virtualStorages = [...this.virtualStoragesMap.values()].map((s) => ({\n name: s.name,\n handle: createLocalStorageHandle(s.name, s.root),\n initialFullPath: s.initialPath,\n }));\n\n const otherStorages = Object.entries(this.storageIdToResourceId!).map(\n ([storageId, resourceId]) => ({\n name: storageId,\n handle: createRemoteStorageHandle(storageId, resourceId),\n initialFullPath: \"\", // we don't have any additional information from where to start browsing remote storages\n isInitialPathHome: false,\n }),\n );\n\n // root must be a storage so we can index any file,\n // but for UI it's enough\n // to have local virtual storage on *nix,\n // and local_disk_${drive} on Windows.\n const noRoot = otherStorages.filter((it) => it.name !== \"root\");\n\n return [...virtualStorages, ...noRoot];\n }\n\n public async listFiles(\n storageHandle: sdk.StorageHandle,\n fullPath: string,\n ): Promise<sdk.ListFilesResult> {\n const storageData = parseStorageHandle(storageHandle);\n\n if (storageData.isRemote) {\n const response = await this.lsClient.list(storageData, fullPath);\n return {\n entries: response.items.map((e) => ({\n type: e.isDir ? \"dir\" : \"file\",\n name: e.name,\n fullPath: e.fullName,\n handle: createIndexImportHandle(storageData.name, e.fullName),\n })),\n };\n }\n\n if (path.sep === \"/\" && fullPath === \"\") fullPath = \"/\";\n\n if (storageData.rootPath === \"\") {\n validateAbsolute(fullPath);\n }\n const lsRoot = path.isAbsolute(fullPath) ? fullPath : path.join(storageData.rootPath, fullPath);\n\n const entries: LsEntry[] = [];\n for await (const dirent of await fsp.opendir(lsRoot)) {\n if (!dirent.isFile() && !dirent.isDirectory()) continue;\n\n // We cannot use no dirent.fullPath no dirent.parentPath,\n // since the former is deprecated\n // and the later works differently on different versions.\n const absolutePath = path.join(lsRoot, dirent.name);\n\n entries.push({\n type: dirent.isFile() ? \"file\" : \"dir\",\n name: dirent.name,\n fullPath: absolutePath,\n handle: await this.getLocalFileHandle(absolutePath),\n });\n }\n\n return { entries };\n }\n\n public async listRemoteFilesWithAdditionalInfo(\n storageHandle: sdk.StorageHandle,\n fullPath: string,\n ): Promise<ListRemoteFilesResultWithAdditionalInfo> {\n const storageData = parseStorageHandle(storageHandle);\n if (!storageData.isRemote) {\n throw new Error(`Storage ${storageData.name} is not remote`);\n }\n\n const response = await this.lsClient.list(storageData, fullPath);\n\n return {\n entries: response.items.map((e) => ({\n type: e.isDir ? \"dir\" : \"file\",\n name: e.name,\n fullPath: e.fullName,\n handle: createIndexImportHandle(storageData.name, e.fullName),\n size: Number(e.size),\n })),\n };\n }\n\n public async fileToImportHandle(_file: sdk.FileLike): Promise<sdk.ImportFileHandle> {\n throw new Error(\n \"Not implemented. This method must be implemented and intercepted in desktop preload script.\",\n );\n }\n\n public static async init(\n logger: MiLogger,\n client: PlClient,\n signer: Signer,\n /** Pl storages available locally */\n localProjections: LocalStorageProjection[],\n openFileDialogCallback: OpenFileDialogCallback,\n virtualStorages?: VirtualLocalStorageSpec[],\n ): Promise<LsDriver> {\n const lsClient = createLsFilesClient(client, logger);\n\n if (!virtualStorages) virtualStorages = await DefaultVirtualLocalStorages();\n\n // validating inputs\n for (const vp of virtualStorages) validateAbsolute(vp.root);\n for (const lp of localProjections) if (lp.localPath !== \"\") validateAbsolute(lp.localPath);\n\n // creating indexed maps for quick access\n const virtualStoragesMap = new Map(virtualStorages.map((s) => [s.name, s]));\n const localProjectionsMap = new Map(localProjections.map((s) => [s.storageId, s]));\n\n // validating there is no intersection\n if (\n new Set([...virtualStoragesMap.keys(), ...localProjectionsMap.keys()]).size !==\n virtualStoragesMap.size + localProjectionsMap.size\n )\n throw new Error(\n \"Intersection between local projection storage ids and virtual storages names detected.\",\n );\n\n return new LsDriver(\n logger,\n lsClient,\n await doGetAvailableStorageIds(client),\n signer,\n virtualStoragesMap,\n localProjectionsMap,\n openFileDialogCallback,\n );\n }\n}\n\nasync function doGetAvailableStorageIds(client: PlClient): Promise<Record<string, ResourceId>> {\n return client.withReadTx(\"GetAvailableStorageIds\", async (tx) => {\n const lsProviderId = await tx.getResourceByName(\"LSProvider\");\n const provider = await tx.getResourceData(lsProviderId, true);\n\n return providerToStorageIds(provider);\n });\n}\n\nfunction providerToStorageIds(provider: ResourceData) {\n return Object.fromEntries(\n provider.fields\n .filter((f) => f.type == \"Dynamic\" && isNotNullResourceId(f.value))\n .map((f) => [f.name.substring(\"storage/\".length), f.value as ResourceId]),\n );\n}\n"],"mappings":"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"}