@marinoscar/platform-api 0.1.0-next.22 → 0.1.0-next.23

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 (131) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/notifications/channels/browser-notification.channel.d.ts +11 -0
  3. package/dist/notifications/channels/browser-notification.channel.d.ts.map +1 -1
  4. package/dist/notifications/channels/browser-notification.channel.js +71 -48
  5. package/dist/notifications/channels/browser-notification.channel.js.map +1 -1
  6. package/dist/notifications/data/notifications-db.d.ts +19 -0
  7. package/dist/notifications/data/notifications-db.d.ts.map +1 -1
  8. package/dist/notifications/dto/notification.dto.d.ts +4 -0
  9. package/dist/notifications/dto/notification.dto.d.ts.map +1 -1
  10. package/dist/notifications/index.d.ts +1 -1
  11. package/dist/notifications/index.d.ts.map +1 -1
  12. package/dist/notifications/index.js.map +1 -1
  13. package/dist/notifications/notification-inbox-writer.d.ts +112 -0
  14. package/dist/notifications/notification-inbox-writer.d.ts.map +1 -0
  15. package/dist/notifications/notification-inbox-writer.js +217 -0
  16. package/dist/notifications/notification-inbox-writer.js.map +1 -0
  17. package/dist/notifications/notification-store.service.d.ts +10 -0
  18. package/dist/notifications/notification-store.service.d.ts.map +1 -1
  19. package/dist/notifications/notification-store.service.js +55 -10
  20. package/dist/notifications/notification-store.service.js.map +1 -1
  21. package/dist/notifications/notification-stream.service.d.ts +8 -0
  22. package/dist/notifications/notification-stream.service.d.ts.map +1 -1
  23. package/dist/notifications/notification-stream.service.js.map +1 -1
  24. package/dist/notifications/notification.types.d.ts +74 -0
  25. package/dist/notifications/notification.types.d.ts.map +1 -1
  26. package/dist/notifications/notification.types.js.map +1 -1
  27. package/dist/notifications/notifications.controller.d.ts +1 -0
  28. package/dist/notifications/notifications.controller.d.ts.map +1 -1
  29. package/dist/notifications/notifications.controller.js +23 -0
  30. package/dist/notifications/notifications.controller.js.map +1 -1
  31. package/dist/notifications/notifications.service.d.ts +56 -1
  32. package/dist/notifications/notifications.service.d.ts.map +1 -1
  33. package/dist/notifications/notifications.service.js +122 -0
  34. package/dist/notifications/notifications.service.js.map +1 -1
  35. package/dist/notifications/registry/event.registry.d.ts +15 -0
  36. package/dist/notifications/registry/event.registry.d.ts.map +1 -1
  37. package/dist/notifications/registry/event.registry.js +3 -0
  38. package/dist/notifications/registry/event.registry.js.map +1 -1
  39. package/dist/notifications/retention/notification-inbox-purge.handler.d.ts.map +1 -1
  40. package/dist/notifications/retention/notification-inbox-purge.handler.js +16 -4
  41. package/dist/notifications/retention/notification-inbox-purge.handler.js.map +1 -1
  42. package/dist/notifications/testing/index.d.ts +2 -0
  43. package/dist/notifications/testing/index.d.ts.map +1 -1
  44. package/dist/notifications/testing/index.js +5 -1
  45. package/dist/notifications/testing/index.js.map +1 -1
  46. package/dist/storage/config/storage-config.service.d.ts +24 -0
  47. package/dist/storage/config/storage-config.service.d.ts.map +1 -1
  48. package/dist/storage/config/storage-config.service.js +31 -5
  49. package/dist/storage/config/storage-config.service.js.map +1 -1
  50. package/dist/storage/handlers/storage-cleanup.handler.d.ts +3 -1
  51. package/dist/storage/handlers/storage-cleanup.handler.d.ts.map +1 -1
  52. package/dist/storage/handlers/storage-cleanup.handler.js +10 -3
  53. package/dist/storage/handlers/storage-cleanup.handler.js.map +1 -1
  54. package/dist/storage/index.d.ts +5 -1
  55. package/dist/storage/index.d.ts.map +1 -1
  56. package/dist/storage/index.js +12 -3
  57. package/dist/storage/index.js.map +1 -1
  58. package/dist/storage/objects/dto/get-part-urls.dto.d.ts +26 -0
  59. package/dist/storage/objects/dto/get-part-urls.dto.d.ts.map +1 -0
  60. package/dist/storage/objects/dto/get-part-urls.dto.js +25 -0
  61. package/dist/storage/objects/dto/get-part-urls.dto.js.map +1 -0
  62. package/dist/storage/objects/dto/init-upload.dto.d.ts +2 -1
  63. package/dist/storage/objects/dto/init-upload.dto.d.ts.map +1 -1
  64. package/dist/storage/objects/objects.controller.d.ts +13 -1
  65. package/dist/storage/objects/objects.controller.d.ts.map +1 -1
  66. package/dist/storage/objects/objects.controller.js +88 -1
  67. package/dist/storage/objects/objects.controller.js.map +1 -1
  68. package/dist/storage/objects/objects.service.d.ts +46 -1
  69. package/dist/storage/objects/objects.service.d.ts.map +1 -1
  70. package/dist/storage/objects/objects.service.js +277 -23
  71. package/dist/storage/objects/objects.service.js.map +1 -1
  72. package/dist/storage/objects/part-body-parser.d.ts +30 -0
  73. package/dist/storage/objects/part-body-parser.d.ts.map +1 -0
  74. package/dist/storage/objects/part-body-parser.js +45 -0
  75. package/dist/storage/objects/part-body-parser.js.map +1 -0
  76. package/dist/storage/objects/part-body.d.ts +23 -0
  77. package/dist/storage/objects/part-body.d.ts.map +1 -0
  78. package/dist/storage/objects/part-body.js +48 -0
  79. package/dist/storage/objects/part-body.js.map +1 -0
  80. package/dist/storage/processing/object-processing.service.d.ts +4 -1
  81. package/dist/storage/processing/object-processing.service.d.ts.map +1 -1
  82. package/dist/storage/processing/object-processing.service.js +11 -3
  83. package/dist/storage/processing/object-processing.service.js.map +1 -1
  84. package/dist/storage/profile-image/avatar.service.d.ts +3 -1
  85. package/dist/storage/profile-image/avatar.service.d.ts.map +1 -1
  86. package/dist/storage/profile-image/avatar.service.js +8 -3
  87. package/dist/storage/profile-image/avatar.service.js.map +1 -1
  88. package/dist/storage/profile-image/profile-image.service.d.ts +4 -1
  89. package/dist/storage/profile-image/profile-image.service.d.ts.map +1 -1
  90. package/dist/storage/profile-image/profile-image.service.js +11 -5
  91. package/dist/storage/profile-image/profile-image.service.js.map +1 -1
  92. package/dist/storage/providers/index.d.ts +3 -1
  93. package/dist/storage/providers/index.d.ts.map +1 -1
  94. package/dist/storage/providers/index.js +8 -1
  95. package/dist/storage/providers/index.js.map +1 -1
  96. package/dist/storage/providers/resolving-storage.provider.d.ts +11 -0
  97. package/dist/storage/providers/resolving-storage.provider.d.ts.map +1 -1
  98. package/dist/storage/providers/resolving-storage.provider.js +13 -0
  99. package/dist/storage/providers/resolving-storage.provider.js.map +1 -1
  100. package/dist/storage/providers/s3/s3-storage.provider.d.ts +9 -1
  101. package/dist/storage/providers/s3/s3-storage.provider.d.ts.map +1 -1
  102. package/dist/storage/providers/s3/s3-storage.provider.js +37 -0
  103. package/dist/storage/providers/s3/s3-storage.provider.js.map +1 -1
  104. package/dist/storage/providers/storage-provider-router.d.ts +64 -0
  105. package/dist/storage/providers/storage-provider-router.d.ts.map +1 -0
  106. package/dist/storage/providers/storage-provider-router.js +161 -0
  107. package/dist/storage/providers/storage-provider-router.js.map +1 -0
  108. package/dist/storage/providers/storage-provider.interface.d.ts +34 -1
  109. package/dist/storage/providers/storage-provider.interface.d.ts.map +1 -1
  110. package/dist/storage/providers/storage-provider.interface.js.map +1 -1
  111. package/dist/storage/providers/storage-provider.types.d.ts +86 -0
  112. package/dist/storage/providers/storage-provider.types.d.ts.map +1 -1
  113. package/dist/storage/providers/storage-provider.types.js +78 -0
  114. package/dist/storage/providers/storage-provider.types.js.map +1 -1
  115. package/dist/storage/providers/storage-providers.module.d.ts.map +1 -1
  116. package/dist/storage/providers/storage-providers.module.js +3 -1
  117. package/dist/storage/providers/storage-providers.module.js.map +1 -1
  118. package/dist/storage/testing/conformance.d.ts +12 -0
  119. package/dist/storage/testing/conformance.d.ts.map +1 -1
  120. package/dist/storage/testing/conformance.js +112 -0
  121. package/dist/storage/testing/conformance.js.map +1 -1
  122. package/dist/storage/testing/driver-conformance.d.ts +13 -1
  123. package/dist/storage/testing/driver-conformance.d.ts.map +1 -1
  124. package/dist/storage/testing/driver-conformance.js +134 -0
  125. package/dist/storage/testing/driver-conformance.js.map +1 -1
  126. package/dist/storage/testing/index.d.ts +1 -1
  127. package/dist/storage/testing/index.d.ts.map +1 -1
  128. package/dist/storage/testing/index.js +2 -1
  129. package/dist/storage/testing/index.js.map +1 -1
  130. package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts +1 -1
  131. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"objects.controller.js","sourceRoot":"","sources":["../../../src/storage/objects/objects.controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"objects.controller.js","sourceRoot":"","sources":["../../../src/storage/objects/objects.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAkBwB;AACxB,6CAQyB;AACzB,6CAAuC;AAEvC,2CAA+C;AAE/C,gDAAuF;AACvF,4CAAmD;AACnD,4DAAmD;AACnD,uDAAmD;AACnD,2DAK+B;AAC/B,mEAImC;AACnC,mEAGmC;AACnC,uEAIqC;AACrC,mEAImC;AACnC,+EAEyC;AACzC,4CAA2C;AAC3C,mEAI+C;AAC/C,+DAAqF;AAErF;;;;;;GAMG;AAGI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACC;IAA7B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAE/D;;OAEG;IAgBG,AAAN,KAAK,CAAC,IAAI,CAC6C,KAAyB,EAC3D,MAAc,EACnB,KAAa;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IAiBG,AAAN,KAAK,CAAC,OAAO,CACiB,EAAU,EACnB,MAAc,EACnB,KAAa;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IAwBG,AAAN,KAAK,CAAC,cAAc,CACU,EAAU,EAClB,SAA6B,EAC9B,MAAc,EACnB,KAAa;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACtF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IA0BG,AAAN,KAAK,CAAC,YAAY,CACY,EAAU,EACvB,IAAiB,EAClB,KAAa;QAE3B,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE;YACnD,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,+BAAW,CAAC,kBAAkB,CAAC;SACxE,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IAkBG,AAAN,KAAK,CAAC,cAAc,CACU,EAAU,EACa,GAAsB,EACtD,MAAc,EACnB,KAAa;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAChF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IAoBG,AAAN,KAAK,CAAC,UAAU,CACiC,GAAkB,EAC9C,MAAc,EACnB,KAAa;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IAWG,AAAN,KAAK,CAAC,eAAe,CACS,QAAgB,EACzB,MAAc,EACnB,KAAa;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAClF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IAeG,AAAN,KAAK,CAAC,WAAW,CACa,QAAgB,EACI,GAAmB,EAChD,MAAc,EACnB,KAAa;QAE3B,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACvF,CAAC;IAED;;OAEG;IAuBG,AAAN,KAAK,CAAC,UAAU,CACc,QAAgB,EACT,UAAkB,EAC9C,GAAmB,EACnB,KAAmB,EACP,MAAc,EACnB,KAAa;QAE3B,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,YAAY,sBAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,sCAA6B,CAAC;gBACtC,OAAO,EAAE,qEAAqE;gBAC9E,OAAO,EAAE,EAAE,MAAM,EAAE,8BAAoB,CAAC,iBAAiB,EAAE;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,OAAO,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEzH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAErH,uEAAuE;QACvE,KAAK,KAAK,CAAC,MAAM,CAAC,mBAAU,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED;;OAEG;IAgBG,AAAN,KAAK,CAAC,cAAc,CACU,QAAgB,EACO,GAAsB,EACtD,MAAc,EACnB,KAAa;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CACrD,QAAQ,EACR,GAAG,EACH,MAAM,EACN,KAAK,CACN,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IAYG,AAAN,KAAK,CAAC,WAAW,CACa,QAAgB,EACzB,MAAc,EACnB,KAAa;QAE3B,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IAgCG,AAAN,KAAK,CAAC,YAAY,CACT,GAAmB,EACP,MAAc,EACnB,KAAa;QAE3B,kCAAkC;QAClC,MAAM,IAAI,GAAG,MAAM,IAAA,uBAAW,EAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,4BAAmB,CAAC,kBAAkB,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CACnD;YACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,EACD,MAAM,EACN,KAAK,CACN,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;CACF,CAAA;AArZY,8CAAiB;AAqBtB;IAfL,IAAA,YAAG,GAAE;IACL,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,YAAY,CAAC,EAAE,CAAC;IACjD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,sBAAsB;QAC/B,WAAW,EAAE,0EAA0E;KACxF,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAClG,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;IACpH,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC/I,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;IAClI,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IAClH,IAAA,uBAAe,EAAC,uCAAiB,EAAE;QAClC,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,6BAA6B;KAC3C,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,8BAAiB,CAAC,6CAAqB,CAAC,CAAC,CAAA;IACnD,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;6CAId;AAqBK;IAhBL,IAAA,YAAG,EAAC,KAAK,CAAC;IACV,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,YAAY,CAAC,EAAE,CAAC;IACjD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,oBAAoB;QAC7B,WAAW,EAAE,4CAA4C;KAC1D,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,uBAAe,EAAC,uCAAiB,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IACpF,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,kBAAkB;KAChC,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,4CAA4C;KAC1D,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;gDAId;AA4BK;IAvBL,IAAA,YAAG,EAAC,cAAc,CAAC;IACnB,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,YAAY,CAAC,EAAE,CAAC;IACjD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,wDAAwD;KACtE,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;IACxH,IAAA,uBAAe,EAAC,kDAAsB,EAAE;QACvC,WAAW,EAAE,qCAAqC;KACnD,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,kCAAkC;KAChD,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,kBAAkB;KAChC,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,4CAA4C;KAC1D,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,cAAK,EAAC,WAAW,CAAC,CAAA;IAClB,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;uDAId;AA8BK;IAzBL,IAAA,eAAM,EAAC,KAAK,CAAC;IACb,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,iBAAQ,EAAC,mBAAU,CAAC,UAAU,CAAC;IAC/B,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,uBAAuB;QAChC,WAAW,EACT,sFAAsF;YACtF,2FAA2F;YAC3F,2FAA2F;YAC3F,+DAA+D;KAClE,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,6BAA6B;KAC3C,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,kBAAkB;KAChC,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EACT,iHAAiH;KACpH,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,mBAAW,GAAE,CAAA;IACb,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;qDAKd;AAsBK;IAjBL,IAAA,cAAK,EAAC,cAAc,CAAC;IACrB,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,wBAAwB;QACjC,WAAW,EAAE,sEAAsE;KACpF,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,iBAAO,EAAC,EAAE,IAAI,EAAE,2CAAqB,EAAE,CAAC;IACxC,IAAA,uBAAe,EAAC,uCAAiB,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IACpF,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,kBAAkB;KAChC,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,4CAA4C;KAC1D,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,aAAI,EAAC,IAAI,8BAAiB,CAAC,0CAAoB,CAAC,CAAC,CAAA;IACjD,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;uDAId;AAwBK;IAnBL,IAAA,aAAI,EAAC,aAAa,CAAC;IACnB,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,6BAA6B;QACtC,WAAW,EAAE,0CAA0C;KACxD,CAAC;IACD,IAAA,iBAAO,EAAC,EAAE,IAAI,EAAE,mCAAiB,EAAE,CAAC;IACpC,IAAA,uBAAe,EAAC,uCAAqB,EAAE;QACtC,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,iCAAiC;KAC/C,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,mEAAmE;KACjF,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,0EAA0E;KACxF,CAAC;IAEC,WAAA,IAAA,aAAI,EAAC,IAAI,8BAAiB,CAAC,kCAAgB,CAAC,CAAC,CAAA;IAC7C,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;mDAId;AAeK;IAVL,IAAA,YAAG,EAAC,mBAAmB,CAAC;IACxB,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,sCAAsC;KACpD,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,uBAAe,EAAC,6CAAuB,EAAE;QACxC,WAAW,EAAE,6GAA6G;KAC3H,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;wDAId;AAmBK;IAdL,IAAA,aAAI,EAAC,sBAAsB,CAAC;IAC5B,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,oBAAoB;QAC7B,WAAW,EACT,oGAAoG;YACpG,yGAAyG;YACzG,iFAAiF;KACpF,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,iBAAO,EAAC,EAAE,IAAI,EAAE,sCAAkB,EAAE,CAAC;IACrC,IAAA,uBAAe,EAAC,0CAAsB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC5E,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,wEAAwE,EAAE,CAAC;IACnH,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC;IAE7F,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,aAAI,EAAC,IAAI,8BAAiB,CAAC,2BAAiB,CAAC,CAAC,CAAA;IAC9C,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;oDAGd;AA2BK;IAtBL,IAAA,YAAG,EAAC,8BAA8B,CAAC;IACnC,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,iBAAQ,EAAC,mBAAU,CAAC,EAAE,CAAC;IACvB,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,iCAAiC;QAC1C,WAAW,EACT,uGAAuG;YACvG,2GAA2G;YAC3G,wGAAwG;YACxG,+GAA+G;KAClH,CAAC;IACD,IAAA,qBAAW,EAAC,0BAA0B,CAAC;IACvC,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IACzF,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,iEAAiE,EAAE,CAAC;IAC5G,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EACT,wIAAwI;KAC3I,CAAC;IACD,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC;IAC/F,IAAA,qBAAW,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,gEAAgE,EAAE,CAAC;IAEzG,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,cAAK,EAAC,YAAY,EAAE,qBAAY,CAAC,CAAA;IACjC,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;mDAkBd;AAoBK;IAfL,IAAA,aAAI,EAAC,qBAAqB,CAAC;IAC3B,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,2BAA2B;QACpC,WAAW,EAAE,0DAA0D;KACxE,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,iBAAO,EAAC,EAAE,IAAI,EAAE,2CAAqB,EAAE,CAAC;IACxC,IAAA,uBAAe,EAAC,uCAAiB,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IACpF,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EACT,kBAAkB,8BAAoB,CAAC,oBAAoB,sDAAsD;YACjH,MAAM,8BAAoB,CAAC,sBAAsB,0DAA0D;KAC9G,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,aAAI,EAAC,IAAI,8BAAiB,CAAC,0CAAoB,CAAC,CAAC,CAAA;IACjD,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;uDASd;AAgBK;IAXL,IAAA,eAAM,EAAC,kBAAkB,CAAC;IAC1B,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,wBAAwB;QACjC,WAAW,EAAE,wCAAwC;KACtD,CAAC;IACD,IAAA,kBAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAChF,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,6BAA6B;KAC3C,CAAC;IAEC,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;IAC1B,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;oDAGd;AAoCK;IA/BL,IAAA,aAAI,GAAE;IACN,IAAA,YAAI,EAAC,EAAE,WAAW,EAAE,CAAC,+BAAW,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,oBAAoB;QAC7B,WAAW,EAAE,qCAAqC;KACnD,CAAC;IACD,IAAA,qBAAW,EAAC,qBAAqB,CAAC;IAClC,IAAA,iBAAO,EAAC;QACP,WAAW,EAAE,gBAAgB;QAC7B,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,QAAQ;iBACjB;aACF;SACF;KACF,CAAC;IACD,IAAA,uBAAe,EAAC,uCAAiB,EAAE;QAClC,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,4BAA4B;KAC1C,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,+EAA+E;KAC7F,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,0EAA0E;KACxF,CAAC;IAEC,WAAA,IAAA,YAAG,GAAE,CAAA;IACL,WAAA,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;IACjB,WAAA,IAAA,kBAAU,GAAE,CAAA;;;;qDAoBd;4BApZU,iBAAiB;IAF7B,IAAA,iBAAO,EAAC,SAAS,CAAC;IAClB,IAAA,mBAAU,EAAC,iBAAiB,CAAC;qCAEiB,gCAAc;GADhD,iBAAiB,CAqZ7B"}
@@ -1,8 +1,11 @@
1
1
  import { ConfigService } from '@nestjs/config';
2
2
  import { Readable } from 'node:stream';
3
3
  import type { StorageProvider } from '../providers/storage-provider.interface';
4
+ import { StorageProviderRouter } from '../providers/storage-provider-router';
5
+ import { type StoredPart } from '../providers/storage-provider.types';
4
6
  import { InitUploadDto, InitUploadResponseDto } from './dto/init-upload.dto';
5
7
  import { CompleteUploadDto } from './dto/complete-upload.dto';
8
+ import type { GetPartUrlsDto, GetPartUrlsResponse } from '@marinoscar/platform-contract/storage';
6
9
  import { ObjectResponseDto, UploadStatusResponseDto } from './dto/object-response.dto';
7
10
  import { ObjectListQueryDto, ObjectListResponseDto } from './dto/object-list-query.dto';
8
11
  import { UpdateMetadataDto } from './dto/update-metadata.dto';
@@ -36,10 +39,15 @@ export declare class ObjectsService {
36
39
  private readonly processing;
37
40
  private readonly jobs;
38
41
  private readonly options?;
42
+ private readonly router?;
39
43
  private readonly logger;
40
- constructor(prisma: StoragePrisma, storageProvider: StorageProvider, config: ConfigService, processing: ObjectProcessingService, jobs: JobsService, options?: ResolvedStorageModuleOptions | undefined);
44
+ constructor(prisma: StoragePrisma, storageProvider: StorageProvider, config: ConfigService, processing: ObjectProcessingService, jobs: JobsService, options?: ResolvedStorageModuleOptions | undefined, router?: StorageProviderRouter | undefined);
41
45
  /** The multipart part size: the forRoot option, else the deployment's `storage.partSize`. */
42
46
  private partSize;
47
+ /** The provider that holds `object`'s bytes (its recorded provider and bucket). */
48
+ private providerFor;
49
+ /** The provider new uploads go to (the active one). */
50
+ private activeProvider;
43
51
  /**
44
52
  * The database client scoped to the caller's organization (row-level
45
53
  * security, issue #725): every statement runs with `app.org_id` set, so
@@ -55,6 +63,43 @@ export declare class ObjectsService {
55
63
  * Initialize a resumable multipart upload
56
64
  */
57
65
  initUpload(dto: InitUploadDto, userId: string, orgId: string): Promise<InitUploadResponseDto>;
66
+ /**
67
+ * Part URLs a client can actually PUT to, and how to authenticate them.
68
+ *
69
+ * A presigned driver (S3, R2, the default) returns its signed URLs verbatim
70
+ * with `partUploadAuth: 'none'`. A `proxied` driver cannot sign anything, so
71
+ * the client gets this API's own part route with `partUploadAuth: 'bearer'`.
72
+ */
73
+ private buildPartUrls;
74
+ /** How many parts an object of `objectSize` has, the exact size of each and the configured part size. */
75
+ private partLayout;
76
+ /** 409 `UPLOAD_PARTS_MISSING`: re-send exactly `partNumbers`, then complete again. */
77
+ private partsMissing;
78
+ /** 409 `UPLOAD_SESSION_INVALID`: the backend no longer knows the session; abort and re-initialise. */
79
+ private sessionInvalid;
80
+ /**
81
+ * The upload an owner may work on, or a 404: another user's upload and a
82
+ * missing one are indistinguishable. The in-progress rule (an open session
83
+ * and a `pending`/`uploading` row) is a 400 `UPLOAD_NOT_ACTIVE`.
84
+ */
85
+ private ownedOpenUpload;
86
+ /**
87
+ * More part URLs for an upload in progress (at most 100 per call), from the
88
+ * provider that holds the upload, so an active-provider switch mid-upload
89
+ * cannot misroute them.
90
+ */
91
+ getPartUrls(objectId: string, dto: GetPartUrlsDto, userId: string, orgId: string): Promise<GetPartUrlsResponse>;
92
+ /**
93
+ * Receives one part of a multipart upload THROUGH the API, for a driver with
94
+ * no presigned URLs. The body is streamed to the driver and never buffered;
95
+ * the platform bounds it to the exact part size, so a short or long body is a
96
+ * 400 `PART_SIZE_MISMATCH` and nothing of it is kept. The part is recorded in
97
+ * `storage_object_chunks` (its real size) so status reports it.
98
+ *
99
+ * @param declaredLength - the request's Content-Length, when sent; a wrong value is refused before a byte is read.
100
+ * @returns the part's ETag, quoted like S3's.
101
+ */
102
+ uploadPart(objectId: string, partNumber: number, userId: string, orgId: string, body: Readable, declaredLength?: number): Promise<StoredPart>;
58
103
  /**
59
104
  * Get upload status and progress
60
105
  */
@@ -1 +1 @@
1
- {"version":3,"file":"objects.service.d.ts","sourceRoot":"","sources":["../../../src/storage/objects/objects.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"objects.service.d.ts","sourceRoot":"","sources":["../../../src/storage/objects/objects.service.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AASvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,qCAAqC,CAAC;AAO7C,OAAO,EACL,aAAa,EACb,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAyB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAKlF,OAAO,KAAK,EAKV,aAAa,EAEd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAoD,KAAK,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAEzH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAqCD;;;;GAIG;AACH,qBACa,cAAc;IAIE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEhD,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAKrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAKzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IApB1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAGd,MAAM,EAAE,aAAa,EAE9C,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,aAAa,EAGrB,UAAU,EAAE,uBAAuB,EACnC,IAAI,EAAE,WAAW,EAKjB,OAAO,CAAC,EAAE,4BAA4B,YAAA,EAKtC,MAAM,CAAC,EAAE,qBAAqB,YAAA;IAOjD,6FAA6F;IAC7F,OAAO,CAAC,QAAQ;IAIhB,mFAAmF;IACnF,OAAO,CAAC,WAAW;IAInB,uDAAuD;IACvD,OAAO,CAAC,cAAc;IAItB;;;;OAIG;IACH,OAAO,CAAC,EAAE;IAIV;;;OAGG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACG,UAAU,CACd,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC;IAwFjC;;;;;;OAMG;YACW,aAAa;IA4B3B,yGAAyG;IACzG,OAAO,CAAC,UAAU;IAWlB,sFAAsF;IACtF,OAAO,CAAC,YAAY;IAWpB,sGAAsG;IACtG,OAAO,CAAC,cAAc;IAStB;;;;OAIG;YACW,eAAe;IAiB7B;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAoBrH;;;;;;;;;OASG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,QAAQ,EACd,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,UAAU,CAAC;IA2DtB;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,uBAAuB,CAAC;IA0DnC;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,iBAAiB,CAAC;IA2K7B;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCjF;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,iBAAiB,CAAC;IAsE7B;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC;IA6CjC;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAKpF;;OAEG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC;IA8BlC;;;;;;;;;;;;;;OAcG;IACG,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC,IAAI,CAAC;IA6BhB;;OAEG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,iBAAiB,CAAC;IA2B7B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;OAGG;YACW,sBAAsB;IAuBpC;;;;;;;;;;;;;OAaG;YACW,YAAY;IA6B1B;;;;;;;OAOG;YACW,qBAAqB;IAoBnC,OAAO,CAAC,cAAc;IAetB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;YACW,gBAAgB;CAkB/B"}
@@ -25,6 +25,10 @@ const storage_key_prefix_registry_1 = require("../storage-key-prefix.registry");
25
25
  const profile_image_1 = require("../profile-image/profile-image");
26
26
  const mime_type_match_1 = require("../mime-type-match");
27
27
  const storage_provider_interface_1 = require("../providers/storage-provider.interface");
28
+ const storage_provider_router_1 = require("../providers/storage-provider-router");
29
+ const storage_provider_types_1 = require("../providers/storage-provider.types");
30
+ const storage_1 = require("@marinoscar/platform-contract/storage");
31
+ const part_body_1 = require("./part-body");
28
32
  const index_1 = require("../../jobs/index");
29
33
  const object_processing_service_1 = require("../processing/object-processing.service");
30
34
  const processing_metadata_1 = require("../processing/processing-metadata");
@@ -33,6 +37,21 @@ const storage_job_input_1 = require("../storage-job-input");
33
37
  const index_2 = require("../../core/index");
34
38
  const storage_db_1 = require("../data/storage-db");
35
39
  const storage_options_1 = require("../storage.options");
40
+ /** Statuses of an object whose multipart upload is still open. */
41
+ const IN_PROGRESS_STATUSES = new Set(['pending', 'uploading']);
42
+ /** The API's own part route, appended to the deployment origin for a `proxied` driver. */
43
+ const PART_ROUTE_PREFIX = '/api/storage/objects';
44
+ /**
45
+ * Whether an error means the backend no longer knows the multipart session
46
+ * (completed, aborted, garbage-collected): the S3 `NoSuchUpload`, or a driver's
47
+ * {@link MultipartSessionNotFoundError}. A client-state error, never a 500.
48
+ */
49
+ function isStaleMultipartSessionError(error) {
50
+ if (error instanceof storage_provider_types_1.MultipartSessionNotFoundError)
51
+ return true;
52
+ const named = error;
53
+ return named?.name === 'NoSuchUpload' || named?.Code === 'NoSuchUpload';
54
+ }
36
55
  /**
37
56
  * Longest transaction recording the parts of a completed multipart upload
38
57
  * (Prisma's default is 5 s; an upload can have 10 000 parts).
@@ -60,17 +79,19 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
60
79
  processing;
61
80
  jobs;
62
81
  options;
82
+ router;
63
83
  logger = new common_1.Logger(ObjectsService_1.name);
64
84
  constructor(prisma, storageProvider, config,
65
85
  // #520: post-upload processing is a queue job. These two decide, at
66
86
  // upload time, whether one is needed and queue it — see `settleUpload`.
67
- processing, jobs, options) {
87
+ processing, jobs, options, router) {
68
88
  this.prisma = prisma;
69
89
  this.storageProvider = storageProvider;
70
90
  this.config = config;
71
91
  this.processing = processing;
72
92
  this.jobs = jobs;
73
93
  this.options = options;
94
+ this.router = router;
74
95
  // The `uploads` key prefix this service builds keys under (#736); a no-op
75
96
  // when `StorageModule.forRoot()` or the app's manifest registered it.
76
97
  (0, storage_key_prefixes_1.ensureStorageSliceKeyPrefixes)();
@@ -79,6 +100,14 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
79
100
  partSize() {
80
101
  return this.options?.partSizeBytes ?? this.config.get('storage.partSize', storage_options_1.DEFAULT_STORAGE_PART_SIZE_BYTES);
81
102
  }
103
+ /** The provider that holds `object`'s bytes (its recorded provider and bucket). */
104
+ providerFor(object) {
105
+ return this.router ? this.router.forObject(object) : Promise.resolve(this.storageProvider);
106
+ }
107
+ /** The provider new uploads go to (the active one). */
108
+ activeProvider() {
109
+ return this.router ? this.router.forLocation(null) : Promise.resolve(this.storageProvider);
110
+ }
82
111
  /**
83
112
  * The database client scoped to the caller's organization (row-level
84
113
  * security, issue #725): every statement runs with `app.org_id` set, so
@@ -119,8 +148,10 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
119
148
  // or anywhere rebuilds a key for an existing row.
120
149
  const storageKey = this.newUploadKey(orgId, name);
121
150
  this.logger.log(`Initializing upload for ${name}, ${totalParts} parts`);
151
+ // New bytes go to the ACTIVE provider; the row records which one.
152
+ const provider = await this.activeProvider();
122
153
  // Initialize multipart upload with storage provider
123
- const { uploadId } = await this.storageProvider.initMultipartUpload(storageKey, { mimeType });
154
+ const { uploadId } = await provider.initMultipartUpload(storageKey, { mimeType });
124
155
  // Create StorageObject record
125
156
  const storageObject = await this.db(orgId, userId).storageObject.create({
126
157
  data: {
@@ -133,20 +164,18 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
133
164
  // must not leave a trail of rows claiming their objects are in S3. It
134
165
  // comes from the same snapshot `getBucket()` answers from, so this pair
135
166
  // names one configuration.
136
- storageProvider: this.storageProvider.kind,
137
- bucket: this.storageProvider.getBucket(),
167
+ storageProvider: provider.kind,
168
+ bucket: provider.getBucket(),
138
169
  status: 'pending',
139
170
  s3UploadId: uploadId,
140
171
  uploadedById: userId,
141
172
  orgId,
142
173
  },
143
174
  });
144
- // Generate presigned URLs for first batch (up to 10 parts)
145
- const urlBatchSize = Math.min(10, totalParts);
146
- const presignedUrls = await Promise.all(Array.from({ length: urlBatchSize }, (_, i) => i + 1).map(async (partNumber) => ({
147
- partNumber,
148
- url: await this.storageProvider.getSignedUploadUrl(storageKey, uploadId, partNumber),
149
- })));
175
+ // Part URLs for the first batch (at most 10): presigned provider URLs, or
176
+ // this API's own part route when the driver has none.
177
+ const urlBatchSize = Math.min(storage_1.INIT_UPLOAD_PART_URL_BATCH, totalParts);
178
+ const { presignedUrls, partUploadAuth } = await this.buildPartUrls(provider, storageObject.id, storageKey, uploadId, Array.from({ length: urlBatchSize }, (_, i) => i + 1));
150
179
  this.logger.log(`Upload initialized: ${storageObject.id}, uploadId: ${uploadId}`);
151
180
  return {
152
181
  objectId: storageObject.id,
@@ -154,8 +183,153 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
154
183
  partSize,
155
184
  totalParts,
156
185
  presignedUrls,
186
+ partUploadAuth,
187
+ };
188
+ }
189
+ /**
190
+ * Part URLs a client can actually PUT to, and how to authenticate them.
191
+ *
192
+ * A presigned driver (S3, R2, the default) returns its signed URLs verbatim
193
+ * with `partUploadAuth: 'none'`. A `proxied` driver cannot sign anything, so
194
+ * the client gets this API's own part route with `partUploadAuth: 'bearer'`.
195
+ */
196
+ async buildPartUrls(provider, objectId, storageKey, uploadId, partNumbers) {
197
+ if (provider.partUploadMode === 'proxied') {
198
+ const origin = (this.config.get('appUrl') ?? '').replace(/\/+$/, '');
199
+ return {
200
+ presignedUrls: partNumbers.map((partNumber) => ({
201
+ partNumber,
202
+ url: `${origin}${PART_ROUTE_PREFIX}/${objectId}/upload/parts/${partNumber}`,
203
+ })),
204
+ partUploadAuth: 'bearer',
205
+ };
206
+ }
207
+ const presignedUrls = await Promise.all(partNumbers.map(async (partNumber) => ({
208
+ partNumber,
209
+ url: await provider.getSignedUploadUrl(storageKey, uploadId, partNumber),
210
+ })));
211
+ return { presignedUrls, partUploadAuth: 'none' };
212
+ }
213
+ /** How many parts an object of `objectSize` has, the exact size of each and the configured part size. */
214
+ partLayout(objectSize) {
215
+ const partSize = this.partSize();
216
+ const totalParts = Math.max(1, Math.ceil(objectSize / partSize));
217
+ return {
218
+ partSize,
219
+ totalParts,
220
+ sizeOf: (partNumber) => (partNumber < totalParts ? partSize : objectSize - partSize * (totalParts - 1)),
157
221
  };
158
222
  }
223
+ /** 409 `UPLOAD_PARTS_MISSING`: re-send exactly `partNumbers`, then complete again. */
224
+ partsMissing(objectId, partNumbers) {
225
+ const sorted = [...new Set(partNumbers)].sort((a, b) => a - b);
226
+ this.logger.warn(`Refusing to complete upload ${objectId}: missing or mismatching part(s) ${sorted.join(', ')}`);
227
+ return new common_1.ConflictException({
228
+ message: 'Some parts of this upload are missing or do not match their ETag. Re-send the listed parts, then complete the upload again.',
229
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.UPLOAD_PARTS_MISSING, partNumbers: sorted },
230
+ });
231
+ }
232
+ /** 409 `UPLOAD_SESSION_INVALID`: the backend no longer knows the session; abort and re-initialise. */
233
+ sessionInvalid(objectId) {
234
+ this.logger.warn(`Multipart session for object ${objectId} is no longer valid on the storage backend`);
235
+ return new common_1.ConflictException({
236
+ message: 'The multipart upload session is no longer valid on the storage backend. Re-initialize the upload and send the parts again.',
237
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.UPLOAD_SESSION_INVALID },
238
+ });
239
+ }
240
+ /**
241
+ * The upload an owner may work on, or a 404: another user's upload and a
242
+ * missing one are indistinguishable. The in-progress rule (an open session
243
+ * and a `pending`/`uploading` row) is a 400 `UPLOAD_NOT_ACTIVE`.
244
+ */
245
+ async ownedOpenUpload(objectId, userId, orgId) {
246
+ const row = await this.db(orgId, userId).storageObject.findUnique({ where: { id: objectId } });
247
+ if (!row || row.uploadedById !== userId) {
248
+ throw new common_1.NotFoundException('Upload not found');
249
+ }
250
+ if (!row.s3UploadId || !IN_PROGRESS_STATUSES.has(row.status)) {
251
+ throw new common_1.BadRequestException({
252
+ message: `Upload is not in progress (status: ${row.status})`,
253
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.UPLOAD_NOT_ACTIVE, status: row.status },
254
+ });
255
+ }
256
+ return row;
257
+ }
258
+ /**
259
+ * More part URLs for an upload in progress (at most 100 per call), from the
260
+ * provider that holds the upload, so an active-provider switch mid-upload
261
+ * cannot misroute them.
262
+ */
263
+ async getPartUrls(objectId, dto, userId, orgId) {
264
+ const row = await this.ownedOpenUpload(objectId, userId, orgId);
265
+ const { totalParts } = this.partLayout(Number(row.size));
266
+ const outOfRange = dto.partNumbers.filter((n) => n > totalParts);
267
+ if (outOfRange.length > 0) {
268
+ throw new common_1.BadRequestException({
269
+ message: `Part numbers must be between 1 and ${totalParts}`,
270
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.PART_OUT_OF_RANGE, totalParts, partNumbers: outOfRange },
271
+ });
272
+ }
273
+ const provider = await this.providerFor(row);
274
+ const result = await this.buildPartUrls(provider, objectId, row.storageKey, row.s3UploadId, dto.partNumbers);
275
+ this.logger.log(`Minted ${result.presignedUrls.length} part URL(s) for object ${objectId}`);
276
+ return result;
277
+ }
278
+ /**
279
+ * Receives one part of a multipart upload THROUGH the API, for a driver with
280
+ * no presigned URLs. The body is streamed to the driver and never buffered;
281
+ * the platform bounds it to the exact part size, so a short or long body is a
282
+ * 400 `PART_SIZE_MISMATCH` and nothing of it is kept. The part is recorded in
283
+ * `storage_object_chunks` (its real size) so status reports it.
284
+ *
285
+ * @param declaredLength - the request's Content-Length, when sent; a wrong value is refused before a byte is read.
286
+ * @returns the part's ETag, quoted like S3's.
287
+ */
288
+ async uploadPart(objectId, partNumber, userId, orgId, body, declaredLength) {
289
+ const row = await this.ownedOpenUpload(objectId, userId, orgId);
290
+ const provider = await this.providerFor(row);
291
+ if (provider.partUploadMode !== 'proxied' || !provider.uploadPart) {
292
+ throw new common_1.BadRequestException({
293
+ message: 'This upload takes its parts at the presigned URLs returned by upload/init and upload/part-urls, not through the API.',
294
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.PRESIGNED_PARTS_REQUIRED },
295
+ });
296
+ }
297
+ const { partSize, totalParts, sizeOf } = this.partLayout(Number(row.size));
298
+ if (!Number.isInteger(partNumber) || partNumber < 1 || partNumber > totalParts) {
299
+ throw new common_1.BadRequestException({
300
+ message: `Part number must be between 1 and ${totalParts}`,
301
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.PART_OUT_OF_RANGE, totalParts },
302
+ });
303
+ }
304
+ const expectedSize = sizeOf(partNumber);
305
+ const mismatch = (receivedSize) => new common_1.BadRequestException({
306
+ message: `Part ${partNumber} must be exactly ${expectedSize} bytes`,
307
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.PART_SIZE_MISMATCH, partNumber, expectedSize, receivedSize, partSize },
308
+ });
309
+ if (declaredLength !== undefined && declaredLength !== expectedSize) {
310
+ // Refuse before reading anything; discard the unread body.
311
+ body.resume();
312
+ throw mismatch(declaredLength);
313
+ }
314
+ let stored;
315
+ try {
316
+ stored = await provider.uploadPart(row.storageKey, row.s3UploadId, partNumber, (0, part_body_1.boundPartBody)(body, partNumber, expectedSize), expectedSize);
317
+ }
318
+ catch (error) {
319
+ if (error instanceof storage_provider_types_1.PartSizeMismatchError)
320
+ throw mismatch(error.exceeded ? null : error.receivedSize);
321
+ if (isStaleMultipartSessionError(error))
322
+ throw this.sessionInvalid(objectId);
323
+ throw error;
324
+ }
325
+ const eTag = `"${(0, storage_provider_types_1.normalizeEtag)(stored.eTag)}"`;
326
+ await this.db(orgId, userId).storageObjectChunk.upsert({
327
+ where: { objectId_partNumber: { objectId, partNumber } },
328
+ create: { objectId, orgId, partNumber, eTag, size: BigInt(expectedSize) },
329
+ update: { eTag, size: BigInt(expectedSize) },
330
+ });
331
+ return { eTag };
332
+ }
159
333
  /**
160
334
  * Get upload status and progress
161
335
  */
