@cobaltcore-dev/aurora 0.22.0 → 0.23.0

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 (127) hide show
  1. package/dist/client/{AuthProvider-p1e1DuKU.mjs → AuthProvider-CQ6Yppoh.mjs} +2 -2
  2. package/dist/client/{AuthProvider-p1e1DuKU.mjs.map → AuthProvider-CQ6Yppoh.mjs.map} +1 -1
  3. package/dist/client/{BucketToastNotifications-BGd2wVmh.mjs → BucketToastNotifications-BhPi4WWw.mjs} +3 -3
  4. package/dist/client/{BucketToastNotifications-BGd2wVmh.mjs.map → BucketToastNotifications-BhPi4WWw.mjs.map} +1 -1
  5. package/dist/client/{ContentHeader-BIScbvb4.mjs → ContentHeader-9KZdhOoA.mjs} +2 -2
  6. package/dist/client/{ContentHeader-BIScbvb4.mjs.map → ContentHeader-9KZdhOoA.mjs.map} +1 -1
  7. package/dist/client/{DeleteFlavorModal-lFMExcq_.mjs → DeleteFlavorModal-Be2qZo4w.mjs} +2 -2
  8. package/dist/client/{DeleteFlavorModal-lFMExcq_.mjs.map → DeleteFlavorModal-Be2qZo4w.mjs.map} +1 -1
  9. package/dist/client/{DeletePcaModal-Dg9dej-H.mjs → DeletePcaModal-CIFsGWyj.mjs} +4 -4
  10. package/dist/client/{DeletePcaModal-Dg9dej-H.mjs.map → DeletePcaModal-CIFsGWyj.mjs.map} +1 -1
  11. package/dist/client/{DetailsInfo-DwCo9P1o.mjs → DetailsInfo-CHVD7d-W.mjs} +3 -3
  12. package/dist/client/{DetailsInfo-DwCo9P1o.mjs.map → DetailsInfo-CHVD7d-W.mjs.map} +1 -1
  13. package/dist/client/{FiltersInput-cOaaRpcQ.mjs → FiltersInput-DqT08Ib-.mjs} +2 -2
  14. package/dist/client/{FiltersInput-cOaaRpcQ.mjs.map → FiltersInput-DqT08Ib-.mjs.map} +1 -1
  15. package/dist/client/{FloatingIpActionModals-CDF8LVtX.mjs → FloatingIpActionModals-BcceUHcg.mjs} +4 -4
  16. package/dist/client/{FloatingIpActionModals-CDF8LVtX.mjs.map → FloatingIpActionModals-BcceUHcg.mjs.map} +1 -1
  17. package/dist/client/{ImageToastNotifications-Dzq6jNTm.mjs → ImageToastNotifications-BGyX2J6j.mjs} +5 -5
  18. package/dist/client/ImageToastNotifications-BGyX2J6j.mjs.map +1 -0
  19. package/dist/client/{RouteError-BmZRk_ss.mjs → RouteError-Rm08PcxN.mjs} +2 -2
  20. package/dist/client/{RouteError-BmZRk_ss.mjs.map → RouteError-Rm08PcxN.mjs.map} +1 -1
  21. package/dist/client/{SortInput-DjaEHvcO.mjs → SortInput-D_q_jDfe.mjs} +2 -2
  22. package/dist/client/{SortInput-DjaEHvcO.mjs.map → SortInput-D_q_jDfe.mjs.map} +1 -1
  23. package/dist/client/{StatusError-CLB026fg.mjs → StatusError-2ZU1gFpu.mjs} +2 -2
  24. package/dist/client/{StatusError-CLB026fg.mjs.map → StatusError-2ZU1gFpu.mjs.map} +1 -1
  25. package/dist/client/{_auth-Dut7CaMR.mjs → _auth-D5_QNUos.mjs} +2 -2
  26. package/dist/client/{_auth-Dut7CaMR.mjs.map → _auth-D5_QNUos.mjs.map} +1 -1
  27. package/dist/client/{_flavorId-DUWdFEMH.mjs → _flavorId-BsmqS9hP.mjs} +7 -7
  28. package/dist/client/{_flavorId-DUWdFEMH.mjs.map → _flavorId-BsmqS9hP.mjs.map} +1 -1
  29. package/dist/client/{_flavorId-BMJcnI7H.mjs → _flavorId-CFmkmg2Y.mjs} +2 -2
  30. package/dist/client/{_flavorId-BMJcnI7H.mjs.map → _flavorId-CFmkmg2Y.mjs.map} +1 -1
  31. package/dist/client/{_floatingIpId-KcWWq9ZW2.mjs → _floatingIpId-Bb9ZEJ6b.mjs} +6 -6
  32. package/dist/client/_floatingIpId-Bb9ZEJ6b.mjs.map +1 -0
  33. package/dist/client/{_floatingIpId-CjQLzpC5.mjs → _floatingIpId-Dzh6_JCI.mjs} +2 -2
  34. package/dist/client/{_floatingIpId-CjQLzpC5.mjs.map → _floatingIpId-Dzh6_JCI.mjs.map} +1 -1
  35. package/dist/client/{_imageId-BkEpwbCr.mjs → _imageId-C3As7sHE.mjs} +5 -5
  36. package/dist/client/{_imageId-BkEpwbCr.mjs.map → _imageId-C3As7sHE.mjs.map} +1 -1
  37. package/dist/client/{_pcaId-BcwGho7g.mjs → _pcaId-n0q0aDb6.mjs} +6 -6
  38. package/dist/client/{_pcaId-BcwGho7g.mjs.map → _pcaId-n0q0aDb6.mjs.map} +1 -1
  39. package/dist/client/{_projectId-hMtrqW6m.mjs → _projectId-BuBIFdgG.mjs} +3 -3
  40. package/dist/client/{_projectId-hMtrqW6m.mjs.map → _projectId-BuBIFdgG.mjs.map} +1 -1
  41. package/dist/client/{_projectId-CoMD6nq6.mjs → _projectId-CAQkJHZ4.mjs} +3 -3
  42. package/dist/client/{_projectId-CoMD6nq6.mjs.map → _projectId-CAQkJHZ4.mjs.map} +1 -1
  43. package/dist/client/_projectId-D-b7paXE.mjs +29 -0
  44. package/dist/client/_projectId-D-b7paXE.mjs.map +1 -0
  45. package/dist/client/{_projectId-D8FHe0gr.mjs → _projectId-DNZsNxJw.mjs} +3 -3
  46. package/dist/client/{_projectId-D8FHe0gr.mjs.map → _projectId-DNZsNxJw.mjs.map} +1 -1
  47. package/dist/client/{_securityGroupId-B5-gJe1u.mjs → _securityGroupId-DFdNKa2l.mjs} +641 -504
  48. package/dist/client/_securityGroupId-DFdNKa2l.mjs.map +1 -0
  49. package/dist/client/{_securityGroupId-fPJWtDPU.mjs → _securityGroupId-DRkY3Gt6.mjs} +2 -2
  50. package/dist/client/_securityGroupId-DRkY3Gt6.mjs.map +1 -0
  51. package/dist/client/{_storageType-CI5f4CsI.mjs → _storageType-BKfQcpgp.mjs} +2 -2
  52. package/dist/client/{_storageType-CI5f4CsI.mjs.map → _storageType-BKfQcpgp.mjs.map} +1 -1
  53. package/dist/client/{_storageType-DePX1Aah.mjs → _storageType-sMj9NEJz.mjs} +7 -7
  54. package/dist/client/{_storageType-DePX1Aah.mjs.map → _storageType-sMj9NEJz.mjs.map} +1 -1
  55. package/dist/client/{about-B4sGnxeW.mjs → about-C8tTrQaW.mjs} +2 -2
  56. package/dist/client/{about-B4sGnxeW.mjs.map → about-C8tTrQaW.mjs.map} +1 -1
  57. package/dist/client/assets/objectDownload.worker-BAc5Au4B.js.map +1 -0
  58. package/dist/client/{aurora-Dp_NPGe8.mjs → aurora-jyvXcI4T.mjs} +2 -2
  59. package/dist/client/{aurora-Dp_NPGe8.mjs.map → aurora-jyvXcI4T.mjs.map} +1 -1
  60. package/dist/client/{build-DgeVmENN.mjs → build-CRLQyqu2.mjs} +2616 -3346
  61. package/dist/client/{build-DgeVmENN.mjs.map → build-CRLQyqu2.mjs.map} +1 -1
  62. package/dist/client/{flavors-DkGuWvge.mjs → flavors-BfTXqmoD.mjs} +6 -6
  63. package/dist/client/{flavors-DkGuWvge.mjs.map → flavors-BfTXqmoD.mjs.map} +1 -1
  64. package/dist/client/{flavors-DLxUiBhE.mjs → flavors-Dy-2mRGv.mjs} +2 -2
  65. package/dist/client/{flavors-DLxUiBhE.mjs.map → flavors-Dy-2mRGv.mjs.map} +1 -1
  66. package/dist/client/floatingips-zhNK6Xxn.mjs +562 -0
  67. package/dist/client/floatingips-zhNK6Xxn.mjs.map +1 -0
  68. package/dist/client/{hooks-D0wGUhRF.mjs → hooks-Bw3sHHOg.mjs} +2 -2
  69. package/dist/client/{hooks-D0wGUhRF.mjs.map → hooks-Bw3sHHOg.mjs.map} +1 -1
  70. package/dist/client/{images-h9i7S4LN.mjs → images-DPKUXryV.mjs} +2 -2
  71. package/dist/client/{images-h9i7S4LN.mjs.map → images-DPKUXryV.mjs.map} +1 -1
  72. package/dist/client/{images-D9nfOtSC.mjs → images-DhZnqUG_.mjs} +29 -29
  73. package/dist/client/images-DhZnqUG_.mjs.map +1 -0
  74. package/dist/client/images-NBf2bV43.mjs.map +1 -1
  75. package/dist/client/index.js +303 -312
  76. package/dist/client/index.js.map +1 -1
  77. package/dist/client/{objects-CGOfO00N.mjs → objects-BG1saVLZ.mjs} +1153 -862
  78. package/dist/client/objects-BG1saVLZ.mjs.map +1 -0
  79. package/dist/client/{objects-B3Z8h4RU.mjs → objects-Dahys529.mjs} +2 -2
  80. package/dist/client/{objects-B3Z8h4RU.mjs.map → objects-Dahys529.mjs.map} +1 -1
  81. package/dist/client/{pca-Nppb8aVa.mjs → pca-B60iWWfG.mjs} +7 -7
  82. package/dist/client/{pca-Nppb8aVa.mjs.map → pca-B60iWWfG.mjs.map} +1 -1
  83. package/dist/client/{pca-C7cMT8fW.mjs → pca-D0kKxHp4.mjs} +2 -2
  84. package/dist/client/{pca-C7cMT8fW.mjs.map → pca-D0kKxHp4.mjs.map} +1 -1
  85. package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
  86. package/dist/client/{routes-CaqfgBYu.mjs → routes-BOf-GDMM.mjs} +4 -4
  87. package/dist/client/{routes-CaqfgBYu.mjs.map → routes-BOf-GDMM.mjs.map} +1 -1
  88. package/dist/client/{routes-Bz4zb2H4.mjs → routes-CtfnI-aY.mjs} +2 -2
  89. package/dist/client/{routes-Bz4zb2H4.mjs.map → routes-CtfnI-aY.mjs.map} +1 -1
  90. package/dist/client/securitygroups-B8aLyFK7.mjs +17 -0
  91. package/dist/client/securitygroups-B8aLyFK7.mjs.map +1 -0
  92. package/dist/client/securitygroups-DRhFle2O.mjs +589 -0
  93. package/dist/client/securitygroups-DRhFle2O.mjs.map +1 -0
  94. package/dist/client/trpcClient-Di56hpVv.mjs +71 -0
  95. package/dist/client/trpcClient-Di56hpVv.mjs.map +1 -0
  96. package/dist/client/trpcClient.d.ts +40 -4
  97. package/dist/client/useListWithFiltering-aPTUNRaW.mjs +32 -0
  98. package/dist/client/useListWithFiltering-aPTUNRaW.mjs.map +1 -0
  99. package/dist/client/useSecurityGroupPermissions-BPS1ibWq.mjs +161 -0
  100. package/dist/client/useSecurityGroupPermissions-BPS1ibWq.mjs.map +1 -0
  101. package/dist/server/index.d.ts +56 -53
  102. package/dist/server/index.js +297 -20
  103. package/package.json +15 -15
  104. package/dist/client/EditSecurityGroupModal-BGPXglju.mjs +0 -137
  105. package/dist/client/EditSecurityGroupModal-BGPXglju.mjs.map +0 -1
  106. package/dist/client/ImageToastNotifications-Dzq6jNTm.mjs.map +0 -1
  107. package/dist/client/_floatingIpId-KcWWq9ZW2.mjs.map +0 -1
  108. package/dist/client/_projectId-MjFv839t.mjs +0 -25
  109. package/dist/client/_projectId-MjFv839t.mjs.map +0 -1
  110. package/dist/client/_securityGroupId-B5-gJe1u.mjs.map +0 -1
  111. package/dist/client/_securityGroupId-fPJWtDPU.mjs.map +0 -1
  112. package/dist/client/buildFilterParams-DoZzMKX9.mjs +0 -15
  113. package/dist/client/buildFilterParams-DoZzMKX9.mjs.map +0 -1
  114. package/dist/client/floatingips-DC5OrR8h.mjs +0 -434
  115. package/dist/client/floatingips-DC5OrR8h.mjs.map +0 -1
  116. package/dist/client/images-B5ktfqg6.mjs +0 -8
  117. package/dist/client/images-B5ktfqg6.mjs.map +0 -1
  118. package/dist/client/images-D9nfOtSC.mjs.map +0 -1
  119. package/dist/client/objects-CGOfO00N.mjs.map +0 -1
  120. package/dist/client/projects-DvSiI5Vg.mjs +0 -12
  121. package/dist/client/projects-DvSiI5Vg.mjs.map +0 -1
  122. package/dist/client/securitygroups-JMvcJLpb.mjs +0 -440
  123. package/dist/client/securitygroups-JMvcJLpb.mjs.map +0 -1
  124. package/dist/client/trpcClient-BxcNKnhv.mjs +0 -65
  125. package/dist/client/trpcClient-BxcNKnhv.mjs.map +0 -1
  126. package/dist/client/useListWithFiltering-BuhE81I6.mjs +0 -157
  127. package/dist/client/useListWithFiltering-BuhE81I6.mjs.map +0 -1
