pyric-admin 0.1.0-alpha.24 → 0.1.0-alpha.26
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 +1 -1
- 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 +13 -1
- package/dist/app-check/index.d.ts.map +1 -1
- package/dist/app-check/index.js +14 -9
- package/dist/app-check/index.js.map +1 -1
- 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 +23 -1
- package/dist/data-connect/index.d.ts.map +1 -1
- package/dist/data-connect/index.js +44 -7
- package/dist/data-connect/index.js.map +1 -1
- 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 +37 -13
- package/dist/deferred.d.ts.map +1 -1
- package/dist/deferred.js +57 -15
- package/dist/deferred.js.map +1 -1
- package/dist/eventarc/index.d.ts +13 -1
- package/dist/eventarc/index.d.ts.map +1 -1
- package/dist/eventarc/index.js +15 -9
- package/dist/eventarc/index.js.map +1 -1
- package/dist/extensions/index.d.ts +13 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +15 -9
- package/dist/extensions/index.js.map +1 -1
- 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 +13 -1
- package/dist/functions/index.d.ts.map +1 -1
- package/dist/functions/index.js +15 -9
- package/dist/functions/index.js.map +1 -1
- package/dist/installations/index.d.ts +13 -1
- package/dist/installations/index.d.ts.map +1 -1
- package/dist/installations/index.js +15 -9
- package/dist/installations/index.js.map +1 -1
- package/dist/instance-id/index.d.ts +13 -1
- package/dist/instance-id/index.d.ts.map +1 -1
- package/dist/instance-id/index.js +15 -9
- package/dist/instance-id/index.js.map +1 -1
- package/dist/machine-learning/index.d.ts +19 -1
- package/dist/machine-learning/index.d.ts.map +1 -1
- package/dist/machine-learning/index.js +23 -9
- package/dist/machine-learning/index.js.map +1 -1
- package/dist/messaging/index.d.ts.map +1 -1
- package/dist/messaging/index.js +1 -0
- package/dist/messaging/index.js.map +1 -1
- package/dist/phone-number-verification/index.d.ts +12 -1
- package/dist/phone-number-verification/index.d.ts.map +1 -1
- package/dist/phone-number-verification/index.js +14 -9
- package/dist/phone-number-verification/index.js.map +1 -1
- package/dist/project-management/index.d.ts +21 -1
- package/dist/project-management/index.d.ts.map +1 -1
- package/dist/project-management/index.js +23 -9
- package/dist/project-management/index.js.map +1 -1
- package/dist/remote-config/index.d.ts +21 -1
- package/dist/remote-config/index.d.ts.map +1 -1
- package/dist/remote-config/index.js +24 -9
- package/dist/remote-config/index.js.map +1 -1
- package/dist/security-rules/index.d.ts +23 -1
- package/dist/security-rules/index.d.ts.map +1 -1
- package/dist/security-rules/index.js +27 -9
- package/dist/security-rules/index.js.map +1 -1
- 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 +77 -13
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +359 -160
- 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 +2 -2
- package/src/admin.ts +58 -8
- package/src/app/index.ts +71 -19
- package/src/app-check/index.ts +27 -9
- package/src/auth/auth.test.ts +27 -0
- package/src/auth/index.ts +8 -0
- package/src/data-connect/index.ts +70 -9
- package/src/database/database.test.ts +1 -0
- package/src/database/index.ts +182 -108
- package/src/deferred.ts +78 -15
- package/src/eventarc/index.ts +32 -9
- package/src/extensions/index.ts +32 -9
- package/src/firestore/index.ts +30 -3
- package/src/functions/index.ts +32 -9
- package/src/installations/index.ts +33 -10
- package/src/instance-id/index.ts +33 -9
- package/src/machine-learning/index.ts +46 -9
- package/src/messaging/index.ts +1 -0
- package/src/phone-number-verification/index.ts +31 -9
- package/src/project-management/index.ts +48 -8
- package/src/remote-config/index.ts +51 -8
- package/src/security-rules/index.ts +54 -9
- 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 +484 -180
- package/src/storage/remote-names.ts +34 -0
- package/src/storage/storage.test.ts +78 -5
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
/** Options for `Bucket.getFiles`. Subset of `@google-cloud/storage`'s `GetFilesOptions`. */
|
|
18
|
+
export interface GetFilesOptions {
|
|
19
|
+
prefix?: string;
|
|
20
|
+
delimiter?: string;
|
|
21
|
+
maxResults?: number;
|
|
22
|
+
pageToken?: string;
|
|
23
|
+
autoPaginate?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Options for `Bucket.deleteFiles`. Subset of `@google-cloud/storage`'s `DeleteFilesOptions`. */
|
|
26
|
+
export interface DeleteFilesOptions extends GetFilesOptions {
|
|
27
|
+
/** Delete every file it can, then reject with the array of errors, instead of stopping at the first. */
|
|
28
|
+
force?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** The JSON API response a page came from. The sandbox leaves out `items`, the objects' full metadata. */
|
|
31
|
+
export interface GetFilesApiResponse {
|
|
32
|
+
kind: 'storage#objects';
|
|
33
|
+
prefixes?: string[];
|
|
34
|
+
nextPageToken?: string;
|
|
35
|
+
}
|
|
36
|
+
/** One page of a listing: file names, rolled-up prefixes, and where the next page starts. */
|
|
37
|
+
export interface ListingPage {
|
|
38
|
+
names: string[];
|
|
39
|
+
prefixes: string[];
|
|
40
|
+
nextPageToken?: string;
|
|
41
|
+
}
|
|
42
|
+
/** Refuse the callback form, which would otherwise never be called. */
|
|
43
|
+
export declare function assertQuery(query: unknown, method: string): void;
|
|
44
|
+
/** Does this query read every page, as `@google-cloud/paginator` decides? */
|
|
45
|
+
export declare function readsEveryPage(query: GetFilesOptions): boolean;
|
|
46
|
+
/** The page of `names` that `query` asks for, `pageSize` entries at most. */
|
|
47
|
+
export declare function listingPage(names: readonly string[], query: GetFilesOptions, pageSize?: number): ListingPage;
|
|
48
|
+
/** Every file name `query` lists from its `pageToken` on, up to `maxResults` of them, across pages. */
|
|
49
|
+
export declare function everyListedName(names: readonly string[], query: GetFilesOptions): string[];
|
|
50
|
+
/** The JSON API response for `page`. */
|
|
51
|
+
export declare function apiResponseOf(page: ListingPage): GetFilesApiResponse;
|
|
52
|
+
//# sourceMappingURL=file-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-query.d.ts","sourceRoot":"","sources":["../../src/storage/file-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4FAA4F;AAC5F,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,kGAAkG;AAClG,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,wGAAwG;IACxG,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,0GAA0G;AAC1G,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAKhE;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAG9D;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,SAAoB,GAAG,WAAW,CAYvH;AAED,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,CAK1F;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAMpE"}
|
|
@@ -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
|
@@ -9,8 +9,13 @@
|
|
|
9
9
|
* `connectRemoteSandbox()`/`remoteSandbox()` relays every data
|
|
10
10
|
* operation to the sandbox's host (admin lens pinned — rules bypass).
|
|
11
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).
|
|
13
|
-
*
|
|
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
|
|
@@ -26,6 +31,9 @@
|
|
|
26
31
|
* - `file.download(options?)` → `[Buffer]`, whole or `start..end`
|
|
27
32
|
* - `file.createReadStream(options?)`, whole or `start..end`
|
|
28
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
|
|
29
37
|
* - `file.getMetadata()` / `file.setMetadata(metadata)`: settable fields
|
|
30
38
|
* and custom metadata; a custom key set to `null` is removed
|
|
31
39
|
* - `getDownloadURL(file)`: mints a token into
|
|
@@ -34,14 +42,24 @@
|
|
|
34
42
|
* - `file.delete()` — idempotent
|
|
35
43
|
* - `file.exists()` → `[boolean]`
|
|
36
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`
|
|
37
49
|
*
|
|
38
50
|
* **Deferred in the sandbox backend** (throws `"not implemented in
|
|
39
|
-
* pyric-admin/storage sandbox backend"`):
|
|
40
|
-
*
|
|
41
|
-
* notifications.
|
|
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`.
|
|
42
56
|
*/
|
|
43
57
|
import { Readable, Writable } from 'node:stream';
|
|
44
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';
|
|
45
63
|
/**
|
|
46
64
|
* `pyric-admin/storage`'s sandbox `Storage` handle. It exposes the subset
|
|
47
65
|
* documented in the module header.
|
|
@@ -65,6 +83,18 @@ export interface Bucket {
|
|
|
65
83
|
readonly name: string;
|
|
66
84
|
/** Get a {@link File} handle for `path`. The file may or may not exist. */
|
|
67
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>;
|
|
68
98
|
}
|
|
69
99
|
/**
|
|
70
100
|
* A file handle within a bucket. Method shapes mirror
|
|
@@ -106,6 +136,23 @@ export interface File {
|
|
|
106
136
|
* stream finishes, as {@link File.save} does.
|
|
107
137
|
*/
|
|
108
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]>;
|
|
109
156
|
/** The file's metadata, as a `[metadata]` tuple. Throws if the file does not exist. */
|
|
110
157
|
getMetadata(): Promise<[FileMetadata]>;
|
|
111
158
|
/**
|
|
@@ -134,10 +181,10 @@ export interface File {
|
|
|
134
181
|
/** Options bag for {@link File.save}. Subset of `@google-cloud/storage`'s `SaveOptions`. */
|
|
135
182
|
export interface SaveOptions {
|
|
136
183
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* `
|
|
140
|
-
*
|
|
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}.
|
|
141
188
|
*/
|
|
142
189
|
metadata?: Record<string, unknown>;
|
|
143
190
|
/**
|
|
@@ -146,9 +193,8 @@ export interface SaveOptions {
|
|
|
146
193
|
*/
|
|
147
194
|
contentType?: string;
|
|
148
195
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* 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.
|
|
152
198
|
*/
|
|
153
199
|
resumable?: boolean;
|
|
154
200
|
}
|
|
@@ -170,6 +216,25 @@ export interface CreateWriteStreamOptions {
|
|
|
170
216
|
/** Content type stored on the file. */
|
|
171
217
|
contentType?: string;
|
|
172
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
|
+
}
|
|
173
238
|
/** Settable fields the sandbox keeps, besides custom metadata. */
|
|
174
239
|
declare const SETTABLE_FIELDS: readonly ["contentType", "cacheControl", "contentDisposition", "contentEncoding", "contentLanguage"];
|
|
175
240
|
type SettableField = (typeof SETTABLE_FIELDS)[number];
|
|
@@ -232,5 +297,4 @@ export declare function getStorage(app?: StorageApp): Storage;
|
|
|
232
297
|
* carries the bytes.
|
|
233
298
|
*/
|
|
234
299
|
export declare function getDownloadURL(file: File): Promise<string>;
|
|
235
|
-
export {};
|
|
236
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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"}
|