@@ -171,10 +345,30 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
171
345
  if (storageObject.uploadedById !== userId) {
172
346
  throw new common_1.ForbiddenException('You do not own this upload');
173
347
  }
174
- const uploadedParts = storageObject.chunks
348
+ let uploadedParts = storageObject.chunks
175
349
  .map((chunk) => chunk.partNumber)
176
350
  .sort((a, b) => a - b);
177
- const uploadedBytes = storageObject.chunks.reduce((sum, chunk) => sum + chunk.size, BigInt(0));
351
+ let uploadedBytes = storageObject.chunks.reduce((sum, chunk) => sum + chunk.size, BigInt(0));
352
+ // While the upload is open, what the BACKEND holds is the truth: a client
353
+ // PUTs parts straight to S3 and never reports each one, so the chunk rows
354
+ // (written at `complete`) would always read empty to a client resuming
355
+ // after a crash. A driver that cannot list parts keeps the chunk rows.
356
+ if (storageObject.s3UploadId && IN_PROGRESS_STATUSES.has(storageObject.status)) {
357
+ const provider = await this.providerFor(storageObject);
358
+ if (provider.listUploadedParts) {
359
+ let held;
360
+ try {
361
+ held = await provider.listUploadedParts(storageObject.storageKey, storageObject.s3UploadId);
362
+ }
363
+ catch (error) {
364
+ if (isStaleMultipartSessionError(error))
365
+ throw this.sessionInvalid(objectId);
366
+ throw error;
367
+ }
368
+ uploadedParts = held.map((part) => part.partNumber).sort((a, b) => a - b);
369
+ uploadedBytes = held.reduce((sum, part) => sum + BigInt(part.size), BigInt(0));
370
+ }
371
+ }
178
372
  const partSize = this.partSize();
