@milaboratories/pl-drivers 1.8.3 → 1.9.1

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 (332) hide show
  1. package/dist/clients/constructors.cjs +45 -0
  2. package/dist/clients/constructors.cjs.map +1 -0
  3. package/dist/clients/constructors.d.ts +0 -1
  4. package/dist/clients/constructors.js +39 -0
  5. package/dist/clients/constructors.js.map +1 -0
  6. package/dist/clients/download.cjs +149 -0
  7. package/dist/clients/download.cjs.map +1 -0
  8. package/dist/clients/download.d.ts +0 -1
  9. package/dist/clients/download.js +121 -0
  10. package/dist/clients/download.js.map +1 -0
  11. package/dist/clients/logs.cjs +44 -0
  12. package/dist/clients/logs.cjs.map +1 -0
  13. package/dist/clients/logs.d.ts +0 -1
  14. package/dist/clients/logs.js +42 -0
  15. package/dist/clients/logs.js.map +1 -0
  16. package/dist/clients/ls_api.cjs +23 -0
  17. package/dist/clients/ls_api.cjs.map +1 -0
  18. package/dist/clients/ls_api.d.ts +0 -1
  19. package/dist/clients/ls_api.js +21 -0
  20. package/dist/clients/ls_api.js.map +1 -0
  21. package/dist/clients/progress.cjs +58 -0
  22. package/dist/clients/progress.cjs.map +1 -0
  23. package/dist/clients/progress.d.ts +1 -3
  24. package/dist/clients/progress.js +56 -0
  25. package/dist/clients/progress.js.map +1 -0
  26. package/dist/clients/upload.cjs +188 -0
  27. package/dist/clients/upload.cjs.map +1 -0
  28. package/dist/clients/upload.d.ts +1 -3
  29. package/dist/clients/upload.js +163 -0
  30. package/dist/clients/upload.js.map +1 -0
  31. package/dist/drivers/download_blob/blob_key.cjs +34 -0
  32. package/dist/drivers/download_blob/blob_key.cjs.map +1 -0
  33. package/dist/drivers/download_blob/blob_key.d.ts +0 -1
  34. package/dist/drivers/download_blob/blob_key.js +12 -0
  35. package/dist/drivers/download_blob/blob_key.js.map +1 -0
  36. package/dist/drivers/download_blob/download_blob.cjs +442 -0
  37. package/dist/drivers/download_blob/download_blob.cjs.map +1 -0
  38. package/dist/drivers/download_blob/download_blob.d.ts +0 -1
  39. package/dist/drivers/download_blob/download_blob.js +417 -0
  40. package/dist/drivers/download_blob/download_blob.js.map +1 -0
  41. package/dist/drivers/download_blob/download_blob_task.cjs +170 -0
  42. package/dist/drivers/download_blob/download_blob_task.cjs.map +1 -0
  43. package/dist/drivers/download_blob/download_blob_task.d.ts +0 -1
  44. package/dist/drivers/download_blob/download_blob_task.js +146 -0
  45. package/dist/drivers/download_blob/download_blob_task.js.map +1 -0
  46. package/dist/drivers/download_blob/sparse_cache/cache.cjs +202 -0
  47. package/dist/drivers/download_blob/sparse_cache/cache.cjs.map +1 -0
  48. package/dist/drivers/download_blob/sparse_cache/cache.d.ts +0 -1
  49. package/dist/drivers/download_blob/sparse_cache/cache.js +197 -0
  50. package/dist/drivers/download_blob/sparse_cache/cache.js.map +1 -0
  51. package/dist/drivers/download_blob/sparse_cache/file.cjs +61 -0
  52. package/dist/drivers/download_blob/sparse_cache/file.cjs.map +1 -0
  53. package/dist/drivers/download_blob/sparse_cache/file.d.ts +0 -1
  54. package/dist/drivers/download_blob/sparse_cache/file.js +39 -0
  55. package/dist/drivers/download_blob/sparse_cache/file.js.map +1 -0
  56. package/dist/drivers/download_blob/sparse_cache/ranges.cjs +104 -0
  57. package/dist/drivers/download_blob/sparse_cache/ranges.cjs.map +1 -0
  58. package/dist/drivers/download_blob/sparse_cache/ranges.d.ts +0 -1
  59. package/dist/drivers/download_blob/sparse_cache/ranges.js +76 -0
  60. package/dist/drivers/download_blob/sparse_cache/ranges.js.map +1 -0
  61. package/dist/drivers/download_blob_url/driver.cjs +169 -0
  62. package/dist/drivers/download_blob_url/driver.cjs.map +1 -0
  63. package/dist/drivers/download_blob_url/driver.d.ts +0 -1
  64. package/dist/drivers/download_blob_url/driver.js +148 -0
  65. package/dist/drivers/download_blob_url/driver.js.map +1 -0
  66. package/dist/drivers/download_blob_url/driver_id.cjs +9 -0
  67. package/dist/drivers/download_blob_url/driver_id.cjs.map +1 -0
  68. package/dist/drivers/download_blob_url/driver_id.d.ts +0 -1
  69. package/dist/drivers/download_blob_url/driver_id.js +7 -0
  70. package/dist/drivers/download_blob_url/driver_id.js.map +1 -0
  71. package/dist/drivers/download_blob_url/snapshot.cjs +18 -0
  72. package/dist/drivers/download_blob_url/snapshot.cjs.map +1 -0
  73. package/dist/drivers/download_blob_url/snapshot.d.ts +2 -3
  74. package/dist/drivers/download_blob_url/snapshot.js +15 -0
  75. package/dist/drivers/download_blob_url/snapshot.js.map +1 -0
  76. package/dist/drivers/download_blob_url/task.cjs +209 -0
  77. package/dist/drivers/download_blob_url/task.cjs.map +1 -0
  78. package/dist/drivers/download_blob_url/task.d.ts +0 -1
  79. package/dist/drivers/download_blob_url/task.js +184 -0
  80. package/dist/drivers/download_blob_url/task.js.map +1 -0
  81. package/dist/drivers/download_blob_url/url.d.ts +1 -1
  82. package/dist/drivers/download_url/driver.cjs +149 -0
  83. package/dist/drivers/download_url/driver.cjs.map +1 -0
  84. package/dist/drivers/download_url/driver.d.ts +0 -1
  85. package/dist/drivers/download_url/driver.js +128 -0
  86. package/dist/drivers/download_url/driver.js.map +1 -0
  87. package/dist/drivers/download_url/task.cjs +150 -0
  88. package/dist/drivers/download_url/task.cjs.map +1 -0
  89. package/dist/drivers/download_url/task.d.ts +0 -1
  90. package/dist/drivers/download_url/task.js +124 -0
  91. package/dist/drivers/download_url/task.js.map +1 -0
  92. package/dist/drivers/helpers/download_local_handle.cjs +26 -0
  93. package/dist/drivers/helpers/download_local_handle.cjs.map +1 -0
  94. package/dist/drivers/helpers/download_local_handle.d.ts +0 -1
  95. package/dist/drivers/helpers/download_local_handle.js +22 -0
  96. package/dist/drivers/helpers/download_local_handle.js.map +1 -0
  97. package/dist/drivers/helpers/download_remote_handle.cjs +36 -0
  98. package/dist/drivers/helpers/download_remote_handle.cjs.map +1 -0
  99. package/dist/drivers/helpers/download_remote_handle.d.ts +0 -1
  100. package/dist/drivers/helpers/download_remote_handle.js +32 -0
  101. package/dist/drivers/helpers/download_remote_handle.js.map +1 -0
  102. package/dist/drivers/helpers/files_cache.cjs +68 -0
  103. package/dist/drivers/helpers/files_cache.cjs.map +1 -0
  104. package/dist/drivers/helpers/files_cache.d.ts +0 -1
  105. package/dist/drivers/helpers/files_cache.js +66 -0
  106. package/dist/drivers/helpers/files_cache.js.map +1 -0
  107. package/dist/drivers/helpers/helpers.cjs +34 -0
  108. package/dist/drivers/helpers/helpers.cjs.map +1 -0
  109. package/dist/drivers/helpers/helpers.d.ts +0 -1
  110. package/dist/drivers/helpers/helpers.js +31 -0
  111. package/dist/drivers/helpers/helpers.js.map +1 -0
  112. package/dist/drivers/helpers/logs_handle.cjs +50 -0
  113. package/dist/drivers/helpers/logs_handle.cjs.map +1 -0
  114. package/dist/drivers/helpers/logs_handle.d.ts +0 -1
  115. package/dist/drivers/helpers/logs_handle.js +43 -0
  116. package/dist/drivers/helpers/logs_handle.js.map +1 -0
  117. package/dist/drivers/helpers/ls_remote_import_handle.cjs +34 -0
  118. package/dist/drivers/helpers/ls_remote_import_handle.cjs.map +1 -0
  119. package/dist/drivers/helpers/ls_remote_import_handle.d.ts +0 -1
  120. package/dist/drivers/helpers/ls_remote_import_handle.js +29 -0
  121. package/dist/drivers/helpers/ls_remote_import_handle.js.map +1 -0
  122. package/dist/drivers/helpers/ls_storage_entry.cjs +64 -0
  123. package/dist/drivers/helpers/ls_storage_entry.cjs.map +1 -0
  124. package/dist/drivers/helpers/ls_storage_entry.d.ts +0 -1
  125. package/dist/drivers/helpers/ls_storage_entry.js +58 -0
  126. package/dist/drivers/helpers/ls_storage_entry.js.map +1 -0
  127. package/dist/drivers/helpers/polling_ops.d.ts +0 -1
  128. package/dist/drivers/helpers/read_file.cjs +54 -0
  129. package/dist/drivers/helpers/read_file.cjs.map +1 -0
  130. package/dist/drivers/helpers/read_file.d.ts +0 -1
  131. package/dist/drivers/helpers/read_file.js +33 -0
  132. package/dist/drivers/helpers/read_file.js.map +1 -0
  133. package/dist/drivers/helpers/test_helpers.d.ts +0 -1
  134. package/dist/drivers/logs.cjs +118 -0
  135. package/dist/drivers/logs.cjs.map +1 -0
  136. package/dist/drivers/logs.d.ts +0 -1
  137. package/dist/drivers/logs.js +116 -0
  138. package/dist/drivers/logs.js.map +1 -0
  139. package/dist/drivers/logs_stream.cjs +238 -0
  140. package/dist/drivers/logs_stream.cjs.map +1 -0
  141. package/dist/drivers/logs_stream.d.ts +0 -1
  142. package/dist/drivers/logs_stream.js +236 -0
  143. package/dist/drivers/logs_stream.js.map +1 -0
  144. package/dist/drivers/ls.cjs +236 -0
  145. package/dist/drivers/ls.cjs.map +1 -0
  146. package/dist/drivers/ls.d.ts +0 -1
  147. package/dist/drivers/ls.js +214 -0
  148. package/dist/drivers/ls.js.map +1 -0
  149. package/dist/drivers/types.cjs +72 -0
  150. package/dist/drivers/types.cjs.map +1 -0
  151. package/dist/drivers/types.d.ts +4 -5
  152. package/dist/drivers/types.js +64 -0
  153. package/dist/drivers/types.js.map +1 -0
  154. package/dist/drivers/upload.cjs +154 -0
  155. package/dist/drivers/upload.cjs.map +1 -0
  156. package/dist/drivers/upload.d.ts +0 -1
  157. package/dist/drivers/upload.js +151 -0
  158. package/dist/drivers/upload.js.map +1 -0
  159. package/dist/drivers/upload_task.cjs +293 -0
  160. package/dist/drivers/upload_task.cjs.map +1 -0
  161. package/dist/drivers/upload_task.d.ts +0 -1
  162. package/dist/drivers/upload_task.js +285 -0
  163. package/dist/drivers/upload_task.js.map +1 -0
  164. package/dist/drivers/urls/url.cjs +59 -0
  165. package/dist/drivers/urls/url.cjs.map +1 -0
  166. package/dist/drivers/urls/url.d.ts +0 -1
  167. package/dist/drivers/urls/url.js +54 -0
  168. package/dist/drivers/urls/url.js.map +1 -0
  169. package/dist/drivers/virtual_storages.cjs +53 -0
  170. package/dist/drivers/virtual_storages.cjs.map +1 -0
  171. package/dist/drivers/virtual_storages.d.ts +0 -1
  172. package/dist/drivers/virtual_storages.js +51 -0
  173. package/dist/drivers/virtual_storages.js.map +1 -0
  174. package/dist/helpers/download.cjs +63 -0
  175. package/dist/helpers/download.cjs.map +1 -0
  176. package/dist/helpers/download.d.ts +0 -1
  177. package/dist/helpers/download.js +60 -0
  178. package/dist/helpers/download.js.map +1 -0
  179. package/dist/helpers/validate.cjs +12 -0
  180. package/dist/helpers/validate.cjs.map +1 -0
  181. package/dist/helpers/validate.d.ts +0 -1
  182. package/dist/helpers/validate.js +10 -0
  183. package/dist/helpers/validate.js.map +1 -0
  184. package/dist/index.cjs +72 -0
  185. package/dist/index.cjs.map +1 -0
  186. package/dist/index.d.ts +0 -1
  187. package/dist/index.js +19 -2
  188. package/dist/index.js.map +1 -1
  189. package/dist/proto/github.com/googleapis/googleapis/google/rpc/status.d.ts +0 -1
  190. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.cjs +261 -0
  191. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.cjs.map +1 -0
  192. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.cjs +31 -0
  193. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.cjs.map +1 -0
  194. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.d.ts +3 -5
  195. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.js +29 -0
  196. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.js.map +1 -0
  197. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.d.ts +0 -1
  198. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.js +256 -0
  199. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.js.map +1 -0
  200. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.cjs +301 -0
  201. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.cjs.map +1 -0
  202. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.cjs +34 -0
  203. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.cjs.map +1 -0
  204. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.d.ts +3 -5
  205. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.js +32 -0
  206. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.js.map +1 -0
  207. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.d.ts +0 -1
  208. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.js +296 -0
  209. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.js.map +1 -0
  210. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.cjs +410 -0
  211. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.cjs.map +1 -0
  212. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.cjs +38 -0
  213. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.cjs.map +1 -0
  214. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.d.ts +3 -5
  215. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.js +36 -0
  216. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.js.map +1 -0
  217. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.d.ts +0 -1
  218. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.js +403 -0
  219. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.js.map +1 -0
  220. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.cjs +486 -0
  221. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.cjs.map +1 -0
  222. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.cjs +86 -0
  223. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.cjs.map +1 -0
  224. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.d.ts +3 -5
  225. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.js +84 -0
  226. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.js.map +1 -0
  227. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.d.ts +0 -1
  228. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.js +478 -0
  229. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.js.map +1 -0
  230. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.cjs +712 -0
  231. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.cjs.map +1 -0
  232. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.cjs +71 -0
  233. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.cjs.map +1 -0
  234. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.d.ts +3 -5
  235. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.js +69 -0
  236. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.js.map +1 -0
  237. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.d.ts +0 -1
  238. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.js +701 -0
  239. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.js.map +1 -0
  240. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts +3 -5
  241. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +0 -1
  242. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts +0 -1
  243. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts +0 -1
  244. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/import.d.ts +0 -1
  245. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts +0 -1
  246. package/dist/proto/google/api/http.d.ts +0 -1
  247. package/dist/proto/google/protobuf/any.d.ts +0 -1
  248. package/dist/proto/google/protobuf/descriptor.d.ts +0 -1
  249. package/dist/proto/google/protobuf/duration.cjs +105 -0
  250. package/dist/proto/google/protobuf/duration.cjs.map +1 -0
  251. package/dist/proto/google/protobuf/duration.d.ts +0 -1
  252. package/dist/proto/google/protobuf/duration.js +103 -0
  253. package/dist/proto/google/protobuf/duration.js.map +1 -0
  254. package/dist/proto/google/protobuf/empty.d.ts +0 -1
  255. package/dist/proto/google/protobuf/struct.d.ts +0 -1
  256. package/dist/proto/google/protobuf/timestamp.cjs +133 -0
  257. package/dist/proto/google/protobuf/timestamp.cjs.map +1 -0
  258. package/dist/proto/google/protobuf/timestamp.d.ts +0 -1
  259. package/dist/proto/google/protobuf/timestamp.js +131 -0
  260. package/dist/proto/google/protobuf/timestamp.js.map +1 -0
  261. package/dist/proto/google/protobuf/wrappers.d.ts +0 -1
  262. package/dist/test_env.d.ts +0 -1
  263. package/package.json +21 -20
  264. package/src/clients/upload.ts +28 -3
  265. package/dist/clients/constructors.d.ts.map +0 -1
  266. package/dist/clients/download.d.ts.map +0 -1
  267. package/dist/clients/logs.d.ts.map +0 -1
  268. package/dist/clients/ls_api.d.ts.map +0 -1
  269. package/dist/clients/progress.d.ts.map +0 -1
  270. package/dist/clients/upload.d.ts.map +0 -1
  271. package/dist/drivers/download_blob/blob_key.d.ts.map +0 -1
  272. package/dist/drivers/download_blob/download_blob.d.ts.map +0 -1
  273. package/dist/drivers/download_blob/download_blob_task.d.ts.map +0 -1
  274. package/dist/drivers/download_blob/sparse_cache/cache.d.ts.map +0 -1
  275. package/dist/drivers/download_blob/sparse_cache/file.d.ts.map +0 -1
  276. package/dist/drivers/download_blob/sparse_cache/ranges.d.ts.map +0 -1
  277. package/dist/drivers/download_blob_url/driver.d.ts.map +0 -1
  278. package/dist/drivers/download_blob_url/driver_id.d.ts.map +0 -1
  279. package/dist/drivers/download_blob_url/snapshot.d.ts.map +0 -1
  280. package/dist/drivers/download_blob_url/task.d.ts.map +0 -1
  281. package/dist/drivers/download_blob_url/url.d.ts.map +0 -1
  282. package/dist/drivers/download_url/driver.d.ts.map +0 -1
  283. package/dist/drivers/download_url/task.d.ts.map +0 -1
  284. package/dist/drivers/helpers/download_local_handle.d.ts.map +0 -1
  285. package/dist/drivers/helpers/download_remote_handle.d.ts.map +0 -1
  286. package/dist/drivers/helpers/files_cache.d.ts.map +0 -1
  287. package/dist/drivers/helpers/helpers.d.ts.map +0 -1
  288. package/dist/drivers/helpers/logs_handle.d.ts.map +0 -1
  289. package/dist/drivers/helpers/ls_remote_import_handle.d.ts.map +0 -1
  290. package/dist/drivers/helpers/ls_storage_entry.d.ts.map +0 -1
  291. package/dist/drivers/helpers/polling_ops.d.ts.map +0 -1
  292. package/dist/drivers/helpers/read_file.d.ts.map +0 -1
  293. package/dist/drivers/helpers/test_helpers.d.ts.map +0 -1
  294. package/dist/drivers/logs.d.ts.map +0 -1
  295. package/dist/drivers/logs_stream.d.ts.map +0 -1
  296. package/dist/drivers/ls.d.ts.map +0 -1
  297. package/dist/drivers/types.d.ts.map +0 -1
  298. package/dist/drivers/upload.d.ts.map +0 -1
  299. package/dist/drivers/upload_task.d.ts.map +0 -1
  300. package/dist/drivers/urls/url.d.ts.map +0 -1
  301. package/dist/drivers/virtual_storages.d.ts.map +0 -1
  302. package/dist/helpers/download.d.ts.map +0 -1
  303. package/dist/helpers/validate.d.ts.map +0 -1
  304. package/dist/index.d.ts.map +0 -1
  305. package/dist/index.mjs +0 -4875
  306. package/dist/index.mjs.map +0 -1
  307. package/dist/proto/github.com/googleapis/googleapis/google/rpc/status.d.ts.map +0 -1
  308. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.d.ts.map +0 -1
  309. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.d.ts.map +0 -1
  310. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.d.ts.map +0 -1
  311. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.d.ts.map +0 -1
  312. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.d.ts.map +0 -1
  313. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.d.ts.map +0 -1
  314. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.d.ts.map +0 -1
  315. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.d.ts.map +0 -1
  316. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.d.ts.map +0 -1
  317. package/dist/proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.d.ts.map +0 -1
  318. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts.map +0 -1
  319. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +0 -1
  320. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts.map +0 -1
  321. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts.map +0 -1
  322. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/import.d.ts.map +0 -1
  323. package/dist/proto/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts.map +0 -1
  324. package/dist/proto/google/api/http.d.ts.map +0 -1
  325. package/dist/proto/google/protobuf/any.d.ts.map +0 -1
  326. package/dist/proto/google/protobuf/descriptor.d.ts.map +0 -1
  327. package/dist/proto/google/protobuf/duration.d.ts.map +0 -1
  328. package/dist/proto/google/protobuf/empty.d.ts.map +0 -1
  329. package/dist/proto/google/protobuf/struct.d.ts.map +0 -1
  330. package/dist/proto/google/protobuf/timestamp.d.ts.map +0 -1
  331. package/dist/proto/google/protobuf/wrappers.d.ts.map +0 -1
  332. package/dist/test_env.d.ts.map +0 -1
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var protocol_client = require('../proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.cjs');
4
+ var duration = require('../proto/google/protobuf/duration.cjs');
5
+ var plClient = require('@milaboratories/pl-client');
6
+ var tsHelpers = require('@milaboratories/ts-helpers');
7
+
8
+ // ClientProgress holds a grpc connection to the platform
9
+ // but for Progress API service.
10
+ // When blobs are transfered, one can got a status of transfering
11
+ // using this API.
12
+ class ClientProgress {
13
+ client;
14
+ logger;
15
+ grpcClient;
16
+ constructor(grpcClientProviderFactory, _, client, logger) {
17
+ this.client = client;
18
+ this.logger = logger;
19
+ this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new protocol_client.ProgressClient(transport));
20
+ }
21
+ close() { }
22
+ /** getStatus gets a progress status by given rId and rType. */
23
+ async getStatus({ id, type }, options) {
24
+ const status = await this.grpcClient.get().getStatus({ resourceId: id }, plClient.addRTypeToMetadata(type, options));
25
+ const report = tsHelpers.notEmpty(status.response.report);
26
+ return {
27
+ done: report.done,
28
+ progress: report.progress,
29
+ bytesProcessed: String(report.bytesProcessed),
30
+ bytesTotal: String(report.bytesTotal),
31
+ };
32
+ }
33
+ // realtimeStatus returns a async generator that takes statuses from
34
+ // GRPC stream every updateIntervalMs milliseconds.
35
+ async *realtimeStatus({ id, type }, updateIntervalMs = 100, options) {
36
+ options = plClient.addRTypeToMetadata(type, options);
37
+ const secs = Math.floor(updateIntervalMs / 1000);
38
+ const nanos = (updateIntervalMs - secs * 1000) * 1000000;
39
+ const updateInterval = duration.Duration.create({
40
+ seconds: BigInt(secs),
41
+ nanos: nanos,
42
+ });
43
+ try {
44
+ const { responses } = this.grpcClient.get().realtimeStatus({
45
+ resourceId: id,
46
+ updateInterval: updateInterval,
47
+ }, options);
48
+ yield* responses;
49
+ }
50
+ catch (e) {
51
+ this.logger.warn('Failed to get realtime status' + String(e));
52
+ throw e;
53
+ }
54
+ }
55
+ }
56
+
57
+ exports.ClientProgress = ClientProgress;
58
+ //# sourceMappingURL=progress.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.cjs","sources":["../../src/clients/progress.ts"],"sourcesContent":["import { ProgressClient } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client';\nimport type { RpcOptions } from '@protobuf-ts/runtime-rpc';\nimport { Duration } from '../proto/google/protobuf/duration';\nimport type { GrpcClientProvider, GrpcClientProviderFactory, PlClient } from '@milaboratories/pl-client';\nimport { addRTypeToMetadata } from '@milaboratories/pl-client';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport type { Dispatcher } from 'undici';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\n\nexport type ProgressStatus = {\n done: boolean;\n progress: number;\n bytesProcessed?: string;\n bytesTotal?: string;\n};\n\n// ClientProgress holds a grpc connection to the platform\n// but for Progress API service.\n// When blobs are transfered, one can got a status of transfering\n// using this API.\nexport class ClientProgress {\n public readonly grpcClient: GrpcClientProvider<ProgressClient>;\n\n constructor(\n grpcClientProviderFactory: GrpcClientProviderFactory,\n _: Dispatcher,\n public readonly client: PlClient,\n public readonly logger: MiLogger,\n ) {\n this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new ProgressClient(transport));\n }\n\n close() {}\n\n /** getStatus gets a progress status by given rId and rType. */\n async getStatus({ id, type }: ResourceInfo, options?: RpcOptions): Promise<ProgressStatus> {\n const status = await this.grpcClient.get().getStatus(\n { resourceId: id },\n addRTypeToMetadata(type, options),\n );\n\n const report = notEmpty(status.response.report);\n\n return {\n done: report.done,\n progress: report.progress,\n bytesProcessed: String(report.bytesProcessed),\n bytesTotal: String(report.bytesTotal),\n };\n }\n\n // realtimeStatus returns a async generator that takes statuses from\n // GRPC stream every updateIntervalMs milliseconds.\n async *realtimeStatus(\n { id, type }: ResourceInfo,\n updateIntervalMs: number = 100,\n options?: RpcOptions,\n ) {\n options = addRTypeToMetadata(type, options);\n\n const secs = Math.floor(updateIntervalMs / 1000);\n const nanos = (updateIntervalMs - secs * 1000) * 1000000;\n const updateInterval = Duration.create({\n seconds: BigInt(secs),\n nanos: nanos,\n });\n\n try {\n const { responses } = this.grpcClient.get().realtimeStatus(\n {\n resourceId: id,\n updateInterval: updateInterval,\n },\n options,\n );\n\n yield * responses;\n } catch (e) {\n this.logger.warn('Failed to get realtime status' + String(e));\n throw e;\n }\n }\n}\n"],"names":["ProgressClient","addRTypeToMetadata","notEmpty","Duration"],"mappings":";;;;;;;AAiBA;AACA;AACA;AACA;MACa,cAAc,CAAA;AAMP,IAAA,MAAA;AACA,IAAA,MAAA;AANF,IAAA,UAAU;AAE1B,IAAA,WAAA,CACE,yBAAoD,EACpD,CAAa,EACG,MAAgB,EAChB,MAAgB,EAAA;QADhB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,MAAM,GAAN,MAAM;AAEtB,QAAA,IAAI,CAAC,UAAU,GAAG,yBAAyB,CAAC,wBAAwB,CAAC,CAAC,SAAS,KAAK,IAAIA,8BAAc,CAAC,SAAS,CAAC,CAAC;IACpH;AAEA,IAAA,KAAK,KAAI;;IAGT,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAgB,EAAE,OAAoB,EAAA;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAClD,EAAE,UAAU,EAAE,EAAE,EAAE,EAClBC,2BAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAClC;QAED,MAAM,MAAM,GAAGC,kBAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE/C,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,YAAA,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;AAC7C,YAAA,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;SACtC;IACH;;;AAIA,IAAA,OAAO,cAAc,CACnB,EAAE,EAAE,EAAE,IAAI,EAAgB,EAC1B,gBAAA,GAA2B,GAAG,EAC9B,OAAoB,EAAA;AAEpB,QAAA,OAAO,GAAGD,2BAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;QAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAChD,MAAM,KAAK,GAAG,CAAC,gBAAgB,GAAG,IAAI,GAAG,IAAI,IAAI,OAAO;AACxD,QAAA,MAAM,cAAc,GAAGE,iBAAQ,CAAC,MAAM,CAAC;AACrC,YAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;AACrB,YAAA,KAAK,EAAE,KAAK;AACb,SAAA,CAAC;AAEF,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,CACxD;AACE,gBAAA,UAAU,EAAE,EAAE;AACd,gBAAA,cAAc,EAAE,cAAc;aAC/B,EACD,OAAO,CACR;YAED,OAAQ,SAAS;QACnB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7D,YAAA,MAAM,CAAC;QACT;IACF;AACD;;;;"}
@@ -4,7 +4,6 @@ import { GrpcClientProvider, GrpcClientProviderFactory, PlClient } from '@milabo
4
4
  import { MiLogger } from '@milaboratories/ts-helpers';