@@ -4,7 +4,7 @@ import * as _trpc_server from '@trpc/server';
4
4
  import { AnyRouter } from '@trpc/server';
5
5
  import * as _cobaltcore_dev_signal_openstack from '@cobaltcore-dev/signal-openstack';
6
6
  import { SignalOpenstackSessionType } from '@cobaltcore-dev/signal-openstack';
7
- import { ProxyConfig } from './shared-types';
7
+ import * as _cobaltcore_dev_signal_openstack_dist_types_client from '@cobaltcore-dev/signal-openstack/dist/types/client';
8
8
  import * as fastify_types_type_provider from 'fastify/types/type-provider';
9
9
  import * as http from 'http';
10
10
  import * as zod from 'zod';
@@ -126,22 +126,6 @@ interface AuroraPortalContext extends AuroraContext {
126
126
  formFields?: FormFieldData;
127
127
  }
128
128
 
129
- interface RequestParams {
130
- method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD";
131
- path: string;
132
- options?: {
133
- host?: string;
134
- headers?: Record<string, string>;
135
- body?: string | object | FormData | Blob | ArrayBuffer | ReadableStream;
136
- queryParams?: Record<string, string | string[] | number | boolean | null | undefined>;
137
- signal?: AbortSignal;
138
- debug?: boolean;
139
- proxy?: ProxyConfig;
140
- };
141
- }
142
- type ActionBody = NonNullable<RequestParams["options"]>["body"];
143
- type ActionPath = RequestParams["path"];
144
-
145
129
  declare const auroraRouter: _trpc_server.TRPCRouterBuilder<{
146
130
  ctx: AuroraPortalContext;
147
131
  meta: object;
@@ -179,18 +163,18 @@ declare const protectedProcedure: _trpc_server.TRPCProcedureBuilder<AuroraPortal
179
163
  region?: string;
180
164
  interfaceName?: string;
181
165
  }) => string | null;