179
373
  const totalParts = Math.ceil(Number(storageObject.size) / partSize);
180
374
  return {
@@ -206,6 +400,44 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
206
400
  }
207
401
  const { parts } = dto;
208
402
  this.logger.log(`Completing upload ${objectId} with ${parts.length} parts`);
403
+ // The provider that holds this upload, not the active one.
404
+ const provider = await this.providerFor(storageObject);
405
+ // A backend that can list its parts says exactly which are missing, or whose
406
+ // ETag differs from the client's, BEFORE anything is recorded or completed.
407
+ // Every part of the object must be listed too: concatenating 1 and 3 without
408
+ // 2 is a corrupt file, not a smaller one.
409
+ if (provider.listUploadedParts || provider.partUploadMode === 'proxied') {
410
+ const { totalParts } = this.partLayout(Number(storageObject.size));
411
+ const listed = new Set(parts.map((part) => part.partNumber));
412
+ const outOfRange = [...listed].filter((n) => n > totalParts);
413
+ if (outOfRange.length > 0) {
414
+ throw new common_1.BadRequestException({
415
+ message: `Part numbers must be between 1 and ${totalParts}`,
416
+ details: { reason: storage_1.UPLOAD_ERROR_REASONS.PART_OUT_OF_RANGE, totalParts, partNumbers: outOfRange.sort((a, b) => a - b) },
417
+ });
418
+ }
419
+ const unlisted = Array.from({ length: totalParts }, (_, i) => i + 1).filter((n) => !listed.has(n));
420
+ let missing = unlisted;
421
+ if (provider.listUploadedParts) {
422
+ let held;
423
+ try {
424
+ held = await provider.listUploadedParts(storageObject.storageKey, storageObject.s3UploadId);
425
+ }
426
+ catch (error) {
427
+ if (isStaleMultipartSessionError(error))
428
+ throw this.sessionInvalid(objectId);
429
+ throw error;
430
+ }
431
+ const heldEtags = new Map(held.map((part) => [part.partNumber, (0, storage_provider_types_1.normalizeEtag)(part.eTag)]));
432
+ const mismatching = parts
433
+ .filter((part) => heldEtags.get(part.partNumber) !== (0, storage_provider_types_1.normalizeEtag)(part.eTag))
434
+ .map((part) => part.partNumber);
435
+ missing = [...unlisted, ...mismatching];
436
+ }
437
+ if (missing.length > 0) {
438
+ throw this.partsMissing(objectId, missing);
439
+ }
440
+ }
209
441
  // Record chunks in database: one scoped transaction for all parts (a
