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.
Files changed (129) hide show
  1. package/README.md +13 -5
  2. package/dist/admin.d.ts +64 -12
  3. package/dist/admin.d.ts.map +1 -1
  4. package/dist/admin.js +53 -8
  5. package/dist/admin.js.map +1 -1
  6. package/dist/app/index.d.ts +14 -1
  7. package/dist/app/index.d.ts.map +1 -1
  8. package/dist/app/index.js +58 -16
  9. package/dist/app/index.js.map +1 -1
  10. package/dist/app-check/index.d.ts +15 -0
  11. package/dist/app-check/index.d.ts.map +1 -0
  12. package/dist/app-check/index.js +16 -0
  13. package/dist/app-check/index.js.map +1 -0
  14. package/dist/auth/index.d.ts.map +1 -1
  15. package/dist/auth/index.js +11 -0
  16. package/dist/auth/index.js.map +1 -1
  17. package/dist/data-connect/index.d.ts +25 -0
  18. package/dist/data-connect/index.d.ts.map +1 -0
  19. package/dist/data-connect/index.js +48 -0
  20. package/dist/data-connect/index.js.map +1 -0
  21. package/dist/database/index.d.ts +24 -19
  22. package/dist/database/index.d.ts.map +1 -1
  23. package/dist/database/index.js +133 -99
  24. package/dist/database/index.js.map +1 -1
  25. package/dist/deferred.d.ts +45 -0
  26. package/dist/deferred.d.ts.map +1 -0
  27. package/dist/deferred.js +71 -0
  28. package/dist/deferred.js.map +1 -0
  29. package/dist/eventarc/index.d.ts +15 -0
  30. package/dist/eventarc/index.d.ts.map +1 -0
  31. package/dist/eventarc/index.js +17 -0
  32. package/dist/eventarc/index.js.map +1 -0
  33. package/dist/extensions/index.d.ts +15 -0
  34. package/dist/extensions/index.d.ts.map +1 -0
  35. package/dist/extensions/index.js +17 -0
  36. package/dist/extensions/index.js.map +1 -0
  37. package/dist/firestore/index.d.ts +6 -0
  38. package/dist/firestore/index.d.ts.map +1 -1
  39. package/dist/firestore/index.js +25 -3
  40. package/dist/firestore/index.js.map +1 -1
  41. package/dist/functions/index.d.ts +15 -0
  42. package/dist/functions/index.d.ts.map +1 -0
  43. package/dist/functions/index.js +17 -0
  44. package/dist/functions/index.js.map +1 -0
  45. package/dist/installations/index.d.ts +15 -0
  46. package/dist/installations/index.d.ts.map +1 -0
  47. package/dist/installations/index.js +17 -0
  48. package/dist/installations/index.js.map +1 -0
  49. package/dist/instance-id/index.d.ts +15 -0
  50. package/dist/instance-id/index.d.ts.map +1 -0
  51. package/dist/instance-id/index.js +17 -0
  52. package/dist/instance-id/index.js.map +1 -0
  53. package/dist/machine-learning/index.d.ts +21 -0
  54. package/dist/machine-learning/index.d.ts.map +1 -0
  55. package/dist/machine-learning/index.js +25 -0
  56. package/dist/machine-learning/index.js.map +1 -0
  57. package/dist/messaging/index.d.ts +0 -1
  58. package/dist/messaging/index.d.ts.map +1 -1
  59. package/dist/messaging/index.js +8 -8
  60. package/dist/messaging/index.js.map +1 -1
  61. package/dist/phone-number-verification/index.d.ts +14 -0
  62. package/dist/phone-number-verification/index.d.ts.map +1 -0
  63. package/dist/phone-number-verification/index.js +16 -0
  64. package/dist/phone-number-verification/index.js.map +1 -0
  65. package/dist/project-management/index.d.ts +23 -0
  66. package/dist/project-management/index.d.ts.map +1 -0
  67. package/dist/project-management/index.js +25 -0
  68. package/dist/project-management/index.js.map +1 -0
  69. package/dist/remote-config/index.d.ts +23 -0
  70. package/dist/remote-config/index.d.ts.map +1 -0
  71. package/dist/remote-config/index.js +26 -0
  72. package/dist/remote-config/index.js.map +1 -0
  73. package/dist/security-rules/index.d.ts +25 -0
  74. package/dist/security-rules/index.d.ts.map +1 -0
  75. package/dist/security-rules/index.js +29 -0
  76. package/dist/security-rules/index.js.map +1 -0
  77. package/dist/storage/deferred-members.d.ts +14 -0
  78. package/dist/storage/deferred-members.d.ts.map +1 -0
  79. package/dist/storage/deferred-members.js +55 -0
  80. package/dist/storage/deferred-members.js.map +1 -0
  81. package/dist/storage/delete-files.d.ts +13 -0
  82. package/dist/storage/delete-files.d.ts.map +1 -0
  83. package/dist/storage/delete-files.js +39 -0
  84. package/dist/storage/delete-files.js.map +1 -0
  85. package/dist/storage/file-query.d.ts +52 -0
  86. package/dist/storage/file-query.d.ts.map +1 -0
  87. package/dist/storage/file-query.js +94 -0
  88. package/dist/storage/file-query.js.map +1 -0
  89. package/dist/storage/get-files.d.ts +15 -0
  90. package/dist/storage/get-files.d.ts.map +1 -0
  91. package/dist/storage/get-files.js +33 -0
  92. package/dist/storage/get-files.js.map +1 -0
  93. package/dist/storage/index.d.ts +159 -23
  94. package/dist/storage/index.d.ts.map +1 -1
  95. package/dist/storage/index.js +688 -149
  96. package/dist/storage/index.js.map +1 -1
  97. package/dist/storage/remote-names.d.ts +19 -0
  98. package/dist/storage/remote-names.d.ts.map +1 -0
  99. package/dist/storage/remote-names.js +26 -0
  100. package/dist/storage/remote-names.js.map +1 -0
  101. package/package.json +50 -2
  102. package/src/admin.ts +58 -8
  103. package/src/app/index.ts +71 -19
  104. package/src/app-check/index.ts +32 -0
  105. package/src/auth/auth.test.ts +27 -0
  106. package/src/auth/index.ts +8 -0
  107. package/src/data-connect/index.ts +75 -0
  108. package/src/database/database.test.ts +1 -0
  109. package/src/database/index.ts +182 -108
  110. package/src/deferred.ts +96 -0
  111. package/src/eventarc/index.ts +37 -0
  112. package/src/extensions/index.ts +37 -0
  113. package/src/firestore/index.ts +30 -3
  114. package/src/functions/index.ts +37 -0
  115. package/src/installations/index.ts +38 -0
  116. package/src/instance-id/index.ts +38 -0
  117. package/src/machine-learning/index.ts +51 -0
  118. package/src/messaging/index.ts +3 -9
  119. package/src/phone-number-verification/index.ts +36 -0
  120. package/src/project-management/index.ts +55 -0
  121. package/src/remote-config/index.ts +58 -0
  122. package/src/security-rules/index.ts +59 -0
  123. package/src/storage/deferred-members.ts +67 -0
  124. package/src/storage/delete-files.ts +40 -0
  125. package/src/storage/file-query.ts +135 -0
  126. package/src/storage/get-files.ts +40 -0
  127. package/src/storage/index.ts +918 -183
  128. package/src/storage/remote-names.ts +34 -0
  129. 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"}