182
- head: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
183
- get: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
184
- post: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
185
- put: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
186
- patch: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
187
- del: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
188
- cancellableHead: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
189
- cancellableGet: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
190
- cancellablePost: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
191
- cancellablePut: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
192
- cancellablePatch: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
193
- cancellableDel: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
166
+ head: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
167
+ get: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
168
+ post: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
169
+ put: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
170
+ patch: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
171
+ del: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
172
+ cancellableHead: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
173
+ cancellableGet: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
174
+ cancellablePost: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
175
+ cancellablePut: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
176
+ cancellablePatch: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
177
+ cancellableDel: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
194
178
  };
195
179
  hasService: (name: string) => boolean;
196
180
  terminate: () => Promise<void>;
@@ -353,18 +337,18 @@ declare const projectScopedProcedure: _trpc_server.TRPCProcedureBuilder<AuroraPo
353
337
  region?: string;
354
338
  interfaceName?: string;
355
339
  }) => string | null;
356
- head: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
357
- get: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
358
- post: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
359
- put: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
360
- patch: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
361
- del: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
362
- cancellableHead: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
363
- cancellableGet: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
364
- cancellablePost: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
365
- cancellablePut: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
366
- cancellablePatch: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
367
- cancellableDel: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
340
+ head: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
341
+ get: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
342
+ post: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
343
+ put: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
344
+ patch: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
345
+ del: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
346
+ cancellableHead: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
347
+ cancellableGet: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
348
+ cancellablePost: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
349
+ cancellablePut: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
350
+ cancellablePatch: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
351
+ cancellableDel: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
368
352
  };