210
442
  // scoped client would open one transaction per upsert, and a large upload
211
443
  // has thousands of parts). Each chunk carries its object's org_id, which
@@ -232,8 +464,27 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
232
464
  });
233
465
  }
234
466
  }, { userId, timeout: CHUNK_RECORD_TIMEOUT_MS });
235
- // Complete upload with storage provider
236
- await this.storageProvider.completeMultipartUpload(storageObject.storageKey, storageObject.s3UploadId, parts);
467
+ // Complete upload with the provider that holds it. A dead session or a part
468
+ // the backend rejects is CLIENT STATE, not a server fault: say which, so the
469
+ // client re-sends those parts or re-initialises instead of seeing a 500.
470
+ try {
471
+ await provider.completeMultipartUpload(storageObject.storageKey, storageObject.s3UploadId, parts);
472
+ }
473
+ catch (error) {
474
+ if (error instanceof storage_provider_types_1.MultipartPartsMissingError) {
475
+ // Forget the bad parts so status stops reporting them as uploaded.
476
+ await this.db(orgId, userId).storageObjectChunk.deleteMany({
477
+ where: { objectId, partNumber: { in: error.partNumbers } },
478
+ });
479
+ throw this.partsMissing(objectId, error.partNumbers);
480
+ }
481
+ if (isStaleMultipartSessionError(error))
482
+ throw this.sessionInvalid(objectId);
483
+ if (error?.name === 'InvalidPart') {
484
+ throw this.partsMissing(objectId, parts.map((part) => part.partNumber));
485
+ }
486
+ throw error;
487
+ }
237
488
  // `processing`, then either `ready` (no processor applies) or a queued
