pyric-admin 0.1.0-alpha.22 → 0.1.0-alpha.25
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/README.md +13 -5
- package/dist/admin.d.ts +64 -12
- package/dist/admin.d.ts.map +1 -1
- package/dist/admin.js +53 -8
- package/dist/admin.js.map +1 -1
- package/dist/app/index.d.ts +14 -1
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +58 -16
- package/dist/app/index.js.map +1 -1
- package/dist/app-check/index.d.ts +15 -0
- package/dist/app-check/index.d.ts.map +1 -0
- package/dist/app-check/index.js +16 -0
- package/dist/app-check/index.js.map +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/data-connect/index.d.ts +25 -0
- package/dist/data-connect/index.d.ts.map +1 -0
- package/dist/data-connect/index.js +48 -0
- package/dist/data-connect/index.js.map +1 -0
- package/dist/database/index.d.ts +24 -19
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +133 -99
- package/dist/database/index.js.map +1 -1
- package/dist/deferred.d.ts +45 -0
- package/dist/deferred.d.ts.map +1 -0
- package/dist/deferred.js +71 -0
- package/dist/deferred.js.map +1 -0
- package/dist/eventarc/index.d.ts +15 -0
- package/dist/eventarc/index.d.ts.map +1 -0
- package/dist/eventarc/index.js +17 -0
- package/dist/eventarc/index.js.map +1 -0
- package/dist/extensions/index.d.ts +15 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +17 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/firestore/index.d.ts +6 -0
- package/dist/firestore/index.d.ts.map +1 -1
- package/dist/firestore/index.js +25 -3
- package/dist/firestore/index.js.map +1 -1
- package/dist/functions/index.d.ts +15 -0
- package/dist/functions/index.d.ts.map +1 -0
- package/dist/functions/index.js +17 -0
- package/dist/functions/index.js.map +1 -0
- package/dist/installations/index.d.ts +15 -0
- package/dist/installations/index.d.ts.map +1 -0
- package/dist/installations/index.js +17 -0
- package/dist/installations/index.js.map +1 -0
- package/dist/instance-id/index.d.ts +15 -0
- package/dist/instance-id/index.d.ts.map +1 -0
- package/dist/instance-id/index.js +17 -0
- package/dist/instance-id/index.js.map +1 -0
- package/dist/machine-learning/index.d.ts +21 -0
- package/dist/machine-learning/index.d.ts.map +1 -0
- package/dist/machine-learning/index.js +25 -0
- package/dist/machine-learning/index.js.map +1 -0
- package/dist/messaging/index.d.ts +0 -1
- package/dist/messaging/index.d.ts.map +1 -1
- package/dist/messaging/index.js +8 -8
- package/dist/messaging/index.js.map +1 -1
- package/dist/phone-number-verification/index.d.ts +14 -0
- package/dist/phone-number-verification/index.d.ts.map +1 -0
- package/dist/phone-number-verification/index.js +16 -0
- package/dist/phone-number-verification/index.js.map +1 -0
- package/dist/project-management/index.d.ts +23 -0
- package/dist/project-management/index.d.ts.map +1 -0
- package/dist/project-management/index.js +25 -0
- package/dist/project-management/index.js.map +1 -0
- package/dist/remote-config/index.d.ts +23 -0
- package/dist/remote-config/index.d.ts.map +1 -0
- package/dist/remote-config/index.js +26 -0
- package/dist/remote-config/index.js.map +1 -0
- package/dist/security-rules/index.d.ts +25 -0
- package/dist/security-rules/index.d.ts.map +1 -0
- package/dist/security-rules/index.js +29 -0
- package/dist/security-rules/index.js.map +1 -0
- package/dist/storage/deferred-members.d.ts +14 -0
- package/dist/storage/deferred-members.d.ts.map +1 -0
- package/dist/storage/deferred-members.js +55 -0
- package/dist/storage/deferred-members.js.map +1 -0
- package/dist/storage/delete-files.d.ts +13 -0
- package/dist/storage/delete-files.d.ts.map +1 -0
- package/dist/storage/delete-files.js +39 -0
- package/dist/storage/delete-files.js.map +1 -0
- package/dist/storage/file-query.d.ts +52 -0
- package/dist/storage/file-query.d.ts.map +1 -0
- package/dist/storage/file-query.js +94 -0
- package/dist/storage/file-query.js.map +1 -0
- package/dist/storage/get-files.d.ts +15 -0
- package/dist/storage/get-files.d.ts.map +1 -0
- package/dist/storage/get-files.js +33 -0
- package/dist/storage/get-files.js.map +1 -0
- package/dist/storage/index.d.ts +159 -23
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +688 -149
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/remote-names.d.ts +19 -0
- package/dist/storage/remote-names.d.ts.map +1 -0
- package/dist/storage/remote-names.js +26 -0
- package/dist/storage/remote-names.js.map +1 -0
- package/package.json +50 -2
- package/src/admin.ts +58 -8
- package/src/app/index.ts +71 -19
- package/src/app-check/index.ts +32 -0
- package/src/auth/auth.test.ts +27 -0
- package/src/auth/index.ts +8 -0
- package/src/data-connect/index.ts +75 -0
- package/src/database/database.test.ts +1 -0
- package/src/database/index.ts +182 -108
- package/src/deferred.ts +96 -0
- package/src/eventarc/index.ts +37 -0
- package/src/extensions/index.ts +37 -0
- package/src/firestore/index.ts +30 -3
- package/src/functions/index.ts +37 -0
- package/src/installations/index.ts +38 -0
- package/src/instance-id/index.ts +38 -0
- package/src/machine-learning/index.ts +51 -0
- package/src/messaging/index.ts +3 -9
- package/src/phone-number-verification/index.ts +36 -0
- package/src/project-management/index.ts +55 -0
- package/src/remote-config/index.ts +58 -0
- package/src/security-rules/index.ts +59 -0
- package/src/storage/deferred-members.ts +67 -0
- package/src/storage/delete-files.ts +40 -0
- package/src/storage/file-query.ts +135 -0
- package/src/storage/get-files.ts +40 -0
- package/src/storage/index.ts +918 -183
- package/src/storage/remote-names.ts +34 -0
- package/src/storage/storage.test.ts +78 -5
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The object listing `@google-cloud/storage`'s `Bucket.getFiles` reads from
|
|
3
|
+
* the JSON API, worked out over a bucket's object names. Both sandbox arms
|
|
4
|
+
* collect the names their own way and page them here, so a query lists the
|
|
5
|
+
* same files on each.
|
|
6
|
+
*
|
|
7
|
+
* - `prefix` matches the start of a name verbatim; it is not a folder, so
|
|
8
|
+
* `users/12` matches `users/123/a.png`. An empty prefix lists the bucket.
|
|
9
|
+
* - `delimiter` rolls each name whose rest after the prefix holds it up to
|
|
10
|
+
* a prefix ending in the delimiter, reported in `apiResponse.prefixes`.
|
|
11
|
+
* - A page holds up to `maxResults` entries, files and prefixes together,
|
|
12
|
+
* in name order (1000 without it), and `pageToken` resumes after the
|
|
13
|
+
* entry the previous page ended on.
|
|
14
|
+
* - `autoPaginate` (the default unless `maxResults` is set or it is
|
|
15
|
+
* `false`) reads every page, as `@google-cloud/paginator` does.
|
|
16
|
+
*/
|
|
17
|
+
/** The page size the JSON API uses without `maxResults`. */
|
|
18
|
+
const DEFAULT_PAGE_SIZE = 1000;
|
|
19
|
+
/** Refuse the callback form, which would otherwise never be called. */
|
|
20
|
+
export function assertQuery(query, method) {
|
|
21
|
+
const isCallback = typeof query === 'function';
|
|
22
|
+
if (isCallback) {
|
|
23
|
+
throw new TypeError(`pyric-admin/storage: Bucket.${method} returns a promise; the callback form is not supported.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Does this query read every page, as `@google-cloud/paginator` decides? */
|
|
27
|
+
export function readsEveryPage(query) {
|
|
28
|
+
const limited = typeof query.maxResults === 'number' && query.maxResults > 0;
|
|
29
|
+
return !limited && query.autoPaginate !== false;
|
|
30
|
+
}
|
|
31
|
+
/** The page of `names` that `query` asks for, `pageSize` entries at most. */
|
|
32
|
+
export function listingPage(names, query, pageSize = pageSizeOf(query)) {
|
|
33
|
+
const entries = entriesOf(names, query);
|
|
34
|
+
const after = query.pageToken === undefined ? undefined : decodeToken(query.pageToken);
|
|
35
|
+
const remaining = after === undefined ? entries : entries.filter(entry => entry.key > after);
|
|
36
|
+
const page = remaining.slice(0, pageSize);
|
|
37
|
+
const more = remaining.length > page.length;
|
|
38
|
+
const last = page[page.length - 1];
|
|
39
|
+
return {
|
|
40
|
+
names: page.filter(entry => !entry.rolledUp).map(entry => entry.key),
|
|
41
|
+
prefixes: page.filter(entry => entry.rolledUp).map(entry => entry.key),
|
|
42
|
+
...(more && last !== undefined ? { nextPageToken: encodeToken(last.key) } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Every file name `query` lists from its `pageToken` on, up to `maxResults` of them, across pages. */
|
|
46
|
+
export function everyListedName(names, query) {
|
|
47
|
+
const { maxResults, ...rest } = query;
|
|
48
|
+
const listed = listingPage(names, rest, Number.POSITIVE_INFINITY).names;
|
|
49
|
+
const limited = typeof maxResults === 'number' && maxResults > 0;
|
|
50
|
+
return limited ? listed.slice(0, maxResults) : listed;
|
|
51
|
+
}
|
|
52
|
+
/** The JSON API response for `page`. */
|
|
53
|
+
export function apiResponseOf(page) {
|
|
54
|
+
return {
|
|
55
|
+
kind: 'storage#objects',
|
|
56
|
+
...(page.prefixes.length > 0 ? { prefixes: page.prefixes } : {}),
|
|
57
|
+
...(page.nextPageToken !== undefined ? { nextPageToken: page.nextPageToken } : {}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function pageSizeOf(query) {
|
|
61
|
+
const limited = typeof query.maxResults === 'number' && query.maxResults > 0;
|
|
62
|
+
return limited ? Math.min(query.maxResults, DEFAULT_PAGE_SIZE) : DEFAULT_PAGE_SIZE;
|
|
63
|
+
}
|
|
64
|
+
/** The names under the prefix, with the delimiter's roll-up applied, in name order. */
|
|
65
|
+
function entriesOf(names, query) {
|
|
66
|
+
const prefix = query.prefix ?? '';
|
|
67
|
+
const delimiter = query.delimiter ?? '';
|
|
68
|
+
const byKey = new Map();
|
|
69
|
+
for (const name of names) {
|
|
70
|
+
if (!name.startsWith(prefix))
|
|
71
|
+
continue;
|
|
72
|
+
const rest = name.slice(prefix.length);
|
|
73
|
+
const cut = delimiter === '' ? -1 : rest.indexOf(delimiter);
|
|
74
|
+
const rolledUp = cut !== -1;
|
|
75
|
+
const key = rolledUp ? prefix + rest.slice(0, cut + delimiter.length) : name;
|
|
76
|
+
byKey.set(key, { key, rolledUp });
|
|
77
|
+
}
|
|
78
|
+
return [...byKey.values()].sort((a, b) => compareKeys(a.key, b.key));
|
|
79
|
+
}
|
|
80
|
+
/** Name order, as the JSON API lists objects. */
|
|
81
|
+
function compareKeys(a, b) {
|
|
82
|
+
if (a < b)
|
|
83
|
+
return -1;
|
|
84
|
+
if (a > b)
|
|
85
|
+
return 1;
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
function encodeToken(key) {
|
|
89
|
+
return Buffer.from(key, 'utf8').toString('base64url');
|
|
90
|
+
}
|
|
91
|
+
function decodeToken(token) {
|
|
92
|
+
return Buffer.from(token, 'base64url').toString('utf8');
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=file-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-query.js","sourceRoot":"","sources":["../../src/storage/file-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Bucket.getFiles`'s result, as `@google-cloud/storage` resolves it:
|
|
3
|
+
* `[files, nextQuery, apiResponse]`.
|
|
4
|
+
*
|
|
5
|
+
* A single page (`autoPaginate: false`, or `maxResults` set) gives the query
|
|
6
|
+
* for the next page, with its `pageToken`, or `null` on the last page. Reading
|
|
7
|
+
* every page gives a copy of the query the call was made with in that
|
|
8
|
+
* position, as `@google-cloud/paginator` resolves it, and the last page's
|
|
9
|
+
* response.
|
|
10
|
+
*/
|
|
11
|
+
import { type GetFilesApiResponse, type GetFilesOptions } from './file-query.js';
|
|
12
|
+
export type GetFilesResponse<F> = [F[], GetFilesOptions | null, GetFilesApiResponse];
|
|
13
|
+
/** The `getFiles` result for `query` over a bucket's object `names`. */
|
|
14
|
+
export declare function getFilesResponse<F>(names: readonly string[], query: GetFilesOptions, fileOf: (name: string) => F): GetFilesResponse<F>;
|
|
15
|
+
//# sourceMappingURL=get-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-files.d.ts","sourceRoot":"","sources":["../../src/storage/get-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,EAAE,mBAAmB,CAAC,CAAC;AAErF,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAWtI"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Bucket.getFiles`'s result, as `@google-cloud/storage` resolves it:
|
|
3
|
+
* `[files, nextQuery, apiResponse]`.
|
|
4
|
+
*
|
|
5
|
+
* A single page (`autoPaginate: false`, or `maxResults` set) gives the query
|
|
6
|
+
* for the next page, with its `pageToken`, or `null` on the last page. Reading
|
|
7
|
+
* every page gives a copy of the query the call was made with in that
|
|
8
|
+
* position, as `@google-cloud/paginator` resolves it, and the last page's
|
|
9
|
+
* response.
|
|
10
|
+
*/
|
|
11
|
+
import { apiResponseOf, listingPage, readsEveryPage, } from './file-query.js';
|
|
12
|
+
/** The `getFiles` result for `query` over a bucket's object `names`. */
|
|
13
|
+
export function getFilesResponse(names, query, fileOf) {
|
|
14
|
+
if (!readsEveryPage(query))
|
|
15
|
+
return onePage(names, query, fileOf);
|
|
16
|
+
const files = [];
|
|
17
|
+
let pageQuery = { ...query };
|
|
18
|
+
for (;;) {
|
|
19
|
+
const page = listingPage(names, pageQuery);
|
|
20
|
+
files.push(...page.names.map(fileOf));
|
|
21
|
+
const token = page.nextPageToken;
|
|
22
|
+
if (token === undefined)
|
|
23
|
+
return [files, { ...query }, apiResponseOf(page)];
|
|
24
|
+
pageQuery = { ...pageQuery, pageToken: token };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function onePage(names, query, fileOf) {
|
|
28
|
+
const page = listingPage(names, query);
|
|
29
|
+
const token = page.nextPageToken;
|
|
30
|
+
const nextQuery = token === undefined ? null : { ...query, pageToken: token };
|
|
31
|
+
return [page.names.map(fileOf), nextQuery, apiResponseOf(page)];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=get-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-files.js","sourceRoot":"","sources":["../../src/storage/get-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,GAGf,MAAM,iBAAiB,CAAC;AAIzB,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAI,KAAwB,EAAE,KAAsB,EAAE,MAA2B;IAC/G,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,KAAK,GAAQ,EAAE,CAAC;IACtB,IAAI,SAAS,GAAoB,EAAE,GAAG,KAAK,EAAE,CAAC;IAC9C,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAI,KAAwB,EAAE,KAAsB,EAAE,MAA2B;IAC/F,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -7,10 +7,15 @@
|
|
|
7
7
|
*
|
|
8
8
|
* - **Remote sandbox path** — a handle branded by `@pyric/cli`'
|
|
9
9
|
* `connectRemoteSandbox()`/`remoteSandbox()` relays every data
|
|
10
|
-
* operation
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* the
|
|
10
|
+
* operation to the sandbox's host (admin lens pinned — rules bypass).
|
|
11
|
+
* Bytes move over the host's HTTP byte route when it has one, and as
|
|
12
|
+
* frames when it does not (a browser tab's SharedWorker). Each bucket
|
|
13
|
+
* name is its own bucket on the host; the default bucket is the host's
|
|
14
|
+
* default one. `createResumableUpload` gives a session URL on the byte
|
|
15
|
+
* route. `getSignedUrl` stays the local stub. See the remote arm section below.
|
|
16
|
+
*
|
|
17
|
+
* - **Default bucket**: `bucket()` is the bucket the app's `storageBucket`
|
|
18
|
+
* option names, or `'pyric-default'` without one, on both paths.
|
|
14
19
|
*
|
|
15
20
|
* - **Sandbox path** — returns an in-process {@link Storage} backed
|
|
16
21
|
* by an in-memory `Map<bucketName, Map<path, FileEntry>>`. State
|
|
@@ -23,17 +28,38 @@
|
|
|
23
28
|
* - `storage.bucket(name?)` → {@link Bucket}-shaped handle
|
|
24
29
|
* - `bucket.file(path)` → {@link File}-shaped handle
|
|
25
30
|
* - `file.save(data, options?)` — `Buffer | string | Uint8Array`
|
|
26
|
-
* - `file.download(options?)` → `[Buffer]`
|
|
31
|
+
* - `file.download(options?)` → `[Buffer]`, whole or `start..end`
|
|
32
|
+
* - `file.createReadStream(options?)`, whole or `start..end`
|
|
33
|
+
* - `file.createWriteStream(options?)`
|
|
34
|
+
* - `save` and `createWriteStream` take `firebaseStorageDownloadTokens`
|
|
35
|
+
* under `metadata.metadata` as the file's download tokens, which grant
|
|
36
|
+
* its download URL as `getDownloadURL` mints them
|
|
37
|
+
* - `file.getMetadata()` / `file.setMetadata(metadata)`: settable fields
|
|
38
|
+
* and custom metadata; a custom key set to `null` is removed
|
|
39
|
+
* - `getDownloadURL(file)`: mints a token into
|
|
40
|
+
* `firebaseStorageDownloadTokens` when the file has none. The Node
|
|
41
|
+
* host returns its HTTP URL; elsewhere the URL is a `data:` URI
|
|
27
42
|
* - `file.delete()` — idempotent
|
|
28
43
|
* - `file.exists()` → `[boolean]`
|
|
29
44
|
* - `file.getSignedUrl(options)` → `['pyric-sandbox-storage://…']`
|
|
45
|
+
* - `file.copy(destination, options?)`, within a bucket or across buckets
|
|
46
|
+
* - `bucket.getFiles(query?)` → `[files, nextQuery, apiResponse]`, with
|
|
47
|
+
* `prefix`, `delimiter`, `maxResults`, `pageToken`, `autoPaginate`
|
|
48
|
+
* - `bucket.deleteFiles(query?)`, honoring `force`
|
|
30
49
|
*
|
|
31
50
|
* **Deferred in the sandbox backend** (throws `"not implemented in
|
|
32
|
-
* pyric-admin/storage sandbox backend"`):
|
|
33
|
-
*
|
|
34
|
-
* policies, lifecycle rules, ACLs,
|
|
51
|
+
* pyric-admin/storage sandbox backend"`): `file.createResumableUpload`
|
|
52
|
+
* upload sessions, which need an HTTP host, signed cookies, IAM
|
|
53
|
+
* policies, lifecycle rules, ACLs, move, notifications. Every other
|
|
54
|
+
* `Bucket` and `File` method is a deferred member listed in
|
|
55
|
+
* `deferred-members.ts`.
|
|
35
56
|
*/
|
|
57
|
+
import { Readable, Writable } from 'node:stream';
|
|
36
58
|
import { type PyricAdminApp } from '../app/index.js';
|
|
59
|
+
import { type DeleteFilesOptions, type GetFilesOptions } from './file-query.js';
|
|
60
|
+
import { type GetFilesResponse } from './get-files.js';
|
|
61
|
+
export type { DeleteFilesOptions, GetFilesApiResponse, GetFilesOptions } from './file-query.js';
|
|
62
|
+
export type { GetFilesResponse } from './get-files.js';
|
|
37
63
|
/**
|
|
38
64
|
* `pyric-admin/storage`'s sandbox `Storage` handle. It exposes the subset
|
|
39
65
|
* documented in the module header.
|
|
@@ -57,6 +83,18 @@ export interface Bucket {
|
|
|
57
83
|
readonly name: string;
|
|
58
84
|
/** Get a {@link File} handle for `path`. The file may or may not exist. */
|
|
59
85
|
file(path: string): File;
|
|
86
|
+
/**
|
|
87
|
+
* List the bucket's files, as `@google-cloud/storage` does: names starting
|
|
88
|
+
* with `prefix`, rolled up at `delimiter`, paged by `maxResults` and
|
|
89
|
+
* `pageToken`. Resolves `[files, nextQuery, apiResponse]`; see `get-files.ts`.
|
|
90
|
+
*/
|
|
91
|
+
getFiles(query?: GetFilesOptions): Promise<GetFilesResponse<File>>;
|
|
92
|
+
/**
|
|
93
|
+
* Delete every file `getFiles(query)` would list across its pages. With
|
|
94
|
+
* `force`, a failed delete does not stop the others, and the call rejects
|
|
95
|
+
* with the array of errors.
|
|
96
|
+
*/
|
|
97
|
+
deleteFiles(query?: DeleteFilesOptions): Promise<void>;
|
|
60
98
|
}
|
|
61
99
|
/**
|
|
62
100
|
* A file handle within a bucket. Method shapes mirror
|
|
@@ -64,9 +102,9 @@ export interface Bucket {
|
|
|
64
102
|
* / getSignedUrl, etc.) so common consumer code retains the familiar shape.
|
|
65
103
|
*
|
|
66
104
|
* The sandbox backend implements the methods documented here. Any
|
|
67
|
-
* other `File` method from `@google-cloud/storage` (`
|
|
68
|
-
* `
|
|
69
|
-
*
|
|
105
|
+
* other `File` method from `@google-cloud/storage` (`copy`, `move`,
|
|
106
|
+
* `setMetadata` beyond the basic `save` options, etc.) is not implemented
|
|
107
|
+
* on the sandbox path — see module header.
|
|
70
108
|
*/
|
|
71
109
|
export interface File {
|
|
72
110
|
/** Name (path) of the file within its bucket. */
|
|
@@ -82,11 +120,47 @@ export interface File {
|
|
|
82
120
|
*/
|
|
83
121
|
save(data: Buffer | string | Uint8Array, options?: SaveOptions): Promise<void>;
|
|
84
122
|
/**
|
|
85
|
-
* Read the file's bytes
|
|
86
|
-
* `@google-cloud/storage`'s
|
|
87
|
-
* `[Buffer, ...]`). Throws if the file
|
|
123
|
+
* Read the file's bytes, or the inclusive range `start..end` of them.
|
|
124
|
+
* Returns a `[Buffer]` tuple to mirror `@google-cloud/storage`'s
|
|
125
|
+
* `File.download` (which returns `[Buffer, ...]`). Throws if the file
|
|
126
|
+
* does not exist.
|
|
88
127
|
*/
|
|
89
128
|
download(options?: DownloadOptions): Promise<[Buffer]>;
|
|
129
|
+
/**
|
|
130
|
+
* A readable stream of the file's bytes, or of the inclusive range
|
|
131
|
+
* `start..end`. A missing file surfaces as the stream's error.
|
|
132
|
+
*/
|
|
133
|
+
createReadStream(options?: CreateReadStreamOptions): Readable;
|
|
134
|
+
/**
|
|
135
|
+
* A writable stream whose bytes replace the file's content once the
|
|
136
|
+
* stream finishes, as {@link File.save} does.
|
|
137
|
+
*/
|
|
138
|
+
createWriteStream(options?: CreateWriteStreamOptions): Writable;
|
|
139
|
+
/**
|
|
140
|
+
* `@google-cloud/storage`'s resumable upload session: a URL that takes the
|
|
141
|
+
* object's bytes from a browser, and creates the object with
|
|
142
|
+
* `options.metadata` when the last byte arrives. A remote sandbox whose host
|
|
143
|
+
* serves HTTP (the hosted dev server) gives one. In process, and on a
|
|
144
|
+
* browser tab's SharedWorker host, there is no HTTP host to take the bytes,
|
|
145
|
+
* so this rejects with a not-implemented error there.
|
|
146
|
+
*/
|
|
147
|
+
createResumableUpload(options?: CreateResumableUploadOptions): Promise<[string]>;
|
|
148
|
+
/**
|
|
149
|
+
* Copy the object, with its content type, custom metadata and download
|
|
150
|
+
* tokens, to `destination`: a path in this bucket, a `gs://` URL, another
|
|
151
|
+
* {@link Bucket} (same path), or another {@link File}. `options` change the
|
|
152
|
+
* copy's metadata; a custom key set to `null` is left off the copy.
|
|
153
|
+
* Resolves `[copy, copyMetadata]`.
|
|
154
|
+
*/
|
|
155
|
+
copy(destination: CopyDestination, options?: CopyOptions): Promise<[File, FileMetadata]>;
|
|
156
|
+
/** The file's metadata, as a `[metadata]` tuple. Throws if the file does not exist. */
|
|
157
|
+
getMetadata(): Promise<[FileMetadata]>;
|
|
158
|
+
/**
|
|
159
|
+
* Change the file's metadata: the named settable fields, and the custom
|
|
160
|
+
* keys under `metadata`, where `null` removes a key and the others stay.
|
|
161
|
+
* Removing `firebaseStorageDownloadTokens` revokes the file's download URL.
|
|
162
|
+
*/
|
|
163
|
+
setMetadata(metadata: FileMetadataUpdate): Promise<[FileMetadata]>;
|
|
90
164
|
/**
|
|
91
165
|
* Remove the file from its bucket. Idempotent — deleting a missing
|
|
92
166
|
* file is a no-op (matches `@google-cloud/storage`'s
|
|
@@ -107,10 +181,10 @@ export interface File {
|
|
|
107
181
|
/** Options bag for {@link File.save}. Subset of `@google-cloud/storage`'s `SaveOptions`. */
|
|
108
182
|
export interface SaveOptions {
|
|
109
183
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* `
|
|
113
|
-
*
|
|
184
|
+
* Metadata stored alongside the file: the settable fields `setMetadata`
|
|
185
|
+
* takes, and custom keys under `metadata`. A
|
|
186
|
+
* `firebaseStorageDownloadTokens` custom key sets the file's download
|
|
187
|
+
* tokens. Other fields are ignored. Read it back with {@link File.getMetadata}.
|
|
114
188
|
*/
|
|
115
189
|
metadata?: Record<string, unknown>;
|
|
116
190
|
/**
|
|
@@ -119,17 +193,75 @@ export interface SaveOptions {
|
|
|
119
193
|
*/
|
|
120
194
|
contentType?: string;
|
|
121
195
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
* uploads are deferred.
|
|
196
|
+
* How `@google-cloud/storage` sends the bytes. The sandbox stores the
|
|
197
|
+
* object in one write either way, so the stored object is the same.
|
|
125
198
|
*/
|
|
126
199
|
resumable?: boolean;
|
|
127
200
|
}
|
|
128
201
|
/** Options bag for {@link File.download}. Subset of `@google-cloud/storage`'s `DownloadOptions`. */
|
|
129
202
|
export interface DownloadOptions {
|
|
203
|
+
/** First byte to read, inclusive. */
|
|
204
|
+
start?: number;
|
|
205
|
+
/** Last byte to read, inclusive. */
|
|
206
|
+
end?: number;
|
|
130
207
|
/** The sandbox accepts but ignores `validation`. */
|
|
131
208
|
validation?: 'md5' | 'crc32c' | boolean;
|
|
132
209
|
}
|
|
210
|
+
/** Options bag for {@link File.createReadStream}. Subset of `@google-cloud/storage`'s `CreateReadStreamOptions`. */
|
|
211
|
+
export type CreateReadStreamOptions = DownloadOptions;
|
|
212
|
+
/** Options bag for {@link File.createWriteStream}. Subset of `@google-cloud/storage`'s `CreateWriteStreamOptions`. */
|
|
213
|
+
export interface CreateWriteStreamOptions {
|
|
214
|
+
/** Stored alongside the file, as {@link SaveOptions.metadata} is. */
|
|
215
|
+
metadata?: Record<string, unknown>;
|
|
216
|
+
/** Content type stored on the file. */
|
|
217
|
+
contentType?: string;
|
|
218
|
+
}
|
|
219
|
+
/** Options bag for {@link File.createResumableUpload}. Subset of `@google-cloud/storage`'s `CreateResumableUploadOptions`. */
|
|
220
|
+
export interface CreateResumableUploadOptions {
|
|
221
|
+
/** The object's metadata, as {@link SaveOptions.metadata} takes it. */
|
|
222
|
+
metadata?: Record<string, unknown>;
|
|
223
|
+
/** The page origin whose cross-origin requests the session URL answers. */
|
|
224
|
+
origin?: string;
|
|
225
|
+
}
|
|
226
|
+
/** Where {@link File.copy} copies to. */
|
|
227
|
+
export type CopyDestination = string | Bucket | File;
|
|
228
|
+
/** Options bag for {@link File.copy}. Subset of `@google-cloud/storage`'s `CopyOptions`. */
|
|
229
|
+
export interface CopyOptions {
|
|
230
|
+
contentType?: string;
|
|
231
|
+
cacheControl?: string;
|
|
232
|
+
contentDisposition?: string;
|
|
233
|
+
contentEncoding?: string;
|
|
234
|
+
contentLanguage?: string;
|
|
235
|
+
/** Custom keys for the copy, merged over the source's; `null` leaves a key off. */
|
|
236
|
+
metadata?: Record<string, string | number | boolean | null>;
|
|
237
|
+
}
|
|
238
|
+
/** Settable fields the sandbox keeps, besides custom metadata. */
|
|
239
|
+
declare const SETTABLE_FIELDS: readonly ["contentType", "cacheControl", "contentDisposition", "contentEncoding", "contentLanguage"];
|
|
240
|
+
type SettableField = (typeof SETTABLE_FIELDS)[number];
|
|
241
|
+
/** A file's metadata. Subset of `@google-cloud/storage`'s `FileMetadata`. */
|
|
242
|
+
export interface FileMetadata {
|
|
243
|
+
name: string;
|
|
244
|
+
bucket: string;
|
|
245
|
+
generation: string;
|
|
246
|
+
metageneration: string;
|
|
247
|
+
/** Size in bytes, as a decimal string. */
|
|
248
|
+
size: string;
|
|
249
|
+
timeCreated: string;
|
|
250
|
+
updated: string;
|
|
251
|
+
contentType?: string;
|
|
252
|
+
cacheControl?: string;
|
|
253
|
+
contentDisposition?: string;
|
|
254
|
+
contentEncoding?: string;
|
|
255
|
+
contentLanguage?: string;
|
|
256
|
+
md5Hash?: string;
|
|
257
|
+
/** Custom metadata, including `firebaseStorageDownloadTokens` once the file has a download URL. Absent when there is none. */
|
|
258
|
+
metadata?: Record<string, string>;
|
|
259
|
+
}
|
|
260
|
+
/** What {@link File.setMetadata} takes. Subset of `@google-cloud/storage`'s `FileMetadata`. */
|
|
261
|
+
export type FileMetadataUpdate = Partial<Pick<FileMetadata, SettableField>> & {
|
|
262
|
+
/** Custom keys to set; `null` removes a key. Values are stored as strings. */
|
|
263
|
+
metadata?: Record<string, string | number | boolean | null>;
|
|
264
|
+
};
|
|
133
265
|
/** Options bag for {@link File.getSignedUrl}. Mirrors `@google-cloud/storage`'s shape. */
|
|
134
266
|
export interface GetSignedUrlOptions {
|
|
135
267
|
/** `'read' | 'write' | 'delete' | 'resumable'`. Sandbox stamps it into the URL only as a hint. */
|
|
@@ -157,8 +289,12 @@ export type StorageApp = PyricAdminApp;
|
|
|
157
289
|
*/
|
|
158
290
|
export declare function getStorage(app?: StorageApp): Storage;
|
|
159
291
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
292
|
+
* Mirror of `firebase-admin/storage`'s `getDownloadURL(file)`. A file without
|
|
293
|
+
* a download token gets one in `firebaseStorageDownloadTokens`, as production
|
|
294
|
+
* mints it. On the Node host the URL is its HTTP byte route URL, which serves
|
|
295
|
+
* ranges and stops working when the token is removed. In process and on a
|
|
296
|
+
* SharedWorker host there is no HTTP origin, so the URL is a `data:` URI that
|
|
297
|
+
* carries the bytes.
|
|
162
298
|
*/
|
|
163
299
|
export declare function getDownloadURL(file: File): Promise<string>;
|
|
164
300
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
|