@decaf-ts/integrations 0.1.3 → 0.2.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 (172) hide show
  1. package/dist/integrations.cjs +1 -1
  2. package/docker/azure-blob-compose.yml +21 -0
  3. package/docker/gcs-blob-compose.yml +21 -0
  4. package/docker/ipfs-compose.yml +25 -0
  5. package/docker/minio-compose.yml +25 -0
  6. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +293 -0
  7. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -0
  8. package/lib/cjs/blob/azure/index.cjs +24 -0
  9. package/lib/cjs/blob/azure/index.cjs.map +1 -0
  10. package/lib/cjs/blob/core/BlobErrors.cjs +74 -0
  11. package/lib/cjs/blob/core/BlobErrors.cjs.map +1 -0
  12. package/lib/cjs/blob/core/BlobKey.cjs +37 -0
  13. package/lib/cjs/blob/core/BlobKey.cjs.map +1 -0
  14. package/lib/cjs/blob/core/BlobStoreFactory.cjs +57 -0
  15. package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +1 -0
  16. package/lib/cjs/blob/core/BlobStoreService.cjs +42 -0
  17. package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -0
  18. package/lib/cjs/blob/core/BlobTypes.cjs +4 -0
  19. package/lib/cjs/blob/core/BlobTypes.cjs.map +1 -0
  20. package/lib/cjs/blob/core/BlobValue.cjs +72 -0
  21. package/lib/cjs/blob/core/BlobValue.cjs.map +1 -0
  22. package/lib/cjs/blob/core/index.cjs +29 -0
  23. package/lib/cjs/blob/core/index.cjs.map +1 -0
  24. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +272 -0
  25. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -0
  26. package/lib/cjs/blob/gcp/index.cjs +24 -0
  27. package/lib/cjs/blob/gcp/index.cjs.map +1 -0
  28. package/lib/cjs/blob/index.cjs +25 -0
  29. package/lib/cjs/blob/index.cjs.map +1 -0
  30. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +182 -0
  31. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +1 -0
  32. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +27 -0
  33. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +1 -0
  34. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +35 -0
  35. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +1 -0
  36. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +45 -0
  37. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +1 -0
  38. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +35 -0
  39. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +1 -0
  40. package/lib/cjs/blob/ipfs/index.cjs +28 -0
  41. package/lib/cjs/blob/ipfs/index.cjs.map +1 -0
  42. package/lib/cjs/blob/local/LocalBlobStoreService.cjs +288 -0
  43. package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +1 -0
  44. package/lib/cjs/blob/local/index.cjs +24 -0
  45. package/lib/cjs/blob/local/index.cjs.map +1 -0
  46. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +146 -0
  47. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +1 -0
  48. package/lib/cjs/blob/memory/index.cjs +24 -0
  49. package/lib/cjs/blob/memory/index.cjs.map +1 -0
  50. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +14 -0
  51. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +1 -0
  52. package/lib/cjs/blob/s3/R2BlobStoreService.cjs +14 -0
  53. package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +1 -0
  54. package/lib/cjs/blob/s3/S3BlobStoreService.cjs +322 -0
  55. package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -0
  56. package/lib/cjs/blob/s3/index.cjs +26 -0
  57. package/lib/cjs/blob/s3/index.cjs.map +1 -0
  58. package/lib/cjs/docker/DockerComposeService.cjs +2 -2
  59. package/lib/cjs/docker/DockerComposeService.cjs.map +1 -1
  60. package/lib/cjs/index.cjs +3 -3
  61. package/lib/esm/blob/azure/AzureBlobStoreService.js +288 -0
  62. package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -0
  63. package/lib/esm/blob/azure/index.js +7 -0
  64. package/lib/esm/blob/azure/index.js.map +1 -0
  65. package/lib/esm/blob/core/BlobErrors.js +61 -0
  66. package/lib/esm/blob/core/BlobErrors.js.map +1 -0
  67. package/lib/esm/blob/core/BlobKey.js +32 -0
  68. package/lib/esm/blob/core/BlobKey.js.map +1 -0
  69. package/lib/esm/blob/core/BlobStoreFactory.js +52 -0
  70. package/lib/esm/blob/core/BlobStoreFactory.js.map +1 -0
  71. package/lib/esm/blob/core/BlobStoreService.js +37 -0
  72. package/lib/esm/blob/core/BlobStoreService.js.map +1 -0
  73. package/lib/esm/blob/core/BlobTypes.js +2 -0
  74. package/lib/esm/blob/core/BlobTypes.js.map +1 -0
  75. package/lib/esm/blob/core/BlobValue.js +66 -0
  76. package/lib/esm/blob/core/BlobValue.js.map +1 -0
  77. package/lib/esm/blob/core/index.js +12 -0
  78. package/lib/esm/blob/core/index.js.map +1 -0
  79. package/lib/esm/blob/gcp/GcsBlobStoreService.js +267 -0
  80. package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -0
  81. package/lib/esm/blob/gcp/index.js +7 -0
  82. package/lib/esm/blob/gcp/index.js.map +1 -0
  83. package/lib/esm/blob/index.js +8 -0
  84. package/lib/esm/blob/index.js.map +1 -0
  85. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +177 -0
  86. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +1 -0
  87. package/lib/esm/blob/ipfs/IpfsKeyIndex.js +23 -0
  88. package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +1 -0
  89. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +30 -0
  90. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +1 -0
  91. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +40 -0
  92. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +1 -0
  93. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +30 -0
  94. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +1 -0
  95. package/lib/esm/blob/ipfs/index.js +11 -0
  96. package/lib/esm/blob/ipfs/index.js.map +1 -0
  97. package/lib/esm/blob/local/LocalBlobStoreService.js +283 -0
  98. package/lib/esm/blob/local/LocalBlobStoreService.js.map +1 -0
  99. package/lib/esm/blob/local/index.js +7 -0
  100. package/lib/esm/blob/local/index.js.map +1 -0
  101. package/lib/esm/blob/memory/MemoryBlobStoreService.js +141 -0
  102. package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +1 -0
  103. package/lib/esm/blob/memory/index.js +7 -0
  104. package/lib/esm/blob/memory/index.js.map +1 -0
  105. package/lib/esm/blob/s3/MinioBlobStoreService.js +9 -0
  106. package/lib/esm/blob/s3/MinioBlobStoreService.js.map +1 -0
  107. package/lib/esm/blob/s3/R2BlobStoreService.js +9 -0
  108. package/lib/esm/blob/s3/R2BlobStoreService.js.map +1 -0
  109. package/lib/esm/blob/s3/S3BlobStoreService.js +317 -0
  110. package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -0
  111. package/lib/esm/blob/s3/index.js +9 -0
  112. package/lib/esm/blob/s3/index.js.map +1 -0
  113. package/lib/esm/docker/DockerComposeService.js +2 -2
  114. package/lib/esm/docker/DockerComposeService.js.map +1 -1
  115. package/lib/esm/index.js +3 -3
  116. package/lib/types/blob/azure/AzureBlobStoreService.d.cts +25 -0
  117. package/lib/types/blob/azure/AzureBlobStoreService.d.mts +25 -0
  118. package/lib/types/blob/azure/index.d.cts +6 -0
  119. package/lib/types/blob/azure/index.d.mts +6 -0
  120. package/lib/types/blob/core/BlobErrors.d.cts +14 -0
  121. package/lib/types/blob/core/BlobErrors.d.mts +14 -0
  122. package/lib/types/blob/core/BlobKey.d.cts +9 -0
  123. package/lib/types/blob/core/BlobKey.d.mts +9 -0
  124. package/lib/types/blob/core/BlobStoreFactory.d.cts +5 -0
  125. package/lib/types/blob/core/BlobStoreFactory.d.mts +5 -0
  126. package/lib/types/blob/core/BlobStoreService.d.cts +28 -0
  127. package/lib/types/blob/core/BlobStoreService.d.mts +28 -0
  128. package/lib/types/blob/core/BlobTypes.d.cts +122 -0
  129. package/lib/types/blob/core/BlobTypes.d.mts +122 -0
  130. package/lib/types/blob/core/BlobValue.d.cts +13 -0
  131. package/lib/types/blob/core/BlobValue.d.mts +13 -0
  132. package/lib/types/blob/core/index.d.cts +11 -0
  133. package/lib/types/blob/core/index.d.mts +11 -0
  134. package/lib/types/blob/gcp/GcsBlobStoreService.d.cts +25 -0
  135. package/lib/types/blob/gcp/GcsBlobStoreService.d.mts +25 -0
  136. package/lib/types/blob/gcp/index.d.cts +6 -0
  137. package/lib/types/blob/gcp/index.d.mts +6 -0
  138. package/lib/types/blob/index.d.cts +7 -0
  139. package/lib/types/blob/index.d.mts +7 -0
  140. package/lib/types/blob/ipfs/IpfsBlobStoreService.d.cts +26 -0
  141. package/lib/types/blob/ipfs/IpfsBlobStoreService.d.mts +26 -0
  142. package/lib/types/blob/ipfs/IpfsKeyIndex.d.cts +9 -0
  143. package/lib/types/blob/ipfs/IpfsKeyIndex.d.mts +9 -0
  144. package/lib/types/blob/ipfs/LocalJsonIpfsKeyIndex.d.cts +11 -0
  145. package/lib/types/blob/ipfs/LocalJsonIpfsKeyIndex.d.mts +11 -0
  146. package/lib/types/blob/ipfs/MemoryIpfsKeyIndex.d.cts +15 -0
  147. package/lib/types/blob/ipfs/MemoryIpfsKeyIndex.d.mts +15 -0
  148. package/lib/types/blob/ipfs/PostgresIpfsKeyIndex.d.cts +11 -0
  149. package/lib/types/blob/ipfs/PostgresIpfsKeyIndex.d.mts +11 -0
  150. package/lib/types/blob/ipfs/index.d.cts +10 -0
  151. package/lib/types/blob/ipfs/index.d.mts +10 -0
  152. package/lib/types/blob/local/LocalBlobStoreService.d.cts +30 -0
  153. package/lib/types/blob/local/LocalBlobStoreService.d.mts +30 -0
  154. package/lib/types/blob/local/index.d.cts +6 -0
  155. package/lib/types/blob/local/index.d.mts +6 -0
  156. package/lib/types/blob/memory/MemoryBlobStoreService.d.cts +28 -0
  157. package/lib/types/blob/memory/MemoryBlobStoreService.d.mts +28 -0
  158. package/lib/types/blob/memory/index.d.cts +6 -0
  159. package/lib/types/blob/memory/index.d.mts +6 -0
  160. package/lib/types/blob/s3/MinioBlobStoreService.d.cts +8 -0
  161. package/lib/types/blob/s3/MinioBlobStoreService.d.mts +8 -0
  162. package/lib/types/blob/s3/R2BlobStoreService.d.cts +8 -0
  163. package/lib/types/blob/s3/R2BlobStoreService.d.mts +8 -0
  164. package/lib/types/blob/s3/S3BlobStoreService.d.cts +25 -0
  165. package/lib/types/blob/s3/S3BlobStoreService.d.mts +25 -0
  166. package/lib/types/blob/s3/index.d.cts +8 -0
  167. package/lib/types/blob/s3/index.d.mts +8 -0
  168. package/lib/types/docker/DockerComposeService.d.cts +6 -0
  169. package/lib/types/docker/DockerComposeService.d.mts +6 -0
  170. package/lib/types/index.d.cts +2 -2
  171. package/lib/types/index.d.mts +2 -2
  172. package/package.json +88 -6
