n8n
Version:
n8n Workflow Automation Tool
124 lines • 4.83 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProtectedResourceRegistry = void 0;
const backend_common_1 = require("@n8n/backend-common");
const di_1 = require("@n8n/di");
const ensure_error_1 = require("@n8n/utils/errors/ensure-error");
const trimTrailingSlash = (url) => url.replace(/\/$/, '');
const splitQuery = (pathname) => {
const index = pathname.indexOf('?');
return index === -1 ? [pathname, ''] : [pathname.slice(0, index), pathname.slice(index)];
};
const getResourceUrls = (resource) => resource.getResourceUrls?.() ?? [resource.getResourceUrl()];
let ProtectedResourceRegistry = class ProtectedResourceRegistry {
constructor(logger) {
this.logger = logger;
this.resources = new Map();
this.resolvers = new Set();
}
register(resource) {
this.resources.set(resource.id, resource);
}
registerResolver(resolver) {
this.resolvers.add(resolver);
}
getById(id) {
return this.resources.get(id);
}
async getByResourceUrl(resourceUrl) {
const normalized = trimTrailingSlash(resourceUrl);
for (const resource of this.resources.values()) {
if (getResourceUrls(resource).some((url) => trimTrailingSlash(url) === normalized)) {
return resource;
}
}
for (const resolver of this.resolvers) {
try {
const resource = await resolver.resolveByUrl(normalized);
if (resource)
return resource;
}
catch (error) {
this.logResolverFailure(resolver, error);
}
}
return undefined;
}
async getByResourcePath(pathname) {
const [rawPath, search] = splitQuery(pathname);
const normalized = trimTrailingSlash(rawPath);
for (const resource of this.resources.values()) {
for (const url of getResourceUrls(resource)) {
try {
if (trimTrailingSlash(new URL(url).pathname) === normalized) {
return resource;
}
}
catch {
continue;
}
}
}
for (const resolver of this.resolvers) {
try {
const resource = await resolver.resolveByPath(normalized, search);
if (resource)
return resource;
}
catch (error) {
this.logResolverFailure(resolver, error);
}
}
return undefined;
}
logResolverFailure(resolver, error) {
this.logger.warn(`Protected resource resolver "${resolver.id}" failed to resolve`, {
error: (0, ensure_error_1.ensureError)(error).message,
});
}
getAll() {
return [...this.resources.values()];
}
getDefaultResource() {
for (const resource of this.resources.values()) {
if (resource.isDefault)
return resource;
}
return undefined;
}
getAllAudiences() {
const audiences = new Set();
for (const resource of this.resources.values()) {
for (const audience of resource.getAudiences())
audiences.add(audience);
}
return [...audiences];
}
getAllScopes() {
const scopes = new Set();
for (const resource of this.resources.values()) {
for (const scope of resource.scopes)
scopes.add(scope);
}
for (const resolver of this.resolvers) {
for (const scope of resolver.scopes)
scopes.add(scope);
}
return [...scopes];
}
};
exports.ProtectedResourceRegistry = ProtectedResourceRegistry;
exports.ProtectedResourceRegistry = ProtectedResourceRegistry = __decorate([
(0, di_1.Service)(),
__metadata("design:paramtypes", [backend_common_1.Logger])
], ProtectedResourceRegistry);
//# sourceMappingURL=protected-resource.registry.js.map