@descope/sdk-mixins
Version:
Descope JavaScript SDK mixins
117 lines (113 loc) • 7.5 kB
JavaScript
'use strict';
var tslib = require('tslib');
var sdkHelpers = require('@descope/sdk-helpers');
var loggerMixin = require('../loggerMixin/loggerMixin.js');
var constants = require('./constants.js');
var projectIdMixin = require('../projectIdMixin.js');
var baseUrlMixin = require('../baseUrlMixin.js');
var fetchWithFallbacks = require('./fetchWithFallbacks.js');
function getResourceUrl({ projectId, filename, assetsFolder = constants.ASSETS_FOLDER, baseUrl = constants.BASE_CONTENT_URL, }) {
const url = new URL(baseUrl);
url.pathname = sdkHelpers.pathJoin(url.pathname, projectId, assetsFolder, filename);
// we want to keep the baseUrl so we can use it later
url.baseUrl = baseUrl;
return url;
}
const staticResourcesMixin = sdkHelpers.createSingletonMixin((superclass) => {
var _StaticResourcesMixinClass_instances, _StaticResourcesMixinClass_lastBaseUrl, _StaticResourcesMixinClass_workingBaseUrl, _StaticResourcesMixinClass_failedUrls, _StaticResourcesMixinClass_getResourceUrls, _StaticResourcesMixinClass_createResourceUrl, _a;
const BaseClass = sdkHelpers.compose(loggerMixin.loggerMixin, projectIdMixin.projectIdMixin, baseUrlMixin.baseUrlMixin)(superclass);
// the logic should be as following:
// 1. if there is a local storage override, use it
// 2. otherwise, if there is a base-static-url attribute, use it
// 3. otherwise, try to use base-url
// 4. otherwise, try to use default content url (BASE_CONTENT_URL)
// 5. otherwise, try to use the fallback content url (BASE_CONTENT_URL_FALLBACK)
// For steps 3-5: if the url is valid, keep using it, and if not, don't try it anymore
return _a = class StaticResourcesMixinClass extends BaseClass {
constructor() {
super(...arguments);
_StaticResourcesMixinClass_instances.add(this);
_StaticResourcesMixinClass_lastBaseUrl.set(this, void 0);
_StaticResourcesMixinClass_workingBaseUrl.set(this, void 0);
_StaticResourcesMixinClass_failedUrls.set(this, new Set());
}
async fetchStaticResource(filename, format) {
const resourceUrls = tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_getResourceUrls).call(this, filename);
// Cache the working URL and mark failed URLs
const onSuccess = !Array.isArray(resourceUrls)
? null
: (index) => {
const { baseUrl } = resourceUrls[index];
tslib.__classPrivateFieldSet(this, _StaticResourcesMixinClass_workingBaseUrl, baseUrl, "f");
// Mark all URLs before this one as failed
for (let i = 0; i < index; i++) {
const failedUrl = resourceUrls[i].baseUrl;
tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_failedUrls, "f").add(failedUrl);
}
};
try {
const res = await fetchWithFallbacks.fetchWithFallbacks(resourceUrls, { cache: 'default' }, { logger: this.logger, onSuccess });
return {
body: await res[format](),
headers: Object.fromEntries(res.headers.entries()),
};
}
catch (e) {
this.logger.error(e.message);
}
}
get baseStaticUrl() {
return this.getAttribute('base-static-url') || '';
}
},
_StaticResourcesMixinClass_lastBaseUrl = new WeakMap(),
_StaticResourcesMixinClass_workingBaseUrl = new WeakMap(),
_StaticResourcesMixinClass_failedUrls = new WeakMap(),
_StaticResourcesMixinClass_instances = new WeakSet(),
_StaticResourcesMixinClass_getResourceUrls = function _StaticResourcesMixinClass_getResourceUrls(filename) {
const overrideUrl = constants.OVERRIDE_CONTENT_URL || this.baseStaticUrl;
// Steps 1-2: Override URL or base-static-url takes precedence
if (overrideUrl) {
return tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_createResourceUrl).call(this, filename, overrideUrl);
}
// Reset state if base-url changed
if (tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_lastBaseUrl, "f") !== this.baseUrl) {
tslib.__classPrivateFieldSet(this, _StaticResourcesMixinClass_lastBaseUrl, this.baseUrl, "f");
tslib.__classPrivateFieldSet(this, _StaticResourcesMixinClass_workingBaseUrl, undefined, "f");
tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_failedUrls, "f").clear();
}
// Build URL list based on cached state or fallback chain
const urls = [];
if (tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_workingBaseUrl, "f")) {
// Use cached working URL
urls.push(tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_createResourceUrl).call(this, filename, tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_workingBaseUrl, "f")));
// Add fallback only for BASE_CONTENT_URL (for resilience)
if (tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_workingBaseUrl, "f") === constants.BASE_CONTENT_URL) {
urls.push(tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_createResourceUrl).call(this, filename, constants.BASE_CONTENT_URL_FALLBACK));
}
}
else {
// Build fallback chain: try URLs that haven't failed yet
const baseUrlWithPages = this.baseUrl + '/pages';
if (this.baseUrl && !tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_failedUrls, "f").has(baseUrlWithPages)) {
urls.push(tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_createResourceUrl).call(this, filename, baseUrlWithPages));
}
if (!tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_failedUrls, "f").has(constants.BASE_CONTENT_URL)) {
urls.push(tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_createResourceUrl).call(this, filename, constants.BASE_CONTENT_URL));
}
urls.push(tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_createResourceUrl).call(this, filename, constants.BASE_CONTENT_URL_FALLBACK));
}
return urls.length === 1 ? urls[0] : urls;
},
_StaticResourcesMixinClass_createResourceUrl = function _StaticResourcesMixinClass_createResourceUrl(filename, baseUrl) {
return getResourceUrl({
projectId: this.projectId,
filename,
baseUrl,
});
},
_a;
});
exports.getResourceUrl = getResourceUrl;
exports.staticResourcesMixin = staticResourcesMixin;
//# sourceMappingURL=staticResourcesMixin.js.map