238
489
  // processing job — in ONE transaction, so the row never reads
239
490
  // `processing` without a job that will settle it.
@@ -289,8 +540,8 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
289
540
  throw new common_1.BadRequestException('Upload ID not found');
290
541
  }
291
542
  this.logger.log(`Aborting upload ${objectId}`);
292
- // Abort with storage provider
293
- await this.storageProvider.abortMultipartUpload(storageObject.storageKey, storageObject.s3UploadId);
543
+ // Abort with the provider that holds the upload
544
+ await (await this.providerFor(storageObject)).abortMultipartUpload(storageObject.storageKey, storageObject.s3UploadId);
294
545
  // Delete database records
295
546
  await this.db(orgId, userId).storageObject.delete({
296
547
  where: { id: objectId },
@@ -322,11 +573,13 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
322
573
  // Generate storage key (org-aware since #736; see `initUpload`).
323
574
  const storageKey = this.newUploadKey(orgId, filename);
324
575
  this.logger.log(`Simple upload starting: ${filename}`);
325
- // Upload to storage
326
- const result = await this.storageProvider.upload(storageKey, stream, {
576
+ // Upload to storage: new bytes go to the active provider, and the row
577
+ // records which one took them.
578
+ const provider = await this.activeProvider();
579
+ const result = await provider.upload(storageKey, stream, {
327
580
  mimeType: mimetype,
328
581
  });
329
- const storageProvider = this.storageProvider.kind;
582
+ const storageProvider = provider.kind;
330
583
  // We don't know the size until after upload for streams
331
584
  // Use a default size of 0, should be updated in post-processing.
332
585
  // Created and settled (`ready`, or a queued processing job) in ONE
@@ -420,7 +673,7 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
420
673
  }
421
674
  const defaultExpiry = this.config.get('storage.signedUrlExpiry', 3600);
422
675
  const expiry = expiresIn || defaultExpiry;
423
- const url = await this.storageProvider.getSignedDownloadUrl(object.storageKey, { expiresIn: expiry });
676
+ const url = await (await this.providerFor(object)).getSignedDownloadUrl(object.storageKey, { expiresIn: expiry });
424
677
  this.logger.log(`Generated download URL for object ${id}, expires in ${expiry}s`);
425
678
  return {
426
679
  url,
@@ -448,8 +701,8 @@ let ObjectsService = ObjectsService_1 = class ObjectsService {
448
701
  ? await this.getObjectForDeleteAny(id, userId, orgId)
449
702
  : await this.getObjectWithAuthCheck(id, userId, orgId);
450
703
  this.logger.log(`Deleting object ${id} from storage and database`);
451
- // Delete from storage provider
452
- await this.storageProvider.delete(object.storageKey);
704
+ // Delete from the provider that holds the bytes, not the active one
705
+ await (await this.providerFor(object)).delete(object.storageKey);
453
706
  // Delete from database (cascade deletes chunks)
454
707
  await this.db(orgId, userId).storageObject.delete({
455
708
  where: { id },
@@ -635,8 +888,9 @@ exports.ObjectsService = ObjectsService = ObjectsService_1 = __decorate([
635
888
  __param(1, (0, common_2.Inject)(storage_provider_interface_1.STORAGE_PROVIDER)),
636
889
  __param(5, (0, common_1.Optional)()),
637
890
  __param(5, (0, common_2.Inject)(storage_options_1.STORAGE_OPTIONS)),
891
+ __param(6, (0, common_1.Optional)()),
638
892
  __metadata("design:paramtypes", [Object, Object, config_1.ConfigService,
639
893
  object_processing_service_1.ObjectProcessingService,
640
- index_1.JobsService, Object])
894
+ index_1.JobsService, Object, storage_provider_router_1.StorageProviderRouter])
641
895
  ], ObjectsService);
642
896
  //# sourceMappingURL=objects.service.js.map