@@ -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 over the bridge to the browser-hosted SharedWorker's
11
- * object store (admin lens pinned — rules bypass). Single bucket;
12
- * 8 MiB per-op byte cap; `getSignedUrl` stays the local stub. See
13
- * the remote arm section below.
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"`): streaming uploads
33
- * (`createWriteStream`), resumable uploads, signed cookies, IAM
34
- * policies, lifecycle rules, ACLs, copy/move, 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`.
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` (`createWriteStream`,
68
- * `createReadStream`, `copy`, `move`, `setMetadata` beyond the basic
69
- * `save` options, etc.) throws on the sandbox path — see module header.
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. Returns a `[Buffer]` tuple to mirror
86
- * `@google-cloud/storage`'s `File.download` (which returns
87
- * `[Buffer, ...]`). Throws if the file does not exist.
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
- * Arbitrary metadata stored alongside the file. The sandbox stores
111
- * it verbatim; consumers that need to round-trip `contentType`,
112
- * `metadata.custom`, etc. get it back via internal admin tooling
113
- * (not exposed on `File` itself yet).
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
- * `resumable: false` is the only mode the sandbox models (single-
123
- * shot writes). The sandbox throws when set to `true` since resumable
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
- * Link-compatible mirror of `firebase-admin/storage`'s `getDownloadURL(file)`.
161
- * Returns a deterministic sandbox storage stub URL from `file.getSignedUrl()`.
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AASH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAKzB;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,IAAI;IACnB,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,qGAAqG;IACrG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7B;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CAC/D;AAED,4FAA4F;AAC5F,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,oGAAoG;AACpG,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;CACzC;AAED,0FAA0F;AAC1F,MAAM,WAAW,mBAAmB;IAClC,kGAAkG;IAClG,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;IAClD;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CAuBpD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}