369
353
  hasService: (name: string) => boolean;
370
354
  terminate: () => Promise<void>;
@@ -529,18 +513,18 @@ declare const domainScopedProcedure: _trpc_server.TRPCProcedureBuilder<AuroraPor
529
513
  region?: string;
530
514
  interfaceName?: string;
531
515
  }) => string | null;
532
- head: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
533
- get: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
534
- post: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
535
- put: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
536
- patch: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
537
- del: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
538
- cancellableHead: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
539
- cancellableGet: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
540
- cancellablePost: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
541
- cancellablePut: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
542
- cancellablePatch: (path: ActionPath, values: ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
543
- cancellableDel: (path: ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
516
+ head: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
517
+ get: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
518
+ post: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
519
+ put: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
520
+ patch: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
521
+ del: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => Promise<Response>;
522
+ cancellableHead: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
523
+ cancellableGet: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
524
+ cancellablePost: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
525
+ cancellablePut: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
526
+ cancellablePatch: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, values: _cobaltcore_dev_signal_openstack_dist_types_client.ActionBody, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
527
+ cancellableDel: (path: _cobaltcore_dev_signal_openstack_dist_types_client.ActionPath, options?: _cobaltcore_dev_signal_openstack.ServiceActionOptions) => _cobaltcore_dev_signal_openstack.CancellableRequest<Response>;
544
528
  };
545
529
  hasService: (name: string) => boolean;
546
530
  terminate: () => Promise<void>;
@@ -2423,6 +2407,25 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
2423
2407
  }, void, any>;
2424
2408
  meta: object;
2425
2409
  }>;
2410
+ uploadObject: _trpc_server.TRPCMutationProcedure<{
2411
+ input: _trpc_server_http.OctetInput;
2412
+ output: {
2413
+ success: boolean;
2414
+ };
2415
+ meta: object;
2416
+ }>;
2417
+ watchUploadProgress: _trpc_server.TRPCSubscriptionProcedure<{
2418
+ input: {
2419
+ project_id: string;
2420
+ uploadId: string;
2421
+ };
2422
+ output: AsyncIterable<{
2423
+ uploaded: number;
2424
+ total: number;
2425
+ percent: number;
2426
+ }, void, any>;
2427
+ meta: object;
2428
+ }>;
2426
2429
  }>>;
