@milaboratories/pl-drivers 1.11.59 → 1.11.61
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.
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/clients/constructors.cjs +28 -28
- package/dist/clients/constructors.cjs.map +1 -1
- package/dist/clients/constructors.d.ts +17 -13
- package/dist/clients/constructors.js +28 -26
- package/dist/clients/constructors.js.map +1 -1
- package/dist/clients/crc32c.cjs +8 -13
- package/dist/clients/crc32c.cjs.map +1 -1
- package/dist/clients/crc32c.js +8 -12
- package/dist/clients/crc32c.js.map +1 -1
- package/dist/clients/download.cjs +119 -160
- package/dist/clients/download.cjs.map +1 -1
- package/dist/clients/download.d.ts +45 -41
- package/dist/clients/download.js +115 -137
- package/dist/clients/download.js.map +1 -1
- package/dist/clients/logs.cjs +78 -82
- package/dist/clients/logs.cjs.map +1 -1
- package/dist/clients/logs.d.ts +34 -24
- package/dist/clients/logs.js +77 -80
- package/dist/clients/logs.js.map +1 -1
- package/dist/clients/ls_api.cjs +62 -68
- package/dist/clients/ls_api.cjs.map +1 -1
- package/dist/clients/ls_api.d.ts +15 -11
- package/dist/clients/ls_api.js +61 -66
- package/dist/clients/ls_api.js.map +1 -1
- package/dist/clients/progress.cjs +49 -59
- package/dist/clients/progress.cjs.map +1 -1
- package/dist/clients/progress.d.ts +27 -20
- package/dist/clients/progress.js +48 -57
- package/dist/clients/progress.js.map +1 -1
- package/dist/clients/upload.cjs +189 -250
- package/dist/clients/upload.cjs.map +1 -1
- package/dist/clients/upload.d.ts +44 -34
- package/dist/clients/upload.js +187 -229
- package/dist/clients/upload.js.map +1 -1
- package/dist/drivers/download_blob/blob_key.cjs +9 -26
- package/dist/drivers/download_blob/blob_key.cjs.map +1 -1
- package/dist/drivers/download_blob/blob_key.js +7 -5
- package/dist/drivers/download_blob/blob_key.js.map +1 -1
- package/dist/drivers/download_blob/download_blob.cjs +395 -478
- package/dist/drivers/download_blob/download_blob.cjs.map +1 -1
- package/dist/drivers/download_blob/download_blob.d.ts +102 -100
- package/dist/drivers/download_blob/download_blob.js +388 -453
- package/dist/drivers/download_blob/download_blob.js.map +1 -1
- package/dist/drivers/download_blob/download_blob_task.cjs +128 -163
- package/dist/drivers/download_blob/download_blob_task.cjs.map +1 -1
- package/dist/drivers/download_blob/download_blob_task.js +125 -141
- package/dist/drivers/download_blob/download_blob_task.js.map +1 -1
- package/dist/drivers/download_blob/sparse_cache/cache.cjs +166 -195
- package/dist/drivers/download_blob/sparse_cache/cache.cjs.map +1 -1
- package/dist/drivers/download_blob/sparse_cache/cache.js +164 -193
- package/dist/drivers/download_blob/sparse_cache/cache.js.map +1 -1
- package/dist/drivers/download_blob/sparse_cache/file.cjs +29 -50
- package/dist/drivers/download_blob/sparse_cache/file.cjs.map +1 -1
- package/dist/drivers/download_blob/sparse_cache/file.js +28 -29
- package/dist/drivers/download_blob/sparse_cache/file.js.map +1 -1
- package/dist/drivers/download_blob/sparse_cache/ranges.cjs +48 -76
- package/dist/drivers/download_blob/sparse_cache/ranges.cjs.map +1 -1
- package/dist/drivers/download_blob/sparse_cache/ranges.js +47 -54
- package/dist/drivers/download_blob/sparse_cache/ranges.js.map +1 -1
- package/dist/drivers/download_blob_url/driver.cjs +125 -165
- package/dist/drivers/download_blob_url/driver.cjs.map +1 -1
- package/dist/drivers/download_blob_url/driver.d.ts +45 -42
- package/dist/drivers/download_blob_url/driver.js +123 -144
- package/dist/drivers/download_blob_url/driver.js.map +1 -1
- package/dist/drivers/download_blob_url/driver_id.cjs +4 -4
- package/dist/drivers/download_blob_url/driver_id.cjs.map +1 -1
- package/dist/drivers/download_blob_url/driver_id.js +4 -3
- package/dist/drivers/download_blob_url/driver_id.js.map +1 -1
- package/dist/drivers/download_blob_url/snapshot.cjs +7 -11
- package/dist/drivers/download_blob_url/snapshot.cjs.map +1 -1
- package/dist/drivers/download_blob_url/snapshot.d.ts +10 -5
- package/dist/drivers/download_blob_url/snapshot.js +5 -8
- package/dist/drivers/download_blob_url/snapshot.js.map +1 -1
- package/dist/drivers/download_blob_url/task.cjs +147 -194
- package/dist/drivers/download_blob_url/task.cjs.map +1 -1
- package/dist/drivers/download_blob_url/task.d.ts +55 -57
- package/dist/drivers/download_blob_url/task.js +140 -170
- package/dist/drivers/download_blob_url/task.js.map +1 -1
- package/dist/drivers/download_url/driver.cjs +109 -146
- package/dist/drivers/download_url/driver.cjs.map +1 -1
- package/dist/drivers/download_url/driver.d.ts +59 -57
- package/dist/drivers/download_url/driver.js +107 -125
- package/dist/drivers/download_url/driver.js.map +1 -1
- package/dist/drivers/download_url/task.cjs +104 -137
- package/dist/drivers/download_url/task.cjs.map +1 -1
- package/dist/drivers/download_url/task.d.ts +33 -37
- package/dist/drivers/download_url/task.js +99 -113
- package/dist/drivers/download_url/task.js.map +1 -1
- package/dist/drivers/helpers/download_local_handle.cjs +13 -14
- package/dist/drivers/helpers/download_local_handle.cjs.map +1 -1
- package/dist/drivers/helpers/download_local_handle.js +13 -13
- package/dist/drivers/helpers/download_local_handle.js.map +1 -1
- package/dist/drivers/helpers/download_remote_handle.cjs +23 -24
- package/dist/drivers/helpers/download_remote_handle.cjs.map +1 -1
- package/dist/drivers/helpers/download_remote_handle.js +22 -22
- package/dist/drivers/helpers/download_remote_handle.js.map +1 -1
- package/dist/drivers/helpers/files_cache.cjs +53 -64
- package/dist/drivers/helpers/files_cache.cjs.map +1 -1
- package/dist/drivers/helpers/files_cache.js +52 -62
- package/dist/drivers/helpers/files_cache.js.map +1 -1
- package/dist/drivers/helpers/helpers.cjs +24 -28
- package/dist/drivers/helpers/helpers.cjs.map +1 -1
- package/dist/drivers/helpers/helpers.d.ts +10 -7
- package/dist/drivers/helpers/helpers.js +24 -27
- package/dist/drivers/helpers/helpers.js.map +1 -1
- package/dist/drivers/helpers/logs_handle.cjs +24 -33
- package/dist/drivers/helpers/logs_handle.cjs.map +1 -1
- package/dist/drivers/helpers/logs_handle.js +24 -29
- package/dist/drivers/helpers/logs_handle.js.map +1 -1
- package/dist/drivers/helpers/ls_remote_import_handle.cjs +20 -20
- package/dist/drivers/helpers/ls_remote_import_handle.cjs.map +1 -1
- package/dist/drivers/helpers/ls_remote_import_handle.js +20 -18
- package/dist/drivers/helpers/ls_remote_import_handle.js.map +1 -1
- package/dist/drivers/helpers/ls_storage_entry.cjs +36 -40
- package/dist/drivers/helpers/ls_storage_entry.cjs.map +1 -1
- package/dist/drivers/helpers/ls_storage_entry.js +36 -37
- package/dist/drivers/helpers/ls_storage_entry.js.map +1 -1
- package/dist/drivers/helpers/polling_ops.d.ts +6 -5
- package/dist/drivers/helpers/read_file.cjs +34 -57
- package/dist/drivers/helpers/read_file.cjs.map +1 -1
- package/dist/drivers/helpers/read_file.js +30 -34
- package/dist/drivers/helpers/read_file.js.map +1 -1
- package/dist/drivers/logs.cjs +94 -112
- package/dist/drivers/logs.cjs.map +1 -1
- package/dist/drivers/logs.d.ts +35 -32
- package/dist/drivers/logs.js +93 -110
- package/dist/drivers/logs.js.map +1 -1
- package/dist/drivers/logs_stream.cjs +210 -242
- package/dist/drivers/logs_stream.cjs.map +1 -1
- package/dist/drivers/logs_stream.d.ts +55 -53
- package/dist/drivers/logs_stream.js +209 -240
- package/dist/drivers/logs_stream.js.map +1 -1
- package/dist/drivers/ls.cjs +151 -238
- package/dist/drivers/ls.cjs.map +1 -1
- package/dist/drivers/ls.d.ts +53 -49
- package/dist/drivers/ls.js +148 -216
- package/dist/drivers/ls.js.map +1 -1
- package/dist/drivers/types.cjs +25 -53
- package/dist/drivers/types.cjs.map +1 -1
- package/dist/drivers/types.d.ts +91 -106
- package/dist/drivers/types.js +23 -50
- package/dist/drivers/types.js.map +1 -1
- package/dist/drivers/upload.cjs +127 -153
- package/dist/drivers/upload.cjs.map +1 -1
- package/dist/drivers/upload.d.ts +52 -50
- package/dist/drivers/upload.js +126 -151
- package/dist/drivers/upload.js.map +1 -1
- package/dist/drivers/upload_task.cjs +223 -260
- package/dist/drivers/upload_task.cjs.map +1 -1
- package/dist/drivers/upload_task.d.ts +54 -52
- package/dist/drivers/upload_task.js +221 -258
- package/dist/drivers/upload_task.js.map +1 -1
- package/dist/drivers/urls/url.cjs +30 -35
- package/dist/drivers/urls/url.cjs.map +1 -1
- package/dist/drivers/urls/url.js +28 -33
- package/dist/drivers/urls/url.js.map +1 -1
- package/dist/drivers/virtual_storages.cjs +36 -48
- package/dist/drivers/virtual_storages.cjs.map +1 -1
- package/dist/drivers/virtual_storages.d.ts +6 -2
- package/dist/drivers/virtual_storages.js +32 -46
- package/dist/drivers/virtual_storages.js.map +1 -1
- package/dist/helpers/download.cjs +72 -95
- package/dist/helpers/download.cjs.map +1 -1
- package/dist/helpers/download.d.ts +13 -9
- package/dist/helpers/download.js +71 -93
- package/dist/helpers/download.js.map +1 -1
- package/dist/helpers/download_errors.cjs +28 -27
- package/dist/helpers/download_errors.cjs.map +1 -1
- package/dist/helpers/download_errors.d.ts +16 -13
- package/dist/helpers/download_errors.js +28 -26
- package/dist/helpers/download_errors.js.map +1 -1
- package/dist/helpers/validate.cjs +8 -7
- package/dist/helpers/validate.cjs.map +1 -1
- package/dist/helpers/validate.d.ts +4 -1
- package/dist/helpers/validate.js +6 -5
- package/dist/helpers/validate.js.map +1 -1
- package/dist/index.cjs +75 -79
- package/dist/index.d.ts +22 -22
- package/dist/index.js +22 -21
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.cjs +238 -249
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.cjs +27 -27
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.d.ts +25 -23
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.js +26 -25
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.d.ts +51 -87
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.js +238 -245
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.cjs +295 -289
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.cjs +30 -30
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.js +29 -28
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.d.ts +86 -150
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.js +295 -285
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.cjs +385 -393
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.cjs +34 -34
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.d.ts +33 -34
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.js +33 -32
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.d.ts +78 -129
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.js +385 -387
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.cjs +570 -468
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.cjs +82 -82
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.d.ts +109 -112
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.js +81 -80
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.d.ts +243 -264
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.js +569 -460
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.cjs +751 -729
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.cjs +67 -67
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.js +66 -65
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.d.ts +15 -381
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.js +749 -718
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/duration.cjs +92 -100
- package/dist/proto-grpc/google/protobuf/duration.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/duration.d.ts +38 -43
- package/dist/proto-grpc/google/protobuf/duration.js +91 -98
- package/dist/proto-grpc/google/protobuf/duration.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/timestamp.cjs +117 -128
- package/dist/proto-grpc/google/protobuf/timestamp.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/timestamp.d.ts +50 -55
- package/dist/proto-grpc/google/protobuf/timestamp.js +116 -126
- package/dist/proto-grpc/google/protobuf/timestamp.js.map +1 -1
- package/dist/proto-rest/downloadapi.d.ts +85 -91
- package/dist/proto-rest/index.d.ts +11 -16
- package/dist/proto-rest/progressapi.d.ts +130 -140
- package/dist/proto-rest/streamingapi.d.ts +413 -434
- package/package.json +12 -12
- package/dist/clients/constructors.d.ts.map +0 -1
- package/dist/clients/crc32c.d.ts +0 -2
- package/dist/clients/crc32c.d.ts.map +0 -1
- package/dist/clients/download.d.ts.map +0 -1
- package/dist/clients/logs.d.ts.map +0 -1
- package/dist/clients/ls_api.d.ts.map +0 -1
- package/dist/clients/progress.d.ts.map +0 -1
- package/dist/clients/upload.d.ts.map +0 -1
- package/dist/drivers/download_blob/blob_key.d.ts +0 -5
- package/dist/drivers/download_blob/blob_key.d.ts.map +0 -1
- package/dist/drivers/download_blob/download_blob.d.ts.map +0 -1
- package/dist/drivers/download_blob/download_blob_task.d.ts +0 -56
- package/dist/drivers/download_blob/download_blob_task.d.ts.map +0 -1
- package/dist/drivers/download_blob/sparse_cache/cache.d.ts +0 -82
- package/dist/drivers/download_blob/sparse_cache/cache.d.ts.map +0 -1
- package/dist/drivers/download_blob/sparse_cache/file.d.ts +0 -8
- package/dist/drivers/download_blob/sparse_cache/file.d.ts.map +0 -1
- package/dist/drivers/download_blob/sparse_cache/ranges.d.ts +0 -46
- package/dist/drivers/download_blob/sparse_cache/ranges.d.ts.map +0 -1
- package/dist/drivers/download_blob_url/driver.d.ts.map +0 -1
- package/dist/drivers/download_blob_url/driver_id.d.ts +0 -6
- package/dist/drivers/download_blob_url/driver_id.d.ts.map +0 -1
- package/dist/drivers/download_blob_url/snapshot.d.ts.map +0 -1
- package/dist/drivers/download_blob_url/task.d.ts.map +0 -1
- package/dist/drivers/download_url/driver.d.ts.map +0 -1
- package/dist/drivers/download_url/task.d.ts.map +0 -1
- package/dist/drivers/helpers/download_local_handle.d.ts +0 -11
- package/dist/drivers/helpers/download_local_handle.d.ts.map +0 -1
- package/dist/drivers/helpers/download_remote_handle.d.ts +0 -13
- package/dist/drivers/helpers/download_remote_handle.d.ts.map +0 -1
- package/dist/drivers/helpers/files_cache.d.ts +0 -29
- package/dist/drivers/helpers/files_cache.d.ts.map +0 -1
- package/dist/drivers/helpers/helpers.d.ts.map +0 -1
- package/dist/drivers/helpers/logs_handle.d.ts +0 -15
- package/dist/drivers/helpers/logs_handle.d.ts.map +0 -1
- package/dist/drivers/helpers/ls_remote_import_handle.d.ts +0 -8
- package/dist/drivers/helpers/ls_remote_import_handle.d.ts.map +0 -1
- package/dist/drivers/helpers/ls_storage_entry.d.ts +0 -23
- package/dist/drivers/helpers/ls_storage_entry.d.ts.map +0 -1
- package/dist/drivers/helpers/polling_ops.d.ts.map +0 -1
- package/dist/drivers/helpers/read_file.d.ts +0 -12
- package/dist/drivers/helpers/read_file.d.ts.map +0 -1
- package/dist/drivers/helpers/test_helpers.d.ts +0 -2
- package/dist/drivers/helpers/test_helpers.d.ts.map +0 -1
- package/dist/drivers/logs.d.ts.map +0 -1
- package/dist/drivers/logs_stream.d.ts.map +0 -1
- package/dist/drivers/ls.d.ts.map +0 -1
- package/dist/drivers/types.d.ts.map +0 -1
- package/dist/drivers/upload.d.ts.map +0 -1
- package/dist/drivers/upload_task.d.ts.map +0 -1
- package/dist/drivers/urls/url.d.ts +0 -13
- package/dist/drivers/urls/url.d.ts.map +0 -1
- package/dist/drivers/virtual_storages.d.ts.map +0 -1
- package/dist/helpers/download.d.ts.map +0 -1
- package/dist/helpers/download_errors.d.ts.map +0 -1
- package/dist/helpers/validate.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.client.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/downloadapi/protocol.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.d.ts +0 -46
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.client.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/lsapi/protocol.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.client.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/progressapi/protocol.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.client.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/streamingapi/protocol.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.d.ts +0 -108
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.client.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/controllers/shared/grpc/uploadapi/protocol.d.ts.map +0 -1
- package/dist/proto-grpc/google/api/http.d.ts +0 -460
- package/dist/proto-grpc/google/api/http.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/descriptor.d.ts +0 -2340
- package/dist/proto-grpc/google/protobuf/descriptor.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/duration.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/timestamp.d.ts.map +0 -1
- package/dist/proto-rest/downloadapi.d.ts.map +0 -1
- package/dist/proto-rest/index.d.ts.map +0 -1
- package/dist/proto-rest/lsapi.d.ts +0 -148
- package/dist/proto-rest/lsapi.d.ts.map +0 -1
- package/dist/proto-rest/progressapi.d.ts.map +0 -1
- package/dist/proto-rest/streamingapi.d.ts.map +0 -1
- package/dist/proto-rest/uploadapi.d.ts +0 -355
- package/dist/proto-rest/uploadapi.d.ts.map +0 -1
- package/dist/test_env.d.ts +0 -6
- package/dist/test_env.d.ts.map +0 -1
|
@@ -1,299 +1,262 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_upload = require('../clients/upload.cjs');
|
|
3
|
+
const require_types = require('./types.cjs');
|
|
4
|
+
let _milaboratories_pl_client = require("@milaboratories/pl-client");
|
|
5
|
+
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
6
|
+
let _milaboratories_computable = require("@milaboratories/computable");
|
|
7
|
+
let node_assert = require("node:assert");
|
|
8
|
+
node_assert = require_runtime.__toESM(node_assert);
|
|
9
9
|
|
|
10
|
+
//#region src/drivers/upload_task.ts
|
|
10
11
|
/** Holds all info needed to upload a file and a status of uploading
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
this.alreadyExisted = true;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
setDone(done) {
|
|
135
|
-
this.progress.done = done;
|
|
136
|
-
if (done)
|
|
137
|
-
this.progress.lastError = undefined;
|
|
138
|
-
}
|
|
139
|
-
incCounter(w, callerId) {
|
|
140
|
-
this.change.attachWatcher(w);
|
|
141
|
-
this.counter.inc(callerId);
|
|
142
|
-
}
|
|
143
|
-
decCounter(callerId) {
|
|
144
|
-
return this.counter.dec(callerId);
|
|
145
|
-
}
|
|
146
|
-
isComputableDone() {
|
|
147
|
-
return this.counter.isZero();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
12
|
+
* and indexing. Also, has a method to update a status of the progress.
|
|
13
|
+
* And holds a change source. */
|
|
14
|
+
var UploadTask = class {
|
|
15
|
+
change = new _milaboratories_computable.ChangeSource();
|
|
16
|
+
counter = new _milaboratories_ts_helpers.CallersCounter();
|
|
17
|
+
nMaxUploads;
|
|
18
|
+
nPartsWithThisUploadSpeed = 0;
|
|
19
|
+
nPartsToIncreaseUpload = 10;
|
|
20
|
+
/** If this is upload progress this field will be defined */
|
|
21
|
+
uploadData;
|
|
22
|
+
progress;
|
|
23
|
+
/** If failed, then getting a progress is terminally failed. */
|
|
24
|
+
failed;
|
|
25
|
+
/** True if the blob was existed.
|
|
26
|
+
* At this case, the task will show progress == 1.0. */
|
|
27
|
+
alreadyExisted = false;
|
|
28
|
+
constructor(logger, clientBlob, clientProgress, maxNConcurrentPartsUpload, signer, res) {
|
|
29
|
+
this.logger = logger;
|
|
30
|
+
this.clientBlob = clientBlob;
|
|
31
|
+
this.clientProgress = clientProgress;
|
|
32
|
+
this.maxNConcurrentPartsUpload = maxNConcurrentPartsUpload;
|
|
33
|
+
this.res = res;
|
|
34
|
+
this.nMaxUploads = this.maxNConcurrentPartsUpload;
|
|
35
|
+
const { uploadData, progress } = newProgress(res, signer);
|
|
36
|
+
this.uploadData = uploadData;
|
|
37
|
+
this.progress = progress;
|
|
38
|
+
}
|
|
39
|
+
getProgress(w, callerId) {
|
|
40
|
+
this.incCounter(w, callerId);
|
|
41
|
+
if (this.failed) {
|
|
42
|
+
this.logger.error(`Uploading terminally failed: ${this.progress.lastError}`);
|
|
43
|
+
throw new Error(this.progress.lastError);
|
|
44
|
+
}
|
|
45
|
+
return cloneProgress(this.progress);
|
|
46
|
+
}
|
|
47
|
+
shouldScheduleUpload() {
|
|
48
|
+
return isMyUpload(this.progress);
|
|
49
|
+
}
|
|
50
|
+
/** Uploads a blob if it's not BlobIndex. */
|
|
51
|
+
async uploadBlobTask() {
|
|
52
|
+
try {
|
|
53
|
+
await uploadBlob(this.logger, this.clientBlob, this.res, this.uploadData, this.isComputableDone.bind(this), {
|
|
54
|
+
nPartsWithThisUploadSpeed: this.nPartsWithThisUploadSpeed,
|
|
55
|
+
nPartsToIncreaseUpload: this.nPartsToIncreaseUpload,
|
|
56
|
+
currentSpeed: this.nMaxUploads,
|
|
57
|
+
maxSpeed: this.maxNConcurrentPartsUpload
|
|
58
|
+
});
|
|
59
|
+
this.change.markChanged(`blob upload for ${(0, _milaboratories_pl_client.resourceIdToString)(this.res.id)} finished`);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
if (isTerminalUploadError(e)) {
|
|
62
|
+
this.logger.warn(`terminal error while uploading a blob: ${e}`);
|
|
63
|
+
this.change.markChanged(`blob upload for ${(0, _milaboratories_pl_client.resourceIdToString)(this.res.id)} aborted: ${e.code}`);
|
|
64
|
+
this.setDone(true);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.logger.error(`error while uploading a blob: ${e}`);
|
|
68
|
+
this.change.markChanged(`blob upload for ${(0, _milaboratories_pl_client.resourceIdToString)(this.res.id)} failed`);
|
|
69
|
+
if (nonRecoverableError(e)) {
|
|
70
|
+
this.setTerminalError(e);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.setRetriableError(e);
|
|
74
|
+
if (isHeadersTimeoutError(e)) this.nMaxUploads = decreaseConcurrency(this.logger, this.nMaxUploads, 1);
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async updateStatus() {
|
|
79
|
+
try {
|
|
80
|
+
const status = await this.clientProgress.getStatus(this.res, { timeout: 1e4 });
|
|
81
|
+
const oldStatus = this.progress.status;
|
|
82
|
+
const newStatus = doneProgressIfExisted(this.alreadyExisted, protoToStatus(status));
|
|
83
|
+
this.progress.status = newStatus;
|
|
84
|
+
this.setDone(status.done);
|
|
85
|
+
if (status.done || this.progress.status.progress != oldStatus?.progress) this.change.markChanged(`upload status for ${(0, _milaboratories_pl_client.resourceIdToString)(this.res.id)} changed`);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
this.setRetriableError(e);
|
|
88
|
+
if ((0, _milaboratories_pl_client.isTimeoutError)(e)) {
|
|
89
|
+
this.logger.warn(`deadline exceeded while getting a status of BlobImport: ${e.message}`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (isTerminalUploadError(e)) {
|
|
93
|
+
this.logger.warn(`terminal error while updating BlobImport status: ${e}, ${(0, _milaboratories_pl_client.stringifyWithResourceId)(this.res)}`);
|
|
94
|
+
this.change.markChanged(`upload status for ${(0, _milaboratories_pl_client.resourceIdToString)(this.res.id)} aborted: ${e.code}`);
|
|
95
|
+
this.setDone(true);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.logger.error(`retryable error while updating a status of BlobImport: ${e}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Set non-terminal error, that task can be retried. */
|
|
102
|
+
setRetriableError(e) {
|
|
103
|
+
this.progress.lastError = String(e);
|
|
104
|
+
}
|
|
105
|
+
/** Set a terminal error, the task will throw a error instead of a progress. */
|
|
106
|
+
setTerminalError(e) {
|
|
107
|
+
this.progress.lastError = String(e);
|
|
108
|
+
this.progress.done = false;
|
|
109
|
+
this.failed = true;
|
|
110
|
+
}
|
|
111
|
+
setDoneIfOutputSet(res) {
|
|
112
|
+
if (isImportResourceOutputSet(res)) {
|
|
113
|
+
this.setDone(true);
|
|
114
|
+
this.alreadyExisted = true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
setDone(done) {
|
|
118
|
+
this.progress.done = done;
|
|
119
|
+
if (done) this.progress.lastError = void 0;
|
|
120
|
+
}
|
|
121
|
+
incCounter(w, callerId) {
|
|
122
|
+
this.change.attachWatcher(w);
|
|
123
|
+
this.counter.inc(callerId);
|
|
124
|
+
}
|
|
125
|
+
decCounter(callerId) {
|
|
126
|
+
return this.counter.dec(callerId);
|
|
127
|
+
}
|
|
128
|
+
isComputableDone() {
|
|
129
|
+
return this.counter.isZero();
|
|
130
|
+
}
|
|
131
|
+
};
|
|
150
132
|
/** Uploads a blob if it's not BlobIndex. */
|
|
151
133
|
async function uploadBlob(logger, clientBlob, res, uploadData, isDoneFn, speed) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
};
|
|
173
|
-
await tsHelpers.asyncPool(speed.currentSpeed, parts.toUpload.map(partUploadFn));
|
|
174
|
-
if (isDoneFn())
|
|
175
|
-
return;
|
|
176
|
-
await clientBlob.finalize(res, { timeout });
|
|
177
|
-
logger.info(`uploading of resource ${res.id} finished.`);
|
|
134
|
+
(0, node_assert.default)(isUpload(res), "the upload operation can be done only for BlobUploads");
|
|
135
|
+
const timeout = 1e4;
|
|
136
|
+
if (isDoneFn()) return;
|
|
137
|
+
const parts = await clientBlob.initUpload(res, { timeout });
|
|
138
|
+
logger.info(`started to upload blob ${res.id}, parts overall: ${parts.overall}, parts remained: ${parts.toUpload.length}, number of concurrent uploads: ${speed.currentSpeed}`);
|
|
139
|
+
const partUploadFn = (part) => async (controller) => {
|
|
140
|
+
if (isDoneFn()) return;
|
|
141
|
+
await clientBlob.partUpload(res, uploadData.localPath, BigInt(uploadData.modificationTime), part, parts.checksumAlgorithm, parts.checksumHeader, { timeout });
|
|
142
|
+
logger.info(`uploaded chunk ${part}/${parts.overall} of resource: ${res.id}`);
|
|
143
|
+
speed.nPartsWithThisUploadSpeed++;
|
|
144
|
+
if (speed.nPartsWithThisUploadSpeed >= speed.nPartsToIncreaseUpload) {
|
|
145
|
+
speed.nPartsWithThisUploadSpeed = 0;
|
|
146
|
+
speed.currentSpeed = increaseConcurrency(logger, speed.currentSpeed, speed.maxSpeed);
|
|
147
|
+
controller.setConcurrency(speed.currentSpeed);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
await (0, _milaboratories_ts_helpers.asyncPool)(speed.currentSpeed, parts.toUpload.map(partUploadFn));
|
|
151
|
+
if (isDoneFn()) return;
|
|
152
|
+
await clientBlob.finalize(res, { timeout });
|
|
153
|
+
logger.info(`uploading of resource ${res.id} finished.`);
|
|
178
154
|
}
|
|
179
155
|
function newProgress(res, signer) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
156
|
+
let isUploadSignMatch;
|
|
157
|
+
let uploadData;
|
|
158
|
+
if (isUpload(res)) {
|
|
159
|
+
uploadData = require_types.ImportFileHandleUploadData.parse(res.data);
|
|
160
|
+
isUploadSignMatch = isSignMatch(signer, uploadData.localPath, uploadData.pathSignature);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
uploadData,
|
|
164
|
+
progress: {
|
|
165
|
+
done: false,
|
|
166
|
+
status: void 0,
|
|
167
|
+
isUpload: isUpload(res),
|
|
168
|
+
isUploadSignMatch,
|
|
169
|
+
lastError: void 0
|
|
170
|
+
}
|
|
171
|
+
};
|
|
196
172
|
}
|
|
197
173
|
/** Returns true if we need to upload the blob that got from this progress. */
|
|
198
174
|
function isMyUpload(p) {
|
|
199
|
-
|
|
175
|
+
return p.isUpload && (p.isUploadSignMatch ?? false);
|
|
200
176
|
}
|
|
201
177
|
/** Creates a deep copy of progress,
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
178
|
+
* since we do not want to pass a mutable object
|
|
179
|
+
* to API, it led to bugs before.
|
|
180
|
+
* We do not use '...' cloning syntax
|
|
181
|
+
* for the compiler to fail here if we change API. */
|
|
206
182
|
function cloneProgress(progress) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return progress;
|
|
183
|
+
const cloned = {
|
|
184
|
+
done: progress.done,
|
|
185
|
+
isUpload: progress.isUpload,
|
|
186
|
+
isUploadSignMatch: progress.isUploadSignMatch,
|
|
187
|
+
lastError: progress.lastError
|
|
188
|
+
};
|
|
189
|
+
if (progress.status) cloned.status = {
|
|
190
|
+
progress: progress.status.progress,
|
|
191
|
+
bytesProcessed: progress.status.bytesProcessed,
|
|
192
|
+
bytesTotal: progress.status.bytesTotal
|
|
193
|
+
};
|
|
194
|
+
return progress;
|
|
220
195
|
}
|
|
221
196
|
function isImportResourceOutputSet(res) {
|
|
222
|
-
|
|
223
|
-
? res.fields.blob !== undefined
|
|
224
|
-
: res.fields.incarnation !== undefined;
|
|
197
|
+
return "blob" in res.fields ? res.fields.blob !== void 0 : res.fields.incarnation !== void 0;
|
|
225
198
|
}
|
|
226
199
|
function isUpload(res) {
|
|
227
|
-
|
|
200
|
+
return res.type.name.startsWith("BlobUpload");
|
|
228
201
|
}
|
|
229
202
|
function isSignMatch(signer, path, signature) {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
203
|
+
try {
|
|
204
|
+
signer.verify(path, signature);
|
|
205
|
+
return true;
|
|
206
|
+
} catch {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
237
209
|
}
|
|
238
210
|
function protoToStatus(proto) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
211
|
+
return {
|
|
212
|
+
progress: proto.progress ?? 0,
|
|
213
|
+
bytesProcessed: Number(proto.bytesProcessed),
|
|
214
|
+
bytesTotal: Number(proto.bytesTotal)
|
|
215
|
+
};
|
|
244
216
|
}
|
|
245
217
|
/** Special hack: if we didn't even start to upload the blob
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
218
|
+
* to backend because the result was already there,
|
|
219
|
+
* the backend does show us a status that nothing were uploaded,
|
|
220
|
+
* but we need to show the client that everything is OK.
|
|
221
|
+
* Thus, here we set progress to be 1.0 and all bytes are become processed. */
|
|
250
222
|
function doneProgressIfExisted(alreadyExisted, status) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
258
|
-
return status;
|
|
223
|
+
if (alreadyExisted && status.bytesTotal != 0 && status.bytesProcessed == 0) return {
|
|
224
|
+
progress: 1,
|
|
225
|
+
bytesProcessed: Number(status.bytesTotal),
|
|
226
|
+
bytesTotal: Number(status.bytesTotal)
|
|
227
|
+
};
|
|
228
|
+
return status;
|
|
259
229
|
}
|
|
260
230
|
function isTerminalUploadError(e) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
default:
|
|
269
|
-
return false;
|
|
270
|
-
}
|
|
231
|
+
if (e?.name !== "RpcError") return false;
|
|
232
|
+
switch (e.code) {
|
|
233
|
+
case "NOT_FOUND":
|
|
234
|
+
case "ABORTED":
|
|
235
|
+
case "ALREADY_EXISTS": return true;
|
|
236
|
+
default: return false;
|
|
237
|
+
}
|
|
271
238
|
}
|
|
272
239
|
function nonRecoverableError(e) {
|
|
273
|
-
|
|
274
|
-
e instanceof upload.UnexpectedEOF ||
|
|
275
|
-
e instanceof upload.NoFileForUploading ||
|
|
276
|
-
e instanceof upload.BadRequestError);
|
|
240
|
+
return e instanceof require_upload.MTimeError || e instanceof require_upload.UnexpectedEOF || e instanceof require_upload.NoFileForUploading || e instanceof require_upload.BadRequestError;
|
|
277
241
|
}
|
|
278
242
|
function isHeadersTimeoutError(e) {
|
|
279
|
-
|
|
243
|
+
return e?.message.includes(`UND_ERR_HEADERS_TIMEOUT`);
|
|
280
244
|
}
|
|
281
245
|
/** It's called for every upload success so if everyone is succeeded, we'll double the concurrency. */
|
|
282
246
|
function increaseConcurrency(logger, current, max) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return newConcurrency;
|
|
247
|
+
const newConcurrency = Math.min(current + 2, max);
|
|
248
|
+
if (newConcurrency != current) logger.info(`uploadTask.increaseConcurrency: increased from ${current} to ${newConcurrency}`);
|
|
249
|
+
return newConcurrency;
|
|
287
250
|
}
|
|
288
251
|
/** When a error happens, this will half the concurrency level, so the next time
|
|
289
|
-
|
|
252
|
+
* we'll try to upload blobs slower. */
|
|
290
253
|
function decreaseConcurrency(logger, current, min) {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
return newConcurrency;
|
|
254
|
+
const newConcurrency = Math.max(Math.round(current / 2), min);
|
|
255
|
+
if (newConcurrency != current) logger.info(`uploadTask.decreaseConcurrency: decreased from ${current} to ${newConcurrency}`);
|
|
256
|
+
return newConcurrency;
|
|
295
257
|
}
|
|
296
258
|
|
|
259
|
+
//#endregion
|
|
297
260
|
exports.UploadTask = UploadTask;
|
|
298
261
|
exports.isMyUpload = isMyUpload;
|
|
299
262
|
exports.isSignMatch = isSignMatch;
|
|
@@ -301,4 +264,4 @@ exports.isTerminalUploadError = isTerminalUploadError;
|
|
|
301
264
|
exports.isUpload = isUpload;
|
|
302
265
|
exports.nonRecoverableError = nonRecoverableError;
|
|
303
266
|
exports.uploadBlob = uploadBlob;
|
|
304
|
-
//# sourceMappingURL=upload_task.cjs.map
|
|
267
|
+
//# sourceMappingURL=upload_task.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload_task.cjs","sources":["../../src/drivers/upload_task.ts"],"sourcesContent":["import type { Watcher } from \"@milaboratories/computable\";\nimport { ChangeSource } from \"@milaboratories/computable\";\nimport {\n isTimeoutError,\n resourceIdToString,\n stringifyWithResourceId,\n} from \"@milaboratories/pl-client\";\nimport type * as sdk from \"@milaboratories/pl-model-common\";\nimport type { AsyncPoolController, MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { asyncPool, CallersCounter } from \"@milaboratories/ts-helpers\";\nimport type { ClientProgress, ProgressStatus } from \"../clients/progress\";\nimport type { ClientUpload } from \"../clients/upload\";\nimport { BadRequestError, MTimeError, NoFileForUploading, UnexpectedEOF } from \"../clients/upload\";\nimport type { ImportResourceSnapshot } from \"./types\";\nimport { ImportFileHandleUploadData } from \"./types\";\nimport assert from \"node:assert\";\nimport { ResourceInfo } from \"@milaboratories/pl-tree\";\n\n/** Holds all info needed to upload a file and a status of uploading\n * and indexing. Also, has a method to update a status of the progress.\n * And holds a change source. */\nexport class UploadTask {\n private readonly change: ChangeSource = new ChangeSource();\n private readonly counter: CallersCounter = new CallersCounter();\n private nMaxUploads: number;\n private nPartsWithThisUploadSpeed = 0;\n private nPartsToIncreaseUpload = 10; // how many parts we have to wait to increase concurrency, 50 mb, 10 parts by 5 mb each.\n\n /** If this is upload progress this field will be defined */\n private uploadData?: ImportFileHandleUploadData;\n public progress: sdk.ImportProgress;\n\n /** If failed, then getting a progress is terminally failed. */\n public failed?: boolean;\n\n /** True if the blob was existed.\n * At this case, the task will show progress == 1.0. */\n private alreadyExisted = false;\n\n constructor(\n private readonly logger: MiLogger,\n private readonly clientBlob: ClientUpload,\n private readonly clientProgress: ClientProgress,\n private readonly maxNConcurrentPartsUpload: number,\n signer: Signer,\n public readonly res: ImportResourceSnapshot,\n ) {\n this.nMaxUploads = this.maxNConcurrentPartsUpload;\n const { uploadData, progress } = newProgress(res, signer);\n this.uploadData = uploadData;\n this.progress = progress;\n }\n\n public getProgress(w: Watcher, callerId: string) {\n this.incCounter(w, callerId);\n\n if (this.failed) {\n this.logger.error(`Uploading terminally failed: ${this.progress.lastError}`);\n throw new Error(this.progress.lastError);\n }\n\n return cloneProgress(this.progress);\n }\n\n public shouldScheduleUpload(): boolean {\n return isMyUpload(this.progress);\n }\n\n /** Uploads a blob if it's not BlobIndex. */\n public async uploadBlobTask() {\n try {\n await uploadBlob(\n this.logger,\n this.clientBlob,\n this.res,\n this.uploadData!,\n this.isComputableDone.bind(this),\n {\n nPartsWithThisUploadSpeed: this.nPartsWithThisUploadSpeed,\n nPartsToIncreaseUpload: this.nPartsToIncreaseUpload,\n currentSpeed: this.nMaxUploads,\n maxSpeed: this.maxNConcurrentPartsUpload,\n },\n );\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} finished`);\n } catch (e: any) {\n if (isTerminalUploadError(e)) {\n this.logger.warn(`terminal error while uploading a blob: ${e}`);\n this.change.markChanged(\n `blob upload for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n\n return;\n }\n\n this.logger.error(`error while uploading a blob: ${e}`);\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} failed`);\n\n if (nonRecoverableError(e)) {\n this.setTerminalError(e);\n return;\n }\n\n this.setRetriableError(e);\n\n if (isHeadersTimeoutError(e)) {\n // we probably have a slow internet, we need to slow things a bit.\n this.nMaxUploads = decreaseConcurrency(this.logger, this.nMaxUploads, 1);\n }\n\n throw e;\n }\n }\n\n public async updateStatus() {\n try {\n // we do it with timeout in case we have slow internet.\n const status = await this.clientProgress.getStatus(this.res, { timeout: 10000 });\n\n const oldStatus = this.progress.status;\n const newStatus = doneProgressIfExisted(this.alreadyExisted, protoToStatus(status));\n this.progress.status = newStatus;\n this.setDone(status.done);\n\n if (status.done || this.progress.status.progress != oldStatus?.progress) {\n this.change.markChanged(`upload status for ${resourceIdToString(this.res.id)} changed`);\n }\n } catch (e: any) {\n this.setRetriableError(e);\n\n if (isTimeoutError(e)) {\n this.logger.warn(`deadline exceeded while getting a status of BlobImport: ${e.message}`);\n return;\n }\n\n if (isTerminalUploadError(e)) {\n this.logger.warn(\n `terminal error while updating BlobImport status: ${e}, ${stringifyWithResourceId(this.res)}`,\n );\n this.change.markChanged(\n `upload status for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n return;\n }\n\n this.logger.error(`retryable error while updating a status of BlobImport: ${e}`);\n // It was a terminal error, but when a connection drops,\n // this will stop the whole task, so we make it retryable.\n // It was like that:\n // this.change.markChanged();\n // this.setTerminalError(e);\n }\n }\n\n /** Set non-terminal error, that task can be retried. */\n private setRetriableError(e: unknown) {\n this.progress.lastError = String(e);\n }\n\n /** Set a terminal error, the task will throw a error instead of a progress. */\n private setTerminalError(e: unknown) {\n this.progress.lastError = String(e);\n this.progress.done = false;\n this.failed = true;\n }\n\n public setDoneIfOutputSet(res: ImportResourceSnapshot) {\n if (isImportResourceOutputSet(res)) {\n this.setDone(true);\n this.alreadyExisted = true;\n }\n }\n\n private setDone(done: boolean) {\n this.progress.done = done;\n if (done) this.progress.lastError = undefined;\n }\n\n public incCounter(w: Watcher, callerId: string) {\n this.change.attachWatcher(w);\n this.counter.inc(callerId);\n }\n\n public decCounter(callerId: string) {\n return this.counter.dec(callerId);\n }\n\n private isComputableDone() {\n return this.counter.isZero();\n }\n}\n\n/** Uploads a blob if it's not BlobIndex. */\nexport async function uploadBlob(\n logger: MiLogger,\n clientBlob: ClientUpload,\n res: ResourceInfo,\n uploadData: ImportFileHandleUploadData,\n isDoneFn: () => boolean,\n speed: {\n nPartsWithThisUploadSpeed: number;\n nPartsToIncreaseUpload: number;\n currentSpeed: number;\n maxSpeed: number;\n },\n) {\n assert(isUpload(res), \"the upload operation can be done only for BlobUploads\");\n const timeout = 10000; // 10 sec instead of standard 5 sec, things might be slow with a slow connection.\n\n if (isDoneFn()) return;\n const parts = await clientBlob.initUpload(res, { timeout });\n logger.info(\n `started to upload blob ${res.id},` +\n ` parts overall: ${parts.overall}, parts remained: ${parts.toUpload.length},` +\n ` number of concurrent uploads: ${speed.currentSpeed}`,\n );\n\n const partUploadFn = (part: bigint) => async (controller: AsyncPoolController) => {\n if (isDoneFn()) return;\n await clientBlob.partUpload(\n res,\n uploadData.localPath,\n BigInt(uploadData.modificationTime),\n part,\n parts.checksumAlgorithm,\n parts.checksumHeader,\n { timeout },\n );\n logger.info(`uploaded chunk ${part}/${parts.overall} of resource: ${res.id}`);\n\n // if we had a network freeze, it will be increased slowly.\n speed.nPartsWithThisUploadSpeed++;\n if (speed.nPartsWithThisUploadSpeed >= speed.nPartsToIncreaseUpload) {\n speed.nPartsWithThisUploadSpeed = 0;\n speed.currentSpeed = increaseConcurrency(logger, speed.currentSpeed, speed.maxSpeed);\n controller.setConcurrency(speed.currentSpeed);\n }\n };\n\n await asyncPool(speed.currentSpeed, parts.toUpload.map(partUploadFn));\n\n if (isDoneFn()) return;\n await clientBlob.finalize(res, { timeout });\n\n logger.info(`uploading of resource ${res.id} finished.`);\n}\n\nfunction newProgress(res: ImportResourceSnapshot, signer: Signer) {\n let isUploadSignMatch: boolean | undefined;\n let uploadData: ImportFileHandleUploadData | undefined;\n if (isUpload(res)) {\n uploadData = ImportFileHandleUploadData.parse(res.data);\n isUploadSignMatch = isSignMatch(signer, uploadData.localPath, uploadData.pathSignature);\n }\n\n return {\n uploadData: uploadData,\n progress: {\n done: false,\n status: undefined,\n isUpload: isUpload(res),\n isUploadSignMatch: isUploadSignMatch,\n lastError: undefined,\n } satisfies sdk.ImportProgress,\n };\n}\n\n/** Returns true if we need to upload the blob that got from this progress. */\nexport function isMyUpload(p: sdk.ImportProgress): boolean {\n return p.isUpload && (p.isUploadSignMatch ?? false);\n}\n\n/** Creates a deep copy of progress,\n * since we do not want to pass a mutable object\n * to API, it led to bugs before.\n * We do not use '...' cloning syntax\n * for the compiler to fail here if we change API. */\nfunction cloneProgress(progress: sdk.ImportProgress): sdk.ImportProgress {\n const cloned: sdk.ImportProgress = {\n done: progress.done,\n isUpload: progress.isUpload,\n isUploadSignMatch: progress.isUploadSignMatch,\n lastError: progress.lastError,\n };\n\n if (progress.status)\n cloned.status = {\n progress: progress.status.progress,\n bytesProcessed: progress.status.bytesProcessed,\n bytesTotal: progress.status.bytesTotal,\n };\n\n return progress;\n}\n\nfunction isImportResourceOutputSet(res: ImportResourceSnapshot) {\n return \"blob\" in res.fields\n ? res.fields.blob !== undefined\n : res.fields.incarnation !== undefined;\n}\n\nexport function isUpload(res: ResourceInfo) {\n return res.type.name.startsWith(\"BlobUpload\");\n}\n\nexport function isSignMatch(signer: Signer, path: string, signature: string): boolean {\n try {\n signer.verify(path, signature);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction protoToStatus(proto: ProgressStatus): sdk.ImportStatus {\n return {\n progress: proto.progress ?? 0,\n bytesProcessed: Number(proto.bytesProcessed),\n bytesTotal: Number(proto.bytesTotal),\n };\n}\n\n/** Special hack: if we didn't even start to upload the blob\n * to backend because the result was already there,\n * the backend does show us a status that nothing were uploaded,\n * but we need to show the client that everything is OK.\n * Thus, here we set progress to be 1.0 and all bytes are become processed. */\nfunction doneProgressIfExisted(alreadyExisted: boolean, status: sdk.ImportStatus) {\n if (alreadyExisted && status.bytesTotal != 0 && status.bytesProcessed == 0) {\n return {\n progress: 1.0,\n bytesProcessed: Number(status.bytesTotal),\n bytesTotal: Number(status.bytesTotal),\n };\n }\n\n return status;\n}\n\nexport function isTerminalUploadError(e: any) {\n if (e?.name !== \"RpcError\") return false;\n switch (e.code) {\n case \"NOT_FOUND\":\n case \"ABORTED\":\n case \"ALREADY_EXISTS\":\n return true;\n default:\n return false;\n }\n}\n\nexport function nonRecoverableError(e: any) {\n return (\n e instanceof MTimeError ||\n e instanceof UnexpectedEOF ||\n e instanceof NoFileForUploading ||\n e instanceof BadRequestError\n );\n}\n\nfunction isHeadersTimeoutError(e: any) {\n return (e as Error)?.message.includes(`UND_ERR_HEADERS_TIMEOUT`);\n}\n\n/** It's called for every upload success so if everyone is succeeded, we'll double the concurrency. */\nfunction increaseConcurrency(logger: MiLogger, current: number, max: number): number {\n const newConcurrency = Math.min(current + 2, max);\n if (newConcurrency != current)\n logger.info(`uploadTask.increaseConcurrency: increased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n\n/** When a error happens, this will half the concurrency level, so the next time\n * we'll try to upload blobs slower. */\nfunction decreaseConcurrency(logger: MiLogger, current: number, min: number): number {\n const newConcurrency = Math.max(Math.round(current / 2), min);\n if (newConcurrency != current)\n logger.info(`uploadTask.decreaseConcurrency: decreased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n"],"names":["ChangeSource","CallersCounter","resourceIdToString","isTimeoutError","stringifyWithResourceId","asyncPool","ImportFileHandleUploadData","MTimeError","UnexpectedEOF","NoFileForUploading","BadRequestError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upload_task.cjs","names":["ChangeSource","CallersCounter","ImportFileHandleUploadData","MTimeError","UnexpectedEOF","NoFileForUploading","BadRequestError"],"sources":["../../src/drivers/upload_task.ts"],"sourcesContent":["import type { Watcher } from \"@milaboratories/computable\";\nimport { ChangeSource } from \"@milaboratories/computable\";\nimport {\n isTimeoutError,\n resourceIdToString,\n stringifyWithResourceId,\n} from \"@milaboratories/pl-client\";\nimport type * as sdk from \"@milaboratories/pl-model-common\";\nimport type { AsyncPoolController, MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { asyncPool, CallersCounter } from \"@milaboratories/ts-helpers\";\nimport type { ClientProgress, ProgressStatus } from \"../clients/progress\";\nimport type { ClientUpload } from \"../clients/upload\";\nimport { BadRequestError, MTimeError, NoFileForUploading, UnexpectedEOF } from \"../clients/upload\";\nimport type { ImportResourceSnapshot } from \"./types\";\nimport { ImportFileHandleUploadData } from \"./types\";\nimport assert from \"node:assert\";\nimport { ResourceInfo } from \"@milaboratories/pl-tree\";\n\n/** Holds all info needed to upload a file and a status of uploading\n * and indexing. Also, has a method to update a status of the progress.\n * And holds a change source. */\nexport class UploadTask {\n private readonly change: ChangeSource = new ChangeSource();\n private readonly counter: CallersCounter = new CallersCounter();\n private nMaxUploads: number;\n private nPartsWithThisUploadSpeed = 0;\n private nPartsToIncreaseUpload = 10; // how many parts we have to wait to increase concurrency, 50 mb, 10 parts by 5 mb each.\n\n /** If this is upload progress this field will be defined */\n private uploadData?: ImportFileHandleUploadData;\n public progress: sdk.ImportProgress;\n\n /** If failed, then getting a progress is terminally failed. */\n public failed?: boolean;\n\n /** True if the blob was existed.\n * At this case, the task will show progress == 1.0. */\n private alreadyExisted = false;\n\n constructor(\n private readonly logger: MiLogger,\n private readonly clientBlob: ClientUpload,\n private readonly clientProgress: ClientProgress,\n private readonly maxNConcurrentPartsUpload: number,\n signer: Signer,\n public readonly res: ImportResourceSnapshot,\n ) {\n this.nMaxUploads = this.maxNConcurrentPartsUpload;\n const { uploadData, progress } = newProgress(res, signer);\n this.uploadData = uploadData;\n this.progress = progress;\n }\n\n public getProgress(w: Watcher, callerId: string) {\n this.incCounter(w, callerId);\n\n if (this.failed) {\n this.logger.error(`Uploading terminally failed: ${this.progress.lastError}`);\n throw new Error(this.progress.lastError);\n }\n\n return cloneProgress(this.progress);\n }\n\n public shouldScheduleUpload(): boolean {\n return isMyUpload(this.progress);\n }\n\n /** Uploads a blob if it's not BlobIndex. */\n public async uploadBlobTask() {\n try {\n await uploadBlob(\n this.logger,\n this.clientBlob,\n this.res,\n this.uploadData!,\n this.isComputableDone.bind(this),\n {\n nPartsWithThisUploadSpeed: this.nPartsWithThisUploadSpeed,\n nPartsToIncreaseUpload: this.nPartsToIncreaseUpload,\n currentSpeed: this.nMaxUploads,\n maxSpeed: this.maxNConcurrentPartsUpload,\n },\n );\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} finished`);\n } catch (e: any) {\n if (isTerminalUploadError(e)) {\n this.logger.warn(`terminal error while uploading a blob: ${e}`);\n this.change.markChanged(\n `blob upload for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n\n return;\n }\n\n this.logger.error(`error while uploading a blob: ${e}`);\n this.change.markChanged(`blob upload for ${resourceIdToString(this.res.id)} failed`);\n\n if (nonRecoverableError(e)) {\n this.setTerminalError(e);\n return;\n }\n\n this.setRetriableError(e);\n\n if (isHeadersTimeoutError(e)) {\n // we probably have a slow internet, we need to slow things a bit.\n this.nMaxUploads = decreaseConcurrency(this.logger, this.nMaxUploads, 1);\n }\n\n throw e;\n }\n }\n\n public async updateStatus() {\n try {\n // we do it with timeout in case we have slow internet.\n const status = await this.clientProgress.getStatus(this.res, { timeout: 10000 });\n\n const oldStatus = this.progress.status;\n const newStatus = doneProgressIfExisted(this.alreadyExisted, protoToStatus(status));\n this.progress.status = newStatus;\n this.setDone(status.done);\n\n if (status.done || this.progress.status.progress != oldStatus?.progress) {\n this.change.markChanged(`upload status for ${resourceIdToString(this.res.id)} changed`);\n }\n } catch (e: any) {\n this.setRetriableError(e);\n\n if (isTimeoutError(e)) {\n this.logger.warn(`deadline exceeded while getting a status of BlobImport: ${e.message}`);\n return;\n }\n\n if (isTerminalUploadError(e)) {\n this.logger.warn(\n `terminal error while updating BlobImport status: ${e}, ${stringifyWithResourceId(this.res)}`,\n );\n this.change.markChanged(\n `upload status for ${resourceIdToString(this.res.id)} aborted: ${e.code}`,\n );\n this.setDone(true);\n return;\n }\n\n this.logger.error(`retryable error while updating a status of BlobImport: ${e}`);\n // It was a terminal error, but when a connection drops,\n // this will stop the whole task, so we make it retryable.\n // It was like that:\n // this.change.markChanged();\n // this.setTerminalError(e);\n }\n }\n\n /** Set non-terminal error, that task can be retried. */\n private setRetriableError(e: unknown) {\n this.progress.lastError = String(e);\n }\n\n /** Set a terminal error, the task will throw a error instead of a progress. */\n private setTerminalError(e: unknown) {\n this.progress.lastError = String(e);\n this.progress.done = false;\n this.failed = true;\n }\n\n public setDoneIfOutputSet(res: ImportResourceSnapshot) {\n if (isImportResourceOutputSet(res)) {\n this.setDone(true);\n this.alreadyExisted = true;\n }\n }\n\n private setDone(done: boolean) {\n this.progress.done = done;\n if (done) this.progress.lastError = undefined;\n }\n\n public incCounter(w: Watcher, callerId: string) {\n this.change.attachWatcher(w);\n this.counter.inc(callerId);\n }\n\n public decCounter(callerId: string) {\n return this.counter.dec(callerId);\n }\n\n private isComputableDone() {\n return this.counter.isZero();\n }\n}\n\n/** Uploads a blob if it's not BlobIndex. */\nexport async function uploadBlob(\n logger: MiLogger,\n clientBlob: ClientUpload,\n res: ResourceInfo,\n uploadData: ImportFileHandleUploadData,\n isDoneFn: () => boolean,\n speed: {\n nPartsWithThisUploadSpeed: number;\n nPartsToIncreaseUpload: number;\n currentSpeed: number;\n maxSpeed: number;\n },\n) {\n assert(isUpload(res), \"the upload operation can be done only for BlobUploads\");\n const timeout = 10000; // 10 sec instead of standard 5 sec, things might be slow with a slow connection.\n\n if (isDoneFn()) return;\n const parts = await clientBlob.initUpload(res, { timeout });\n logger.info(\n `started to upload blob ${res.id},` +\n ` parts overall: ${parts.overall}, parts remained: ${parts.toUpload.length},` +\n ` number of concurrent uploads: ${speed.currentSpeed}`,\n );\n\n const partUploadFn = (part: bigint) => async (controller: AsyncPoolController) => {\n if (isDoneFn()) return;\n await clientBlob.partUpload(\n res,\n uploadData.localPath,\n BigInt(uploadData.modificationTime),\n part,\n parts.checksumAlgorithm,\n parts.checksumHeader,\n { timeout },\n );\n logger.info(`uploaded chunk ${part}/${parts.overall} of resource: ${res.id}`);\n\n // if we had a network freeze, it will be increased slowly.\n speed.nPartsWithThisUploadSpeed++;\n if (speed.nPartsWithThisUploadSpeed >= speed.nPartsToIncreaseUpload) {\n speed.nPartsWithThisUploadSpeed = 0;\n speed.currentSpeed = increaseConcurrency(logger, speed.currentSpeed, speed.maxSpeed);\n controller.setConcurrency(speed.currentSpeed);\n }\n };\n\n await asyncPool(speed.currentSpeed, parts.toUpload.map(partUploadFn));\n\n if (isDoneFn()) return;\n await clientBlob.finalize(res, { timeout });\n\n logger.info(`uploading of resource ${res.id} finished.`);\n}\n\nfunction newProgress(res: ImportResourceSnapshot, signer: Signer) {\n let isUploadSignMatch: boolean | undefined;\n let uploadData: ImportFileHandleUploadData | undefined;\n if (isUpload(res)) {\n uploadData = ImportFileHandleUploadData.parse(res.data);\n isUploadSignMatch = isSignMatch(signer, uploadData.localPath, uploadData.pathSignature);\n }\n\n return {\n uploadData: uploadData,\n progress: {\n done: false,\n status: undefined,\n isUpload: isUpload(res),\n isUploadSignMatch: isUploadSignMatch,\n lastError: undefined,\n } satisfies sdk.ImportProgress,\n };\n}\n\n/** Returns true if we need to upload the blob that got from this progress. */\nexport function isMyUpload(p: sdk.ImportProgress): boolean {\n return p.isUpload && (p.isUploadSignMatch ?? false);\n}\n\n/** Creates a deep copy of progress,\n * since we do not want to pass a mutable object\n * to API, it led to bugs before.\n * We do not use '...' cloning syntax\n * for the compiler to fail here if we change API. */\nfunction cloneProgress(progress: sdk.ImportProgress): sdk.ImportProgress {\n const cloned: sdk.ImportProgress = {\n done: progress.done,\n isUpload: progress.isUpload,\n isUploadSignMatch: progress.isUploadSignMatch,\n lastError: progress.lastError,\n };\n\n if (progress.status)\n cloned.status = {\n progress: progress.status.progress,\n bytesProcessed: progress.status.bytesProcessed,\n bytesTotal: progress.status.bytesTotal,\n };\n\n return progress;\n}\n\nfunction isImportResourceOutputSet(res: ImportResourceSnapshot) {\n return \"blob\" in res.fields\n ? res.fields.blob !== undefined\n : res.fields.incarnation !== undefined;\n}\n\nexport function isUpload(res: ResourceInfo) {\n return res.type.name.startsWith(\"BlobUpload\");\n}\n\nexport function isSignMatch(signer: Signer, path: string, signature: string): boolean {\n try {\n signer.verify(path, signature);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction protoToStatus(proto: ProgressStatus): sdk.ImportStatus {\n return {\n progress: proto.progress ?? 0,\n bytesProcessed: Number(proto.bytesProcessed),\n bytesTotal: Number(proto.bytesTotal),\n };\n}\n\n/** Special hack: if we didn't even start to upload the blob\n * to backend because the result was already there,\n * the backend does show us a status that nothing were uploaded,\n * but we need to show the client that everything is OK.\n * Thus, here we set progress to be 1.0 and all bytes are become processed. */\nfunction doneProgressIfExisted(alreadyExisted: boolean, status: sdk.ImportStatus) {\n if (alreadyExisted && status.bytesTotal != 0 && status.bytesProcessed == 0) {\n return {\n progress: 1.0,\n bytesProcessed: Number(status.bytesTotal),\n bytesTotal: Number(status.bytesTotal),\n };\n }\n\n return status;\n}\n\nexport function isTerminalUploadError(e: any) {\n if (e?.name !== \"RpcError\") return false;\n switch (e.code) {\n case \"NOT_FOUND\":\n case \"ABORTED\":\n case \"ALREADY_EXISTS\":\n return true;\n default:\n return false;\n }\n}\n\nexport function nonRecoverableError(e: any) {\n return (\n e instanceof MTimeError ||\n e instanceof UnexpectedEOF ||\n e instanceof NoFileForUploading ||\n e instanceof BadRequestError\n );\n}\n\nfunction isHeadersTimeoutError(e: any) {\n return (e as Error)?.message.includes(`UND_ERR_HEADERS_TIMEOUT`);\n}\n\n/** It's called for every upload success so if everyone is succeeded, we'll double the concurrency. */\nfunction increaseConcurrency(logger: MiLogger, current: number, max: number): number {\n const newConcurrency = Math.min(current + 2, max);\n if (newConcurrency != current)\n logger.info(`uploadTask.increaseConcurrency: increased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n\n/** When a error happens, this will half the concurrency level, so the next time\n * we'll try to upload blobs slower. */\nfunction decreaseConcurrency(logger: MiLogger, current: number, min: number): number {\n const newConcurrency = Math.max(Math.round(current / 2), min);\n if (newConcurrency != current)\n logger.info(`uploadTask.decreaseConcurrency: decreased from ${current} to ${newConcurrency}`);\n\n return newConcurrency;\n}\n"],"mappings":"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"}
|