5
5
  import { Dispatcher } from 'undici';
6
6
  import { ResourceInfo } from '@milaboratories/pl-tree';
7
- import { ProgressAPI_RealtimeStatus_Response } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol';
8
7
  export type ProgressStatus = {
9
8
  done: boolean;
10
9
  progress: number;
@@ -19,6 +18,5 @@ export declare class ClientProgress {
19
18
  close(): void;
20
19
  /** getStatus gets a progress status by given rId and rType. */
21
20
  getStatus({ id, type }: ResourceInfo, options?: RpcOptions): Promise<ProgressStatus>;
22
- realtimeStatus({ id, type }: ResourceInfo, updateIntervalMs?: number, options?: RpcOptions): AsyncGenerator< ProgressAPI_RealtimeStatus_Response, void, any>;
21
+ realtimeStatus({ id, type }: ResourceInfo, updateIntervalMs?: number, options?: RpcOptions): AsyncGenerator<import('../proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol').ProgressAPI_RealtimeStatus_Response, void, any>;
23
22
  }
24
- //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1,56 @@
1
+ import { ProgressClient } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.js';
2
+ import { Duration } from '../proto/google/protobuf/duration.js';
3
+ import { addRTypeToMetadata } from '@milaboratories/pl-client';
4
+ import { notEmpty } from '@milaboratories/ts-helpers';
5
+
6
+ // ClientProgress holds a grpc connection to the platform
7
+ // but for Progress API service.
8
+ // When blobs are transfered, one can got a status of transfering
9
+ // using this API.
10
+ class ClientProgress {
11
+ client;
12
+ logger;
13
+ grpcClient;
14
+ constructor(grpcClientProviderFactory, _, client, logger) {
15
+ this.client = client;
16
+ this.logger = logger;
17
+ this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new ProgressClient(transport));
18
+ }
19
+ close() { }
20
+ /** getStatus gets a progress status by given rId and rType. */
21
+ async getStatus({ id, type }, options) {
22
+ const status = await this.grpcClient.get().getStatus({ resourceId: id }, addRTypeToMetadata(type, options));
23
+ const report = notEmpty(status.response.report);
24
+ return {
25
+ done: report.done,
26
+ progress: report.progress,
27
+ bytesProcessed: String(report.bytesProcessed),
28
+ bytesTotal: String(report.bytesTotal),
29
+ };
30
+ }
31
+ // realtimeStatus returns a async generator that takes statuses from
32
+ // GRPC stream every updateIntervalMs milliseconds.
33
+ async *realtimeStatus({ id, type }, updateIntervalMs = 100, options) {
34
+ options = addRTypeToMetadata(type, options);
35
+ const secs = Math.floor(updateIntervalMs / 1000);
36
+ const nanos = (updateIntervalMs - secs * 1000) * 1000000;
37
+ const updateInterval = Duration.create({
38
+ seconds: BigInt(secs),
39
+ nanos: nanos,
40
+ });
41
+ try {
42
+ const { responses } = this.grpcClient.get().realtimeStatus({
43
+ resourceId: id,
44
+ updateInterval: updateInterval,
45
+ }, options);
46
+ yield* responses;
47
+ }
48
+ catch (e) {
49
+ this.logger.warn('Failed to get realtime status' + String(e));
50
+ throw e;
51
+ }
52
+ }
53
+ }
54
+
55
+ export { ClientProgress };
56
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sources":["../../src/clients/progress.ts"],"sourcesContent":["import { ProgressClient } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client';\nimport type { RpcOptions } from '@protobuf-ts/runtime-rpc';\nimport { Duration } from '../proto/google/protobuf/duration';\nimport type { GrpcClientProvider, GrpcClientProviderFactory, PlClient } from '@milaboratories/pl-client';\nimport { addRTypeToMetadata } from '@milaboratories/pl-client';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport type { Dispatcher } from 'undici';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\n\nexport type ProgressStatus = {\n done: boolean;\n progress: number;\n bytesProcessed?: string;\n bytesTotal?: string;\n};\n\n// ClientProgress holds a grpc connection to the platform\n// but for Progress API service.\n// When blobs are transfered, one can got a status of transfering\n// using this API.\nexport class ClientProgress {\n public readonly grpcClient: GrpcClientProvider<ProgressClient>;\n\n constructor(\n grpcClientProviderFactory: GrpcClientProviderFactory,\n _: Dispatcher,\n public readonly client: PlClient,\n public readonly logger: MiLogger,\n ) {\n this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new ProgressClient(transport));\n }\n\n close() {}\n\n /** getStatus gets a progress status by given rId and rType. */\n async getStatus({ id, type }: ResourceInfo, options?: RpcOptions): Promise<ProgressStatus> {\n const status = await this.grpcClient.get().getStatus(\n { resourceId: id },\n addRTypeToMetadata(type, options),\n );\n\n const report = notEmpty(status.response.report);\n\n return {\n done: report.done,\n progress: report.progress,\n bytesProcessed: String(report.bytesProcessed),\n bytesTotal: String(report.bytesTotal),\n };\n }\n\n // realtimeStatus returns a async generator that takes statuses from\n // GRPC stream every updateIntervalMs milliseconds.\n async *realtimeStatus(\n { id, type }: ResourceInfo,\n updateIntervalMs: number = 100,\n options?: RpcOptions,\n ) {\n options = addRTypeToMetadata(type, options);\n\n const secs = Math.floor(updateIntervalMs / 1000);\n const nanos = (updateIntervalMs - secs * 1000) * 1000000;\n const updateInterval = Duration.create({\n seconds: BigInt(secs),\n nanos: nanos,\n });\n\n try {\n const { responses } = this.grpcClient.get().realtimeStatus(\n {\n resourceId: id,\n updateInterval: updateInterval,\n },\n options,\n );\n\n yield * responses;\n } catch (e) {\n this.logger.warn('Failed to get realtime status' + String(e));\n throw e;\n }\n }\n}\n"],"names":[],"mappings":";;;;;AAiBA;AACA;AACA;AACA;MACa,cAAc,CAAA;AAMP,IAAA,MAAA;AACA,IAAA,MAAA;AANF,IAAA,UAAU;AAE1B,IAAA,WAAA,CACE,yBAAoD,EACpD,CAAa,EACG,MAAgB,EAChB,MAAgB,EAAA;QADhB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,MAAM,GAAN,MAAM;AAEtB,QAAA,IAAI,CAAC,UAAU,GAAG,yBAAyB,CAAC,wBAAwB,CAAC,CAAC,SAAS,KAAK,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IACpH;AAEA,IAAA,KAAK,KAAI;;IAGT,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAgB,EAAE,OAAoB,EAAA;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAClD,EAAE,UAAU,EAAE,EAAE,EAAE,EAClB,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAClC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE/C,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,YAAA,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;AAC7C,YAAA,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;SACtC;IACH;;;AAIA,IAAA,OAAO,cAAc,CACnB,EAAE,EAAE,EAAE,IAAI,EAAgB,EAC1B,gBAAA,GAA2B,GAAG,EAC9B,OAAoB,EAAA;AAEpB,QAAA,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;QAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAChD,MAAM,KAAK,GAAG,CAAC,gBAAgB,GAAG,IAAI,GAAG,IAAI,IAAI,OAAO;AACxD,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;AACrC,YAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;AACrB,YAAA,KAAK,EAAE,KAAK;AACb,SAAA,CAAC;AAEF,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,CACxD;AACE,gBAAA,UAAU,EAAE,EAAE;AACd,gBAAA,cAAc,EAAE,cAAc;aAC/B,EACD,OAAO,CACR;YAED,OAAQ,SAAS;QACnB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7D,YAAA,MAAM,CAAC;QACT;IACF;AACD;;;;"}
@@ -0,0 +1,188 @@
1
+ 'use strict';
2
+
3
+ var plClient = require('@milaboratories/pl-client');
4
+ var fsp = require('node:fs/promises');
5
+ var undici = require('undici');
6
+ var protocol_client = require('../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.cjs');
7
+
8
+ function _interopNamespaceDefault(e) {
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var fsp__namespace = /*#__PURE__*/_interopNamespaceDefault(fsp);
26
+
27
+ class MTimeError extends Error {
28
+ name = 'MTimeError';
29
+ }
30
+ class UnexpectedEOF extends Error {
31
+ name = 'UnexpectedEOF';
32
+ }
33
+ class NetworkError extends Error {
34
+ name = 'NetworkError';
35
+ }
36
+ /** Happens when the file doesn't exist */
37
+ class NoFileForUploading extends Error {
38
+ name = 'NoFileForUploading';
39
+ }
40
+ /** Low-level client for grpc uploadapi.
41
+ * The user should pass here a concrete BlobUpload/<storageId> resource,
42
+ * it can be got from handle field of BlobUpload. */
43
+ class ClientUpload {
44
+ httpClient;
45
+ logger;
46
+ grpcClient;
47
+ constructor(grpcClientProviderFactory, httpClient, _, logger) {
48
+ this.httpClient = httpClient;
49
+ this.logger = logger;
50
+ this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new protocol_client.UploadClient(transport));
51
+ }
52
+ close() { }
53
+ async initUpload({ id, type }, options) {
54
+ const init = await this.grpcInit(id, type, options);
55
+ return {
56
+ overall: init.partsCount,
57
+ toUpload: this.partsToUpload(init.partsCount, init.uploadedParts),
58
+ };
59
+ }
60
+ async partUpload({ id, type }, path, expectedMTimeUnix, partNumber, options) {
61
+ const info = await this.grpcGetPartUrl({ id, type }, partNumber, 0n, // we update progress as a separate call later.
62
+ options);
63
+ const chunk = await readFileChunk(path, info.chunkStart, info.chunkEnd);
64
+ await checkExpectedMTime(path, expectedMTimeUnix);
65
+ const contentLength = Number(info.chunkEnd - info.chunkStart);
66
+ if (chunk.length !== contentLength) {
67
+ throw new Error(`Chunk size mismatch: expected ${contentLength} bytes, but read ${chunk.length} bytes from file`);
68
+ }
69
+ const headers = Object.fromEntries(info.headers.map(({ name, value }) => [name, value]));
70
+ const contentLengthKey = Object.keys(headers).find((key) => key.toLowerCase() === 'content-length');
71
+ if (contentLengthKey) {
72
+ const existingContentLength = Number(headers[contentLengthKey]);
73
+ if (existingContentLength !== contentLength) {
74
+ throw new Error(`Content-Length mismatch: expected ${contentLength}, but got ${existingContentLength} in headers`);
75
+ }
76
+ }
77
+ // content length will be automatically added by undici, so we don't need to set it here
78
+ try {
79
+ const { body: rawBody, statusCode, headers: responseHeaders, } = await undici.request(info.uploadUrl, {
80
+ dispatcher: this.httpClient,
81
+ body: chunk,
82
+ // We got headers only after we send
83
+ // the whole body (in case of S3 PUT requests it's 5 MB).
84
+ // It might be slow with a slow connection (or with SSH),
85
+ // that's why we got big timeout here.
86
+ headersTimeout: 60000,
87
+ bodyTimeout: 60000,
88
+ // Prevent connection reuse by setting "Connection: close" header.
89
+ // This works around an issue with the backend's built-in S3 implementation
90
+ // that caused HTTP/1.1 protocol lines to be included in the uploaded file content.
91
+ reset: true,
92
+ headers,
93
+ method: info.method.toUpperCase(),
94
+ });
95
+ // always read the body for resources to be garbage collected.
96
+ const body = await rawBody.text();
97
+ checkStatusCodeOk(statusCode, body, responseHeaders, info);
98
+ }
99
+ catch (e) {
100
+ if (e instanceof NetworkError)
101
+ throw e;
102
+ throw new Error(`partUpload: error ${JSON.stringify(e)} happened while trying to do part upload to the url ${info.uploadUrl}, headers: ${JSON.stringify(info.headers)}`);
103
+ }
104
+ await this.grpcUpdateProgress({ id, type }, BigInt(info.chunkEnd - info.chunkStart), options);
105
+ }
106
+ async finalize(info, options) {
107
+ return await this.grpcFinalize(info, options);
108
+ }
109
+ /** Calculates parts that need to be uploaded from the parts that were
110
+ * already uploaded. */
111
+ partsToUpload(partsCount, uploadedParts) {
112
+ const toUpload = [];
113
+ const uploaded = new Set(uploadedParts);
114
+ for (let i = 1n; i <= partsCount; i++) {
115
+ if (!uploaded.has(i))
116
+ toUpload.push(i);
117
+ }
118
+ return toUpload;
119
+ }
120
+ async grpcInit(id, type, options) {
121
+ return await this.grpcClient.get().init({ resourceId: id }, plClient.addRTypeToMetadata(type, options))
122
+ .response;
123
+ }
124
+ async grpcGetPartUrl({ id, type }, partNumber, uploadedPartSize, options) {
125
+ return await this.grpcClient.get().getPartURL({ resourceId: id, partNumber, uploadedPartSize, isInternalUse: false }, plClient.addRTypeToMetadata(type, options)).response;
126
+ }
127
+ async grpcUpdateProgress({ id, type }, bytesProcessed, options) {
128
+ await this.grpcClient.get().updateProgress({
129
+ resourceId: id,
130
+ bytesProcessed,
131
+ }, plClient.addRTypeToMetadata(type, options)).response;
132
+ }
133
+ async grpcFinalize({ id, type }, options) {
134
+ return await this.grpcClient.get().finalize({ resourceId: id }, plClient.addRTypeToMetadata(type, options))
135
+ .response;
136
+ }
137
+ }
138
+ async function readFileChunk(path, chunkStart, chunkEnd) {
139
+ let f;
140
+ try {
141
+ f = await fsp__namespace.open(path);
142
+ const len = Number(chunkEnd - chunkStart);
143
+ const pos = Number(chunkStart);
144
+ const b = Buffer.alloc(len);
145
+ const bytesRead = await readBytesFromPosition(f, b, len, pos);
146
+ return b.subarray(0, bytesRead);
147
+ }
148
+ catch (e) {
149
+ if (e && typeof e === 'object' && ('code' in e) && e.code == 'ENOENT')
150
+ throw new NoFileForUploading(`there is no file ${path} for uploading`);
151
+ throw e;
152
+ }
153
+ finally {
154
+ await f?.close();
155
+ }
156
+ }
157
+ /** Read len bytes from a given position.
158
+ * Without this, `FileHandle.read` can read less bytes than needed. */
159
+ async function readBytesFromPosition(f, b, len, position) {
160
+ let bytesReadTotal = 0;
161
+ while (bytesReadTotal < len) {
162
+ const { bytesRead } = await f.read(b, bytesReadTotal, len - bytesReadTotal, position + bytesReadTotal);
163
+ if (bytesRead === 0) {
164
+ throw new UnexpectedEOF('file ended earlier than expected.');
165
+ }
166
+ bytesReadTotal += bytesRead;
167
+ }
168
+ return bytesReadTotal;
169
+ }
170
+ async function checkExpectedMTime(path, expectedMTimeUnix) {
171
+ const mTime = BigInt(Math.floor((await fsp__namespace.stat(path)).mtimeMs / 1000));
172
+ if (mTime > expectedMTimeUnix) {
173
+ throw new MTimeError(`file was modified, expected mtime: ${expectedMTimeUnix}, got: ${mTime}.`);
174
+ }
175
+ }
176
+ function checkStatusCodeOk(statusCode, body, headers, info) {
177
+ if (statusCode != 200) {
178
+ throw new NetworkError(`response is not ok, status code: ${statusCode},`
179
+ + ` body: ${body}, headers: ${JSON.stringify(headers)}, url: ${info.uploadUrl}`);
180
+ }
181
+ }
182
+
183
+ exports.ClientUpload = ClientUpload;
184
+ exports.MTimeError = MTimeError;
185
+ exports.NetworkError = NetworkError;
186
+ exports.NoFileForUploading = NoFileForUploading;
187
+ exports.UnexpectedEOF = UnexpectedEOF;
188
+ //# sourceMappingURL=upload.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.cjs","sources":["../../src/clients/upload.ts"],"sourcesContent":["import type { GrpcClientProvider, GrpcClientProviderFactory, PlClient, ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport { addRTypeToMetadata } from '@milaboratories/pl-client';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport type { RpcOptions } from '@protobuf-ts/runtime-rpc';\nimport * as fs from 'node:fs/promises';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type { uploadapi_GetPartURL_Response } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol';\nimport { UploadClient } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client';\n\nimport type { IncomingHttpHeaders } from 'undici/types/header';\n\nexport class MTimeError extends Error {\n name = 'MTimeError';\n}\n\nexport class UnexpectedEOF extends Error {\n name = 'UnexpectedEOF';\n}\n\nexport class NetworkError extends Error {\n name = 'NetworkError';\n}\n\n/** Happens when the file doesn't exist */\nexport class NoFileForUploading extends Error {\n name = 'NoFileForUploading';\n}\n\n/** Low-level client for grpc uploadapi.\n * The user should pass here a concrete BlobUpload/<storageId> resource,\n * it can be got from handle field of BlobUpload. */\nexport class ClientUpload {\n private readonly grpcClient: GrpcClientProvider<UploadClient>;\n\n constructor(\n grpcClientProviderFactory: GrpcClientProviderFactory,\n public readonly httpClient: Dispatcher,\n _: PlClient,\n public readonly logger: MiLogger,\n ) {\n this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new UploadClient(transport));\n }\n\n close() {}\n\n public async initUpload(\n { id, type }: ResourceInfo,\n options?: RpcOptions,\n ): Promise<{\n overall: bigint;\n toUpload: bigint[];\n }> {\n const init = await this.grpcInit(id, type, options);\n return {\n overall: init.partsCount,\n toUpload: this.partsToUpload(init.partsCount, init.uploadedParts),\n };\n }\n\n public async partUpload(\n { id, type }: ResourceInfo,\n path: string,\n expectedMTimeUnix: bigint,\n partNumber: bigint,\n options?: RpcOptions,\n ) {\n const info = await this.grpcGetPartUrl(\n { id, type },\n partNumber,\n 0n, // we update progress as a separate call later.\n options,\n );\n\n const chunk = await readFileChunk(path, info.chunkStart, info.chunkEnd);\n await checkExpectedMTime(path, expectedMTimeUnix);\n\n const contentLength = Number(info.chunkEnd - info.chunkStart);\n if (chunk.length !== contentLength) {\n throw new Error(\n `Chunk size mismatch: expected ${contentLength} bytes, but read ${chunk.length} bytes from file`,\n );\n }\n\n const headers = Object.fromEntries(info.headers.map(({ name, value }) => [name, value]));\n\n const contentLengthKey = Object.keys(headers).find((key) => key.toLowerCase() === 'content-length');\n if (contentLengthKey) {\n const existingContentLength = Number(headers[contentLengthKey]);\n if (existingContentLength !== contentLength) {\n throw new Error(\n `Content-Length mismatch: expected ${contentLength}, but got ${existingContentLength} in headers`,\n );\n }\n }\n\n // content length will be automatically added by undici, so we don't need to set it here\n\n try {\n const {\n body: rawBody,\n statusCode,\n headers: responseHeaders,\n } = await request(info.uploadUrl, {\n dispatcher: this.httpClient,\n body: chunk,\n // We got headers only after we send\n // the whole body (in case of S3 PUT requests it's 5 MB).\n // It might be slow with a slow connection (or with SSH),\n // that's why we got big timeout here.\n headersTimeout: 60000,\n bodyTimeout: 60000,\n // Prevent connection reuse by setting \"Connection: close\" header.\n // This works around an issue with the backend's built-in S3 implementation\n // that caused HTTP/1.1 protocol lines to be included in the uploaded file content.\n reset: true,\n headers,\n method: info.method.toUpperCase() as Dispatcher.HttpMethod,\n });\n\n // always read the body for resources to be garbage collected.\n const body = await rawBody.text();\n checkStatusCodeOk(statusCode, body, responseHeaders, info);\n } catch (e: unknown) {\n if (e instanceof NetworkError)\n throw e;\n\n throw new Error(`partUpload: error ${JSON.stringify(e)} happened while trying to do part upload to the url ${info.uploadUrl}, headers: ${JSON.stringify(info.headers)}`);\n }\n\n await this.grpcUpdateProgress({ id, type }, BigInt(info.chunkEnd - info.chunkStart), options);\n }\n\n public async finalize(info: ResourceInfo, options?: RpcOptions) {\n return await this.grpcFinalize(info, options);\n }\n\n /** Calculates parts that need to be uploaded from the parts that were\n * already uploaded. */\n private partsToUpload(partsCount: bigint, uploadedParts: bigint[]): bigint[] {\n const toUpload: bigint[] = [];\n const uploaded = new Set(uploadedParts);\n\n for (let i = 1n; i <= partsCount; i++) {\n if (!uploaded.has(i)) toUpload.push(i);\n }\n\n return toUpload;\n }\n\n private async grpcInit(id: ResourceId, type: ResourceType, options?: RpcOptions) {\n return await this.grpcClient.get().init({ resourceId: id }, addRTypeToMetadata(type, options))\n .response;\n }\n\n private async grpcGetPartUrl(\n { id, type }: ResourceInfo,\n partNumber: bigint,\n uploadedPartSize: bigint,\n options?: RpcOptions,\n ) {\n return await this.grpcClient.get().getPartURL(\n { resourceId: id, partNumber, uploadedPartSize, isInternalUse: false },\n addRTypeToMetadata(type, options),\n ).response;\n }\n\n private async grpcUpdateProgress(\n { id, type }: ResourceInfo,\n bytesProcessed: bigint,\n options?: RpcOptions,\n ) {\n await this.grpcClient.get().updateProgress(\n {\n resourceId: id,\n bytesProcessed,\n },\n addRTypeToMetadata(type, options),\n ).response;\n }\n\n private async grpcFinalize({ id, type }: ResourceInfo, options?: RpcOptions) {\n return await this.grpcClient.get().finalize({ resourceId: id }, addRTypeToMetadata(type, options))\n .response;\n }\n}\n\nasync function readFileChunk(path: string, chunkStart: bigint, chunkEnd: bigint): Promise<Buffer> {\n let f: fs.FileHandle | undefined;\n try {\n f = await fs.open(path);\n const len = Number(chunkEnd - chunkStart);\n const pos = Number(chunkStart);\n const b = Buffer.alloc(len);\n const bytesRead = await readBytesFromPosition(f, b, len, pos);\n\n return b.subarray(0, bytesRead);\n } catch (e: unknown) {\n if (e && typeof e === 'object' && ('code' in e) && e.code == 'ENOENT') throw new NoFileForUploading(`there is no file ${path} for uploading`);\n throw e;\n } finally {\n await f?.close();\n }\n}\n\n/** Read len bytes from a given position.\n * Without this, `FileHandle.read` can read less bytes than needed. */\nasync function readBytesFromPosition(f: fs.FileHandle, b: Buffer, len: number, position: number) {\n let bytesReadTotal = 0;\n while (bytesReadTotal < len) {\n const { bytesRead } = await f.read(\n b,\n bytesReadTotal,\n len - bytesReadTotal,\n position + bytesReadTotal,\n );\n if (bytesRead === 0) {\n throw new UnexpectedEOF('file ended earlier than expected.');\n }\n bytesReadTotal += bytesRead;\n }\n\n return bytesReadTotal;\n}\n\nasync function checkExpectedMTime(path: string, expectedMTimeUnix: bigint) {\n const mTime = BigInt(Math.floor((await fs.stat(path)).mtimeMs / 1000));\n if (mTime > expectedMTimeUnix) {\n throw new MTimeError(`file was modified, expected mtime: ${expectedMTimeUnix}, got: ${mTime}.`);\n }\n}\n\nfunction checkStatusCodeOk(\n statusCode: number,\n body: string,\n headers: IncomingHttpHeaders,\n info: uploadapi_GetPartURL_Response,\n) {\n if (statusCode != 200) {\n throw new NetworkError(\n `response is not ok, status code: ${statusCode},`\n + ` body: ${body}, headers: ${JSON.stringify(headers)}, url: ${info.uploadUrl}`,\n );\n }\n}\n"],"names":["UploadClient","request","addRTypeToMetadata","fs"],"mappings":"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"}
@@ -3,7 +3,6 @@ import { ResourceInfo } from '@milaboratories/pl-tree';
3
3
  import { MiLogger } from '@milaboratories/ts-helpers';
