firebase-functions
Version:
Firebase SDK for Cloud Functions
250 lines (248 loc) • 9.04 kB
JavaScript
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.js');
const require_common_options = require('../../common/options.js');
const require_runtime_manifest = require('../../runtime/manifest.js');
const require_common_onInit = require('../../common/onInit.js');
const require_common_providers_https = require('../../common/providers/https.js');
const require_common_providers_identity = require('../../common/providers/identity.js');
const require_v2_trace = require('../trace.js');
const require_v2_options = require('../options.js');
//#region src/v2/providers/identity.ts
var identity_exports = /* @__PURE__ */ require_rolldown_runtime.__export({
HttpsError: () => require_common_providers_https.HttpsError,
IS_NOT_TENANT: () => IS_NOT_TENANT,
beforeEmailSent: () => beforeEmailSent,
beforeOperation: () => beforeOperation,
beforeSmsSent: () => beforeSmsSent,
beforeUserCreated: () => beforeUserCreated,
beforeUserSignedIn: () => beforeUserSignedIn,
getOpts: () => getOpts,
onUserCreated: () => onUserCreated,
onUserDeleted: () => onUserDeleted
});
/**
* Handles an event that is triggered before a user is created.
* @param optsOrHandler - Either an object containing function options, or an event handler (run before user creation).
* @param handler? - If defined, an event handler which is run every time before a user is created.
*/
function beforeUserCreated(optsOrHandler, handler) {
return beforeOperation("beforeCreate", optsOrHandler, handler);
}
/**
* Handles an event that is triggered before a user is signed in.
* @param optsOrHandler - Either an object containing function options, or an event handler (run before user signin).
* @param handler - Event handler which is run every time before a user is signed in.
*/
function beforeUserSignedIn(optsOrHandler, handler) {
return beforeOperation("beforeSignIn", optsOrHandler, handler);
}
/**
* Handles an event that is triggered before an email is sent to a user.
* @param optsOrHandler- Either an object containing function options, or an event handler that is run before an email is sent to a user.
* @param handler - Event handler that is run before an email is sent to a user.
*/
function beforeEmailSent(optsOrHandler, handler) {
return beforeOperation("beforeSendEmail", optsOrHandler, handler);
}
/**
* Handles an event that is triggered before an SMS is sent to a user.
* @param optsOrHandler - Either an object containing function options, or an event handler that is run before an SMS is sent to a user.
* @param handler - Event handler that is run before an SMS is sent to a user.
*/
function beforeSmsSent(optsOrHandler, handler) {
return beforeOperation("beforeSendSms", optsOrHandler, handler);
}
/** @hidden */
function beforeOperation(eventType, optsOrHandler, handler) {
if (!handler || typeof optsOrHandler === "function") {
handler = optsOrHandler;
optsOrHandler = {};
}
const { opts,...blockingOptions } = getOpts(optsOrHandler);
const annotatedHandler = Object.assign(handler, { platform: "gcfv2" });
const func = require_v2_trace.wrapTraceContext(require_common_onInit.withInit(require_common_providers_identity.wrapHandler(eventType, annotatedHandler)));
const legacyEventType = `providers/cloud.auth/eventTypes/user.${eventType}`;
/** Endpoint */
const baseOptsEndpoint = require_v2_options.optionsToEndpoint(require_v2_options.getGlobalOptions());
const specificOptsEndpoint = require_v2_options.optionsToEndpoint(opts, "identity");
func.__endpoint = {
...require_runtime_manifest.initV2Endpoint(require_v2_options.getGlobalOptions(), opts),
platform: "gcfv2",
...baseOptsEndpoint,
...specificOptsEndpoint,
labels: {
...baseOptsEndpoint?.labels,
...specificOptsEndpoint?.labels
},
blockingTrigger: {
eventType: legacyEventType,
options: { ...(eventType === "beforeCreate" || eventType === "beforeSignIn") && blockingOptions }
}
};
func.__requiredAPIs = [{
api: "identitytoolkit.googleapis.com",
reason: "Needed for auth blocking functions"
}];
func.run = handler;
return func;
}
/** @hidden */
function getOpts(blockingOptions) {
const accessToken = blockingOptions.accessToken || false;
const idToken = blockingOptions.idToken || false;
const refreshToken = blockingOptions.refreshToken || false;
const opts = { ...blockingOptions };
delete opts.accessToken;
delete opts.idToken;
delete opts.refreshToken;
return {
opts,
accessToken,
idToken,
refreshToken
};
}
/**
* constant to represent the absence of tenant ID.
* @internal
*/
const IS_NOT_TENANT = require_common_options.RESET_VALUE;
function getOptsAndHandler(optsOrHandler, handler) {
if (typeof optsOrHandler === "function") {
return {
opts: {},
handler: optsOrHandler
};
}
return {
opts: optsOrHandler,
handler
};
}
const PROJECT_ID_REGEX = /(?:^|\/)projects\/([^\/]+)/;
/**
* Converts the v2 Eventarc (`AuthEventData`) protobuf wire protocol (`value`/`oldValue`, `createTime`, `photoUrl`)
* into the v1 `LegacyEvent` wire protocol expected by `userRecordConstructor`.
* @hidden
*/
function convertV2EventToV1Event(rawData) {
if (!rawData || typeof rawData !== "object") {
return undefined;
}
const dataObj = rawData;
let rawUser;
if ("value" in dataObj) {
rawUser = dataObj.value;
} else if ("oldValue" in dataObj) {
rawUser = dataObj.oldValue;
} else if ("old_value" in dataObj) {
rawUser = dataObj.old_value;
} else {
rawUser = dataObj;
}
if (!rawUser || typeof rawUser !== "object") {
return undefined;
}
const userData = { ...rawUser };
if (userData.photoUrl && !userData.photoURL) {
userData.photoURL = userData.photoUrl;
}
if (userData.metadata && typeof userData.metadata === "object") {
const meta = { ...userData.metadata };
if (meta.createTime && !meta.createdAt && !meta.creationTime) {
meta.creationTime = meta.createTime;
}
userData.metadata = meta;
}
return require_common_providers_identity.userRecordConstructor(userData);
}
/**
* Normalizes raw CloudEvents from Eventarc into AuthEvent<User>.
* Eventarc wraps v2 Authentication user payloads inside an `AuthEventData`
* protobuf envelope (`value` for creation events, `oldValue` for deletion events).
* We unbox the envelope (falling back to `raw.data` for unit tests) and normalize
* protobuf-specific field names (`createTime` -> `creationTime`, `photoUrl` -> `photoURL`).
* @hidden
*/
function getAuthEvent(raw) {
const event = { ...raw };
if (raw.data !== undefined && raw.data !== null) {
event.data = convertV2EventToV1Event(raw.data);
}
const rawAny = raw;
const tenantId = rawAny.tenantid || rawAny.tenantId;
if (tenantId) {
event.tenantId = tenantId;
}
if (raw.source) {
const match = raw.source.match(PROJECT_ID_REGEX);
if (match) {
event.project = match[1];
}
}
return event;
}
/** @hidden */
function makeAuthTrigger(eventType, optsOrHandler, handler) {
const { opts, handler: handlerFunc } = getOptsAndHandler(optsOrHandler, handler);
if (typeof handlerFunc !== "function") {
throw new Error("The handler must be a function.");
}
const wrappedHandler = require_v2_trace.wrapTraceContext(require_common_onInit.withInit(handlerFunc));
const func = ((raw) => {
const event = getAuthEvent(raw);
return wrappedHandler(event);
});
func.run = handlerFunc;
const baseOptsEndpoint = require_v2_options.optionsToEndpoint(require_v2_options.getGlobalOptions());
const specificOptsEndpoint = require_v2_options.optionsToEndpoint(opts);
const endpoint = {
...require_runtime_manifest.initV2Endpoint(require_v2_options.getGlobalOptions(), opts),
platform: "gcfv2",
...baseOptsEndpoint,
...specificOptsEndpoint,
labels: {
...baseOptsEndpoint?.labels,
...specificOptsEndpoint?.labels
},
eventTrigger: {
eventType,
eventFilters: {},
retry: opts.retry ?? false,
region: "global"
}
};
if (opts.tenantId !== undefined) {
if (opts.tenantId === IS_NOT_TENANT) {
endpoint.eventTrigger.eventFilters["tenantid"] = "";
} else {
endpoint.eventTrigger.eventFilters["tenantid"] = opts.tenantId;
}
}
func.__endpoint = endpoint;
return func;
}
const USER_CREATED_EVENT = "google.firebase.auth.user.v2.created";
function onUserCreated(optsOrHandler, handler) {
return makeAuthTrigger(USER_CREATED_EVENT, optsOrHandler, handler);
}
const USER_DELETED_EVENT = "google.firebase.auth.user.v2.deleted";
function onUserDeleted(optsOrHandler, handler) {
return makeAuthTrigger(USER_DELETED_EVENT, optsOrHandler, handler);
}
//#endregion
exports.HttpsError = require_common_providers_https.HttpsError;
exports.IS_NOT_TENANT = IS_NOT_TENANT;
exports.beforeEmailSent = beforeEmailSent;
exports.beforeOperation = beforeOperation;
exports.beforeSmsSent = beforeSmsSent;
exports.beforeUserCreated = beforeUserCreated;
exports.beforeUserSignedIn = beforeUserSignedIn;
exports.getOpts = getOpts;
Object.defineProperty(exports, 'identity_exports', {
enumerable: true,
get: function () {
return identity_exports;
}
});
exports.onUserCreated = onUserCreated;
exports.onUserDeleted = onUserDeleted;