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.

327 lines
18 KiB

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.getAppLookupParams = getAppLookupParams;
function _assert() {
const data = _interopRequireDefault(require("assert"));
_assert = function () {
return data;
};
return data;
}
function _keyBy() {
const data = _interopRequireDefault(require("lodash/keyBy"));
_keyBy = function () {
return data;
};
return data;
}
function _omit() {
const data = _interopRequireDefault(require("lodash/omit"));
_omit = function () {
return data;
};
return data;
}
function _pick() {
const data = _interopRequireDefault(require("lodash/pick"));
_pick = function () {
return data;
};
return data;
}
function _IosApiV2Wrapper() {
const data = _interopRequireDefault(require("./IosApiV2Wrapper"));
_IosApiV2Wrapper = function () {
return data;
};
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function getAppLookupParams(experienceName, bundleIdentifier) {
const matchedExperienceName = experienceName.match(/@(.+)\/(.+)/);
(0, _assert().default)(matchedExperienceName && matchedExperienceName.length >= 3, 'invalid experience name');
return {
accountName: matchedExperienceName[1],
projectName: matchedExperienceName[2],
bundleIdentifier
};
}
// appCredentials are identified by `${projectFullName} ${bundleIdentifier}` (see getAppCredentialsCacheIndex method)
// userCredentials are identified by id (string or numeric depending on API)
//
// Expected behaviour of cache (internals)
//
// - when isPrefetched[accountName] true assume everything is synced for that account
// - when credentials[accountName].appCredentials[experienceNameBundleIdentifier] is truthy assume that user and app credentials for that app are synced
// - when accessing user or app credentials identified by AppLookupParams fetch all credentials for that app (user and app credentials)
// - when updating userCredentials refetch only userCredentials
// - when deleting userCredentials modify prefetched appCredentials without calling api
// - when updating provisioningProfile refetch all credentials for that app (user and app credentials)
// - when deleting provisioningProfile modify appCredentials in cache
// - when deleting pushCert refetch all credentials for app (app + user)
//
//
class IosApi {
constructor(api) {
_defineProperty(this, "client", void 0);
_defineProperty(this, "credentials", {});
_defineProperty(this, "isPrefetched", {});
this.client = new (_IosApiV2Wrapper().default)(api);
}
async getAllCredentials(accountName) {
var _this$credentials$acc, _this$credentials$acc2, _this$credentials$acc3, _this$credentials$acc4;
if (!this.isPrefetched[accountName]) {
const credentials = await this.client.getAllCredentialsApi(accountName);
this.credentials[accountName] = {
appCredentials: (0, _keyBy().default)(credentials.appCredentials, cred => `${cred.experienceName} ${cred.bundleIdentifier}`),
userCredentials: (0, _keyBy().default)(credentials.userCredentials, cred => String(cred.id))
};
this.isPrefetched[accountName] = true;
}
return {
appCredentials: Object.values((_this$credentials$acc = (_this$credentials$acc2 = this.credentials[accountName]) === null || _this$credentials$acc2 === void 0 ? void 0 : _this$credentials$acc2.appCredentials) !== null && _this$credentials$acc !== void 0 ? _this$credentials$acc : {}),
userCredentials: Object.values((_this$credentials$acc3 = (_this$credentials$acc4 = this.credentials[accountName]) === null || _this$credentials$acc4 === void 0 ? void 0 : _this$credentials$acc4.userCredentials) !== null && _this$credentials$acc3 !== void 0 ? _this$credentials$acc3 : {})
};
}
async getDistCert(appLookupParams) {
var _this$credentials$acc5, _this$credentials$acc6, _this$credentials$acc7, _this$credentials$acc8;
await this.ensureAppCredentials(appLookupParams);
const appCredentialsIndex = this.getAppCredentialsCacheIndex(appLookupParams);
const {
accountName
} = appLookupParams;
const appCredentials = (_this$credentials$acc5 = this.credentials[accountName]) === null || _this$credentials$acc5 === void 0 ? void 0 : (_this$credentials$acc6 = _this$credentials$acc5.appCredentials) === null || _this$credentials$acc6 === void 0 ? void 0 : _this$credentials$acc6[appCredentialsIndex];
if (!appCredentials || !appCredentials.distCredentialsId) {
return null;
}
const distCert = (_this$credentials$acc7 = this.credentials[accountName]) === null || _this$credentials$acc7 === void 0 ? void 0 : (_this$credentials$acc8 = _this$credentials$acc7.userCredentials) === null || _this$credentials$acc8 === void 0 ? void 0 : _this$credentials$acc8[appCredentials.distCredentialsId];
return distCert !== null && distCert !== void 0 ? distCert : null;
}
async createDistCert(accountName, credentials) {
var _this$credentials$acc9, _this$credentials$acc10;
const id = await this.client.createDistCertApi(accountName, credentials);
// refetching because www might add some fields (e.g. certSerialNumber)
await this.refetchUserCredentials(id, accountName);
const distCert = (_this$credentials$acc9 = this.credentials[accountName]) === null || _this$credentials$acc9 === void 0 ? void 0 : (_this$credentials$acc10 = _this$credentials$acc9.userCredentials) === null || _this$credentials$acc10 === void 0 ? void 0 : _this$credentials$acc10[String(id)];
(0, _assert().default)(id && distCert, 'distribution certificate does not exists');
(0, _assert().default)(distCert.type === 'dist-cert', 'wrong type of user credential');
return distCert;
}
async updateDistCert(id, accountName, credentials) {
var _this$credentials$acc11;
await this.client.updateDistCertApi(id, accountName, credentials);
// refetching because www might add some fields (e.g. certSerialNumber)
await this.refetchUserCredentials(id, accountName);
const distCert = (_this$credentials$acc11 = this.credentials[accountName]) === null || _this$credentials$acc11 === void 0 ? void 0 : _this$credentials$acc11.userCredentials[String(id)];
(0, _assert().default)(distCert, 'distribution certificate does not exists');
(0, _assert().default)(distCert.type === 'dist-cert', 'wrong type of user credential');
return distCert;
}
async deleteDistCert(id, accountName) {
await this.client.deleteDistCertApi(id, accountName);
await this.removeUserCredentialFromCache(id, accountName);
}
async useDistCert(appLookupParams, userCredentialsId) {
await this.client.useDistCertApi(appLookupParams, userCredentialsId);
await this.refetchAppCredentials(appLookupParams);
}
async createPushKey(accountName, credentials) {
var _this$credentials$acc12, _this$credentials$acc13;
const id = await this.client.createPushKeyApi(accountName, credentials);
await this.refetchUserCredentials(id, accountName);
const pushKey = (_this$credentials$acc12 = this.credentials[accountName]) === null || _this$credentials$acc12 === void 0 ? void 0 : (_this$credentials$acc13 = _this$credentials$acc12.userCredentials) === null || _this$credentials$acc13 === void 0 ? void 0 : _this$credentials$acc13[String(id)];
(0, _assert().default)(id && pushKey, 'push key does not exists');
(0, _assert().default)(pushKey.type === 'push-key', 'wrong type of user credentials');
return pushKey;
}
async updatePushKey(id, accountName, credentials) {
var _this$credentials$acc14, _this$credentials$acc15;
await this.client.updatePushKeyApi(id, accountName, credentials);
await this.refetchUserCredentials(id, accountName);
const pushKey = (_this$credentials$acc14 = this.credentials[accountName]) === null || _this$credentials$acc14 === void 0 ? void 0 : (_this$credentials$acc15 = _this$credentials$acc14.userCredentials) === null || _this$credentials$acc15 === void 0 ? void 0 : _this$credentials$acc15[String(id)];
(0, _assert().default)(id && pushKey, 'push key does not exists');
(0, _assert().default)(pushKey.type === 'push-key', 'wrong type of user credentials');
return pushKey;
}
async deletePushKey(id, accountName) {
await this.client.deletePushKeyApi(id, accountName);
await this.removeUserCredentialFromCache(id, accountName);
}
async getPushKey(appLookupParams) {
var _this$credentials$acc16, _this$credentials$acc17, _this$credentials$acc18, _this$credentials$acc19;
await this.ensureAppCredentials(appLookupParams);
const appCredentialsIndex = this.getAppCredentialsCacheIndex(appLookupParams);
const {
accountName
} = appLookupParams;
const appCredentials = (_this$credentials$acc16 = this.credentials[accountName]) === null || _this$credentials$acc16 === void 0 ? void 0 : (_this$credentials$acc17 = _this$credentials$acc16.appCredentials) === null || _this$credentials$acc17 === void 0 ? void 0 : _this$credentials$acc17[appCredentialsIndex];
if (!appCredentials || !appCredentials.pushCredentialsId) {
return null;
}
const pushKey = (_this$credentials$acc18 = this.credentials[accountName]) === null || _this$credentials$acc18 === void 0 ? void 0 : (_this$credentials$acc19 = _this$credentials$acc18.userCredentials) === null || _this$credentials$acc19 === void 0 ? void 0 : _this$credentials$acc19[appCredentials.pushCredentialsId];
return pushKey !== null && pushKey !== void 0 ? pushKey : null;
}
async usePushKey(appLookupParams, userCredentialsId) {
await this.client.usePushKeyApi(appLookupParams, userCredentialsId);
await this.refetchAppCredentials(appLookupParams);
}
async getPushCert(appLookupParams) {
var _appCredentials$crede, _appCredentials$crede2, _appCredentials$crede3;
const appCredentials = await this.getAppCredentials(appLookupParams);
const pushId = appCredentials === null || appCredentials === void 0 ? void 0 : (_appCredentials$crede = appCredentials.credentials) === null || _appCredentials$crede === void 0 ? void 0 : _appCredentials$crede.pushId;
const pushP12 = appCredentials === null || appCredentials === void 0 ? void 0 : (_appCredentials$crede2 = appCredentials.credentials) === null || _appCredentials$crede2 === void 0 ? void 0 : _appCredentials$crede2.pushP12;
const pushPassword = appCredentials === null || appCredentials === void 0 ? void 0 : (_appCredentials$crede3 = appCredentials.credentials) === null || _appCredentials$crede3 === void 0 ? void 0 : _appCredentials$crede3.pushPassword;
if (!pushId || !pushP12 || !pushPassword) {
return null;
}
return {
pushId,
pushP12,
pushPassword
};
}
async deletePushCert(appLookupParams) {
await this.client.deletePushCertApi(appLookupParams);
await this.refetchAppCredentials(appLookupParams);
}
async getAppCredentials(appLookupParams) {
var _this$credentials$acc20, _this$credentials$acc21;
const appCredentialsIndex = this.getAppCredentialsCacheIndex(appLookupParams);
const {
accountName
} = appLookupParams;
await this.ensureAppCredentials(appLookupParams);
return (_this$credentials$acc20 = this.credentials[accountName]) === null || _this$credentials$acc20 === void 0 ? void 0 : (_this$credentials$acc21 = _this$credentials$acc20.appCredentials) === null || _this$credentials$acc21 === void 0 ? void 0 : _this$credentials$acc21[appCredentialsIndex];
}
async getProvisioningProfile(appLookupParams) {
var _appCredentials$crede4;
const appCredentials = await this.getAppCredentials(appLookupParams);
const provisioningProfile = appCredentials === null || appCredentials === void 0 ? void 0 : (_appCredentials$crede4 = appCredentials.credentials) === null || _appCredentials$crede4 === void 0 ? void 0 : _appCredentials$crede4.provisioningProfile;
if (!provisioningProfile) {
return null;
}
return (0, _pick().default)(appCredentials.credentials, ['provisioningProfile', 'provisioningProfileId', 'teamId', 'teamName']);
}
async updateProvisioningProfile(appLookupParams, provisioningProfile) {
var _this$credentials$acc22, _this$credentials$acc23, _this$credentials$acc24;
const appCredentialsIndex = this.getAppCredentialsCacheIndex(appLookupParams);
const {
accountName
} = appLookupParams;
await this.client.updateProvisioningProfileApi(appLookupParams, provisioningProfile);
await this.refetchAppCredentials(appLookupParams);
return (0, _pick().default)((_this$credentials$acc22 = this.credentials[accountName]) === null || _this$credentials$acc22 === void 0 ? void 0 : (_this$credentials$acc23 = _this$credentials$acc22.appCredentials) === null || _this$credentials$acc23 === void 0 ? void 0 : (_this$credentials$acc24 = _this$credentials$acc23[appCredentialsIndex]) === null || _this$credentials$acc24 === void 0 ? void 0 : _this$credentials$acc24.credentials, ['provisioningProfile', 'provisioningProfileId', 'teamId', 'teamName']);
}
async deleteProvisioningProfile(appLookupParams) {
var _this$credentials, _this$credentials$acc25, _this$credentials$acc26;
const appCredentialsIndex = this.getAppCredentialsCacheIndex(appLookupParams);
const {
accountName
} = appLookupParams;
await this.client.deleteProvisioningProfileApi(appLookupParams);
const appCredentials = (_this$credentials = this.credentials) === null || _this$credentials === void 0 ? void 0 : (_this$credentials$acc25 = _this$credentials[accountName]) === null || _this$credentials$acc25 === void 0 ? void 0 : (_this$credentials$acc26 = _this$credentials$acc25.appCredentials) === null || _this$credentials$acc26 === void 0 ? void 0 : _this$credentials$acc26[appCredentialsIndex];
if (appCredentials !== null && appCredentials !== void 0 && appCredentials.credentials) {
// teamId should still be there because it might be part of push cert definition
appCredentials.credentials = (0, _omit().default)(appCredentials.credentials, ['provisioningProfile', 'provisioningProfileId']);
}
}
getAppCredentialsCacheIndex(appLookupParams) {
const {
accountName,
projectName,
bundleIdentifier
} = appLookupParams;
const projectFullName = `@${accountName}/${projectName}`;
return `${projectFullName} ${bundleIdentifier}`;
}
removeUserCredentialFromCache(id, accountName) {
var _this$credentials$acc27, _this$credentials$acc28, _this$credentials$acc29;
if ((_this$credentials$acc27 = this.credentials[accountName]) !== null && _this$credentials$acc27 !== void 0 && (_this$credentials$acc28 = _this$credentials$acc27.userCredentials) !== null && _this$credentials$acc28 !== void 0 && _this$credentials$acc28[String(id)]) {
delete this.credentials[accountName].userCredentials[String(id)];
}
const appCredentials = (_this$credentials$acc29 = this.credentials[accountName]) === null || _this$credentials$acc29 === void 0 ? void 0 : _this$credentials$acc29.appCredentials;
if (appCredentials) {
Object.entries(appCredentials).forEach(([key, val]) => {
if (val.distCredentialsId === id) {
delete appCredentials[key].distCredentialsId;
}
if (val.pushCredentialsId === id) {
delete appCredentials[key].pushCredentialsId;
}
});
}
}
// ensures that credentials are fetched from the server if they exists
// if there is no credentials on server for specific app this function should still succeed.
async ensureAppCredentials(appLookupParams) {
var _this$credentials2, _this$credentials2$ac, _this$credentials2$ac2;
const appCredentialsIndex = this.getAppCredentialsCacheIndex(appLookupParams);
const {
accountName
} = appLookupParams;
if (this.isPrefetched[accountName] || (_this$credentials2 = this.credentials) !== null && _this$credentials2 !== void 0 && (_this$credentials2$ac = _this$credentials2[accountName]) !== null && _this$credentials2$ac !== void 0 && (_this$credentials2$ac2 = _this$credentials2$ac.appCredentials) !== null && _this$credentials2$ac2 !== void 0 && _this$credentials2$ac2[appCredentialsIndex]) {
return;
}
await this.refetchAppCredentials(appLookupParams);
}
async refetchUserCredentials(id, accountName) {
var _this$credentials$acc30;
const userCredentials = await this.client.getUserCredentialsByIdApi(id, accountName);
if (!userCredentials || !userCredentials.id) {
return;
}
this.credentials[accountName] = {
...this.credentials[accountName],
userCredentials: {
...((_this$credentials$acc30 = this.credentials[accountName]) === null || _this$credentials$acc30 === void 0 ? void 0 : _this$credentials$acc30.userCredentials),
[String(id)]: userCredentials
}
};
}
async refetchAppCredentials(app) {
var _this$credentials$acc31, _this$credentials$acc32;
const {
accountName
} = app;
const appCredentialsIndex = this.getAppCredentialsCacheIndex(app);
const data = await this.client.getAllCredentialsForAppApi(app);
if (!data) {
return;
}
this.credentials[accountName] = {
appCredentials: {
...((_this$credentials$acc31 = this.credentials[accountName]) === null || _this$credentials$acc31 === void 0 ? void 0 : _this$credentials$acc31.appCredentials),
[appCredentialsIndex]: (0, _omit().default)(data, ['pushCredentials', 'distCredentials'])
},
userCredentials: {
...((_this$credentials$acc32 = this.credentials[accountName]) === null || _this$credentials$acc32 === void 0 ? void 0 : _this$credentials$acc32.userCredentials),
...(data.pushCredentialsId ? {
[String(data.pushCredentialsId)]: {
...data.pushCredentials,
id: data.pushCredentialsId,
type: 'push-key'
}
} : {}),
...(data.distCredentialsId ? {
[String(data.distCredentialsId)]: {
...data.distCredentials,
id: data.distCredentialsId,
type: 'dist-cert'
}
} : {})
}
};
}
}
exports.default = IosApi;
//# sourceMappingURL=IosApi.js.map