firebase-functions 3.16.0 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/lib/bin/firebase-functions.d.ts +2 -0
  2. package/lib/bin/firebase-functions.js +48 -0
  3. package/lib/cloud-functions.d.ts +15 -8
  4. package/lib/cloud-functions.js +63 -2
  5. package/lib/common/encoding.js +6 -0
  6. package/lib/common/providers/https.d.ts +49 -10
  7. package/lib/common/providers/https.js +114 -57
  8. package/lib/common/providers/identity.d.ts +29 -0
  9. package/lib/common/providers/identity.js +96 -0
  10. package/lib/function-builder.d.ts +7 -1
  11. package/lib/function-builder.js +15 -0
  12. package/lib/function-configuration.d.ts +1 -0
  13. package/lib/handler-builder.d.ts +19 -15
  14. package/lib/handler-builder.js +32 -15
  15. package/lib/providers/auth.d.ts +2 -21
  16. package/lib/providers/auth.js +5 -66
  17. package/lib/providers/database.js +2 -1
  18. package/lib/providers/https.d.ts +44 -2
  19. package/lib/providers/https.js +61 -1
  20. package/lib/runtime/loader.d.ts +1 -0
  21. package/lib/runtime/loader.js +101 -0
  22. package/lib/runtime/manifest.d.ts +59 -0
  23. package/lib/runtime/manifest.js +2 -0
  24. package/lib/v2/core.d.ts +10 -3
  25. package/lib/v2/index.d.ts +2 -1
  26. package/lib/v2/index.js +3 -1
  27. package/lib/v2/options.d.ts +1 -1
  28. package/lib/v2/options.js +47 -9
  29. package/lib/v2/params/types.d.ts +2 -1
  30. package/lib/v2/params/types.js +2 -0
  31. package/lib/v2/providers/alerts/alerts.d.ts +36 -0
  32. package/lib/v2/providers/alerts/alerts.js +72 -0
  33. package/lib/v2/providers/alerts/appDistribution.d.ts +35 -0
  34. package/lib/v2/providers/alerts/appDistribution.js +39 -0
  35. package/lib/v2/providers/alerts/billing.d.ts +38 -0
  36. package/lib/v2/providers/alerts/billing.js +30 -0
  37. package/lib/v2/providers/alerts/crashlytics.d.ts +123 -0
  38. package/lib/v2/providers/alerts/crashlytics.js +74 -0
  39. package/lib/v2/providers/alerts/index.d.ts +5 -0
  40. package/lib/v2/providers/alerts/index.js +20 -0
  41. package/lib/v2/providers/https.d.ts +23 -3
  42. package/lib/v2/providers/https.js +71 -2
  43. package/lib/v2/providers/pubsub.d.ts +1 -1
  44. package/lib/v2/providers/pubsub.js +19 -4
  45. package/lib/v2/providers/storage.d.ts +1 -1
  46. package/lib/v2/providers/storage.js +32 -5
  47. package/package.json +27 -4
@@ -22,7 +22,7 @@ export declare class HandlerBuilder {
22
22
  constructor();
23
23
  /**
24
24
  * Create a handler for HTTPS events.
25
-
25
+
26
26
  * `onRequest` handles an HTTPS request and has the same signature as an Express app.
27
27
  *
28
28
  * @example
@@ -40,6 +40,10 @@ export declare class HandlerBuilder {
40
40
  get https(): {
41
41
  onRequest: (handler: (req: express.Request, resp: express.Response) => void) => HttpsFunction;
42
42
  onCall: (handler: (data: any, context: https.CallableContext) => any | Promise<any>) => HttpsFunction;
43
+ /** @hidden */
44
+ readonly taskQueue: {
45
+ onEnqueue(handler: (data: any, context: https.TaskContext) => void | Promise<void>): https.TaskQueueFunction;
46
+ };
43
47
  };