@@ -0,0 +1,267 @@
1
+ /**
2
+ * @module integrations/blob/gcp/service
3
+ * @summary Google Cloud Storage blob store service.
4
+ * @description Blob store backed by Google Cloud Storage via @google-cloud/storage.
5
+ */
6
+ import { Storage } from "@google-cloud/storage";
7
+ import { AuthorizationError, ConnectionError, ForbiddenError, UnsupportedError, } from "@decaf-ts/core";
8
+ import { ConflictError, InternalError, NotFoundError, ValidationError, } from "@decaf-ts/db-decorators";
9
+ import { BlobStoreService } from "./../core/BlobStoreService.js";
10
+ import { collectToBuffer, computeSha256, toAsyncIterable } from "./../core/BlobValue.js";
11
+ export class GcsBlobStoreService extends BlobStoreService {
12
+ async initialize(...args) {
13
+ const { log } = (await this.logCtx(args, "initialize", true)).for(this.initialize);
14
+ const config = this.getConfigFromArgs(...args);
15
+ if (!config.bucket) {
16
+ throw new InternalError("GcsBlobStoreService requires a bucket");
17
+ }
18
+ const storageOptions = {};
19
+ if (config.projectId)
20
+ storageOptions.projectId = config.projectId;
21
+ if (config.credentials)
22
+ storageOptions.credentials = config.credentials;
23
+ if (config.apiEndpoint)
24
+ storageOptions.apiEndpoint = config.apiEndpoint;
25
+ this.storage = new Storage(storageOptions);
26
+ const client = this.storage.bucket(config.bucket);
27
+ this._config = config;
28
+ this._client = client;
29
+ log.verbose(`Initialized GCS blob store ${config.sourceId}`);
30
+ return { config, client };
31
+ }
32
+ async put(key, value, options = {}, ...args) {
33
+ const { log } = (await this.logCtx(args, "put", true)).for(this.put);
34
+ log.verbose(`Putting blob ${key}`);
35
+ const objectName = this.physicalKey(key);
36
+ if (options.ifNotExists) {
37
+ if (await this.has(key)) {
38
+ throw new ConflictError(`Blob already exists: ${key}`);
39
+ }
40
+ }
41
+ const buffer = await collectToBuffer(value);
42
+ if (options.expectedSha256) {
43
+ const sha256 = await computeSha256(buffer);
44
+ if (options.expectedSha256 !== sha256) {
45
+ throw new ValidationError(`Checksum mismatch for ${key}`);
46
+ }
47
+ }
48
+ try {
49
+ const file = this.client.file(objectName);
50
+ const metadata = { ...(options.metadata ?? {}) };
51
+ await file.save(buffer, {
52
+ contentType: options.contentType,
53
+ metadata,
54
+ });
55
+ const [info] = await file.getMetadata();
56
+ const resultMetadata = {
57
+ contentType: options.contentType,
58
+ contentLength: Number(info.size ?? buffer.length),
59
+ etag: info.etag,
60
+ custom: options.metadata,
61
+ };
62
+ return {
63
+ key,
64
+ uri: this.uri(key, "gcs"),
65
+ provider: this.provider,
66
+ sourceId: this.sourceId,
67
+ metadata: resultMetadata,
68
+ };
69
+ }
70
+ catch (error) {
71
+ throw this.parseError(error);
72
+ }
73
+ }
74
+ async get(key, options = {}, ...args) {
75
+ const { log } = (await this.logCtx(args, "get", true)).for(this.get);
76
+ log.verbose(`Getting blob ${key}`);
77
+ const objectName = this.physicalKey(key);
78
+ try {
79
+ const file = this.client.file(objectName);
80
+ const [exists] = await file.exists();
81
+ if (!exists) {
82
+ throw new NotFoundError(`Blob not found: ${key}`);
83
+ }
84
+ const readOptions = {};
85
+ if (options.range) {
86
+ readOptions.start = options.range.start;
87
+ if (options.range.end !== undefined)
88
+ readOptions.end = options.range.end;
89
+ }
90
+ const [info] = await file.getMetadata();
91
+ const stream = file.createReadStream(readOptions);
92
+ const metadata = {
93
+ contentType: info.contentType,
94
+ contentLength: Number(info.size),
95
+ etag: info.etag,
96
+ };
97
+ return {
98
+ key,
99
+ value: toAsyncIterable(stream),
100
+ uri: this.uri(key, "gcs"),
101
+ provider: this.provider,
102
+ sourceId: this.sourceId,
103
+ metadata,
104
+ };
105
+ }
106
+ catch (error) {
107
+ throw this.parseError(error);
108
+ }
109
+ }
110
+ async has(key, ...args) {
111
+ const { log } = (await this.logCtx(args, "has", true)).for(this.has);
112
+ log.verbose(`Checking blob ${key}`);
113
+ try {
114
+ const [exists] = await this.client.file(this.physicalKey(key)).exists();
115
+ return exists;
116
+ }
117
+ catch (error) {
118
+ throw this.parseError(error);
119
+ }
120
+ }
121
+ async stat(key, ...args) {
122
+ const { log } = (await this.logCtx(args, "stat", true)).for(this.stat);
123
+ log.verbose(`Statting blob ${key}`);
124
+ try {
125
+ const [info] = await this.client.file(this.physicalKey(key)).getMetadata();
126
+ return {
127
+ contentType: info.contentType,
128
+ contentLength: Number(info.size),
129
+ etag: info.etag,
130
+ custom: info.metadata,
131
+ };
132
+ }
133
+ catch (error) {
134
+ throw this.parseError(error);
135
+ }
136
+ }
137
+ async delete(key, ...args) {
138
+ const { log } = (await this.logCtx(args, "delete", true)).for(this.delete);
139
+ log.verbose(`Deleting blob ${key}`);
140
+ try {
141
+ await this.client.file(this.physicalKey(key)).delete({ ignoreNotFound: true });
142
+ }
143
+ catch (error) {
144
+ throw this.parseError(error);
145
+ }
146
+ }
147
+ async copy(fromKey, toKey, options = {}, ...args) {
148
+ const { log } = (await this.logCtx(args, "copy", true)).for(this.copy);
149
+ log.verbose(`Copying blob ${fromKey} to ${toKey}`);
150
+ try {
151
+ const sourceFile = this.client.file(this.physicalKey(fromKey));
152
+ const targetFile = this.client.file(this.physicalKey(toKey));
153
+ const [copied] = await sourceFile.copy(targetFile);
154
+ const [info] = await copied.getMetadata();
155
+ const metadata = {
156
+ contentType: options.contentType ?? info.contentType,
157
+ contentLength: Number(info.size),
158
+ etag: info.etag,
159
+ custom: options.metadata,
160
+ };
161
+ return {
162
+ key: toKey,
163
+ uri: this.uri(toKey, "gcs"),
164
+ provider: this.provider,
165
+ sourceId: this.sourceId,
166
+ metadata,
167
+ };
168
+ }
169
+ catch (error) {
170
+ throw this.parseError(error);
171
+ }
172
+ }
173
+ async list(options = {}, ...args) {
174
+ const { log } = (await this.logCtx(args, "list", true)).for(this.list);
175
+ log.verbose("Listing blobs");
176
+ const prefix = this.physicalKey(options.prefix ?? "");
177
+ try {
178
+ const items = [];
179
+ const [files] = await this.client.getFiles({
180
+ prefix: prefix || undefined,
181
+ maxResults: options.limit,
182
+ pageToken: options.cursor,
183
+ });
184
+ for (const file of files) {
185
+ const [info] = await file.getMetadata();
186
+ items.push({
187
+ key: file.name,
188
+ metadata: {
189
+ contentLength: Number(info.size),
190
+ etag: info.etag,
191
+ contentType: info.contentType,
192
+ },
193
+ });
194
+ }
195
+ return { items };
196
+ }
197
+ catch (error) {
198
+ throw this.parseError(error);
199
+ }
200
+ }
201
+ async url(key, options = {}, ...args) {
202
+ const { log } = (await this.logCtx(args, "url", true)).for(this.url);
203
+ log.verbose(`Building url for blob ${key}`);
204
+ const objectName = this.physicalKey(key);
205
+ const operation = options.operation ?? "get";
206
+ const expiresIn = options.expiresInSeconds ?? 300;
207
+ try {
208
+ const file = this.client.file(objectName);
209
+ const action = operation === "put" ? "write" : "read";
210
+ const config = {
211
+ version: "v4",
212
+ action,
213
+ expires: Date.now() + expiresIn * 1000,
214
+ };
215
+ if (options.contentType)
216
+ config.contentType = options.contentType;
217
+ const [url] = await file.getSignedUrl(config);
218
+ return {
219
+ url,
220
+ method: operation === "put" ? "PUT" : "GET",
221
+ expiresAt: new Date(Date.now() + expiresIn * 1000),
222
+ headers: options.contentType
223
+ ? { "Content-Type": options.contentType }
224
+ : undefined,
225
+ };
226
+ }
227
+ catch (error) {
228
+ throw this.parseError(error);
229
+ }
230
+ }
231
+ parseError(error) {
232
+ const err = error;
233
+ if (err instanceof NotFoundError ||
234
+ err instanceof ConflictError ||
235
+ err instanceof AuthorizationError ||
236
+ err instanceof ForbiddenError ||
237
+ err instanceof ValidationError ||
238
+ err instanceof ConnectionError ||
239
+ err instanceof UnsupportedError ||
240
+ err instanceof InternalError) {
241
+ return err;
242
+ }
243
+ const message = err.message || "Unknown error";
244
+ const lower = message.toLowerCase();
245
+ const code = err?.code || err?.status;
246
+ if (lower.includes("not found") || code === 404 || code === "ENOENT" || code === 5) {
247
+ return new NotFoundError(err);
248
+ }
249
+ if (lower.includes("already exists") || code === 409 || code === "EEXIST" || code === 6) {
250
+ return new ConflictError(err);
251
+ }
252
+ if (lower.includes("unauthorized") || code === 401 || code === 16) {
253
+ return new AuthorizationError(err);
254
+ }
255
+ if (lower.includes("permission") || code === 403 || code === 7) {
256
+ return new ForbiddenError(err);
257
+ }
258
+ if (lower.includes("rate limit") || code === 429 || code === 8) {
259
+ return new ConflictError(err);
260
+ }
261
+ if (lower.includes("timeout") || lower.includes("unavailable") || lower.includes("connection") || code === 14 || code === 503) {
262
+ return new ConnectionError(err);
263
+ }
264
+ return new InternalError(err);
265
+ }
266
+ }
267
+ //# sourceMappingURL=GcsBlobStoreService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GcsBlobStoreService.js","sourceRoot":"","sources":["../../../../src/blob/gcp/GcsBlobStoreService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAe,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAElB,eAAe,EACf,cAAc,EAEd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,sCAAiC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,+BAA0B;AAgBpF,MAAM,OAAO,mBAAoB,SAAQ,gBAGxC;IAGU,KAAK,CAAC,UAAU,CACvB,GAAG,IAAyB;QAK5B,MAAM,EAAE,GAAG,EAAE,GAAG,CACd,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,CAC5C,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,MAAM,MAAM,GACV,IAAI,CAAC,iBAAiB,CAA4B,GAAG,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,aAAa,CAAC,uCAAuC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,cAAc,GAA4B,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,SAAS;YAAE,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClE,IAAI,MAAM,CAAC,WAAW;YAAE,cAAc,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACxE,IAAI,MAAM,CAAC,WAAW;YAAE,cAAc,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAExE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QAEtB,GAAG,CAAC,OAAO,CAAC,8BAA8B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAY,EACZ,KAAgB,EAChB,UAA0B,EAAE,EAC5B,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,aAAa,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;gBACtC,MAAM,IAAI,eAAe,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAA2B,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ;aACT,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,cAAc,GAAiB;gBACnC,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC;gBACjD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,OAAO,CAAC,QAAQ;aACzB,CAAC;YACF,OAAO;gBACL,GAAG;gBACH,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,cAAc;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAY,EACZ,UAA0B,EAAE,EAC5B,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,aAAa,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,WAAW,GAA4B,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBACxC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS;oBAAE,WAAW,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YAC3E,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAiB;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;YAEF,OAAO;gBACL,GAAG;gBACH,KAAK,EAAE,eAAe,CAAC,MAAa,CAAC;gBACrC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ;aACT,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAY,EACZ,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACxE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,GAAY,EACZ,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,GAAG,CAAC,OAAO,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3E,OAAO;gBACL,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,QAA8C;aAC5D,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAY,EACZ,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3E,GAAG,CAAC,OAAO,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,OAAgB,EAChB,KAAc,EACd,UAA0B,EAAE,EAC5B,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,GAAG,CAAC,OAAO,CAAC,gBAAgB,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAiB;gBAC7B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;gBACpD,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,OAAO,CAAC,QAAQ;aACzB,CAAC;YACF,OAAO;gBACL,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ;aACT,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,UAA2B,EAAE,EAC7B,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,KAAK,GAA+C,EAAE,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACzC,MAAM,EAAE,MAAM,IAAI,SAAS;gBAC3B,UAAU,EAAE,OAAO,CAAC,KAAK;gBACzB,SAAS,EAAE,OAAO,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC;oBACT,GAAG,EAAE,IAAI,CAAC,IAAI;oBACd,QAAQ,EAAE;wBACR,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;wBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,WAAW;qBAC9B;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAY,EACZ,UAA0B,EAAE,EAC5B,GAAG,IAA6B;QAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACtD,MAAM,MAAM,GAA4B;gBACtC,OAAO,EAAE,IAAI;gBACb,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI;aACvC,CAAC;YACF,IAAI,OAAO,CAAC,WAAW;gBAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YAClE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAa,CAAC,CAAC;YACrD,OAAO;gBACL,GAAG;gBACH,MAAM,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;gBAC3C,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;gBAClD,OAAO,EAAE,OAAO,CAAC,WAAW;oBAC1B,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE;oBACzC,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAES,UAAU,CAAC,KAAc;QACjC,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,IACE,GAAG,YAAY,aAAa;YAC5B,GAAG,YAAY,aAAa;YAC5B,GAAG,YAAY,kBAAkB;YACjC,GAAG,YAAY,cAAc;YAC7B,GAAG,YAAY,eAAe;YAC9B,GAAG,YAAY,eAAe;YAC9B,GAAG,YAAY,gBAAgB;YAC/B,GAAG,YAAY,aAAa,EAC5B,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,GAAI,GAAW,EAAE,IAAI,IAAK,GAAW,EAAE,MAAM,CAAC;QAExD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACxF,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAClE,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9H,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @module integrations/blob/gcp
3
+ * @summary Google Cloud Storage blob store exports.
4
+ * @description Re-exports the GCS blob store service.
5
+ */
6
+ export * from "./GcsBlobStoreService.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/blob/gcp/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,yCAAsC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @module integrations/blob
3
+ * @summary Blob store management helpers for the integrations package.
4
+ * @description Re-exports the blob store core abstractions only. Provider implementations are exported
5
+ * through their own subpaths so the core entry does not eagerly load optional provider SDKs.
6
+ */
7
+ export * from "./core/index.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/blob/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,gCAAuB"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/service
3
+ * @summary IPFS blob store service.
4
+ * @description Blob store backed by an IPFS (Kubo) node. Because the blob API is key/value CRUD-like
5
+ * and IPFS is content-addressed, an IpfsKeyIndex maps logical keys to CIDs.
6
+ */
7
+ import { create as kuboCreate } from "kubo-rpc-client";
8
+ import { UnsupportedError, } from "@decaf-ts/core";
9
+ import { ConflictError, InternalError, NotFoundError, ValidationError, } from "@decaf-ts/db-decorators";
10
+ import { BlobStoreService } from "./../core/BlobStoreService.js";
11
+ import { collectToBuffer, computeSha256, toAsyncIterable } from "./../core/BlobValue.js";
12
+ import { createIpfsKeyIndex } from "./IpfsKeyIndex.js";
13
+ export class IpfsBlobStoreService extends BlobStoreService {
14
+ async initialize(...args) {
15
+ const { log } = (await this.logCtx(args, "initialize", true)).for(this.initialize);
16
+ const config = this.getConfigFromArgs(...args);
17
+ const apiUrl = config.apiUrl || "http://localhost:5001";
18
+ const client = kuboCreate({ url: apiUrl });
19
+ this.index = createIpfsKeyIndex(config.keyIndex);
20
+ this._config = config;
21
+ this._client = client;
22
+ log.verbose(`Initialized IPFS blob store ${config.sourceId}`);
23
+ return { config, client };
24
+ }
25
+ async put(key, value, options = {}, ...args) {
26
+ const { log } = (await this.logCtx(args, "put", true)).for(this.put);
27
+ log.verbose(`Putting blob ${key}`);
28
+ const physicalKey = this.physicalKey(key);
29
+ if (this.config.encryptedOnly && options.metadata?.encrypted !== "true") {
30
+ throw new ValidationError("IPFS blob store requires encrypted payloads");
31
+ }
32
+ if (options.ifNotExists && (await this.has(key))) {
33
+ throw new ConflictError(`Blob already exists: ${key}`);
34
+ }
35
+ const buffer = await collectToBuffer(value);
36
+ if (options.expectedSha256) {
37
+ const sha256 = await computeSha256(buffer);
38
+ if (options.expectedSha256 !== sha256) {
39
+ throw new ValidationError(`Checksum mismatch for ${key}`);
40
+ }
41
+ }
42
+ try {
43
+ const addResult = await this.client.add(buffer);
44
+ const cid = addResult.cid.toString();
45
+ const size = addResult.size;
46
+ if (this.config.pinByDefault !== false) {
47
+ try {
48
+ await this.client.pin.add(cid);
49
+ }
50
+ catch (e) {
51
+ log.silly(`Pin failed for ${cid}: ${e.message}`);
52
+ }
53
+ }
54
+ const metadata = {
55
+ contentLength: size,
56
+ sha256: undefined,
57
+ cid,
58
+ contentType: options.contentType,
59
+ custom: options.metadata,
60
+ };
61
+ await this.index.set(physicalKey, cid, metadata);
62
+ return {
63
+ key,
64
+ uri: `ipfs://${cid}`,
65
+ provider: this.provider,
66
+ sourceId: this.sourceId,
67
+ metadata,
68
+ };
69
+ }
70
+ catch (error) {
71
+ throw this.parseError(error);
72
+ }
73
+ }
74
+ async get(key, options = {}, ...args) {
75
+ const { log } = (await this.logCtx(args, "get", true)).for(this.get);
76
+ log.verbose(`Getting blob ${key}`);
77
+ const physicalKey = this.physicalKey(key);
78
+ const cid = await this.index.get(physicalKey);
79
+ if (!cid) {
80
+ throw new NotFoundError(`Blob not found: ${key}`);
81
+ }
82
+ const metadata = await this.index.stat(physicalKey);
83
+ const catIterable = this.client.cat(cid);
84
+ void options;
85
+ return {
86
+ key,
87
+ value: toAsyncIterable(catIterable),
88
+ uri: `ipfs://${cid}`,
89
+ provider: this.provider,
90
+ sourceId: this.sourceId,
91
+ metadata,
92
+ };
93
+ }
94
+ async has(key, ...args) {
95
+ const { log } = (await this.logCtx(args, "has", true)).for(this.has);
96
+ log.verbose(`Checking blob ${key}`);
97
+ const physicalKey = this.physicalKey(key);
98
+ return Boolean(await this.index.get(physicalKey));
99
+ }
100
+ async stat(key, ...args) {
101
+ const { log } = (await this.logCtx(args, "stat", true)).for(this.stat);
102
+ log.verbose(`Statting blob ${key}`);
103
+ const physicalKey = this.physicalKey(key);
104
+ try {
105
+ return await this.index.stat(physicalKey);
106
+ }
107
+ catch {
108
+ throw new NotFoundError(`Blob not found: ${key}`);
109
+ }
110
+ }
111
+ async delete(key, ...args) {
112
+ const { log } = (await this.logCtx(args, "delete", true)).for(this.delete);
113
+ log.verbose(`Deleting blob ${key}`);
114
+ const physicalKey = this.physicalKey(key);
115
+ const cid = await this.index.get(physicalKey);
116
+ if (cid) {
117
+ try {
118
+ await this.client.pin.rm(cid);
119
+ }
120
+ catch (e) {
121
+ log.silly(`Unpin failed for ${cid}: ${e.message}`);
122
+ }
123
+ }
124
+ await this.index.delete(physicalKey);
125
+ }
126
+ async copy(fromKey, toKey, options = {}, ...args) {
127
+ const { log } = (await this.logCtx(args, "copy", true)).for(this.copy);
128
+ log.verbose(`Copying blob ${fromKey} to ${toKey}`);
129
+ const source = await this.get(fromKey);
130
+ return this.put(toKey, source.value, options);
131
+ }
132
+ async list(options = {}, ...args) {
133
+ const { log } = (await this.logCtx(args, "list", true)).for(this.list);
134
+ log.verbose("Listing blobs");
135
+ const prefix = options.prefix ? this.physicalKey(options.prefix) : undefined;
136
+ return this.index.list(prefix, options.limit, options.cursor);
137
+ }
138
+ async url(key, options = {}, ...args) {
139
+ const { log } = (await this.logCtx(args, "url", true)).for(this.url);
140
+ log.verbose(`Building url for blob ${key}`);
141
+ if (options.operation && options.operation !== "get") {
142
+ throw new UnsupportedError("IPFS does not support PUT urls through this API");
143
+ }
144
+ const physicalKey = this.physicalKey(key);
145
+ const cid = await this.index.get(physicalKey);
146
+ if (!cid) {
147
+ throw new NotFoundError(`Blob not found: ${key}`);
148
+ }
149
+ if (!this.config.gatewayUrl) {
150
+ throw new UnsupportedError("No IPFS gateway configured");
151
+ }
152
+ return {
153
+ url: `${this.config.gatewayUrl.replace(/\/$/, "")}/ipfs/${cid}`,
154
+ method: "GET",
155
+ expiresAt: new Date(Date.now() + (options.expiresInSeconds ?? 300) * 1000),
156
+ };
157
+ }
158
+ parseError(error) {
159
+ const err = error;
160
+ if (err instanceof NotFoundError ||
161
+ err instanceof ConflictError ||
162
+ err instanceof ValidationError ||
163
+ err instanceof InternalError) {
164
+ return err;
165
+ }
166
+ const message = err.message || "Unknown error";
167
+ const lower = message.toLowerCase();
168
+ if (lower.includes("not found") || lower.includes("does not exist")) {
169
+ return new NotFoundError(err);
170
+ }
171
+ if (lower.includes("already exists") || lower.includes("conflict")) {
172
+ return new ConflictError(err);
173
+ }
174
+ return new InternalError(`IPFS error: ${message}`);
175
+ }
176
+ }
177
+ //# sourceMappingURL=IpfsBlobStoreService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpfsBlobStoreService.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/IpfsBlobStoreService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/key-index
3
+ * @summary IPFS key index abstraction.
4
+ * @description Maps logical blob keys to content-addressed CIDs since the blob API is key/value CRUD-like
5
+ * while IPFS is content-addressed.
6
+ */
7
+ import { UnsupportedError } from "@decaf-ts/core";
8
+ import { MemoryIpfsKeyIndex } from "./MemoryIpfsKeyIndex.js";
9
+ import { PostgresIpfsKeyIndex } from "./PostgresIpfsKeyIndex.js";
10
+ import { LocalJsonIpfsKeyIndex } from "./LocalJsonIpfsKeyIndex.js";
11
+ export function createIpfsKeyIndex(config) {
12
+ switch (config.provider) {
13
+ case "memory":
14
+ return new MemoryIpfsKeyIndex();
15
+ case "postgres":
16
+ return new PostgresIpfsKeyIndex(config.connectionRef);
17
+ case "local-json":
18
+ return new LocalJsonIpfsKeyIndex(config.path);
19
+ default:
20
+ throw new UnsupportedError(`Unsupported IPFS key index provider: ${config.provider}`);
21
+ }
22
+ }
23
+ //# sourceMappingURL=IpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/IpfsKeyIndex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMlD,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,OAAO,EAAE,oBAAoB,EAAE,kCAA+B;AAC9D,OAAO,EAAE,qBAAqB,EAAE,mCAAgC;AAchE,MAAM,UAAU,kBAAkB,CAChC,MAA0B;IAE1B,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,IAAI,kBAAkB,EAAE,CAAC;QAClC,KAAK,UAAU;YACb,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,aAAc,CAAC,CAAC;QACzD,KAAK,YAAY;YACf,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC;QACjD;YACE,MAAM,IAAI,gBAAgB,CACxB,wCAAyC,MAAc,CAAC,QAAQ,EAAE,CACnE,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/local-json-index
3
+ * @summary Local JSON-file-backed IPFS key index (stub).
4
+ * @description Documented placeholder; full file implementation is deferred per the spec.
5
+ */
6
+ import { InternalError } from "@decaf-ts/db-decorators";
7
+ export class LocalJsonIpfsKeyIndex {
8
+ constructor(path) {
9
+ this.path = path;
10
+ if (!path) {
11
+ throw new InternalError("LocalJsonIpfsKeyIndex requires a path");
12
+ }
13
+ }
14
+ async get(key) {
15
+ throw new InternalError(`Implement local JSON IPFS key lookup for ${key} at ${this.path}`);
16
+ }
17
+ async set(key, cid, metadata) {
18
+ throw new InternalError(`Implement local JSON IPFS key set for ${key} (cid=${cid}, metadata=${JSON.stringify(metadata)}) at ${this.path}`);
19
+ }
20
+ async delete(key) {
21
+ throw new InternalError(`Implement local JSON IPFS key delete for ${key} at ${this.path}`);
22
+ }
23
+ async list(prefix, limit, cursor) {
24
+ throw new InternalError(`Implement local JSON IPFS key list (prefix=${prefix}, limit=${limit}, cursor=${cursor}) at ${this.path}`);
25
+ }
26
+ async stat(key) {
27
+ throw new InternalError(`Implement local JSON IPFS key stat for ${key} at ${this.path}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=LocalJsonIpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalJsonIpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/LocalJsonIpfsKeyIndex.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIxD,MAAM,OAAO,qBAAqB;IAChC,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,aAAa,CAAC,uCAAuC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,aAAa,CACrB,4CAA4C,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,GAAW,EACX,QAAuB;QAEvB,MAAM,IAAI,aAAa,CACrB,yCAAyC,GAAG,SAAS,GAAG,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAClH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,aAAa,CACrB,4CAA4C,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAe,EACf,KAAc,EACd,MAAe;QAEf,MAAM,IAAI,aAAa,CACrB,8CAA8C,MAAM,WAAW,KAAK,YAAY,MAAM,QAAQ,IAAI,CAAC,IAAI,EAAE,CAC1G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,aAAa,CACrB,0CAA0C,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAChE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ export class MemoryIpfsKeyIndex {
2
+ constructor() {
3
+ this.values = new Map();
4
+ }
5
+ async get(key) {
6
+ return this.values.get(key)?.cid;
7
+ }
8
+ async set(key, cid, metadata) {
9
+ this.values.set(key, {
10
+ cid,
11
+ metadata: { ...metadata, cid },
12
+ });
13
+ }
14
+ async delete(key) {
15
+ this.values.delete(key);
16
+ }
17
+ async list(prefix = "", limit = 1000, cursor) {
18
+ const all = Array.from(this.values.keys())
19
+ .filter((k) => (prefix ? k.startsWith(prefix) : true))
20
+ .sort();
21
+ const startIndex = cursor ? Number(cursor) : 0;
22
+ const slice = all.slice(startIndex, startIndex + limit);
23
+ const nextCursor = startIndex + limit < all.length ? String(startIndex + limit) : undefined;
24
+ return {
25
+ items: slice.map((key) => ({
26
+ key,
27
+ metadata: this.values.get(key)?.metadata,
28
+ })),
29
+ cursor: nextCursor,
30
+ };
31
+ }
32
+ async stat(key) {
33
+ const entry = this.values.get(key);
34
+ if (!entry) {
35
+ throw new Error(`Blob not found: ${key}`);
36
+ }
37
+ return entry.metadata;
38
+ }
39
+ }
40
+ //# sourceMappingURL=MemoryIpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryIpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/MemoryIpfsKeyIndex.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,kBAAkB;IAA/B;QACmB,WAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAiD1D,CAAC;IA/CC,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,GAAW,EACX,QAAuB;QAEvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;YACnB,GAAG;YACH,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAM,GAAG,EAAE,EACX,KAAK,GAAG,IAAI,EACZ,MAAe;QAEf,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACrD,IAAI,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;QACxD,MAAM,UAAU,GACd,UAAU,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,GAAG;gBACH,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ;aACzC,CAAC,CAAC;YACH,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/postgres-index
3
+ * @summary Postgres-backed IPFS key index (stub).
4
+ * @description Documented placeholder; full SQL implementation is deferred per the spec.
5
+ */
6
+ import { InternalError } from "@decaf-ts/db-decorators";
7
+ export class PostgresIpfsKeyIndex {
8
+ constructor(connectionRef) {
9
+ this.connectionRef = connectionRef;
10
+ if (!connectionRef) {
11
+ throw new InternalError("PostgresIpfsKeyIndex requires a connectionRef");
12
+ }
13
+ }
14
+ async get(key) {
15
+ throw new InternalError(`Implement Postgres IPFS key lookup for ${key}`);
16
+ }
17
+ async set(key, cid, metadata) {
18
+ throw new InternalError(`Implement Postgres IPFS key set for ${key} (cid=${cid}, metadata=${JSON.stringify(metadata)})`);
19
+ }
20
+ async delete(key) {
21
+ throw new InternalError(`Implement Postgres IPFS key delete for ${key}`);
22
+ }
23
+ async list(prefix, limit, cursor) {
24
+ throw new InternalError(`Implement Postgres IPFS key list (prefix=${prefix}, limit=${limit}, cursor=${cursor})`);
25
+ }
26
+ async stat(key) {
27
+ throw new InternalError(`Implement Postgres IPFS key stat for ${key}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=PostgresIpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresIpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/PostgresIpfsKeyIndex.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIxD,MAAM,OAAO,oBAAoB;IAC/B,YAA6B,aAAqB;QAArB,kBAAa,GAAb,aAAa,CAAQ;QAChD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,aAAa,CACrB,+CAA+C,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,aAAa,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,GAAW,EACX,QAAuB;QAEvB,MAAM,IAAI,aAAa,CACrB,uCAAuC,GAAG,SAAS,GAAG,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,aAAa,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAe,EACf,KAAc,EACd,MAAe;QAEf,MAAM,IAAI,aAAa,CACrB,4CAA4C,MAAM,WAAW,KAAK,YAAY,MAAM,GAAG,CACxF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,aAAa,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;CACF"}