@langchain/google-common 2.1.18 → 2.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/auth.cjs +1 -2
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +1 -2
- package/dist/auth.js.map +1 -1
- package/dist/chat_models.cjs +24 -27
- package/dist/chat_models.cjs.map +1 -1
- package/dist/chat_models.d.cts.map +1 -1
- package/dist/chat_models.d.ts.map +1 -1
- package/dist/chat_models.js +7 -9
- package/dist/chat_models.js.map +1 -1
- package/dist/connection.cjs +16 -26
- package/dist/connection.cjs.map +1 -1
- package/dist/connection.d.cts.map +1 -1
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +13 -22
- package/dist/connection.js.map +1 -1
- package/dist/embeddings.cjs +12 -22
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.d.cts +0 -1
- package/dist/embeddings.d.cts.map +1 -1
- package/dist/embeddings.d.ts +0 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +7 -16
- package/dist/embeddings.js.map +1 -1
- package/dist/experimental/media.cjs +41 -70
- package/dist/experimental/media.cjs.map +1 -1
- package/dist/experimental/media.d.cts.map +1 -1
- package/dist/experimental/media.d.ts.map +1 -1
- package/dist/experimental/media.js +36 -65
- package/dist/experimental/media.js.map +1 -1
- package/dist/experimental/utils/media_core.cjs +22 -39
- package/dist/experimental/utils/media_core.cjs.map +1 -1
- package/dist/experimental/utils/media_core.d.cts.map +1 -1
- package/dist/experimental/utils/media_core.d.ts.map +1 -1
- package/dist/experimental/utils/media_core.js +16 -33
- package/dist/experimental/utils/media_core.js.map +1 -1
- package/dist/index.cjs +1 -0
- package/dist/llms.cjs +14 -19
- package/dist/llms.cjs.map +1 -1
- package/dist/llms.d.cts.map +1 -1
- package/dist/llms.d.ts.map +1 -1
- package/dist/llms.js +4 -8
- package/dist/llms.js.map +1 -1
- package/dist/output_parsers.cjs +12 -29
- package/dist/output_parsers.cjs.map +1 -1
- package/dist/output_parsers.d.cts.map +1 -1
- package/dist/output_parsers.d.ts.map +1 -1
- package/dist/output_parsers.js +10 -26
- package/dist/output_parsers.js.map +1 -1
- package/dist/profiles.cjs +100 -17
- package/dist/profiles.cjs.map +1 -1
- package/dist/profiles.js +100 -17
- package/dist/profiles.js.map +1 -1
- package/dist/types-anthropic.d.cts.map +1 -1
- package/dist/types-anthropic.d.ts.map +1 -1
- package/dist/types.cjs +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +0 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/anthropic.cjs +73 -113
- package/dist/utils/anthropic.cjs.map +1 -1
- package/dist/utils/anthropic.js +63 -102
- package/dist/utils/anthropic.js.map +1 -1
- package/dist/utils/common.cjs +10 -13
- package/dist/utils/common.cjs.map +1 -1
- package/dist/utils/common.d.cts.map +1 -1
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/common.js +6 -8
- package/dist/utils/common.js.map +1 -1
- package/dist/utils/failed_handler.cjs +1 -2
- package/dist/utils/failed_handler.cjs.map +1 -1
- package/dist/utils/failed_handler.d.cts.map +1 -1
- package/dist/utils/failed_handler.d.ts.map +1 -1
- package/dist/utils/failed_handler.js +1 -2
- package/dist/utils/failed_handler.js.map +1 -1
- package/dist/utils/gemini.cjs +83 -135
- package/dist/utils/gemini.cjs.map +1 -1
- package/dist/utils/gemini.d.cts.map +1 -1
- package/dist/utils/gemini.d.ts.map +1 -1
- package/dist/utils/gemini.js +58 -109
- package/dist/utils/gemini.js.map +1 -1
- package/dist/utils/index.cjs +1 -0
- package/dist/utils/palm.d.cts.map +1 -1
- package/dist/utils/palm.d.ts.map +1 -1
- package/dist/utils/safety.cjs.map +1 -1
- package/dist/utils/safety.d.cts.map +1 -1
- package/dist/utils/safety.d.ts.map +1 -1
- package/dist/utils/safety.js.map +1 -1
- package/dist/utils/stream.cjs +5 -9
- package/dist/utils/stream.cjs.map +1 -1
- package/dist/utils/stream.d.cts.map +1 -1
- package/dist/utils/stream.d.ts.map +1 -1
- package/dist/utils/stream.js +5 -9
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/zod_to_gemini_parameters.cjs +4 -7
- package/dist/utils/zod_to_gemini_parameters.cjs.map +1 -1
- package/dist/utils/zod_to_gemini_parameters.d.cts.map +1 -1
- package/dist/utils/zod_to_gemini_parameters.d.ts.map +1 -1
- package/dist/utils/zod_to_gemini_parameters.js +2 -4
- package/dist/utils/zod_to_gemini_parameters.js.map +1 -1
- package/package.json +3 -3
- package/dist/_virtual/rolldown_runtime.cjs +0 -25
|
@@ -12,7 +12,7 @@ var GoogleMultipartUploadConnection = class extends GoogleHostConnection {
|
|
|
12
12
|
async _body(separator, data, metadata) {
|
|
13
13
|
const contentType = data.mimetype;
|
|
14
14
|
const { encoded, encoding } = await data.encode();
|
|
15
|
-
|
|
15
|
+
return [
|
|
16
16
|
`--${separator}`,
|
|
17
17
|
"Content-Type: application/json; charset=UTF-8",
|
|
18
18
|
"",
|
|
@@ -24,8 +24,7 @@ var GoogleMultipartUploadConnection = class extends GoogleHostConnection {
|
|
|
24
24
|
"",
|
|
25
25
|
encoded,
|
|
26
26
|
`--${separator}--`
|
|
27
|
-
];
|
|
28
|
-
return body.join("\n");
|
|
27
|
+
].join("\n");
|
|
29
28
|
}
|
|
30
29
|
async request(data, metadata, options) {
|
|
31
30
|
const separator = `separator-${Date.now()}`;
|
|
@@ -34,8 +33,7 @@ var GoogleMultipartUploadConnection = class extends GoogleHostConnection {
|
|
|
34
33
|
"Content-Type": `multipart/related; boundary=${separator}`,
|
|
35
34
|
"X-Goog-Upload-Protocol": "multipart"
|
|
36
35
|
};
|
|
37
|
-
|
|
38
|
-
return response;
|
|
36
|
+
return this._request(body, options, requestHeaders);
|
|
39
37
|
}
|
|
40
38
|
};
|
|
41
39
|
var GoogleDownloadConnection = class extends GoogleHostConnection {
|
|
@@ -61,28 +59,18 @@ var BlobStoreGoogle = class extends BlobStore {
|
|
|
61
59
|
}
|
|
62
60
|
async _set(keyValuePair) {
|
|
63
61
|
const [, blob] = keyValuePair;
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
const options = {};
|
|
67
|
-
const connection = this.buildSetConnection(keyValuePair);
|
|
68
|
-
const response = await connection.request(blob, metadata, options);
|
|
69
|
-
return response;
|
|
62
|
+
const metadata = this.buildSetMetadata(keyValuePair);
|
|
63
|
+
return await this.buildSetConnection(keyValuePair).request(blob, metadata, {});
|
|
70
64
|
}
|
|
71
65
|
async mset(keyValuePairs) {
|
|
72
66
|
const ret = keyValuePairs.map((keyValue) => this._set(keyValue));
|
|
73
67
|
await Promise.all(ret);
|
|
74
68
|
}
|
|
75
69
|
async _getMetadata(key) {
|
|
76
|
-
|
|
77
|
-
const options = {};
|
|
78
|
-
const response = await connection.request(options);
|
|
79
|
-
return response.data;
|
|
70
|
+
return (await this.buildGetMetadataConnection(key).request({})).data;
|
|
80
71
|
}
|
|
81
72
|
async _getData(key) {
|
|
82
|
-
|
|
83
|
-
const options = {};
|
|
84
|
-
const response = await connection.request(options);
|
|
85
|
-
return response.data;
|
|
73
|
+
return (await this.buildGetDataConnection(key).request({})).data;
|
|
86
74
|
}
|
|
87
75
|
_getMimetypeFromMetadata(metadata) {
|
|
88
76
|
return metadata.contentType;
|
|
@@ -90,22 +78,18 @@ var BlobStoreGoogle = class extends BlobStore {
|
|
|
90
78
|
async _get(key) {
|
|
91
79
|
const metadata = await this._getMetadata(key);
|
|
92
80
|
const data = await this._getData(key);
|
|
93
|
-
if (data && metadata) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return ret;
|
|
99
|
-
} else return void 0;
|
|
81
|
+
if (data && metadata) return await MediaBlob.fromBlob(data, {
|
|
82
|
+
metadata,
|
|
83
|
+
path: key
|
|
84
|
+
});
|
|
85
|
+
else return;
|
|
100
86
|
}
|
|
101
87
|
async mget(keys) {
|
|
102
88
|
const ret = keys.map((key) => this._get(key));
|
|
103
89
|
return await Promise.all(ret);
|
|
104
90
|
}
|
|
105
91
|
async _del(key) {
|
|
106
|
-
|
|
107
|
-
const options = {};
|
|
108
|
-
await connection.request(options);
|
|
92
|
+
await this.buildDeleteConnection(key).request({});
|
|
109
93
|
}
|
|
110
94
|
async mdelete(keys) {
|
|
111
95
|
const ret = keys.map((key) => this._del(key));
|
|
@@ -179,8 +163,7 @@ var GoogleCloudStorageRawConnection = class extends GoogleDownloadRawConnection
|
|
|
179
163
|
}
|
|
180
164
|
async buildUrl() {
|
|
181
165
|
const path = encodeURIComponent(this.uri.path);
|
|
182
|
-
|
|
183
|
-
return ret;
|
|
166
|
+
return `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}?alt=media`;
|
|
184
167
|
}
|
|
185
168
|
};
|
|
186
169
|
var BlobStoreGoogleCloudStorageBase = class extends BlobStoreGoogle {
|
|
@@ -194,40 +177,34 @@ var BlobStoreGoogleCloudStorageBase = class extends BlobStoreGoogle {
|
|
|
194
177
|
};
|
|
195
178
|
}
|
|
196
179
|
buildSetConnection([key, _blob]) {
|
|
197
|
-
|
|
180
|
+
return new GoogleCloudStorageUploadConnection({
|
|
198
181
|
...this.params,
|
|
199
182
|
uri: key
|
|
200
|
-
};
|
|
201
|
-
return new GoogleCloudStorageUploadConnection(params, this.caller, this.client);
|
|
183
|
+
}, this.caller, this.client);
|
|
202
184
|
}
|
|
203
185
|
buildSetMetadata([key, blob]) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
name: uri.path,
|
|
186
|
+
return {
|
|
187
|
+
name: new GoogleCloudStorageUri(key).path,
|
|
207
188
|
metadata: blob.metadata,
|
|
208
189
|
contentType: blob.mimetype
|
|
209
190
|
};
|
|
210
|
-
return ret;
|
|
211
191
|
}
|
|
212
192
|
buildGetMetadataConnection(key) {
|
|
213
|
-
|
|
193
|
+
return new GoogleCloudStorageDownloadConnection({
|
|
214
194
|
uri: key,
|
|
215
195
|
method: "GET",
|
|
216
196
|
alt: void 0
|
|
217
|
-
};
|
|
218
|
-
return new GoogleCloudStorageDownloadConnection(params, this.caller, this.client);
|
|
197
|
+
}, this.caller, this.client);
|
|
219
198
|
}
|
|
220
199
|
buildGetDataConnection(key) {
|
|
221
|
-
|
|
222
|
-
return new GoogleCloudStorageRawConnection(params, this.caller, this.client);
|
|
200
|
+
return new GoogleCloudStorageRawConnection({ uri: key }, this.caller, this.client);
|
|
223
201
|
}
|
|
224
202
|
buildDeleteConnection(key) {
|
|
225
|
-
|
|
203
|
+
return new GoogleCloudStorageDownloadConnection({
|
|
226
204
|
uri: key,
|
|
227
205
|
method: "DELETE",
|
|
228
206
|
alt: void 0
|
|
229
|
-
};
|
|
230
|
-
return new GoogleCloudStorageDownloadConnection(params, this.caller, this.client);
|
|
207
|
+
}, this.caller, this.client);
|
|
231
208
|
}
|
|
232
209
|
};
|
|
233
210
|
var AIStudioMediaBlob = class extends MediaBlob {
|
|
@@ -249,8 +226,7 @@ var AIStudioMediaBlob = class extends MediaBlob {
|
|
|
249
226
|
}
|
|
250
227
|
get isExpired() {
|
|
251
228
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
252
|
-
|
|
253
|
-
return exp <= now;
|
|
229
|
+
return (this.metadata?.expirationTime ?? now) <= now;
|
|
254
230
|
}
|
|
255
231
|
};
|
|
256
232
|
var AIStudioFileUploadConnection = class extends GoogleMultipartUploadConnection {
|
|
@@ -330,38 +306,33 @@ var BlobStoreAIStudioFileBase = class extends BlobStoreGoogle {
|
|
|
330
306
|
return {};
|
|
331
307
|
}
|
|
332
308
|
buildGetMetadataConnection(key) {
|
|
333
|
-
|
|
309
|
+
return new AIStudioFileDownloadConnection({
|
|
334
310
|
...this.params,
|
|
335
311
|
method: "GET",
|
|
336
312
|
name: this._pathToName(key)
|
|
337
|
-
};
|
|
338
|
-
return new AIStudioFileDownloadConnection(params, this.caller, this.client);
|
|
313
|
+
}, this.caller, this.client);
|
|
339
314
|
}
|
|
340
315
|
buildGetDataConnection(_key) {
|
|
341
316
|
throw new Error("AI Studio File API does not provide data");
|
|
342
317
|
}
|
|
343
318
|
async _get(key) {
|
|
344
319
|
const metadata = await this._getMetadata(key);
|
|
345
|
-
if (metadata) {
|
|
346
|
-
|
|
347
|
-
|
|
320
|
+
if (metadata) return new MediaBlob({
|
|
321
|
+
path: key,
|
|
322
|
+
data: {
|
|
348
323
|
value: "",
|
|
349
|
-
type:
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
metadata
|
|
355
|
-
});
|
|
356
|
-
} else return void 0;
|
|
324
|
+
type: metadata?.mimeType ?? "application/octet-stream"
|
|
325
|
+
},
|
|
326
|
+
metadata
|
|
327
|
+
});
|
|
328
|
+
else return;
|
|
357
329
|
}
|
|
358
330
|
buildDeleteConnection(key) {
|
|
359
|
-
|
|
331
|
+
return new AIStudioFileDownloadConnection({
|
|
360
332
|
...this.params,
|
|
361
333
|
method: "DELETE",
|
|
362
334
|
name: this._pathToName(key)
|
|
363
|
-
};
|
|
364
|
-
return new AIStudioFileDownloadConnection(params, this.caller, this.client);
|
|
335
|
+
}, this.caller, this.client);
|
|
365
336
|
}
|
|
366
337
|
};
|
|
367
338
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","names":["fields: GoogleConnectionParams<AuthOptions> | undefined","caller: AsyncCaller","client: GoogleAbstractedClient","separator: string","data: MediaBlob","metadata: Record<string, unknown>","options: CallOptions","fields?: BlobStoreGoogleParams<AuthOptions>","keyValuePair: [string, MediaBlob]","keyValuePairs: [string, MediaBlob][]","key: string","keys: string[]","_prefix: string | undefined","uri: string","fields: GoogleCloudStorageUploadConnectionParams<AuthOptions>","fields: GoogleCloudStorageDownloadConnectionParams<AuthOptions>","fields: GoogleCloudStorageRawConnectionParams<AuthOptions>","fields: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>","params: GoogleCloudStorageUploadConnectionParams<AuthOptions>","ret: GoogleCloudStorageObject","params: GoogleCloudStorageDownloadConnectionParams<AuthOptions>","params: GoogleCloudStorageRawConnectionParams<AuthOptions>","value: string","field: string","fields: AIStudioFileDownloadConnectionParams<AuthOptions>","fields?: BlobStoreAIStudioFileBaseParams<AuthOptions>","params: BlobStoreAIStudioFileBaseParams<AuthOptions>","path: string","apiKey: string","params: AIStudioFileDownloadConnectionParams<AuthOptions>","_key: string","data: MediaBlobData"],"sources":["../../src/experimental/media.ts"],"sourcesContent":["import {\n AsyncCaller,\n AsyncCallerCallOptions,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n MediaBlob,\n BlobStore,\n BlobStoreOptions,\n MediaBlobData,\n} from \"./utils/media_core.js\";\nimport {\n GoogleConnectionParams,\n GoogleRawResponse,\n GoogleResponse,\n} from \"../types.js\";\nimport { GoogleHostConnection, GoogleRawConnection } from \"../connection.js\";\nimport {\n ApiKeyGoogleAuth,\n GoogleAbstractedClient,\n GoogleAbstractedClientOpsMethod,\n} from \"../auth.js\";\n\nexport interface GoogleUploadConnectionParams<\n AuthOptions,\n> extends GoogleConnectionParams<AuthOptions> {}\n\nexport abstract class GoogleMultipartUploadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n }\n\n async _body(\n separator: string,\n data: MediaBlob,\n metadata: Record<string, unknown>\n ): Promise<string> {\n const contentType = data.mimetype;\n const { encoded, encoding } = await data.encode();\n const body = [\n `--${separator}`,\n \"Content-Type: application/json; charset=UTF-8\",\n \"\",\n JSON.stringify(metadata),\n \"\",\n `--${separator}`,\n `Content-Type: ${contentType}`,\n `Content-Transfer-Encoding: ${encoding}`,\n \"\",\n encoded,\n `--${separator}--`,\n ];\n return body.join(\"\\n\");\n }\n\n async request(\n data: MediaBlob,\n metadata: Record<string, unknown>,\n options: CallOptions\n ): Promise<ResponseType> {\n const separator = `separator-${Date.now()}`;\n const body = await this._body(separator, data, metadata);\n const requestHeaders = {\n \"Content-Type\": `multipart/related; boundary=${separator}`,\n \"X-Goog-Upload-Protocol\": \"multipart\",\n };\n const response = this._request(body, options, requestHeaders);\n return response;\n }\n}\n\nexport abstract class GoogleDownloadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n async request(options: CallOptions): Promise<ResponseType> {\n return this._request(undefined, options);\n }\n}\n\nexport abstract class GoogleDownloadRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleRawConnection<CallOptions, AuthOptions> {\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"GET\";\n }\n\n async request(options: CallOptions): Promise<GoogleRawResponse> {\n return this._request(undefined, options);\n }\n}\n\nexport interface BlobStoreGoogleParams<AuthOptions>\n extends\n GoogleConnectionParams<AuthOptions>,\n AsyncCallerParams,\n BlobStoreOptions {}\n\nexport abstract class BlobStoreGoogle<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends BlobStore {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n constructor(fields?: BlobStoreGoogleParams<AuthOptions>) {\n super(fields);\n this.caller = new AsyncCaller(fields ?? {});\n this.client = this.buildClient(fields);\n }\n\n abstract buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n abstract buildSetMetadata([key, blob]: [string, MediaBlob]): Record<\n string,\n unknown\n >;\n\n abstract buildSetConnection([key, blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _set(keyValuePair: [string, MediaBlob]): Promise<ResponseType> {\n const [, blob] = keyValuePair;\n const setMetadata = this.buildSetMetadata(keyValuePair);\n const metadata = setMetadata;\n const options = {};\n const connection = this.buildSetConnection(keyValuePair);\n const response = await connection.request(blob, metadata, options);\n return response;\n }\n\n async mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n const ret = keyValuePairs.map((keyValue) => this._set(keyValue));\n await Promise.all(ret);\n }\n\n abstract buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _getMetadata(key: string): Promise<Record<string, unknown>> {\n const connection = this.buildGetMetadataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n abstract buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions>;\n\n async _getData(key: string): Promise<Blob> {\n const connection = this.buildGetDataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n _getMimetypeFromMetadata(metadata: Record<string, unknown>): string {\n return metadata.contentType as string;\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n const data = await this._getData(key);\n if (data && metadata) {\n const ret = await MediaBlob.fromBlob(data, { metadata, path: key });\n return ret;\n } else {\n return undefined;\n }\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const ret = keys.map((key) => this._get(key));\n return await Promise.all(ret);\n }\n\n abstract buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n >;\n\n async _del(key: string): Promise<void> {\n const connection = this.buildDeleteConnection(key);\n const options = {};\n await connection.request(options);\n }\n\n async mdelete(keys: string[]): Promise<void> {\n const ret = keys.map((key) => this._del(key));\n await Promise.all(ret);\n }\n\n // eslint-disable-next-line require-yield\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n // TODO: Implement. Most have an implementation that uses nextToken.\n throw new Error(\"yieldKeys is not implemented\");\n }\n}\n\n/**\n * Based on https://cloud.google.com/storage/docs/json_api/v1/objects#resource\n */\nexport interface GoogleCloudStorageObject extends Record<string, unknown> {\n id?: string;\n name?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n // This is incomplete.\n}\n\nexport interface GoogleCloudStorageResponse extends GoogleResponse {\n data: GoogleCloudStorageObject;\n}\n\nexport type BucketAndPath = {\n bucket: string;\n path: string;\n};\n\nexport class GoogleCloudStorageUri {\n static uriRegexp = /gs:\\/\\/([a-z0-9][a-z0-9._-]+[a-z0-9])\\/(.*)/;\n\n bucket: string;\n\n path: string;\n\n constructor(uri: string) {\n const bucketAndPath = GoogleCloudStorageUri.uriToBucketAndPath(uri);\n this.bucket = bucketAndPath.bucket;\n this.path = bucketAndPath.path;\n }\n\n get uri() {\n return `gs://${this.bucket}/${this.path}`;\n }\n\n get isValid() {\n return (\n typeof this.bucket !== \"undefined\" && typeof this.path !== \"undefined\"\n );\n }\n\n static uriToBucketAndPath(uri: string): BucketAndPath {\n const match = this.uriRegexp.exec(uri);\n if (!match) {\n throw new Error(`Invalid gs:// URI: ${uri}`);\n }\n return {\n bucket: match[1],\n path: match[2],\n };\n }\n\n static isValidUri(uri: string): boolean {\n return this.uriRegexp.test(uri);\n }\n}\n\nexport interface GoogleCloudStorageConnectionParams {\n uri: string;\n}\n\nexport interface GoogleCloudStorageUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n GoogleCloudStorageConnectionParams {}\n\nexport class GoogleCloudStorageUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageUploadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n return `https://storage.googleapis.com/upload/storage/${this.apiVersion}/b/${this.uri.bucket}/o?uploadType=multipart`;\n }\n}\n\nexport interface GoogleCloudStorageDownloadConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n alt: \"media\" | undefined;\n}\n\nexport class GoogleCloudStorageDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n method: GoogleAbstractedClientOpsMethod;\n\n alt: \"media\" | undefined;\n\n constructor(\n fields: GoogleCloudStorageDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n this.method = fields.method;\n this.alt = fields.alt;\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}`;\n return this.alt ? `${ret}?alt=${this.alt}` : ret;\n }\n}\n\nexport interface GoogleCloudStorageRawConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {}\n\nexport class GoogleCloudStorageRawConnection<\n AuthOptions,\n> extends GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageRawConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}?alt=media`;\n return ret;\n }\n}\n\nexport interface BlobStoreGoogleCloudStorageBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n uriPrefix: GoogleCloudStorageUri;\n}\n\nexport abstract class BlobStoreGoogleCloudStorageBase<\n AuthOptions,\n> extends BlobStoreGoogle<GoogleCloudStorageResponse, AuthOptions> {\n params: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>;\n\n constructor(fields: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>) {\n super(fields);\n this.params = fields;\n this.defaultStoreOptions = {\n ...this.defaultStoreOptions,\n pathPrefix: fields.uriPrefix.uri,\n };\n }\n\n buildSetConnection([key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageUploadConnectionParams<AuthOptions> = {\n ...this.params,\n uri: key,\n };\n return new GoogleCloudStorageUploadConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([key, blob]: [string, MediaBlob]): Record<string, unknown> {\n const uri = new GoogleCloudStorageUri(key);\n const ret: GoogleCloudStorageObject = {\n name: uri.path,\n metadata: blob.metadata,\n contentType: blob.mimetype,\n };\n return ret;\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"GET\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleCloudStorageResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n const params: GoogleCloudStorageRawConnectionParams<AuthOptions> = {\n uri: key,\n };\n return new GoogleCloudStorageRawConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"DELETE\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n\nexport type AIStudioFileState =\n | \"PROCESSING\"\n | \"ACTIVE\"\n | \"FAILED\"\n | \"STATE_UNSPECIFIED\";\n\nexport type AIStudioFileVideoMetadata = {\n videoMetadata: {\n videoDuration: string; // Duration in seconds, possibly with fractional, ending in \"s\"\n };\n};\n\nexport type AIStudioFileMetadata = AIStudioFileVideoMetadata;\n\nexport interface AIStudioFileObject {\n name?: string;\n displayName?: string;\n mimeType?: string;\n sizeBytes?: string; // int64 format\n createTime?: string; // timestamp format\n updateTime?: string; // timestamp format\n expirationTime?: string; // timestamp format\n sha256Hash?: string; // base64 encoded\n uri?: string;\n state?: AIStudioFileState;\n error?: {\n code: number;\n message: string;\n details: Record<string, unknown>[];\n };\n metadata?: AIStudioFileMetadata;\n}\n\nexport class AIStudioMediaBlob extends MediaBlob {\n _valueAsDate(value: string): Date {\n if (!value) {\n return new Date(0);\n }\n return new Date(value);\n }\n\n _metadataFieldAsDate(field: string): Date {\n return this._valueAsDate(this.metadata?.[field]);\n }\n\n get createDate(): Date {\n return this._metadataFieldAsDate(\"createTime\");\n }\n\n get updateDate(): Date {\n return this._metadataFieldAsDate(\"updateTime\");\n }\n\n get expirationDate(): Date {\n return this._metadataFieldAsDate(\"expirationTime\");\n }\n\n get isExpired(): boolean {\n const now = new Date().toISOString();\n const exp = this.metadata?.expirationTime ?? now;\n return exp <= now;\n }\n}\n\nexport interface AIStudioFileGetResponse extends GoogleResponse {\n data: AIStudioFileObject;\n}\n\nexport interface AIStudioFileSaveResponse extends GoogleResponse {\n data: {\n file: AIStudioFileObject;\n };\n}\n\nexport interface AIStudioFileListResponse extends GoogleResponse {\n data: {\n files: AIStudioFileObject[];\n nextPageToken: string;\n };\n}\n\nexport type AIStudioFileResponse =\n | AIStudioFileGetResponse\n | AIStudioFileSaveResponse\n | AIStudioFileListResponse;\n\nexport interface AIStudioFileConnectionParams {}\n\nexport interface AIStudioFileUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n AIStudioFileConnectionParams {}\n\nexport class AIStudioFileUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileSaveResponse,\n AuthOptions\n> {\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/upload/${this.apiVersion}/files`;\n }\n}\n\nexport interface AIStudioFileDownloadConnectionParams<AuthOptions>\n extends AIStudioFileConnectionParams, GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n name: string;\n}\n\nexport class AIStudioFileDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n method: GoogleAbstractedClientOpsMethod;\n\n name: string;\n\n constructor(\n fields: AIStudioFileDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.method = fields.method;\n this.name = fields.name;\n }\n\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/${this.apiVersion}/files/${this.name}`;\n }\n}\n\nexport interface BlobStoreAIStudioFileBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n retryTime?: number;\n}\n\nexport abstract class BlobStoreAIStudioFileBase<\n AuthOptions,\n> extends BlobStoreGoogle<AIStudioFileResponse, AuthOptions> {\n params?: BlobStoreAIStudioFileBaseParams<AuthOptions>;\n\n retryTime: number = 1000;\n\n constructor(fields?: BlobStoreAIStudioFileBaseParams<AuthOptions>) {\n const params: BlobStoreAIStudioFileBaseParams<AuthOptions> = {\n defaultStoreOptions: {\n pathPrefix: \"https://generativelanguage.googleapis.com/v1beta/files/\",\n actionIfInvalid: \"removePath\",\n },\n ...fields,\n };\n super(params);\n this.params = params;\n this.retryTime = params?.retryTime ?? this.retryTime ?? 1000;\n }\n\n _pathToName(path: string): string {\n return path.split(\"/\").pop() ?? path;\n }\n\n abstract buildAbstractedClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: BlobStoreGoogleParams<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n // TODO: Test that you can use OAuth to access\n return this.buildAbstractedClient(fields);\n }\n }\n\n async _regetMetadata(key: string): Promise<AIStudioFileObject> {\n // Sleep for some time period\n await new Promise((resolve) => setTimeout(resolve, this.retryTime));\n\n // Fetch the latest metadata\n return this._getMetadata(key);\n }\n\n async _set([key, blob]: [\n string,\n MediaBlob,\n ]): Promise<AIStudioFileSaveResponse> {\n const response = (await super._set([\n key,\n blob,\n ])) as AIStudioFileSaveResponse;\n\n let file = response.data?.file ?? { state: \"FAILED\" };\n while (file.state === \"PROCESSING\" && file.uri && this.retryTime > 0) {\n file = await this._regetMetadata(file.uri);\n }\n\n // The response should contain the name (and valid URI), so we need to\n // update the blob with this. We can't return a new blob, since mset()\n // doesn't return anything.\n blob.path = file.uri;\n blob.metadata = {\n ...blob.metadata,\n ...file,\n };\n return response;\n }\n\n buildSetConnection([_key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n return new AIStudioFileUploadConnection(\n this.params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([_key, _blob]: [string, MediaBlob]): Record<\n string,\n unknown\n > {\n return {};\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"GET\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n _key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n throw new Error(\"AI Studio File API does not provide data\");\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n if (metadata) {\n const contentType =\n (metadata?.mimeType as string) ?? \"application/octet-stream\";\n // TODO - Get the actual data (and other metadata) from an optional backing store\n const data: MediaBlobData = {\n value: \"\",\n type: contentType,\n };\n\n return new MediaBlob({\n path: key,\n data,\n metadata,\n });\n } else {\n return undefined;\n }\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"DELETE\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media.js","names":[],"sources":["../../src/experimental/media.ts"],"sourcesContent":["import {\n AsyncCaller,\n AsyncCallerCallOptions,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n MediaBlob,\n BlobStore,\n BlobStoreOptions,\n MediaBlobData,\n} from \"./utils/media_core.js\";\nimport {\n GoogleConnectionParams,\n GoogleRawResponse,\n GoogleResponse,\n} from \"../types.js\";\nimport { GoogleHostConnection, GoogleRawConnection } from \"../connection.js\";\nimport {\n ApiKeyGoogleAuth,\n GoogleAbstractedClient,\n GoogleAbstractedClientOpsMethod,\n} from \"../auth.js\";\n\nexport interface GoogleUploadConnectionParams<\n AuthOptions,\n> extends GoogleConnectionParams<AuthOptions> {}\n\nexport abstract class GoogleMultipartUploadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n }\n\n async _body(\n separator: string,\n data: MediaBlob,\n metadata: Record<string, unknown>\n ): Promise<string> {\n const contentType = data.mimetype;\n const { encoded, encoding } = await data.encode();\n const body = [\n `--${separator}`,\n \"Content-Type: application/json; charset=UTF-8\",\n \"\",\n JSON.stringify(metadata),\n \"\",\n `--${separator}`,\n `Content-Type: ${contentType}`,\n `Content-Transfer-Encoding: ${encoding}`,\n \"\",\n encoded,\n `--${separator}--`,\n ];\n return body.join(\"\\n\");\n }\n\n async request(\n data: MediaBlob,\n metadata: Record<string, unknown>,\n options: CallOptions\n ): Promise<ResponseType> {\n const separator = `separator-${Date.now()}`;\n const body = await this._body(separator, data, metadata);\n const requestHeaders = {\n \"Content-Type\": `multipart/related; boundary=${separator}`,\n \"X-Goog-Upload-Protocol\": \"multipart\",\n };\n const response = this._request(body, options, requestHeaders);\n return response;\n }\n}\n\nexport abstract class GoogleDownloadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n async request(options: CallOptions): Promise<ResponseType> {\n return this._request(undefined, options);\n }\n}\n\nexport abstract class GoogleDownloadRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleRawConnection<CallOptions, AuthOptions> {\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"GET\";\n }\n\n async request(options: CallOptions): Promise<GoogleRawResponse> {\n return this._request(undefined, options);\n }\n}\n\nexport interface BlobStoreGoogleParams<AuthOptions>\n extends\n GoogleConnectionParams<AuthOptions>,\n AsyncCallerParams,\n BlobStoreOptions {}\n\nexport abstract class BlobStoreGoogle<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends BlobStore {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n constructor(fields?: BlobStoreGoogleParams<AuthOptions>) {\n super(fields);\n this.caller = new AsyncCaller(fields ?? {});\n this.client = this.buildClient(fields);\n }\n\n abstract buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n abstract buildSetMetadata([key, blob]: [string, MediaBlob]): Record<\n string,\n unknown\n >;\n\n abstract buildSetConnection([key, blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _set(keyValuePair: [string, MediaBlob]): Promise<ResponseType> {\n const [, blob] = keyValuePair;\n const setMetadata = this.buildSetMetadata(keyValuePair);\n const metadata = setMetadata;\n const options = {};\n const connection = this.buildSetConnection(keyValuePair);\n const response = await connection.request(blob, metadata, options);\n return response;\n }\n\n async mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n const ret = keyValuePairs.map((keyValue) => this._set(keyValue));\n await Promise.all(ret);\n }\n\n abstract buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _getMetadata(key: string): Promise<Record<string, unknown>> {\n const connection = this.buildGetMetadataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n abstract buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions>;\n\n async _getData(key: string): Promise<Blob> {\n const connection = this.buildGetDataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n _getMimetypeFromMetadata(metadata: Record<string, unknown>): string {\n return metadata.contentType as string;\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n const data = await this._getData(key);\n if (data && metadata) {\n const ret = await MediaBlob.fromBlob(data, { metadata, path: key });\n return ret;\n } else {\n return undefined;\n }\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const ret = keys.map((key) => this._get(key));\n return await Promise.all(ret);\n }\n\n abstract buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n >;\n\n async _del(key: string): Promise<void> {\n const connection = this.buildDeleteConnection(key);\n const options = {};\n await connection.request(options);\n }\n\n async mdelete(keys: string[]): Promise<void> {\n const ret = keys.map((key) => this._del(key));\n await Promise.all(ret);\n }\n\n // eslint-disable-next-line require-yield\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n // TODO: Implement. Most have an implementation that uses nextToken.\n throw new Error(\"yieldKeys is not implemented\");\n }\n}\n\n/**\n * Based on https://cloud.google.com/storage/docs/json_api/v1/objects#resource\n */\nexport interface GoogleCloudStorageObject extends Record<string, unknown> {\n id?: string;\n name?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n // This is incomplete.\n}\n\nexport interface GoogleCloudStorageResponse extends GoogleResponse {\n data: GoogleCloudStorageObject;\n}\n\nexport type BucketAndPath = {\n bucket: string;\n path: string;\n};\n\nexport class GoogleCloudStorageUri {\n static uriRegexp = /gs:\\/\\/([a-z0-9][a-z0-9._-]+[a-z0-9])\\/(.*)/;\n\n bucket: string;\n\n path: string;\n\n constructor(uri: string) {\n const bucketAndPath = GoogleCloudStorageUri.uriToBucketAndPath(uri);\n this.bucket = bucketAndPath.bucket;\n this.path = bucketAndPath.path;\n }\n\n get uri() {\n return `gs://${this.bucket}/${this.path}`;\n }\n\n get isValid() {\n return (\n typeof this.bucket !== \"undefined\" && typeof this.path !== \"undefined\"\n );\n }\n\n static uriToBucketAndPath(uri: string): BucketAndPath {\n const match = this.uriRegexp.exec(uri);\n if (!match) {\n throw new Error(`Invalid gs:// URI: ${uri}`);\n }\n return {\n bucket: match[1],\n path: match[2],\n };\n }\n\n static isValidUri(uri: string): boolean {\n return this.uriRegexp.test(uri);\n }\n}\n\nexport interface GoogleCloudStorageConnectionParams {\n uri: string;\n}\n\nexport interface GoogleCloudStorageUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n GoogleCloudStorageConnectionParams {}\n\nexport class GoogleCloudStorageUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageUploadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n return `https://storage.googleapis.com/upload/storage/${this.apiVersion}/b/${this.uri.bucket}/o?uploadType=multipart`;\n }\n}\n\nexport interface GoogleCloudStorageDownloadConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n alt: \"media\" | undefined;\n}\n\nexport class GoogleCloudStorageDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n method: GoogleAbstractedClientOpsMethod;\n\n alt: \"media\" | undefined;\n\n constructor(\n fields: GoogleCloudStorageDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n this.method = fields.method;\n this.alt = fields.alt;\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}`;\n return this.alt ? `${ret}?alt=${this.alt}` : ret;\n }\n}\n\nexport interface GoogleCloudStorageRawConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {}\n\nexport class GoogleCloudStorageRawConnection<\n AuthOptions,\n> extends GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageRawConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}?alt=media`;\n return ret;\n }\n}\n\nexport interface BlobStoreGoogleCloudStorageBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n uriPrefix: GoogleCloudStorageUri;\n}\n\nexport abstract class BlobStoreGoogleCloudStorageBase<\n AuthOptions,\n> extends BlobStoreGoogle<GoogleCloudStorageResponse, AuthOptions> {\n params: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>;\n\n constructor(fields: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>) {\n super(fields);\n this.params = fields;\n this.defaultStoreOptions = {\n ...this.defaultStoreOptions,\n pathPrefix: fields.uriPrefix.uri,\n };\n }\n\n buildSetConnection([key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageUploadConnectionParams<AuthOptions> = {\n ...this.params,\n uri: key,\n };\n return new GoogleCloudStorageUploadConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([key, blob]: [string, MediaBlob]): Record<string, unknown> {\n const uri = new GoogleCloudStorageUri(key);\n const ret: GoogleCloudStorageObject = {\n name: uri.path,\n metadata: blob.metadata,\n contentType: blob.mimetype,\n };\n return ret;\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"GET\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleCloudStorageResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n const params: GoogleCloudStorageRawConnectionParams<AuthOptions> = {\n uri: key,\n };\n return new GoogleCloudStorageRawConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"DELETE\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n\nexport type AIStudioFileState =\n | \"PROCESSING\"\n | \"ACTIVE\"\n | \"FAILED\"\n | \"STATE_UNSPECIFIED\";\n\nexport type AIStudioFileVideoMetadata = {\n videoMetadata: {\n videoDuration: string; // Duration in seconds, possibly with fractional, ending in \"s\"\n };\n};\n\nexport type AIStudioFileMetadata = AIStudioFileVideoMetadata;\n\nexport interface AIStudioFileObject {\n name?: string;\n displayName?: string;\n mimeType?: string;\n sizeBytes?: string; // int64 format\n createTime?: string; // timestamp format\n updateTime?: string; // timestamp format\n expirationTime?: string; // timestamp format\n sha256Hash?: string; // base64 encoded\n uri?: string;\n state?: AIStudioFileState;\n error?: {\n code: number;\n message: string;\n details: Record<string, unknown>[];\n };\n metadata?: AIStudioFileMetadata;\n}\n\nexport class AIStudioMediaBlob extends MediaBlob {\n _valueAsDate(value: string): Date {\n if (!value) {\n return new Date(0);\n }\n return new Date(value);\n }\n\n _metadataFieldAsDate(field: string): Date {\n return this._valueAsDate(this.metadata?.[field]);\n }\n\n get createDate(): Date {\n return this._metadataFieldAsDate(\"createTime\");\n }\n\n get updateDate(): Date {\n return this._metadataFieldAsDate(\"updateTime\");\n }\n\n get expirationDate(): Date {\n return this._metadataFieldAsDate(\"expirationTime\");\n }\n\n get isExpired(): boolean {\n const now = new Date().toISOString();\n const exp = this.metadata?.expirationTime ?? now;\n return exp <= now;\n }\n}\n\nexport interface AIStudioFileGetResponse extends GoogleResponse {\n data: AIStudioFileObject;\n}\n\nexport interface AIStudioFileSaveResponse extends GoogleResponse {\n data: {\n file: AIStudioFileObject;\n };\n}\n\nexport interface AIStudioFileListResponse extends GoogleResponse {\n data: {\n files: AIStudioFileObject[];\n nextPageToken: string;\n };\n}\n\nexport type AIStudioFileResponse =\n | AIStudioFileGetResponse\n | AIStudioFileSaveResponse\n | AIStudioFileListResponse;\n\nexport interface AIStudioFileConnectionParams {}\n\nexport interface AIStudioFileUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n AIStudioFileConnectionParams {}\n\nexport class AIStudioFileUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileSaveResponse,\n AuthOptions\n> {\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/upload/${this.apiVersion}/files`;\n }\n}\n\nexport interface AIStudioFileDownloadConnectionParams<AuthOptions>\n extends AIStudioFileConnectionParams, GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n name: string;\n}\n\nexport class AIStudioFileDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n method: GoogleAbstractedClientOpsMethod;\n\n name: string;\n\n constructor(\n fields: AIStudioFileDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.method = fields.method;\n this.name = fields.name;\n }\n\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/${this.apiVersion}/files/${this.name}`;\n }\n}\n\nexport interface BlobStoreAIStudioFileBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n retryTime?: number;\n}\n\nexport abstract class BlobStoreAIStudioFileBase<\n AuthOptions,\n> extends BlobStoreGoogle<AIStudioFileResponse, AuthOptions> {\n params?: BlobStoreAIStudioFileBaseParams<AuthOptions>;\n\n retryTime: number = 1000;\n\n constructor(fields?: BlobStoreAIStudioFileBaseParams<AuthOptions>) {\n const params: BlobStoreAIStudioFileBaseParams<AuthOptions> = {\n defaultStoreOptions: {\n pathPrefix: \"https://generativelanguage.googleapis.com/v1beta/files/\",\n actionIfInvalid: \"removePath\",\n },\n ...fields,\n };\n super(params);\n this.params = params;\n this.retryTime = params?.retryTime ?? this.retryTime ?? 1000;\n }\n\n _pathToName(path: string): string {\n return path.split(\"/\").pop() ?? path;\n }\n\n abstract buildAbstractedClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: BlobStoreGoogleParams<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n // TODO: Test that you can use OAuth to access\n return this.buildAbstractedClient(fields);\n }\n }\n\n async _regetMetadata(key: string): Promise<AIStudioFileObject> {\n // Sleep for some time period\n await new Promise((resolve) => setTimeout(resolve, this.retryTime));\n\n // Fetch the latest metadata\n return this._getMetadata(key);\n }\n\n async _set([key, blob]: [\n string,\n MediaBlob,\n ]): Promise<AIStudioFileSaveResponse> {\n const response = (await super._set([\n key,\n blob,\n ])) as AIStudioFileSaveResponse;\n\n let file = response.data?.file ?? { state: \"FAILED\" };\n while (file.state === \"PROCESSING\" && file.uri && this.retryTime > 0) {\n file = await this._regetMetadata(file.uri);\n }\n\n // The response should contain the name (and valid URI), so we need to\n // update the blob with this. We can't return a new blob, since mset()\n // doesn't return anything.\n blob.path = file.uri;\n blob.metadata = {\n ...blob.metadata,\n ...file,\n };\n return response;\n }\n\n buildSetConnection([_key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n return new AIStudioFileUploadConnection(\n this.params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([_key, _blob]: [string, MediaBlob]): Record<\n string,\n unknown\n > {\n return {};\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"GET\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n _key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n throw new Error(\"AI Studio File API does not provide data\");\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n if (metadata) {\n const contentType =\n (metadata?.mimeType as string) ?? \"application/octet-stream\";\n // TODO - Get the actual data (and other metadata) from an optional backing store\n const data: MediaBlobData = {\n value: \"\",\n type: contentType,\n };\n\n return new MediaBlob({\n path: key,\n data,\n metadata,\n });\n } else {\n return undefined;\n }\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"DELETE\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
let uuid = require("uuid");
|
|
3
|
+
let _langchain_core_stores = require("@langchain/core/stores");
|
|
4
|
+
let _langchain_core_load_serializable = require("@langchain/core/load/serializable");
|
|
5
5
|
|
|
6
6
|
//#region src/experimental/utils/media_core.ts
|
|
7
7
|
function bytesToString(dataArray) {
|
|
@@ -17,7 +17,7 @@ function bytesToString(dataArray) {
|
|
|
17
17
|
* Represents a chunk of data that can be identified by the path where the
|
|
18
18
|
* data is (or will be) located, along with optional metadata about the data.
|
|
19
19
|
*/
|
|
20
|
-
var MediaBlob = class MediaBlob extends
|
|
20
|
+
var MediaBlob = class MediaBlob extends _langchain_core_load_serializable.Serializable {
|
|
21
21
|
lc_serializable = true;
|
|
22
22
|
lc_namespace = [
|
|
23
23
|
"langchain",
|
|
@@ -74,11 +74,9 @@ var MediaBlob = class MediaBlob extends __langchain_core_load_serializable.Seria
|
|
|
74
74
|
async encode() {
|
|
75
75
|
const dataUrl = await this.asDataUrl();
|
|
76
76
|
const comma = dataUrl.indexOf(",");
|
|
77
|
-
const encoded = dataUrl.substring(comma + 1);
|
|
78
|
-
const encoding = dataUrl.indexOf("base64") > -1 ? "base64" : "8bit";
|
|
79
77
|
return {
|
|
80
|
-
encoded,
|
|
81
|
-
encoding
|
|
78
|
+
encoded: dataUrl.substring(comma + 1),
|
|
79
|
+
encoding: dataUrl.indexOf("base64") > -1 ? "base64" : "8bit"
|
|
82
80
|
};
|
|
83
81
|
}
|
|
84
82
|
static fromDataUrl(url) {
|
|
@@ -87,20 +85,17 @@ var MediaBlob = class MediaBlob extends __langchain_core_load_serializable.Seria
|
|
|
87
85
|
const semicolon = url.indexOf(";");
|
|
88
86
|
const mimeType = url.substring(colon + 1, semicolon);
|
|
89
87
|
const comma = url.indexOf(",");
|
|
90
|
-
const base64Data = url.substring(comma + 1);
|
|
91
|
-
const data = {
|
|
92
|
-
type: mimeType,
|
|
93
|
-
value: base64Data
|
|
94
|
-
};
|
|
95
88
|
return new MediaBlob({
|
|
96
|
-
data
|
|
89
|
+
data: {
|
|
90
|
+
type: mimeType,
|
|
91
|
+
value: url.substring(comma + 1)
|
|
92
|
+
},
|
|
97
93
|
path: url
|
|
98
94
|
});
|
|
99
95
|
}
|
|
100
96
|
static async fromBlob(blob, other) {
|
|
101
97
|
const valueBuffer = await blob.arrayBuffer();
|
|
102
|
-
const
|
|
103
|
-
const valueStr = bytesToString(valueArray);
|
|
98
|
+
const valueStr = bytesToString(new Uint8Array(valueBuffer));
|
|
104
99
|
const value = btoa(valueStr);
|
|
105
100
|
return new MediaBlob({
|
|
106
101
|
...other,
|
|
@@ -123,7 +118,7 @@ var MediaBlob = class MediaBlob extends __langchain_core_load_serializable.Seria
|
|
|
123
118
|
* BaseStore may be implemented (or even possible). Those that are not
|
|
124
119
|
* implemented should be documented and throw an Error if called.
|
|
125
120
|
*/
|
|
126
|
-
var BlobStore = class extends
|
|
121
|
+
var BlobStore = class extends _langchain_core_stores.BaseStore {
|
|
127
122
|
lc_namespace = ["langchain", "google-common"];
|
|
128
123
|
defaultStoreOptions;
|
|
129
124
|
defaultFetchOptions;
|
|
@@ -169,9 +164,7 @@ var BlobStore = class extends __langchain_core_stores.BaseStore {
|
|
|
169
164
|
return newBlob;
|
|
170
165
|
}
|
|
171
166
|
async _validBlobPrefixPath(blob, opts) {
|
|
172
|
-
const
|
|
173
|
-
const suffix = this._blobPathSuffix(blob);
|
|
174
|
-
const newPath = `${prefix}${suffix}`;
|
|
167
|
+
const newPath = `${opts?.pathPrefix ?? ""}${this._blobPathSuffix(blob)}`;
|
|
175
168
|
return this._newBlob(blob, newPath);
|
|
176
169
|
}
|
|
177
170
|
_validBlobPrefixUuidFunction(name) {
|
|
@@ -182,9 +175,7 @@ var BlobStore = class extends __langchain_core_stores.BaseStore {
|
|
|
182
175
|
}
|
|
183
176
|
}
|
|
184
177
|
async _validBlobPrefixUuid(blob, opts) {
|
|
185
|
-
const
|
|
186
|
-
const suffix = this._validBlobPrefixUuidFunction(opts?.actionIfInvalid ?? "prefixUuid4");
|
|
187
|
-
const newPath = `${prefix}${suffix}`;
|
|
178
|
+
const newPath = `${opts?.pathPrefix ?? ""}${this._validBlobPrefixUuidFunction(opts?.actionIfInvalid ?? "prefixUuid4")}`;
|
|
188
179
|
return this._newBlob(blob, newPath);
|
|
189
180
|
}
|
|
190
181
|
async _validBlobRemovePath(blob, _opts) {
|
|
@@ -206,7 +197,7 @@ var BlobStore = class extends __langchain_core_stores.BaseStore {
|
|
|
206
197
|
case "prefixUuid6":
|
|
207
198
|
case "prefixUuid7": return this._validBlobPrefixUuid(blob, opts);
|
|
208
199
|
case "removePath": return this._validBlobRemovePath(blob, opts);
|
|
209
|
-
default: return
|
|
200
|
+
default: return;
|
|
210
201
|
}
|
|
211
202
|
}
|
|
212
203
|
async store(blob, opts = {}) {
|
|
@@ -221,7 +212,6 @@ var BlobStore = class extends __langchain_core_stores.BaseStore {
|
|
|
221
212
|
const savedKey = await validBlob.asUri();
|
|
222
213
|
return await this.fetch(savedKey);
|
|
223
214
|
}
|
|
224
|
-
return void 0;
|
|
225
215
|
}
|
|
226
216
|
async _missingFetchBlobEmpty(path, _opts) {
|
|
227
217
|
return new MediaBlob({ path });
|
|
@@ -229,7 +219,7 @@ var BlobStore = class extends __langchain_core_stores.BaseStore {
|
|
|
229
219
|
async _missingFetchBlob(path, opts) {
|
|
230
220
|
switch (opts?.actionIfBlobMissing) {
|
|
231
221
|
case "emptyBlob": return this._missingFetchBlobEmpty(path, opts);
|
|
232
|
-
default: return
|
|
222
|
+
default: return;
|
|
233
223
|
}
|
|
234
224
|
}
|
|
235
225
|
async fetch(key, opts = {}) {
|
|
@@ -238,8 +228,7 @@ var BlobStore = class extends __langchain_core_stores.BaseStore {
|
|
|
238
228
|
...opts
|
|
239
229
|
};
|
|
240
230
|
const realKey = await this._realKey(key);
|
|
241
|
-
|
|
242
|
-
return ret?.[0] ?? await this._missingFetchBlob(realKey, allOpts);
|
|
231
|
+
return (await this.mget([realKey]))?.[0] ?? await this._missingFetchBlob(realKey, allOpts);
|
|
243
232
|
}
|
|
244
233
|
};
|
|
245
234
|
var BackedBlobStore = class extends BlobStore {
|
|
@@ -298,17 +287,13 @@ var SimpleWebBlobStore = class extends BlobStore {
|
|
|
298
287
|
async _fetch(url) {
|
|
299
288
|
const ret = new MediaBlob({ path: url });
|
|
300
289
|
const metadata = {};
|
|
301
|
-
const
|
|
302
|
-
const res = await fetch(url, fetchOptions);
|
|
290
|
+
const res = await fetch(url, { method: "GET" });
|
|
303
291
|
metadata.status = res.status;
|
|
304
292
|
const headers = {};
|
|
305
293
|
for (const [key, value] of res.headers.entries()) headers[key] = value;
|
|
306
294
|
metadata.headers = headers;
|
|
307
295
|
metadata.ok = res.ok;
|
|
308
|
-
if (res.ok)
|
|
309
|
-
const resMediaBlob = await MediaBlob.fromBlob(await res.blob());
|
|
310
|
-
ret.data = resMediaBlob.data;
|
|
311
|
-
}
|
|
296
|
+
if (res.ok) ret.data = (await MediaBlob.fromBlob(await res.blob())).data;
|
|
312
297
|
ret.metadata = metadata;
|
|
313
298
|
return ret;
|
|
314
299
|
}
|
|
@@ -342,8 +327,7 @@ var DataBlobStore = class extends BlobStore {
|
|
|
342
327
|
return MediaBlob.fromDataUrl(url);
|
|
343
328
|
}
|
|
344
329
|
async mget(keys) {
|
|
345
|
-
|
|
346
|
-
return blobMap;
|
|
330
|
+
return keys.map(this._fetch);
|
|
347
331
|
}
|
|
348
332
|
async mdelete(_keys) {
|
|
349
333
|
this._notImplementedException();
|
|
@@ -394,8 +378,7 @@ var MediaManager = class {
|
|
|
394
378
|
}
|
|
395
379
|
async getMediaBlob(uri) {
|
|
396
380
|
const aliasBlob = await this.store.fetch(uri);
|
|
397
|
-
|
|
398
|
-
return ret;
|
|
381
|
+
return await this._isInvalid(aliasBlob) ? await this._resolveAndSave(uri) : aliasBlob;
|
|
399
382
|
}
|
|
400
383
|
};
|
|
401
384
|
|