4
4
  import { RpcOptions } from '@protobuf-ts/runtime-rpc';
5
5
  import { Dispatcher } from 'undici';
6
- import { uploadapi_Finalize_Response } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol';
7
6
  export declare class MTimeError extends Error {
8
7
  name: string;
9
8
  }
@@ -31,7 +30,7 @@ export declare class ClientUpload {
31
30
  toUpload: bigint[];
32
31
  }>;
33
32
  partUpload({ id, type }: ResourceInfo, path: string, expectedMTimeUnix: bigint, partNumber: bigint, options?: RpcOptions): Promise<void>;
34
- finalize(info: ResourceInfo, options?: RpcOptions): Promise< uploadapi_Finalize_Response>;
33
+ finalize(info: ResourceInfo, options?: RpcOptions): Promise<import('../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol').uploadapi_Finalize_Response>;
35
34
  /** Calculates parts that need to be uploaded from the parts that were
36
35
  * already uploaded. */
37
36
  private partsToUpload;
@@ -40,4 +39,3 @@ export declare class ClientUpload {
40
39
  private grpcUpdateProgress;
41
40
  private grpcFinalize;
42
41
  }
43
- //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1,163 @@
1
+ import { addRTypeToMetadata } from '@milaboratories/pl-client';
2
+ import * as fsp from 'node:fs/promises';
3
+ import { request } from 'undici';
4
+ import { UploadClient } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.js';
5
+
6
+ class MTimeError extends Error {
7
+ name = 'MTimeError';
8
+ }
9
+ class UnexpectedEOF extends Error {
10
+ name = 'UnexpectedEOF';
11
+ }
12
+ class NetworkError extends Error {
13
+ name = 'NetworkError';
14
+ }
15
+ /** Happens when the file doesn't exist */
16
+ class NoFileForUploading extends Error {
17
+ name = 'NoFileForUploading';
18
+ }
19
+ /** Low-level client for grpc uploadapi.
20
+ * The user should pass here a concrete BlobUpload/<storageId> resource,
21
+ * it can be got from handle field of BlobUpload. */
22
+ class ClientUpload {
23
+ httpClient;
24
+ logger;
25
+ grpcClient;
26
+ constructor(grpcClientProviderFactory, httpClient, _, logger) {
27
+ this.httpClient = httpClient;
28
+ this.logger = logger;
29
+ this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new UploadClient(transport));
30
+ }
31
+ close() { }
32
+ async initUpload({ id, type }, options) {
33
+ const init = await this.grpcInit(id, type, options);
34
+ return {
35
+ overall: init.partsCount,
36
+ toUpload: this.partsToUpload(init.partsCount, init.uploadedParts),
37
+ };
38
+ }
39
+ async partUpload({ id, type }, path, expectedMTimeUnix, partNumber, options) {
40
+ const info = await this.grpcGetPartUrl({ id, type }, partNumber, 0n, // we update progress as a separate call later.
41
+ options);
42
+ const chunk = await readFileChunk(path, info.chunkStart, info.chunkEnd);
43
+ await checkExpectedMTime(path, expectedMTimeUnix);
44
+ const contentLength = Number(info.chunkEnd - info.chunkStart);
45
+ if (chunk.length !== contentLength) {
46
+ throw new Error(`Chunk size mismatch: expected ${contentLength} bytes, but read ${chunk.length} bytes from file`);
47
+ }
48
+ const headers = Object.fromEntries(info.headers.map(({ name, value }) => [name, value]));
49
+ const contentLengthKey = Object.keys(headers).find((key) => key.toLowerCase() === 'content-length');
50
+ if (contentLengthKey) {
51
+ const existingContentLength = Number(headers[contentLengthKey]);
52
+ if (existingContentLength !== contentLength) {
53
+ throw new Error(`Content-Length mismatch: expected ${contentLength}, but got ${existingContentLength} in headers`);
54
+ }
55
+ }
56
+ // content length will be automatically added by undici, so we don't need to set it here
57
+ try {
58
+ const { body: rawBody, statusCode, headers: responseHeaders, } = await request(info.uploadUrl, {
59
+ dispatcher: this.httpClient,
60
+ body: chunk,
61
+ // We got headers only after we send
62
+ // the whole body (in case of S3 PUT requests it's 5 MB).
63
+ // It might be slow with a slow connection (or with SSH),
64
+ // that's why we got big timeout here.
65
+ headersTimeout: 60000,
66
+ bodyTimeout: 60000,
67
+ // Prevent connection reuse by setting "Connection: close" header.
68
+ // This works around an issue with the backend's built-in S3 implementation
69
+ // that caused HTTP/1.1 protocol lines to be included in the uploaded file content.
70
+ reset: true,
71
+ headers,
72
+ method: info.method.toUpperCase(),
73
+ });
74
+ // always read the body for resources to be garbage collected.
75
+ const body = await rawBody.text();
76
+ checkStatusCodeOk(statusCode, body, responseHeaders, info);
77
+ }
78
+ catch (e) {
79
+ if (e instanceof NetworkError)
80
+ throw e;
81
+ throw new Error(`partUpload: error ${JSON.stringify(e)} happened while trying to do part upload to the url ${info.uploadUrl}, headers: ${JSON.stringify(info.headers)}`);
82
+ }
83
+ await this.grpcUpdateProgress({ id, type }, BigInt(info.chunkEnd - info.chunkStart), options);
84
+ }
85
+ async finalize(info, options) {
86
+ return await this.grpcFinalize(info, options);
87
+ }
88
+ /** Calculates parts that need to be uploaded from the parts that were
89
+ * already uploaded. */
90
+ partsToUpload(partsCount, uploadedParts) {
91
+ const toUpload = [];
92
+ const uploaded = new Set(uploadedParts);
93
+ for (let i = 1n; i <= partsCount; i++) {
94
+ if (!uploaded.has(i))
95
+ toUpload.push(i);
96
+ }
97
+ return toUpload;
98
+ }
99
+ async grpcInit(id, type, options) {
100
+ return await this.grpcClient.get().init({ resourceId: id }, addRTypeToMetadata(type, options))
101
+ .response;
102
+ }
103
+ async grpcGetPartUrl({ id, type }, partNumber, uploadedPartSize, options) {
104
+ return await this.grpcClient.get().getPartURL({ resourceId: id, partNumber, uploadedPartSize, isInternalUse: false }, addRTypeToMetadata(type, options)).response;
105
+ }
106
+ async grpcUpdateProgress({ id, type }, bytesProcessed, options) {
107
+ await this.grpcClient.get().updateProgress({
108
+ resourceId: id,
109
+ bytesProcessed,
110
+ }, addRTypeToMetadata(type, options)).response;
111
+ }
112
+ async grpcFinalize({ id, type }, options) {
113
+ return await this.grpcClient.get().finalize({ resourceId: id }, addRTypeToMetadata(type, options))
114
+ .response;
115
+ }
116
+ }
117
+ async function readFileChunk(path, chunkStart, chunkEnd) {
118
+ let f;
119
+ try {
120
+ f = await fsp.open(path);
121
+ const len = Number(chunkEnd - chunkStart);
122
+ const pos = Number(chunkStart);
123
+ const b = Buffer.alloc(len);
124
+ const bytesRead = await readBytesFromPosition(f, b, len, pos);
125
+ return b.subarray(0, bytesRead);
126
+ }
127
+ catch (e) {
128
+ if (e && typeof e === 'object' && ('code' in e) && e.code == 'ENOENT')
129
+ throw new NoFileForUploading(`there is no file ${path} for uploading`);
130
+ throw e;
131
+ }
132
+ finally {
133
+ await f?.close();
134
+ }
135
+ }
136
+ /** Read len bytes from a given position.
137
+ * Without this, `FileHandle.read` can read less bytes than needed. */
138
+ async function readBytesFromPosition(f, b, len, position) {
139
+ let bytesReadTotal = 0;
140
+ while (bytesReadTotal < len) {
141
+ const { bytesRead } = await f.read(b, bytesReadTotal, len - bytesReadTotal, position + bytesReadTotal);
142
+ if (bytesRead === 0) {
143
+ throw new UnexpectedEOF('file ended earlier than expected.');
144
+ }
145
+ bytesReadTotal += bytesRead;
146
+ }
147
+ return bytesReadTotal;
148
+ }
149
+ async function checkExpectedMTime(path, expectedMTimeUnix) {
150
+ const mTime = BigInt(Math.floor((await fsp.stat(path)).mtimeMs / 1000));
151
+ if (mTime > expectedMTimeUnix) {
152
+ throw new MTimeError(`file was modified, expected mtime: ${expectedMTimeUnix}, got: ${mTime}.`);
153
+ }
154
+ }
155
+ function checkStatusCodeOk(statusCode, body, headers, info) {
156
+ if (statusCode != 200) {
157
+ throw new NetworkError(`response is not ok, status code: ${statusCode},`
158
+ + ` body: ${body}, headers: ${JSON.stringify(headers)}, url: ${info.uploadUrl}`);
159
+ }
160
+ }
161
+
162
+ export { ClientUpload, MTimeError, NetworkError, NoFileForUploading, UnexpectedEOF };
163
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sources":["../../src/clients/upload.ts"],"sourcesContent":["import type { GrpcClientProvider, GrpcClientProviderFactory, PlClient, ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport { addRTypeToMetadata } from '@milaboratories/pl-client';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport type { RpcOptions } from '@protobuf-ts/runtime-rpc';\nimport * as fs from 'node:fs/promises';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type { uploadapi_GetPartURL_Response } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol';\nimport { UploadClient } from '../proto/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client';\n\nimport type { IncomingHttpHeaders } from 'undici/types/header';\n\nexport class MTimeError extends Error {\n name = 'MTimeError';\n}\n\nexport class UnexpectedEOF extends Error {\n name = 'UnexpectedEOF';\n}\n\nexport class NetworkError extends Error {\n name = 'NetworkError';\n}\n\n/** Happens when the file doesn't exist */\nexport class NoFileForUploading extends Error {\n name = 'NoFileForUploading';\n}\n\n/** Low-level client for grpc uploadapi.\n * The user should pass here a concrete BlobUpload/<storageId> resource,\n * it can be got from handle field of BlobUpload. */\nexport class ClientUpload {\n private readonly grpcClient: GrpcClientProvider<UploadClient>;\n\n constructor(\n grpcClientProviderFactory: GrpcClientProviderFactory,\n public readonly httpClient: Dispatcher,\n _: PlClient,\n public readonly logger: MiLogger,\n ) {\n this.grpcClient = grpcClientProviderFactory.createGrpcClientProvider((transport) => new UploadClient(transport));\n }\n\n close() {}\n\n public async initUpload(\n { id, type }: ResourceInfo,\n options?: RpcOptions,\n ): Promise<{\n overall: bigint;\n toUpload: bigint[];\n }> {\n const init = await this.grpcInit(id, type, options);\n return {\n overall: init.partsCount,\n toUpload: this.partsToUpload(init.partsCount, init.uploadedParts),\n };\n }\n\n public async partUpload(\n { id, type }: ResourceInfo,\n path: string,\n expectedMTimeUnix: bigint,\n partNumber: bigint,\n options?: RpcOptions,\n ) {\n const info = await this.grpcGetPartUrl(\n { id, type },\n partNumber,\n 0n, // we update progress as a separate call later.\n options,\n );\n\n const chunk = await readFileChunk(path, info.chunkStart, info.chunkEnd);\n await checkExpectedMTime(path, expectedMTimeUnix);\n\n const contentLength = Number(info.chunkEnd - info.chunkStart);\n if (chunk.length !== contentLength) {\n throw new Error(\n `Chunk size mismatch: expected ${contentLength} bytes, but read ${chunk.length} bytes from file`,\n );\n }\n\n const headers = Object.fromEntries(info.headers.map(({ name, value }) => [name, value]));\n\n const contentLengthKey = Object.keys(headers).find((key) => key.toLowerCase() === 'content-length');\n if (contentLengthKey) {\n const existingContentLength = Number(headers[contentLengthKey]);\n if (existingContentLength !== contentLength) {\n throw new Error(\n `Content-Length mismatch: expected ${contentLength}, but got ${existingContentLength} in headers`,\n );\n }\n }\n\n // content length will be automatically added by undici, so we don't need to set it here\n\n try {\n const {\n body: rawBody,\n statusCode,\n headers: responseHeaders,\n } = await request(info.uploadUrl, {\n dispatcher: this.httpClient,\n body: chunk,\n // We got headers only after we send\n // the whole body (in case of S3 PUT requests it's 5 MB).\n // It might be slow with a slow connection (or with SSH),\n // that's why we got big timeout here.\n headersTimeout: 60000,\n bodyTimeout: 60000,\n // Prevent connection reuse by setting \"Connection: close\" header.\n // This works around an issue with the backend's built-in S3 implementation\n // that caused HTTP/1.1 protocol lines to be included in the uploaded file content.\n reset: true,\n headers,\n method: info.method.toUpperCase() as Dispatcher.HttpMethod,\n });\n\n // always read the body for resources to be garbage collected.\n const body = await rawBody.text();\n checkStatusCodeOk(statusCode, body, responseHeaders, info);\n } catch (e: unknown) {\n if (e instanceof NetworkError)\n throw e;\n\n throw new Error(`partUpload: error ${JSON.stringify(e)} happened while trying to do part upload to the url ${info.uploadUrl}, headers: ${JSON.stringify(info.headers)}`);\n }\n\n await this.grpcUpdateProgress({ id, type }, BigInt(info.chunkEnd - info.chunkStart), options);\n }\n\n public async finalize(info: ResourceInfo, options?: RpcOptions) {\n return await this.grpcFinalize(info, options);\n }\n\n /** Calculates parts that need to be uploaded from the parts that were\n * already uploaded. */\n private partsToUpload(partsCount: bigint, uploadedParts: bigint[]): bigint[] {\n const toUpload: bigint[] = [];\n const uploaded = new Set(uploadedParts);\n\n for (let i = 1n; i <= partsCount; i++) {\n if (!uploaded.has(i)) toUpload.push(i);\n }\n\n return toUpload;\n }\n\n private async grpcInit(id: ResourceId, type: ResourceType, options?: RpcOptions) {\n return await this.grpcClient.get().init({ resourceId: id }, addRTypeToMetadata(type, options))\n .response;\n }\n\n private async grpcGetPartUrl(\n { id, type }: ResourceInfo,\n partNumber: bigint,\n uploadedPartSize: bigint,\n options?: RpcOptions,\n ) {\n return await this.grpcClient.get().getPartURL(\n { resourceId: id, partNumber, uploadedPartSize, isInternalUse: false },\n addRTypeToMetadata(type, options),\n ).response;\n }\n\n private async grpcUpdateProgress(\n { id, type }: ResourceInfo,\n bytesProcessed: bigint,\n options?: RpcOptions,\n ) {\n await this.grpcClient.get().updateProgress(\n {\n resourceId: id,\n bytesProcessed,\n },\n addRTypeToMetadata(type, options),\n ).response;\n }\n\n private async grpcFinalize({ id, type }: ResourceInfo, options?: RpcOptions) {\n return await this.grpcClient.get().finalize({ resourceId: id }, addRTypeToMetadata(type, options))\n .response;\n }\n}\n\nasync function readFileChunk(path: string, chunkStart: bigint, chunkEnd: bigint): Promise<Buffer> {\n let f: fs.FileHandle | undefined;\n try {\n f = await fs.open(path);\n const len = Number(chunkEnd - chunkStart);\n const pos = Number(chunkStart);\n const b = Buffer.alloc(len);\n const bytesRead = await readBytesFromPosition(f, b, len, pos);\n\n return b.subarray(0, bytesRead);\n } catch (e: unknown) {\n if (e && typeof e === 'object' && ('code' in e) && e.code == 'ENOENT') throw new NoFileForUploading(`there is no file ${path} for uploading`);\n throw e;\n } finally {\n await f?.close();\n }\n}\n\n/** Read len bytes from a given position.\n * Without this, `FileHandle.read` can read less bytes than needed. */\nasync function readBytesFromPosition(f: fs.FileHandle, b: Buffer, len: number, position: number) {\n let bytesReadTotal = 0;\n while (bytesReadTotal < len) {\n const { bytesRead } = await f.read(\n b,\n bytesReadTotal,\n len - bytesReadTotal,\n position + bytesReadTotal,\n );\n if (bytesRead === 0) {\n throw new UnexpectedEOF('file ended earlier than expected.');\n }\n bytesReadTotal += bytesRead;\n }\n\n return bytesReadTotal;\n}\n\nasync function checkExpectedMTime(path: string, expectedMTimeUnix: bigint) {\n const mTime = BigInt(Math.floor((await fs.stat(path)).mtimeMs / 1000));\n if (mTime > expectedMTimeUnix) {\n throw new MTimeError(`file was modified, expected mtime: ${expectedMTimeUnix}, got: ${mTime}.`);\n }\n}\n\nfunction checkStatusCodeOk(\n statusCode: number,\n body: string,\n headers: IncomingHttpHeaders,\n info: uploadapi_GetPartURL_Response,\n) {\n if (statusCode != 200) {\n throw new NetworkError(\n `response is not ok, status code: ${statusCode},`\n + ` body: ${body}, headers: ${JSON.stringify(headers)}, url: ${info.uploadUrl}`,\n );\n }\n}\n"],"names":["fs"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ require('@milaboratories/pl-client');
4
+ var path = require('node:path');
5
+
6
+ function _interopNamespaceDefault(e) {
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
24
+
25
+ function blobKey(rId) {
26
+ return `${BigInt(rId)}`;
27
+ }
28
+ function pathToKey(fPath) {
29
+ return path__namespace.basename(fPath);
30
+ }
31
+
32
+ exports.blobKey = blobKey;
33
+ exports.pathToKey = pathToKey;
34
+ //# sourceMappingURL=blob_key.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob_key.cjs","sources":["../../../src/drivers/download_blob/blob_key.ts"],"sourcesContent":["import { bigintToResourceId, ResourceId } from \"@milaboratories/pl-client\";\nimport * as path from 'node:path';\n\nexport function blobKey(rId: ResourceId): string {\n return `${BigInt(rId)}`;\n}\n\nexport function pathToKey(fPath: string): string {\n return path.basename(fPath);\n}\n\nexport function pathToBlobInfo(fPath: string): ResourceId | undefined {\n const base = path.basename(fPath);\n return bigintToResourceId(BigInt(base));\n}\n"],"names":["path"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGM,SAAU,OAAO,CAAC,GAAe,EAAA;AACrC,IAAA,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE;AACzB;AAEM,SAAU,SAAS,CAAC,KAAa,EAAA;AACrC,IAAA,OAAOA,eAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC7B;;;;;"}
@@ -2,4 +2,3 @@ import { ResourceId } from '@milaboratories/pl-client';
2
2
  export declare function blobKey(rId: ResourceId): string;
3
3
  export declare function pathToKey(fPath: string): string;
4
4
  export declare function pathToBlobInfo(fPath: string): ResourceId | undefined;
5
- //# sourceMappingURL=blob_key.d.ts.map