forked from dienianindya/gsi_ess_mobile
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
9.3 KiB
248 lines
9.3 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.cleanAuthState = exports.getCleanDomains = exports.removeAuthDomain = exports.addAuthDomains = exports.deleteSite = exports.updateSite = exports.createSite = exports.getSite = exports.listSites = exports.createRelease = exports.cloneVersion = exports.listVersions = exports.updateVersion = exports.createVersion = exports.deleteChannel = exports.updateChannelTtl = exports.createChannel = exports.listChannels = exports.getChannel = exports.normalizeName = void 0;
|
|
const error_1 = require("../error");
|
|
const api_1 = require("../api");
|
|
const apiv2_1 = require("../apiv2");
|
|
const operationPoller = require("../operation-poller");
|
|
const expireUtils_1 = require("../hosting/expireUtils");
|
|
const auth_1 = require("../gcp/auth");
|
|
const proto = require("../gcp/proto");
|
|
const ONE_WEEK_MS = 604800000;
|
|
var ReleaseType;
|
|
(function (ReleaseType) {
|
|
ReleaseType["TYPE_UNSPECIFIED"] = "TYPE_UNSPECIFIED";
|
|
ReleaseType["DEPLOY"] = "DEPLOY";
|
|
ReleaseType["ROLLBACK"] = "ROLLBACK";
|
|
ReleaseType["SITE_DISABLE"] = "SITE_DISABLE";
|
|
})(ReleaseType || (ReleaseType = {}));
|
|
function normalizeName(s) {
|
|
return s.replace(/[/:_#]/g, "-");
|
|
}
|
|
exports.normalizeName = normalizeName;
|
|
const apiClient = new apiv2_1.Client({
|
|
urlPrefix: api_1.hostingApiOrigin,
|
|
apiVersion: "v1beta1",
|
|
auth: true,
|
|
});
|
|
async function getChannel(project = "-", site, channelId) {
|
|
try {
|
|
const res = await apiClient.get(`/projects/${project}/sites/${site}/channels/${channelId}`);
|
|
return res.body;
|
|
}
|
|
catch (e) {
|
|
if (e instanceof error_1.FirebaseError && e.status === 404) {
|
|
return null;
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
exports.getChannel = getChannel;
|
|
async function listChannels(project = "-", site) {
|
|
const channels = [];
|
|
let nextPageToken = "";
|
|
for (;;) {
|
|
try {
|
|
const res = await apiClient.get(`/projects/${project}/sites/${site}/channels`, { queryParams: { pageToken: nextPageToken, pageSize: 10 } });
|
|
const c = res.body.channels;
|
|
if (c) {
|
|
channels.push(...c);
|
|
}
|
|
nextPageToken = res.body.nextPageToken || "";
|
|
if (!nextPageToken) {
|
|
return channels;
|
|
}
|
|
}
|
|
catch (e) {
|
|
if (e instanceof error_1.FirebaseError && e.status === 404) {
|
|
throw new error_1.FirebaseError(`could not find channels for site "${site}"`, {
|
|
original: e,
|
|
});
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
exports.listChannels = listChannels;
|
|
async function createChannel(project = "-", site, channelId, ttlMillis = expireUtils_1.DEFAULT_DURATION) {
|
|
const res = await apiClient.post(`/projects/${project}/sites/${site}/channels?channelId=${channelId}`, { ttl: `${ttlMillis / 1000}s` });
|
|
return res.body;
|
|
}
|
|
exports.createChannel = createChannel;
|
|
async function updateChannelTtl(project = "-", site, channelId, ttlMillis = ONE_WEEK_MS) {
|
|
const res = await apiClient.patch(`/projects/${project}/sites/${site}/channels/${channelId}`, { ttl: `${ttlMillis / 1000}s` }, { queryParams: { updateMask: "ttl" } });
|
|
return res.body;
|
|
}
|
|
exports.updateChannelTtl = updateChannelTtl;
|
|
async function deleteChannel(project = "-", site, channelId) {
|
|
await apiClient.delete(`/projects/${project}/sites/${site}/channels/${channelId}`);
|
|
}
|
|
exports.deleteChannel = deleteChannel;
|
|
async function createVersion(siteId, version) {
|
|
const res = await apiClient.post(`projects/-/sites/${siteId}/versions`, version);
|
|
return res.body.name;
|
|
}
|
|
exports.createVersion = createVersion;
|
|
async function updateVersion(site, versionId, version) {
|
|
const res = await apiClient.patch(`projects/-/sites/${site}/versions/${versionId}`, version, {
|
|
queryParams: {
|
|
updateMask: proto.fieldMasks(version, "labels", "config").join(","),
|
|
},
|
|
});
|
|
return res.body;
|
|
}
|
|
exports.updateVersion = updateVersion;
|
|
async function listVersions(site) {
|
|
let pageToken = undefined;
|
|
const versions = [];
|
|
do {
|
|
const queryParams = {};
|
|
if (pageToken) {
|
|
queryParams.pageToken = pageToken;
|
|
}
|
|
const res = await apiClient.get(`projects/-/sites/${site}/versions`, {
|
|
queryParams,
|
|
});
|
|
versions.push(...res.body.versions);
|
|
pageToken = res.body.nextPageToken;
|
|
} while (pageToken);
|
|
return versions;
|
|
}
|
|
exports.listVersions = listVersions;
|
|
async function cloneVersion(site, versionName, finalize = false) {
|
|
const res = await apiClient.post(`/projects/-/sites/${site}/versions:clone`, {
|
|
sourceVersion: versionName,
|
|
finalize,
|
|
});
|
|
const { name: operationName } = res.body;
|
|
const pollRes = await operationPoller.pollOperation({
|
|
apiOrigin: api_1.hostingApiOrigin,
|
|
apiVersion: "v1beta1",
|
|
operationResourceName: operationName,
|
|
masterTimeout: 600000,
|
|
});
|
|
return pollRes;
|
|
}
|
|
exports.cloneVersion = cloneVersion;
|
|
async function createRelease(site, channel, version, partialRelease) {
|
|
const res = await apiClient.post(`/projects/-/sites/${site}/channels/${channel}/releases`, partialRelease, { queryParams: { versionName: version } });
|
|
return res.body;
|
|
}
|
|
exports.createRelease = createRelease;
|
|
async function listSites(project) {
|
|
const sites = [];
|
|
let nextPageToken = "";
|
|
for (;;) {
|
|
try {
|
|
const res = await apiClient.get(`/projects/${project}/sites`, { queryParams: { pageToken: nextPageToken, pageSize: 10 } });
|
|
const c = res.body.sites;
|
|
if (c) {
|
|
sites.push(...c);
|
|
}
|
|
nextPageToken = res.body.nextPageToken || "";
|
|
if (!nextPageToken) {
|
|
return sites;
|
|
}
|
|
}
|
|
catch (e) {
|
|
if (e instanceof error_1.FirebaseError && e.status === 404) {
|
|
throw new error_1.FirebaseError(`could not find sites for project "${project}"`, {
|
|
original: e,
|
|
});
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
exports.listSites = listSites;
|
|
async function getSite(project, site) {
|
|
try {
|
|
const res = await apiClient.get(`/projects/${project}/sites/${site}`);
|
|
return res.body;
|
|
}
|
|
catch (e) {
|
|
if (e instanceof error_1.FirebaseError && e.status === 404) {
|
|
throw new error_1.FirebaseError(`could not find site "${site}" for project "${project}"`, {
|
|
original: e,
|
|
});
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
exports.getSite = getSite;
|
|
async function createSite(project, site, appId = "") {
|
|
const res = await apiClient.post(`/projects/${project}/sites`, { appId: appId }, { queryParams: { siteId: site } });
|
|
return res.body;
|
|
}
|
|
exports.createSite = createSite;
|
|
async function updateSite(project, site, fields) {
|
|
const res = await apiClient.patch(`/projects/${project}/sites/${site.name}`, site, {
|
|
queryParams: { updateMask: fields.join(",") },
|
|
});
|
|
return res.body;
|
|
}
|
|
exports.updateSite = updateSite;
|
|
async function deleteSite(project, site) {
|
|
await apiClient.delete(`/projects/${project}/sites/${site}`);
|
|
}
|
|
exports.deleteSite = deleteSite;
|
|
async function addAuthDomains(project, urls) {
|
|
const domains = await (0, auth_1.getAuthDomains)(project);
|
|
const authDomains = domains || [];
|
|
for (const url of urls) {
|
|
const domain = url.replace("https://", "");
|
|
if (authDomains.includes(domain)) {
|
|
continue;
|
|
}
|
|
authDomains.push(domain);
|
|
}
|
|
return await (0, auth_1.updateAuthDomains)(project, authDomains);
|
|
}
|
|
exports.addAuthDomains = addAuthDomains;
|
|
async function removeAuthDomain(project, url) {
|
|
const domains = await (0, auth_1.getAuthDomains)(project);
|
|
if (!domains.length) {
|
|
return domains;
|
|
}
|
|
const targetDomain = url.replace("https://", "");
|
|
const authDomains = domains.filter((domain) => domain !== targetDomain);
|
|
return (0, auth_1.updateAuthDomains)(project, authDomains);
|
|
}
|
|
exports.removeAuthDomain = removeAuthDomain;
|
|
async function getCleanDomains(project, site) {
|
|
const channels = await listChannels(project, site);
|
|
const channelMap = channels
|
|
.map((channel) => channel.url.replace("https://", ""))
|
|
.reduce((acc, current) => {
|
|
acc[current] = true;
|
|
return acc;
|
|
}, {});
|
|
const siteMatch = new RegExp(`${site}--`, "i");
|
|
const firebaseAppMatch = new RegExp(/firebaseapp.com$/);
|
|
const domains = await (0, auth_1.getAuthDomains)(project);
|
|
const authDomains = [];
|
|
domains.forEach((domain) => {
|
|
const endsWithFirebaseApp = firebaseAppMatch.test(domain);
|
|
if (endsWithFirebaseApp) {
|
|
authDomains.push(domain);
|
|
return;
|
|
}
|
|
const domainWithNoChannel = siteMatch.test(domain) && !channelMap[domain];
|
|
if (domainWithNoChannel) {
|
|
return;
|
|
}
|
|
authDomains.push(domain);
|
|
});
|
|
return authDomains;
|
|
}
|
|
exports.getCleanDomains = getCleanDomains;
|
|
async function cleanAuthState(project, sites) {
|
|
const siteDomainMap = new Map();
|
|
for (const site of sites) {
|
|
const authDomains = await getCleanDomains(project, site);
|
|
const updatedDomains = await (0, auth_1.updateAuthDomains)(project, authDomains);
|
|
siteDomainMap.set(site, updatedDomains);
|
|
}
|
|
return siteDomainMap;
|
|
}
|
|
exports.cleanAuthState = cleanAuthState;
|