2427
2430
  versioning: _trpc_server.TRPCBuiltRouter<{
2428
2431
  ctx: AuroraPortalContext;
@@ -6713,7 +6713,7 @@ var require_webidl = __commonJS({
6713
6713
  var require_util2 = __commonJS({
6714
6714
  "../../node_modules/.pnpm/undici@7.28.0/node_modules/undici/lib/web/fetch/util.js"(exports2, module2) {
6715
6715
  "use strict";
6716
- var { Transform: Transform3 } = require("stream");
6716
+ var { Transform: Transform4 } = require("stream");
6717
6717
  var zlib = require("zlib");
6718
6718
  var { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require_constants3();
6719
6719
  var { getGlobalOrigin } = require_global();
@@ -7333,7 +7333,7 @@ var require_util2 = __commonJS({
7333
7333
  return contentRange;
7334
7334
  }
7335
7335
  __name(buildContentRange, "buildContentRange");
7336
- var InflateStream = class InflateStream extends Transform3 {
7336
+ var InflateStream = class InflateStream extends Transform4 {
7337
7337
  static {
7338
7338
  __name(this, "InflateStream");
7339
7339
  }
@@ -13114,7 +13114,7 @@ var require_readable = __commonJS({
13114
13114
  "../../node_modules/.pnpm/undici@7.28.0/node_modules/undici/lib/api/readable.js"(exports2, module2) {
13115
13115
  "use strict";
13116
13116
  var assert = require("assert");
13117
- var { Readable: Readable4 } = require("stream");
13117
+ var { Readable: Readable5 } = require("stream");
13118
13118
  var { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require_errors();
13119
13119
  var util = require_util();
13120
13120
  var { ReadableStreamFrom } = require_util();
@@ -13128,7 +13128,7 @@ var require_readable = __commonJS({
13128
13128
  var kBytesRead = /* @__PURE__ */ Symbol("kBytesRead");
13129
13129
  var noop = /* @__PURE__ */ __name(() => {
13130
13130
  }, "noop");
13131
- var BodyReadable = class BodyReadable extends Readable4 {
13131
+ var BodyReadable = class BodyReadable extends Readable5 {
13132
13132
  static {
13133
13133
  __name(this, "BodyReadable");
13134
13134
  }
@@ -13531,7 +13531,7 @@ var require_api_request = __commonJS({
13531
13531
  "use strict";
13532
13532
  var assert = require("assert");
13533
13533
  var { AsyncResource } = require("async_hooks");
13534
- var { Readable: Readable4 } = require_readable();
13534
+ var { Readable: Readable5 } = require_readable();
13535
13535
  var { InvalidArgumentError, RequestAbortedError } = require_errors();
13536
13536
  var util = require_util();
13537
13537
  function noop() {
@@ -13619,7 +13619,7 @@ var require_api_request = __commonJS({
13619
13619
  const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers;
13620
13620
  const contentType = parsedHeaders["content-type"];
13621
13621
  const contentLength = parsedHeaders["content-length"];
13622
- const res = new Readable4({
13622
+ const res = new Readable5({
13623
13623
  resume,
13624
13624
  abort,
13625
13625
  contentType,
@@ -13952,7 +13952,7 @@ var require_api_stream = __commonJS({
13952
13952
  var require_api_pipeline = __commonJS({
13953
13953
  "../../node_modules/.pnpm/undici@7.28.0/node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) {
13954
13954
  "use strict";
13955
- var { Readable: Readable4, Duplex, PassThrough } = require("stream");
13955
+ var { Readable: Readable5, Duplex, PassThrough } = require("stream");
13956
13956
  var assert = require("assert");
13957
13957
  var { AsyncResource } = require("async_hooks");
13958
13958
  var { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError } = require_errors();
@@ -13962,7 +13962,7 @@ var require_api_pipeline = __commonJS({
13962
13962
  }
13963
13963
  __name(noop, "noop");
13964
13964
  var kResume = /* @__PURE__ */ Symbol("resume");
13965
- var PipelineRequest = class PipelineRequest extends Readable4 {
13965
+ var PipelineRequest = class PipelineRequest extends Readable5 {
13966
13966
  static {
13967
13967
  __name(this, "PipelineRequest");
13968
13968
  }
@@ -13984,7 +13984,7 @@ var require_api_pipeline = __commonJS({
13984
13984
  callback(err);
13985
13985
  }
13986
13986
  };
13987
- var PipelineResponse = class PipelineResponse extends Readable4 {
13987
+ var PipelineResponse = class PipelineResponse extends Readable5 {
13988
13988
  static {
13989
13989
  __name(this, "PipelineResponse");
13990
13990
  }
@@ -15419,7 +15419,7 @@ var require_mock_pool = __commonJS({
15419
15419
  var require_pending_interceptors_formatter = __commonJS({
15420
15420
  "../../node_modules/.pnpm/undici@7.28.0/node_modules/undici/lib/mock/pending-interceptors-formatter.js"(exports2, module2) {
15421
15421
  "use strict";
15422
- var { Transform: Transform3 } = require("stream");
15422
+ var { Transform: Transform4 } = require("stream");
15423
15423
  var { Console } = require("console");
15424
15424
  var PERSISTENT = process.versions.icu ? "\u2705" : "Y ";
15425
15425
  var NOT_PERSISTENT = process.versions.icu ? "\u274C" : "N ";
@@ -15428,7 +15428,7 @@ var require_pending_interceptors_formatter = __commonJS({
15428
15428
  __name(this, "PendingInterceptorsFormatter");
15429
15429
  }
15430
15430
  constructor({ disableColors } = {}) {
15431
- this.transform = new Transform3({
15431
+ this.transform = new Transform4({
15432
15432
  transform(chunk, _enc, cb) {
15433
15433
  cb(null, chunk);
15434
15434
  }
@@ -18840,7 +18840,7 @@ var require_cache2 = __commonJS({
18840
18840
  "../../node_modules/.pnpm/undici@7.28.0/node_modules/undici/lib/interceptor/cache.js"(exports2, module2) {
18841
18841
  "use strict";
18842
18842
  var assert = require("assert");
18843
- var { Readable: Readable4 } = require("stream");
18843
+ var { Readable: Readable5 } = require("stream");
18844
18844
  var util = require_util();
18845
18845
  var CacheHandler = require_cache_handler();
18846
18846
  var MemoryCacheStore = require_memory_cache_store();
@@ -18934,7 +18934,7 @@ var require_cache2 = __commonJS({
18934
18934
  }
18935
18935
  __name(handleUncachedResponse, "handleUncachedResponse");
18936
18936
  function sendCachedValue(handler, opts, result, age, context, isStale2) {
18937
- const stream = util.isStream(result.body) ? result.body : Readable4.from(result.body ?? []);
18937
+ const stream = util.isStream(result.body) ? result.body : Readable5.from(result.body ?? []);
18938
18938
  assert(!stream.destroyed, "stream should not be destroyed");
18939
18939
  assert(!stream.readableDidRead, "stream should not be readableDidRead");
18940
18940
  const controller = {
@@ -22010,7 +22010,7 @@ var require_fetch = __commonJS({
22010
22010
  var { safelyExtractBody, extractBody } = require_body();
22011
22011
  var { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, subresourceSet } = require_constants3();
22012
22012
  var EE = require("events");
22013
- var { Readable: Readable4, pipeline: pipeline2, finished, isErrored, isReadable } = require("stream");
22013
+ var { Readable: Readable5, pipeline: pipeline2, finished, isErrored, isReadable } = require("stream");
22014
22014
  var { addAbortListener, bufferToLowerCasedHeaderName } = require_util();
22015
22015
  var { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require_data_url();
22016
22016
  var { getGlobalDispatcher } = require_global2();
@@ -22963,7 +22963,7 @@ var require_fetch = __commonJS({
22963
22963
  }
22964
22964
  }
22965
22965
  const location = headersList.get("location", true);
22966
- this.body = new Readable4({
22966
+ this.body = new Readable5({
22967
22967
  read: resume
22968
22968
  });
22969
22969
  const willFollow = location && request.redirect === "follow" && redirectStatusSet.has(status);
@@ -26540,7 +26540,7 @@ var require_util6 = __commonJS({
26540
26540
  var require_eventsource_stream = __commonJS({
26541
26541
  "../../node_modules/.pnpm/undici@7.28.0/node_modules/undici/lib/web/eventsource/eventsource-stream.js"(exports2, module2) {
26542
26542
  "use strict";
26543
- var { Transform: Transform3 } = require("stream");
26543
+ var { Transform: Transform4 } = require("stream");
26544
26544
  var { isASCIINumber, isValidLastEventId } = require_util6();
26545
26545
  var BOM = [
26546
26546
  239,
@@ -26551,7 +26551,7 @@ var require_eventsource_stream = __commonJS({
26551
26551
  var CR = 13;
26552
26552
  var COLON = 58;
26553
26553
  var SPACE = 32;
26554
- var EventSourceStream = class EventSourceStream extends Transform3 {
26554
+ var EventSourceStream = class EventSourceStream extends Transform4 {
26555
26555
  static {
26556
26556
  __name(this, "EventSourceStream");
26557
26557
  }
@@ -33548,6 +33548,45 @@ var cephProtectedProcedure = cephCredentialMiddleware.use(/* @__PURE__ */ __name
33548
33548
  ctx
33549
33549
  });
33550
33550
  }, "requireCredentials"));
33551
+ var cephUploadProcedure = protectedProcedure.use(/* @__PURE__ */ __name(async function resolveCephForUpload(opts) {
33552
+ const { ctx, next } = opts;
33553
+ const uploadProjectId = ctx.req.headers["x-upload-project-id"]?.trim();
33554
+ if (!uploadProjectId) {
33555
+ throw new import_server11.TRPCError({
33556
+ code: "BAD_REQUEST",
33557
+ message: "x-upload-project-id header is required for uploads"
33558
+ });
33559
+ }
33560
+ const openstackSession = await ctx.rescopeSession({
33561
+ projectId: uploadProjectId
33562
+ });
33563
+ if (!openstackSession) {
33564
+ throw new import_server11.TRPCError({
33565
+ code: "UNAUTHORIZED",
33566
+ message: "Failed to scope session to project. User may not have access to this project."
33567
+ });
33568
+ }
33569
+ const scopedCtx = {
33570
+ ...ctx,
33571
+ openstack: openstackSession
33572
+ };
33573
+ const credentials = await resolveEC2Credential(scopedCtx);
33574
+ if (!credentials) {
33575
+ throw new import_server11.TRPCError({
33576
+ code: "FORBIDDEN",
33577
+ message: NO_CEPH_CREDENTIALS
33578
+ });
33579
+ }
33580
+ const { endpoint, region } = resolveS3Config(scopedCtx);
33581
+ return next({
33582
+ ctx: {
33583
+ ...scopedCtx,
33584
+ cephCredentials: credentials,
33585
+ cephRegion: region,
33586
+ getCephClient: /* @__PURE__ */ __name(() => createS3Client(credentials.access, credentials.secret, endpoint, region), "getCephClient")
33587
+ }
33588
+ });
33589
+ }, "resolveCephForUpload"));
33551
33590
 
33552
33591
  // src/server/Storage/helpers/s3ErrorMapper.ts
33553
33592
  var import_server12 = require("@trpc/server");
@@ -34073,11 +34112,20 @@ var containerRouter = {
34073
34112
  // src/server/Storage/routers/ceph/objectRouter.ts
34074
34113
  var import_client_s33 = require("@aws-sdk/client-s3");
34075
34114
  var import_server13 = require("@trpc/server");
34115
+ var import_http3 = require("@trpc/server/http");
34116
+ var import_node_stream3 = require("stream");
34076
34117
  var import_zod14 = require("zod");
34077
34118
  var import_node_events3 = __toESM(require("events"));
34078
34119
  var downloadProgressEmitter2 = new import_node_events3.default();
34079
34120
  downloadProgressEmitter2.setMaxListeners(0);
34080
34121
  var downloadProgressMap2 = /* @__PURE__ */ new Map();
34122
+ var uploadProgressEmitter3 = new import_node_events3.default();
34123
+ uploadProgressEmitter3.setMaxListeners(0);
34124
+ var uploadProgressMap2 = /* @__PURE__ */ new Map();
34125
+ var watchUploadProgressInputSchema = import_zod14.z.object({
34126
+ project_id: import_zod14.z.string(),
34127
+ uploadId: import_zod14.z.string()
34128
+ });
34081
34129
  var deleteAllObjectsInputSchema = import_zod14.z.object({
34082
34130
  project_id: import_zod14.z.string(),
34083
34131
  containerName: import_zod14.z.string().min(1),
@@ -34812,6 +34860,223 @@ var objectRouter = {
34812
34860
  downloadProgressEmitter2.off(`progress:${scopedDownloadId}:complete`, onComplete);
34813
34861
  downloadProgressEmitter2.off(`progress:${scopedDownloadId}:error`, onError);
34814
34862
  }
34863
+ }),
34864
+ // ============================================================================
34865
+ // UPLOAD OPERATIONS
34866
+ // ============================================================================
34867
+ /**
34868
+ * Upload a file to a Ceph (S3) bucket via octet-stream.
34869
+ *
34870
+ * Mirrors the Swift `uploadObject` implementation (see swiftRouter.ts) so the
34871
+ * client-side UploadObjectModal / watch-progress logic can be reused
34872
+ * unchanged, but targets S3 `PutObjectCommand` instead of a raw Swift PUT.
34873
+ *
34874
+ * Uses `octetInputParser` so tRPC hands us the request body as a true
34875
+ * ReadableStream — never buffered — enabling per-chunk progress tracking via
34876
+ * a Node.js Transform, identical to swiftRouter.uploadObject.
34877
+ *
34878
+ * Metadata travels as custom request headers (the tRPC input is the raw file):
34879
+ * - x-upload-project-id (string, required) — project id, used to scope the
34880
+ * progress key so cross-tenant
34881
+ * observation is impossible
34882
+ * - x-upload-container (string, required) — target bucket name
34883
+ * - x-upload-object (string, required) — full object key, e.g. "folder/file.txt"
34884
+ * - x-upload-type (string, optional) — MIME type detected client-side
34885
+ * - x-upload-size (string, required) — file size in bytes; S3 PutObject
34886
+ * with a streaming Body needs a
34887
+ * ContentLength
34888
+ * - x-upload-id (string, required) — client-computed id for watchUploadProgress
34889
+ *
34890
+ * The client computes `uploadId` as "<bucket>:<objectKey>:<uuid>" before
34891
+ * calling this mutation so the subscription can be opened in advance. The
34892
+ * UUID suffix keeps concurrent uploads of the same key from colliding in the
34893
+ * progress map; the id is further scoped with the project id on the BFF.
34894
+ *
34895
+ * Uses `cephUploadProcedure` (not `cephProtectedProcedure`): octetInputParser
34896
+ * can't chain onto the project-scoped procedure's bundled input, so uploads
34897
+ * run on a base procedure that rescopes from `x-upload-project-id` and still
34898
+ * provides `getCephClient`. See cephProcedure.ts.
34899
+ */
34900
+ uploadObject: cephUploadProcedure.input(import_http3.octetInputParser).mutation(async ({ input, ctx }) => {
34901
+ const s3 = ctx.getCephClient();
34902
+ const headers = ctx.req.headers;
34903
+ const projectId = headers["x-upload-project-id"]?.trim();
34904
+ const bucket = headers["x-upload-container"]?.trim();
34905
+ const objectKey = headers["x-upload-object"]?.trim();
34906
+ const contentType = headers["x-upload-type"];
34907
+ const fileSizeHeader = headers["x-upload-size"];
34908
+ const uploadId = headers["x-upload-id"]?.trim();
34909
+ if (!projectId) {
34910
+ throw new import_server13.TRPCError({
34911
+ code: "BAD_REQUEST",
34912
+ message: "x-upload-project-id header is required"
34913
+ });
34914
+ }
34915
+ if (!bucket) {
34916
+ throw new import_server13.TRPCError({
34917
+ code: "BAD_REQUEST",
34918
+ message: "x-upload-container header is required"
34919
+ });
34920
+ }
34921
+ if (!objectKey) {
34922
+ throw new import_server13.TRPCError({
34923
+ code: "BAD_REQUEST",
34924
+ message: "x-upload-object header is required"
34925
+ });
34926
+ }
34927
+ if (!uploadId) {
34928
+ throw new import_server13.TRPCError({
34929
+ code: "BAD_REQUEST",
34930
+ message: "x-upload-id header is required"
34931
+ });
34932
+ }
34933
+ const fileSize = Number(fileSizeHeader);
34934
+ if (!Number.isFinite(fileSize) || fileSize < 0) {
34935
+ throw new import_server13.TRPCError({
34936
+ code: "BAD_REQUEST",
34937
+ message: "x-upload-size header must be a non-negative number"
34938
+ });
34939
+ }
34940
+ const scopedUploadId = `${projectId}:${uploadId}`;
34941
+ uploadProgressMap2.set(scopedUploadId, {
34942
+ uploaded: 0,
34943
+ total: fileSize,
34944
+ percent: 0
34945
+ });
34946
+ try {
34947
+ const progress = uploadProgressMap2.get(scopedUploadId);
34948
+ const fileStream = import_node_stream3.Readable.fromWeb(input);
34949
+ const progressTracker = new import_node_stream3.Transform({
34950
+ async transform(chunk, _encoding, callback) {
34951
+ progress.uploaded += chunk.length;
34952
+ progress.percent = progress.total > 0 ? Math.round(progress.uploaded / progress.total * 100) : 0;
34953
+ uploadProgressEmitter3.emit(`progress:${scopedUploadId}`, {
34954
+ ...progress
34955
+ });
34956
+ await new Promise((resolve) => setImmediate(resolve));
34957
+ callback(null, chunk);
34958
+ }
34959
+ });
34960
+ const isAbortLike = /* @__PURE__ */ __name((err) => {
34961
+ const code = err?.code;
34962
+ return code === "ECONNRESET" || code === "ECONNABORTED" || !!ctx.req.signal?.aborted;
34963
+ }, "isAbortLike");
34964
+ fileStream.on("error", (err) => {
34965
+ if (isAbortLike(err)) return;
34966
+ progressTracker.destroy(err);
34967
+ });
34968
+ const trackedStream = fileStream.pipe(progressTracker);
34969
+ await s3.send(new import_client_s33.PutObjectCommand({
34970
+ Bucket: bucket,
34971
+ Key: objectKey,
34972
+ Body: trackedStream,
34973
+ ContentLength: fileSize,
34974
+ ContentType: contentType || "application/octet-stream"
34975
+ }), {
34976
+ abortSignal: ctx.req.signal
34977
+ });
34978
+ uploadProgressEmitter3.emit(`progress:${scopedUploadId}:complete`);
34979
+ return {
34980
+ success: true
34981
+ };
34982
+ } catch (error) {
34983
+ try {
34984
+ mapS3ErrorToTRPCError(error, {
34985
+ operation: "upload object",
34986
+ bucket,
34987
+ key: objectKey
34988
+ });
34989
+ } catch (mappedError) {
34990
+ if (!ctx.req.signal?.aborted) {
34991
+ uploadProgressEmitter3.emit(`progress:${scopedUploadId}:error`, mappedError);
34992
+ }
34993
+ throw mappedError;
34994
+ }
34995
+ throw error;
34996
+ } finally {
34997
+ uploadProgressMap2.delete(scopedUploadId);
34998
+ }
34999
+ }),
35000
+ /**
35001
+ * Subscribe to real-time upload progress for a given `uploadId`.
35002
+ *
35003
+ * Mirrors `watchDownloadProgress`. The `uploadId` is computed client-side as
35004
+ * "<bucket>:<objectKey>:<uuid>" and passed to `uploadObject` before the
35005
+ * mutation starts, so this subscription can be opened in advance. Yields
35006
+ * `{ uploaded, total, percent }` as bytes flow through the server; completes
35007
+ * when the upload finishes or throws on a non-abort error.
35008
+ */
35009
+ watchUploadProgress: cephProtectedProcedure.input(watchUploadProgressInputSchema).subscription(async function* ({ input }) {
35010
+ const { project_id, uploadId } = input;
35011
+ const scopedUploadId = `${project_id}:${uploadId}`;
35012
+ const current = uploadProgressMap2.get(scopedUploadId);
35013
+ if (current) {
35014
+ yield {
35015
+ ...current
35016
+ };
35017
+ }
35018
+ const queue = [];
35019
+ let isComplete = false;
35020
+ let isError = false;
35021
+ let caughtError;
35022
+ let waitResolver = null;
35023
+ const onProgress = /* @__PURE__ */ __name((data) => {
35024
+ queue.push(data);
35025
+ waitResolver?.();
35026
+ waitResolver = null;
35027
+ }, "onProgress");
35028
+ const onComplete = /* @__PURE__ */ __name(() => {
35029
+ isComplete = true;
35030
+ waitResolver?.();
35031
+ waitResolver = null;
35032
+ }, "onComplete");
35033
+ const onError = /* @__PURE__ */ __name((err) => {
35034
+ isError = true;
35035
+ caughtError = err instanceof Error ? err : new Error(String(err));
35036
+ waitResolver?.();
35037
+ waitResolver = null;
35038
+ }, "onError");
35039
+ uploadProgressEmitter3.on(`progress:${scopedUploadId}`, onProgress);
35040
+ uploadProgressEmitter3.on(`progress:${scopedUploadId}:complete`, onComplete);
35041
+ uploadProgressEmitter3.on(`progress:${scopedUploadId}:error`, onError);
35042
+ try {
35043
+ while (!isComplete && !isError) {
35044
+ while (queue.length > 0) {
35045
+ yield {
35046
+ ...queue.shift()
35047
+ };
35048
+ }
35049
+ if (!isComplete && !isError) {
35050
+ let timeoutId;
35051
+ const timeout = new Promise((resolve) => {
35052
+ timeoutId = setTimeout(resolve, 3e4);
35053
+ });
35054
+ try {
35055
+ await Promise.race([
35056
+ new Promise((resolve) => {
35057
+ waitResolver = resolve;
35058
+ }),
35059
+ timeout
35060
+ ]);
35061
+ } finally {
35062
+ if (timeoutId) clearTimeout(timeoutId);
35063
+ }
35064
+ if (!isComplete && !isError && queue.length === 0) break;
35065
+ }
35066
+ }
35067
+ while (queue.length > 0) {
35068
+ yield {
35069
+ ...queue.shift()
35070
+ };
35071
+ }
35072
+ if (isError && caughtError) {
35073
+ throw caughtError;
35074
+ }
35075
+ } finally {
35076
+ uploadProgressEmitter3.off(`progress:${scopedUploadId}`, onProgress);
35077
+ uploadProgressEmitter3.off(`progress:${scopedUploadId}:complete`, onComplete);
35078
+ uploadProgressEmitter3.off(`progress:${scopedUploadId}:error`, onError);
35079
+ }
34815
35080
  })
34816
35081
  };
34817
35082
 
@@ -38120,7 +38385,7 @@ __name(createContext, "createContext");
38120
38385
 
38121
38386
  // src/server/server.ts
38122
38387
  var import_path2 = __toESM(require("path"));
38123
- var import_node_stream3 = require("stream");
38388
+ var import_node_stream4 = require("stream");
38124
38389
  var import_zod26 = require("zod");
38125
38390
 
38126
38391
  // src/server/aurora-fastify-plugins/csrfProtection.ts
@@ -38272,7 +38537,7 @@ async function createServer(config) {
38272
38537
  message: "Glance service unavailable"
38273
38538
  });
38274
38539
  }
38275
- const webStream = import_node_stream3.Readable.toWeb(data.file);
38540
+ const webStream = import_node_stream4.Readable.toWeb(data.file);
38276
38541
  await glance.put(`v2/images/${imageId}/file`, webStream, {
38277
38542
  headers: {
38278
38543
  Accept: "application/json",
@@ -38327,7 +38592,19 @@ async function createServer(config) {
38327
38592
  }
38328
38593
  });
38329
38594
  server.register(import_helmet.default, {
38330
- contentSecurityPolicy: isProduction ? void 0 : false
38595
+ contentSecurityPolicy: isProduction ? {
38596
+ directives: {
38597
+ ...import_helmet.default.contentSecurityPolicy.getDefaultDirectives(),
38598
+ // The object-download worker is bundled inline (Vite's ?worker&inline)
38599
+ // and so is started from a blob: URL. Helmet's defaults don't set
38600
+ // worker-src at all, which makes the browser fall back to
38601
+ // script-src 'self' — blocking blob: and the worker with it.
38602
+ "worker-src": [
38603
+ "'self'",
38604
+ "blob:"
38605
+ ]
38606
+ }
38607
+ } : false
38331
38608
  });
38332
38609
  if (isProduction) {
38333
38610
  await server.register(import_static.default, {