44
48
  /**
45
49
  * Create a handler for Firebase Realtime Database events.
@@ -57,7 +61,7 @@ export declare class HandlerBuilder {
57
61
  * ```javascript
58
62
  * exports.myFunction = functions.handler.database.ref.onUpdate((change, context) => { ... })
59
63
  * ```
60
-
64
+
61
65
  * `ref.onDelete` handles the deletion of existing data.
62
66
  *
63
67
  * @example
@@ -88,14 +92,14 @@ export declare class HandlerBuilder {
88
92
  * ```javascript
89
93
  * exports.myFunction = functions.handler.firestore.document.onCreate((snap, context) => { ... })
90
94
  * ```
91
-
95
+
92
96
  * `document.onUpdate` handles updates to existing documents.
93
97
  *
94
98
  * @example
95
99
  * ```javascript
96
100
  * exports.myFunction = functions.handler.firestore.document.onUpdate((change, context) => { ... })
97
101
  * ```
98
-
102
+
99
103
  * `document.onDelete` handles the deletion of existing documents.
100
104
  *
101
105
  * @example
@@ -103,7 +107,7 @@ export declare class HandlerBuilder {
103
107
  * exports.myFunction = functions.handler.firestore.document.onDelete((snap, context) =>
104
108
  * { ... })
105
109
  * ```
106
-
110
+
107
111
  * `document.onWrite` handles the creation, update, or deletion of documents.
108
112
  *
109
113
  * @example
@@ -123,7 +127,7 @@ export declare class HandlerBuilder {
123
127
  * Create a handler for Firebase Remote Config events.
124
128
 
125
129
  * `remoteConfig.onUpdate` handles events that update a Remote Config template.
126
-
130
+
127
131
  * @example
128
132
  * ```javascript
129
133
  * exports.myFunction = functions.handler.remoteConfig.onUpdate() => { ... })
@@ -134,9 +138,9 @@ export declare class HandlerBuilder {
134
138
  };
135
139
  /**
136
140
  * Create a handler for Google Analytics events.
137
-
141
+
138
142
  * `event.onLog` handles the logging of Analytics conversion events.
139
-
143
+
140
144
  * @example
141
145
  * ```javascript
142
146
  * exports.myFunction = functions.handler.analytics.event.onLog((event) => { ... })
@@ -154,14 +158,14 @@ export declare class HandlerBuilder {
154
158
  * ```javascript
155
159
  * exports.myFunction = functions.handler.storage.object.onArchive((object) => { ... })
156
160
  * ```
157
-
161
+
158
162
  * `object.onDelete` handles the deletion of Storage objects.
159
163
  *
160
164
  * @example
161
165
  * ```javascript
162
166
  * exports.myFunction = functions.handler.storage.object.onDelete((object) => { ... })
163
167
  * ```
164
-
168
+
165
169
  * `object.onFinalize` handles the creation of Storage objects.
166
170
  *
167
171
  * @example
@@ -169,7 +173,7 @@ export declare class HandlerBuilder {
169
173
  * exports.myFunction = functions.handler.storage.object.onFinalize((object) =>
170
174
  * { ... })
171
175
  * ```
172
-
176
+
173
177
  * `object.onMetadataUpdate` handles changes to the metadata of existing Storage objects.
174
178
  *
175
179
  * @example
@@ -191,7 +195,7 @@ export declare class HandlerBuilder {
191
195
  * ```javascript
192
196
  * exports.myFunction = functions.handler.pubsub.topic.onPublish((message) => { ... })
193
197
  * ```
194
-
198
+
195
199
  * `schedule.onPublish` handles messages published to a Pub/Sub topic on a schedule.
196
200
  *
197
201
  * @example
@@ -212,14 +216,14 @@ export declare class HandlerBuilder {
212
216
  * ```javascript
213
217
  * exports.myFunction = functions.handler.auth.user.onCreate((user) => { ... })
214
218
  * ```
215
-
219
+
216
220
  * `user.onDelete` handles the deletion of users.
217
221
  *
218
222
  * @example
219
223
  * ```javascript
220
224
  * exports.myFunction = functions.handler.auth.user.onDelete((user => { ... })
221
225
  * ```
222
-
226
+
223
227
  */
224
228
  get auth(): {
225
229
  readonly user: auth.UserBuilder;
@@ -228,7 +232,7 @@ export declare class HandlerBuilder {
228
232
  * Create a handler for Firebase Test Lab events.
229
233
 
230
234
  * `testMatrix.onComplete` handles the completion of a test matrix.
231
-
235
+
232
236
  * @example
233
237
  * ```javascript
234
238
  * exports.myFunction = functions.handler.testLab.testMatrix.onComplete((testMatrix) => { ... })
@@ -45,7 +45,7 @@ class HandlerBuilder {
45
45
  constructor() { }
46
46
  /**
47
47
  * Create a handler for HTTPS events.
48
-
48
+
49
49
  * `onRequest` handles an HTTPS request and has the same signature as an Express app.
50
50
  *
51
51
  * @example
@@ -65,13 +65,30 @@ class HandlerBuilder {
65
65
  onRequest: (handler) => {
66
66
  const func = https._onRequestWithOptions(handler, {});
67
67
  func.__trigger = {};
68
+ func.__endpoint = undefined;
69
+ func.__requiredAPIs = undefined;
68
70
  return func;
69
71
  },
70
72
  onCall: (handler) => {
71
73
  const func = https._onCallWithOptions(handler, {});
72
74
  func.__trigger = {};
75
+ func.__endpoint = undefined;
76
+ func.__requiredAPIs = undefined;
73
77
  return func;
74
78
  },
79
+ /** @hidden */
80
+ get taskQueue() {
81
+ return {
82
+ onEnqueue(handler) {
83
+ const builder = new https.TaskQueueBuilder();
84
+ const func = builder.onDispatch(handler);
85
+ func.__trigger = {};
86
+ func.__endpoint = undefined;
87
+ func.__requiredAPIs = undefined;
88
+ return func;
89
+ },
90
+ };
91
+ },
75
92
  };
76
93
  }
77
94
  /**
@@ -90,7 +107,7 @@ class HandlerBuilder {
90
107
  * ```javascript
91
108
  * exports.myFunction = functions.handler.database.ref.onUpdate((change, context) => { ... })
92
109
  * ```
93
-
110
+
94
111
  * `ref.onDelete` handles the deletion of existing data.
95
112
  *
96
113
  * @example
@@ -129,14 +146,14 @@ class HandlerBuilder {
129
146
  * ```javascript
130
147
  * exports.myFunction = functions.handler.firestore.document.onCreate((snap, context) => { ... })
131
148
  * ```
132
-
149
+
133
150
  * `document.onUpdate` handles updates to existing documents.
134
151
  *
135
152
  * @example
136
153
  * ```javascript
137
154
  * exports.myFunction = functions.handler.firestore.document.onUpdate((change, context) => { ... })
138
155
  * ```
139
-
156
+
140
157
  * `document.onDelete` handles the deletion of existing documents.
141
158
  *
142
159
  * @example
@@ -144,7 +161,7 @@ class HandlerBuilder {
144
161
  * exports.myFunction = functions.handler.firestore.document.onDelete((snap, context) =>
145
162
  * { ... })
146
163
  * ```
147
-
164
+
148
165
  * `document.onWrite` handles the creation, update, or deletion of documents.
149
166
  *
150
167
  * @example
@@ -172,7 +189,7 @@ class HandlerBuilder {
172
189
  * Create a handler for Firebase Remote Config events.
173
190
 
174
191
  * `remoteConfig.onUpdate` handles events that update a Remote Config template.
175
-
192
+
176
193
  * @example
177
194
  * ```javascript
178
195
  * exports.myFunction = functions.handler.remoteConfig.onUpdate() => { ... })
@@ -187,9 +204,9 @@ class HandlerBuilder {
187
204
  }
188
205
  /**
189
206
  * Create a handler for Google Analytics events.
190
-
207
+
191
208
  * `event.onLog` handles the logging of Analytics conversion events.
192
-
209
+
193
210
  * @example
194
211
  * ```javascript
195
212
  * exports.myFunction = functions.handler.analytics.event.onLog((event) => { ... })
@@ -211,14 +228,14 @@ class HandlerBuilder {
211
228
  * ```javascript
212
229
  * exports.myFunction = functions.handler.storage.object.onArchive((object) => { ... })
213
230
  * ```
214
-
231
+
215
232
  * `object.onDelete` handles the deletion of Storage objects.
216
233
  *
217
234
  * @example
218
235
  * ```javascript
219
236
  * exports.myFunction = functions.handler.storage.object.onDelete((object) => { ... })
220
237
  * ```
221
-
238
+
222
239
  * `object.onFinalize` handles the creation of Storage objects.
223
240
  *
224
241
  * @example
@@ -226,7 +243,7 @@ class HandlerBuilder {
226
243
  * exports.myFunction = functions.handler.storage.object.onFinalize((object) =>
227
244
  * { ... })
228
245
  * ```
229
-
246
+
230
247
  * `object.onMetadataUpdate` handles changes to the metadata of existing Storage objects.
231
248
  *
232
249
  * @example
@@ -254,7 +271,7 @@ class HandlerBuilder {
254
271
  * ```javascript
255
272
  * exports.myFunction = functions.handler.pubsub.topic.onPublish((message) => { ... })
256
273
  * ```
257
-
274
+
258
275
  * `schedule.onPublish` handles messages published to a Pub/Sub topic on a schedule.
259
276
  *
260
277
  * @example
@@ -281,14 +298,14 @@ class HandlerBuilder {
281
298
  * ```javascript
282
299
  * exports.myFunction = functions.handler.auth.user.onCreate((user) => { ... })
283
300
  * ```
284
-
301
+
285
302
  * `user.onDelete` handles the deletion of users.
286
303
  *
287
304
  * @example
288
305
  * ```javascript
289
306
  * exports.myFunction = functions.handler.auth.user.onDelete((user => { ... })
290
307
  * ```
291
-
308
+
292
309
  */
293
310
  get auth() {
294
311
  return {
@@ -301,7 +318,7 @@ class HandlerBuilder {
301
318
  * Create a handler for Firebase Test Lab events.
302
319
 
303
320
  * `testMatrix.onComplete` handles the completion of a test matrix.
304
-
321
+
305
322
  * @example
306
323
  * ```javascript
307
324
  * exports.myFunction = functions.handler.testLab.testMatrix.onComplete((testMatrix) => { ... })
@@ -1,6 +1,7 @@
1
- import * as firebase from 'firebase-admin';
1
+ import { UserRecord, UserInfo, UserRecordMetadata, userRecordConstructor } from '../common/providers/identity';
2
2
  import { CloudFunction, EventContext } from '../cloud-functions';
3
3
  import { DeploymentOptions } from '../function-configuration';
4
+ export { UserRecord, UserInfo, UserRecordMetadata, userRecordConstructor };
4
5
  /** @hidden */
5
6
  export declare const provider = "google.firebase.auth";
6
7
  /** @hidden */
@@ -11,16 +12,6 @@ export declare const service = "firebaseauth.googleapis.com";
11
12
  export declare function user(): UserBuilder;
12
13
  /** @hidden */
13
14
  export declare function _userWithOptions(options: DeploymentOptions): UserBuilder;
14
- export declare class UserRecordMetadata implements firebase.auth.UserMetadata {
15
- creationTime: string;
16
- lastSignInTime: string;
17
- constructor(creationTime: string, lastSignInTime: string);
18
- /** Returns a plain JavaScript object with the properties of UserRecordMetadata. */
19
- toJSON(): {
20
- creationTime: string;
21
- lastSignInTime: string;
22
- };
23
- }
24
15
  /** Builder used to create Cloud Functions for Firebase Auth user lifecycle events. */
25
16
  export declare class UserBuilder {
26
17
  private triggerResource;
@@ -34,13 +25,3 @@ export declare class UserBuilder {
34
25
  onDelete(handler: (user: UserRecord, context: EventContext) => PromiseLike<any> | any): CloudFunction<UserRecord>;
35
26
  private onOperation;
36
27
  }
37
- /**
38
- * The UserRecord passed to Cloud Functions is the same UserRecord that is returned by the Firebase Admin
39
- * SDK.
40
- */
41
- export declare type UserRecord = firebase.auth.UserRecord;
42
- /**
43
- * UserInfo that is part of the UserRecord
44
- */
45
- export declare type UserInfo = firebase.auth.UserInfo;
46
- export declare function userRecordConstructor(wireData: Object): firebase.auth.UserRecord;
@@ -21,8 +21,10 @@
21
21
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
  // SOFTWARE.
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.userRecordConstructor = exports.UserBuilder = exports.UserRecordMetadata = exports._userWithOptions = exports.user = exports.service = exports.provider = void 0;
25
- const _ = require("lodash");
24
+ exports.UserBuilder = exports._userWithOptions = exports.user = exports.service = exports.provider = exports.userRecordConstructor = exports.UserRecordMetadata = void 0;
25
+ const identity_1 = require("../common/providers/identity");
26
+ Object.defineProperty(exports, "UserRecordMetadata", { enumerable: true, get: function () { return identity_1.UserRecordMetadata; } });
27
+ Object.defineProperty(exports, "userRecordConstructor", { enumerable: true, get: function () { return identity_1.userRecordConstructor; } });
26
28
  const cloud_functions_1 = require("../cloud-functions");
27
29
  /** @hidden */
28
30
  exports.provider = 'google.firebase.auth';
@@ -45,20 +47,6 @@ function _userWithOptions(options) {
45
47
  }, options);
46
48
  }
47
49
  exports._userWithOptions = _userWithOptions;
48
- class UserRecordMetadata {
49
- constructor(creationTime, lastSignInTime) {
50
- this.creationTime = creationTime;
51
- this.lastSignInTime = lastSignInTime;
52
- }
53
- /** Returns a plain JavaScript object with the properties of UserRecordMetadata. */
54
- toJSON() {
55
- return {
56
- creationTime: this.creationTime,
57
- lastSignInTime: this.lastSignInTime,
58
- };
59
- }
60
- }
61
- exports.UserRecordMetadata = UserRecordMetadata;
62
50
  /** Builder used to create Cloud Functions for Firebase Auth user lifecycle events. */
63
51
  class UserBuilder {
64
52
  /** @hidden */
@@ -67,7 +55,7 @@ class UserBuilder {
67
55
  this.options = options;
68
56
  }
69
57
  static dataConstructor(raw) {
70
- return userRecordConstructor(raw.data);
58
+ return (0, identity_1.userRecordConstructor)(raw.data);
71
59
  }
72
60
  /** Respond to the creation of a Firebase Auth user. */
73
61
  onCreate(handler) {
@@ -91,52 +79,3 @@ class UserBuilder {
91
79
  }
92
80
  }
93
81
  exports.UserBuilder = UserBuilder;
94
- function userRecordConstructor(wireData) {
95
- // Falsey values from the wire format proto get lost when converted to JSON, this adds them back.
96
- const falseyValues = {
97
- email: null,
98
- emailVerified: false,
99
- displayName: null,
100
- photoURL: null,
101
- phoneNumber: null,
102
- disabled: false,
103
- providerData: [],
104
- customClaims: {},
105
- passwordSalt: null,
106
- passwordHash: null,
107
- tokensValidAfterTime: null,
108
- };
109
- const record = _.assign({}, falseyValues, wireData);
110
- const meta = _.get(record, 'metadata');
111
- if (meta) {
112
- _.set(record, 'metadata', new UserRecordMetadata(meta.createdAt || meta.creationTime, meta.lastSignedInAt || meta.lastSignInTime));
113
- }
114
- else {
115
- _.set(record, 'metadata', new UserRecordMetadata(null, null));
116
- }
117
- _.forEach(record.providerData, (entry) => {
118
- _.set(entry, 'toJSON', () => {
119
- return entry;
120
- });
121
- });
122
- _.set(record, 'toJSON', () => {
123
- const json = _.pick(record, [
124
- 'uid',
125
- 'email',
126
- 'emailVerified',
127
- 'displayName',
128
- 'photoURL',
129
- 'phoneNumber',
130
- 'disabled',
131
- 'passwordHash',
132
- 'passwordSalt',
133
- 'tokensValidAfterTime',
134
- ]);
135
- json.metadata = _.get(record, 'metadata').toJSON();
136
- json.customClaims = _.cloneDeep(record.customClaims);
137
- json.providerData = _.map(record.providerData, (entry) => entry.toJSON());
138
- return json;
139
- });
140
- return record;
141
- }
142
- exports.userRecordConstructor = userRecordConstructor;
@@ -266,8 +266,9 @@ exports.extractInstanceAndPath = extractInstanceAndPath;
266
266
  class DataSnapshot {
267
267
  constructor(data, path, // path will be undefined for the database root
268
268
  app, instance) {
269
+ var _a, _b;
269
270
  this.app = app;
270
- if (app && app.options.databaseURL.startsWith('http:')) {
271
+ if ((_b = (_a = app === null || app === void 0 ? void 0 : app.options) === null || _a === void 0 ? void 0 : _a.databaseURL) === null || _b === void 0 ? void 0 : _b.startsWith('http:')) {
271
272
  // In this case we're dealing with an emulator
272
273
  this.instance = app.options.databaseURL;
273
274
  }
@@ -1,8 +1,15 @@
1
1
  import * as express from 'express';
2
2
  import { HttpsFunction, Runnable } from '../cloud-functions';
3
- import { CallableContext, FunctionsErrorCode, HttpsError, Request } from '../common/providers/https';
3
+ import { ManifestEndpoint, ManifestRequiredAPI } from '../runtime/manifest';
4
+ import { CallableContext, FunctionsErrorCode, HttpsError, Request, TaskContext, TaskRateLimits, TaskRetryConfig } from '../common/providers/https';
4
5
  import { DeploymentOptions } from '../function-configuration';
5
- export { Request, CallableContext, FunctionsErrorCode, HttpsError };
6
+ export { Request, CallableContext, FunctionsErrorCode, HttpsError,
7
+ /** @hidden */
8
+ TaskRetryConfig as TaskRetryPolicy,
9
+ /** @hidden */
10
+ TaskRateLimits,
11
+ /** @hidden */
12
+ TaskContext, };
6
13
  /**
7
14
  * Handle HTTP requests.
8
15
  * @param handler A function that takes a request and response object,
@@ -14,6 +21,41 @@ export declare function onRequest(handler: (req: Request, resp: express.Response
14
21
  * @param handler A method that takes a data and context and returns a value.
15
22
  */
16
23
  export declare function onCall(handler: (data: any, context: CallableContext) => any | Promise<any>): HttpsFunction & Runnable<any>;
24
+ /**
25
+ * Configurations for Task Queue Functions.
26
+ * @hidden
27
+ */
28
+ export interface TaskQueueOptions {
29
+ retryConfig?: TaskRetryConfig;
30
+ rateLimits?: TaskRateLimits;
31
+ /**
32
+ * Who can enqueue tasks for this function.
33
+ * If left unspecified, only service accounts which have
34
+ * roles/cloudtasks.enqueuer and roles/cloudfunctions.invoker
35
+ * will have permissions.
36
+ */
37
+ invoker?: 'private' | string | string[];
38
+ }
39
+ /** @hidden */
40
+ export interface TaskQueueFunction {
41
+ (req: Request, res: express.Response): Promise<void>;
42
+ __trigger: unknown;
43
+ __endpoint: ManifestEndpoint;
44
+ __requiredAPIs?: ManifestRequiredAPI[];
45
+ run(data: any, context: TaskContext): void | Promise<void>;
46
+ }
47
+ /** @hidden */
48
+ export declare class TaskQueueBuilder {
49
+ private readonly tqOpts?;
50
+ private readonly depOpts?;
51
+ onDispatch(handler: (data: any, context: TaskContext) => void | Promise<void>): TaskQueueFunction;
52
+ }
53
+ /**
54
+ * Declares a function that can handle tasks enqueued using the Firebase Admin SDK.
55
+ * @param options Configuration for the Task Queue that feeds into this function.
56
+ * @hidden
57
+ */
58
+ export declare function taskQueue(options?: TaskQueueOptions): TaskQueueBuilder;
17
59
  /** @hidden */
18
60
  export declare function _onRequestWithOptions(handler: (req: Request, resp: express.Response) => void | Promise<void>, options: DeploymentOptions): HttpsFunction;
19
61
  /** @hidden */
@@ -21,7 +21,7 @@
21
21
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
  // SOFTWARE.
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports._onCallWithOptions = exports._onRequestWithOptions = exports.onCall = exports.onRequest = exports.HttpsError = void 0;
24
+ exports._onCallWithOptions = exports._onRequestWithOptions = exports.taskQueue = exports.TaskQueueBuilder = exports.onCall = exports.onRequest = exports.HttpsError = void 0;
25
25
  const cloud_functions_1 = require("../cloud-functions");
26
26
  const encoding_1 = require("../common/encoding");
27
27
  const https_1 = require("../common/providers/https");
@@ -44,6 +44,54 @@ function onCall(handler) {
44
44
  }
45
45
  exports.onCall = onCall;
46
46
  /** @hidden */
47
+ class TaskQueueBuilder {
48
+ /** @internal */
49
+ constructor(tqOpts, depOpts) {
50
+ this.tqOpts = tqOpts;
51
+ this.depOpts = depOpts;
52
+ }
53
+ onDispatch(handler) {
54
+ // onEnqueueHandler sniffs the function length of the passed-in callback
55
+ // and the user could have only tried to listen to data. Wrap their handler
56
+ // in another handler to avoid accidentally triggering the v2 API
57
+ const fixedLen = (data, context) => handler(data, context);
58
+ const func = (0, https_1.onDispatchHandler)(fixedLen);
59
+ func.__trigger = {
60
+ ...(0, cloud_functions_1.optionsToTrigger)(this.depOpts || {}),
61
+ taskQueueTrigger: {},
62
+ };
63
+ (0, encoding_1.copyIfPresent)(func.__trigger.taskQueueTrigger, this.tqOpts, 'retryConfig');
64
+ (0, encoding_1.copyIfPresent)(func.__trigger.taskQueueTrigger, this.tqOpts, 'rateLimits');
65
+ (0, encoding_1.convertIfPresent)(func.__trigger.taskQueueTrigger, this.tqOpts, 'invoker', 'invoker', encoding_1.convertInvoker);
66
+ func.__endpoint = {
67
+ platform: 'gcfv1',
68
+ ...(0, cloud_functions_1.optionsToEndpoint)(this.depOpts),
69
+ taskQueueTrigger: {},
70
+ };
71
+ (0, encoding_1.copyIfPresent)(func.__endpoint.taskQueueTrigger, this.tqOpts, 'retryConfig');
72
+ (0, encoding_1.copyIfPresent)(func.__endpoint.taskQueueTrigger, this.tqOpts, 'rateLimits');
73
+ (0, encoding_1.convertIfPresent)(func.__endpoint.taskQueueTrigger, this.tqOpts, 'invoker', 'invoker', encoding_1.convertInvoker);
74
+ func.__requiredAPIs = [
75
+ {
76
+ api: 'cloudtasks.googleapis.com',
77
+ reason: 'Needed for task queue functions',
78
+ },
79
+ ];
80
+ func.run = handler;
81
+ return func;
82
+ }
83
+ }
84
+ exports.TaskQueueBuilder = TaskQueueBuilder;
85
+ /**
86
+ * Declares a function that can handle tasks enqueued using the Firebase Admin SDK.
87
+ * @param options Configuration for the Task Queue that feeds into this function.
88
+ * @hidden
89
+ */
90
+ function taskQueue(options) {
91
+ return new TaskQueueBuilder(options);
92
+ }
93
+ exports.taskQueue = taskQueue;
94
+ /** @hidden */
47
95
  function _onRequestWithOptions(handler, options) {
48
96
  // lets us add __trigger without altering handler:
49
97
  const cloudFunction = (req, res) => {
@@ -55,6 +103,12 @@ function _onRequestWithOptions(handler, options) {
55
103
  };
56
104
  (0, encoding_1.convertIfPresent)(cloudFunction.__trigger.httpsTrigger, options, 'invoker', 'invoker', encoding_1.convertInvoker);
57
105
  // TODO parse the options
106
+ cloudFunction.__endpoint = {
107
+ platform: 'gcfv1',
108
+ ...(0, cloud_functions_1.optionsToEndpoint)(options),
109
+ httpsTrigger: {},
110
+ };
111
+ (0, encoding_1.convertIfPresent)(cloudFunction.__endpoint.httpsTrigger, options, 'invoker', 'invoker', encoding_1.convertInvoker);
58
112
  return cloudFunction;
59
113
  }
60
114
  exports._onRequestWithOptions = _onRequestWithOptions;
@@ -74,6 +128,12 @@ function _onCallWithOptions(handler, options) {
74
128
  httpsTrigger: {},
75
129
  };
76
130
  func.__trigger.labels['deployment-callable'] = 'true';
131
+ func.__endpoint = {
132
+ platform: 'gcfv1',
133
+ labels: {},
134
+ ...(0, cloud_functions_1.optionsToEndpoint)(options),
135
+ callableTrigger: {},
136
+ };
77
137
  func.run = handler;
78
138
  return func;
79
139
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadStack = exports.mergeRequiredAPIs = exports.extractStack = void 0;
4
+ // The MIT License (MIT)
5
+ //
6
+ // Copyright (c) 2021 Firebase
7
+ //
8
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ // of this software and associated documentation files (the "Software"), to deal
10
+ // in the Software without restriction, including without limitation the rights
11
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ // copies of the Software, and to permit persons to whom the Software is
13
+ // furnished to do so, subject to the following conditions:
14
+ //
15
+ // The above copyright notice and this permission notice shall be included in
16
+ // all copies or substantial portions of the Software.
17
+ //
18
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ // SOFTWARE.
25
+ const url = require("url");
26
+ const path = require("path");
27
+ /**
28
+ * Dynamically load import function to prevent TypeScript from
29
+ * transpiling into a require.
30
+ *
31
+ * See https://github.com/microsoft/TypeScript/issues/43329.
32
+ */
33
+ const dynamicImport = new Function('modulePath', 'return import(modulePath)');
34
+ async function loadModule(functionsDir) {
35
+ const absolutePath = path.resolve(functionsDir);
36
+ try {
37
+ return require(path.resolve(absolutePath));
38
+ }
39
+ catch (e) {
40
+ if (e.code === 'ERR_REQUIRE_ESM') {
41
+ // This is an ESM package!
42
+ const modulePath = require.resolve(absolutePath);
43
+ // Resolve module path to file:// URL. Required for windows support.
44
+ // @ts-ignore pathToFileURL exists for Node.js v10 and up. Since ESM support exists for Node.js v13 and up, we
45
+ // can be sure that this function exists here.
46
+ const moduleURL = url.pathToFileURL(modulePath).href;
47
+ return await dynamicImport(moduleURL);
48
+ }
49
+ throw e;
50
+ }
51
+ }
52
+ /* @internal */
53
+ function extractStack(module, endpoints, requiredAPIs, prefix = '') {
54
+ for (const [name, val] of Object.entries(module)) {
55
+ if (typeof val === 'function' &&
56
+ val['__endpoint'] &&
57
+ typeof val['__endpoint'] === 'object') {
58
+ const funcName = prefix + name;
59
+ endpoints[funcName] = {
60
+ ...val['__endpoint'],
61
+ entryPoint: funcName.replace(/-/g, '.'),
62
+ };
63
+ if (val['__requiredAPIs'] && Array.isArray(val['__requiredAPIs'])) {
64
+ requiredAPIs.push(...val['__requiredAPIs']);
65
+ }
66
+ }
67
+ else if (typeof val === 'object' && val !== null) {
68
+ extractStack(val, endpoints, requiredAPIs, prefix + name + '-');
69
+ }
70
+ }
71
+ }
72
+ exports.extractStack = extractStack;
73
+ /* @internal */
74
+ function mergeRequiredAPIs(requiredAPIs) {
75
+ const apiToReasons = {};
76
+ for (const { api, reason } of requiredAPIs) {
77
+ const reasons = apiToReasons[api] || new Set();
78
+ reasons.add(reason);
79
+ apiToReasons[api] = reasons;
80
+ }
81
+ const merged = [];
82
+ for (const [api, reasons] of Object.entries(apiToReasons)) {
83
+ merged.push({ api, reason: Array.from(reasons).join(' ') });
84
+ }
85
+ return merged;
86
+ }
87
+ exports.mergeRequiredAPIs = mergeRequiredAPIs;
88
+ /* @internal */
89
+ async function loadStack(functionsDir) {
90
+ const endpoints = {};
91
+ const requiredAPIs = [];
92
+ const mod = await loadModule(functionsDir);
93
+ extractStack(mod, endpoints, requiredAPIs);
94
+ const stack = {
95
+ endpoints,
96
+ specVersion: 'v1alpha1',
97
+ requiredAPIs: mergeRequiredAPIs(requiredAPIs),
98
+ };
99
+ return stack;
100
+ }
101
+ exports.loadStack = loadStack;