@ng-supabase/core
Version:
ng-supabase is a component library and helper utilities for integrating Supabase in your angular application.
147 lines • 20.9 kB
JavaScript
// Angular.
import { Injectable, NgZone } from '@angular/core';
// 3rd party.
import { BehaviorSubject, Subject, filter, firstValueFrom, map } from 'rxjs';
import { createClient, } from '@supabase/supabase-js';
// Local.
import { SupabaseConfig } from './supabase-config';
import { LogService } from './logging/log.service';
import * as i0 from "@angular/core";
import * as i1 from "./logging/log.service";
import * as i2 from "./supabase-config";
export class SupabaseService {
get isSignedIn() {
return this.signedIn.value;
}
get isNotSignedIn() {
return !this.signedIn.value;
}
constructor(zone, log, config) {
this.zone = zone;
this.log = log;
this.config = config;
this.authChange = new Subject();
this.initialized = new BehaviorSubject(false);
this.session = new BehaviorSubject(null);
this.user = new BehaviorSubject(null);
this.userDisplayName = new BehaviorSubject('');
this.userSubheading = new BehaviorSubject('');
this.userProfile = new BehaviorSubject(null);
this.userAvatar = new BehaviorSubject(null);
this.signedIn = new BehaviorSubject(false);
this.loading = new BehaviorSubject(true);
this.user.subscribe((user) => this.setUserInformation(user));
this.clientReady = firstValueFrom(this.initialized.pipe(filter(Boolean), map(() => this.client)));
this.config.api.subscribe(() => this.setup());
}
waitForSignedIn() {
return firstValueFrom(this.signedIn.pipe(filter(Boolean), map(() => this.session.value)));
}
refreshUserDisplayInfo() {
return this.setUserInformation(this.user.value);
}
async setUserInformation(user) {
const profileTable = this.config.profile.table;
let displayName = '';
if (user && profileTable) {
this.log.debug(`Retrieving user profile for user ID '${user.id}'`);
const { error, data: profile } = await this.client
.from(profileTable)
.select()
.eq(this.config.profile.userIdField, user.id)
.limit(1)
.single();
if (error) {
this.log.error(`Failed to retrieve user profile. ${error.details}`, error);
}
if (profile) {
const firstName = profile[this.config.profile.firstNameField];
const lastName = profile[this.config.profile.lastNameField];
const avatar = profile[this.config.profile.avatarField];
displayName = `${firstName || ''} ${lastName || ''}`.trim();
this.userProfile.next(profile);
if (avatar) {
this.userAvatar.next(avatar);
}
this.log.debug(`Retrieving display name of '${displayName}' from profile`);
}
else {
this.log.warn(`No profile found for user ID '${user.id}'`);
}
}
displayName = displayName || this.extractDisplay(user);
const subheading = displayName === user?.email
? ''
: user?.user_metadata?.['title'] || user?.email || '';
this.userDisplayName.next(displayName);
this.userSubheading.next(subheading);
}
extractDisplay(user) {
const { first_name, last_name } = user?.user_metadata || {};
const display = `${first_name || ''} ${last_name || ''}`.trim();
return user ? display || user.email || user.id : '';
}
setup() {
if (this.isSignedIn) {
this.setStateForSignedOut();
}
this.createClient();
}
createClient() {
const { url, key } = this.config.api.value;
this.client = createClient(url, key);
this.client.auth.onAuthStateChange((event) => {
this.zone.run(() => {
this.setAuthState(event);
});
});
}
setAuthState(event) {
this.log.info(`Auth state change: '${event}'`);
this.authChange.next(event);
if (event === 'INITIAL_SESSION') {
this.initialized.next(true);
this.loading.next(false);
}
else if (event === 'SIGNED_IN') {
this.signedIn.next(true);
this.tryGetSession();
}
else if (event === 'SIGNED_OUT') {
this.setStateForSignedOut();
}
}
async tryGetSession() {
const { data, error } = await this.client.auth.getSession();
const noSession = !error && !data.session;
if (noSession) {
this.log.error('No session information retrieved');
return;
}
if (error) {
this.log.error(`Failed to get user session`, error);
return;
}
this.session.next(data.session);
if (data.session?.user) {
this.user.next(data.session.user);
}
}
setStateForSignedOut() {
this.session.next(null);
this.signedIn.next(false);
this.user.next(null);
this.userProfile.next(null);
this.userDisplayName.next('');
this.userSubheading.next('');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: SupabaseService, deps: [{ token: i0.NgZone }, { token: i1.LogService }, { token: i2.SupabaseConfig }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: SupabaseService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: SupabaseService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.LogService }, { type: i2.SupabaseConfig }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwYWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3N1cGFiYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVztBQUNYLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELGFBQWE7QUFDYixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RSxPQUFPLEVBR0wsWUFBWSxHQUdiLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsU0FBUztBQUNULE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFLbkQsTUFBTSxPQUFPLGVBQWU7SUFjMUIsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUNtQixJQUFZLEVBQ1osR0FBZSxFQUNmLE1BQXNCO1FBRnRCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUF2QmhDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUM1QyxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2xELFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBaUIsSUFBSSxDQUFDLENBQUM7UUFDcEQsU0FBSSxHQUFHLElBQUksZUFBZSxDQUFjLElBQUksQ0FBQyxDQUFDO1FBQzlDLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUNqRCxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBQ2pELGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDdEQsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQy9DLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQWdCcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFpQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDZixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUN2QixDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLGNBQWMsQ0FDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDZixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixDQUFDLENBQ3pDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQWlCO1FBQ2hELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUMvQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFckIsSUFBSSxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsd0NBQXdDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU07aUJBQy9DLElBQUksQ0FBQyxZQUFZLENBQUM7aUJBQ2xCLE1BQU0sRUFBRTtpQkFDUixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7aUJBQzVDLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ1IsTUFBTSxFQUFFLENBQUM7WUFFWixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG9DQUFvQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQ25ELEtBQXlCLENBQzFCLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RCxXQUFXLEdBQUcsR0FBRyxTQUFTLElBQUksRUFBRSxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRS9CLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLENBQUM7Z0JBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osK0JBQStCLFdBQVcsZ0JBQWdCLENBQzNELENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDO1FBRUQsV0FBVyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUNkLFdBQVcsS0FBSyxJQUFJLEVBQUUsS0FBSztZQUN6QixDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFFMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFpQjtRQUN0QyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLEdBQUcsVUFBVSxJQUFJLEVBQUUsSUFBSSxTQUFTLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRU8sS0FBSztRQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLFlBQVk7UUFDbEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQXNCO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksS0FBSyxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYTtRQUN6QixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTFDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ25ELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OEdBdktVLGVBQWU7a0hBQWYsZUFBZSxjQUZkLE1BQU07OzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhci5cbmltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyAzcmQgcGFydHkuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIGZpbHRlciwgZmlyc3RWYWx1ZUZyb20sIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVXNlcixcbiAgU2Vzc2lvbixcbiAgY3JlYXRlQ2xpZW50LFxuICBTdXBhYmFzZUNsaWVudCxcbiAgQXV0aENoYW5nZUV2ZW50LFxufSBmcm9tICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnO1xuXG4vLyBMb2NhbC5cbmltcG9ydCB7IFN1cGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9zdXBhYmFzZS1jb25maWcnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4vbG9nZ2luZy9sb2cuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTdXBhYmFzZVNlcnZpY2Uge1xuICBjbGllbnQhOiBTdXBhYmFzZUNsaWVudDtcbiAgcmVhZG9ubHkgYXV0aENoYW5nZSA9IG5ldyBTdWJqZWN0PEF1dGhDaGFuZ2VFdmVudD4oKTtcbiAgcmVhZG9ubHkgaW5pdGlhbGl6ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2Vzc2lvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSB1c2VyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVzZXJEaXNwbGF5TmFtZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IHVzZXJTdWJoZWFkaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgdXNlclByb2ZpbGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuICByZWFkb25seSB1c2VyQXZhdGFyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2lnbmVkSW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGNsaWVudFJlYWR5OiBQcm9taXNlPFN1cGFiYXNlQ2xpZW50PjtcblxuICBnZXQgaXNTaWduZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaWduZWRJbi52YWx1ZTtcbiAgfVxuXG4gIGdldCBpc05vdFNpZ25lZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zaWduZWRJbi52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBTdXBhYmFzZUNvbmZpZ1xuICApIHtcbiAgICB0aGlzLnVzZXIuc3Vic2NyaWJlKCh1c2VyOiBVc2VyIHwgbnVsbCkgPT4gdGhpcy5zZXRVc2VySW5mb3JtYXRpb24odXNlcikpO1xuXG4gICAgdGhpcy5jbGllbnRSZWFkeSA9IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5pbml0aWFsaXplZC5waXBlKFxuICAgICAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgICAgIG1hcCgoKSA9PiB0aGlzLmNsaWVudClcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5jb25maWcuYXBpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNldHVwKCkpO1xuICB9XG5cbiAgd2FpdEZvclNpZ25lZEluKCk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuc2lnbmVkSW4ucGlwZShcbiAgICAgICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5zZXNzaW9uLnZhbHVlIGFzIFNlc3Npb24pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHJlZnJlc2hVc2VyRGlzcGxheUluZm8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VXNlckluZm9ybWF0aW9uKHRoaXMudXNlci52YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldFVzZXJJbmZvcm1hdGlvbih1c2VyOiBVc2VyIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb2ZpbGVUYWJsZSA9IHRoaXMuY29uZmlnLnByb2ZpbGUudGFibGU7XG4gICAgbGV0IGRpc3BsYXlOYW1lID0gJyc7XG5cbiAgICBpZiAodXNlciAmJiBwcm9maWxlVGFibGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBSZXRyaWV2aW5nIHVzZXIgcHJvZmlsZSBmb3IgdXNlciBJRCAnJHt1c2VyLmlkfSdgKTtcbiAgICAgIGNvbnN0IHsgZXJyb3IsIGRhdGE6IHByb2ZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50XG4gICAgICAgIC5mcm9tKHByb2ZpbGVUYWJsZSlcbiAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgIC5lcSh0aGlzLmNvbmZpZy5wcm9maWxlLnVzZXJJZEZpZWxkLCB1c2VyLmlkKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnNpbmdsZSgpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byByZXRyaWV2ZSB1c2VyIHByb2ZpbGUuICR7ZXJyb3IuZGV0YWlsc31gLFxuICAgICAgICAgIGVycm9yIGFzIHVua25vd24gYXMgRXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgY29uc3QgZmlyc3ROYW1lID0gcHJvZmlsZVt0aGlzLmNvbmZpZy5wcm9maWxlLmZpcnN0TmFtZUZpZWxkXTtcbiAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBwcm9maWxlW3RoaXMuY29uZmlnLnByb2ZpbGUubGFzdE5hbWVGaWVsZF07XG4gICAgICAgIGNvbnN0IGF2YXRhciA9IHByb2ZpbGVbdGhpcy5jb25maWcucHJvZmlsZS5hdmF0YXJGaWVsZF07XG4gICAgICAgIGRpc3BsYXlOYW1lID0gYCR7Zmlyc3ROYW1lIHx8ICcnfSAke2xhc3ROYW1lIHx8ICcnfWAudHJpbSgpO1xuICAgICAgICB0aGlzLnVzZXJQcm9maWxlLm5leHQocHJvZmlsZSk7XG5cbiAgICAgICAgaWYgKGF2YXRhcikge1xuICAgICAgICAgIHRoaXMudXNlckF2YXRhci5uZXh0KGF2YXRhcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgUmV0cmlldmluZyBkaXNwbGF5IG5hbWUgb2YgJyR7ZGlzcGxheU5hbWV9JyBmcm9tIHByb2ZpbGVgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBObyBwcm9maWxlIGZvdW5kIGZvciB1c2VyIElEICcke3VzZXIuaWR9J2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWUgfHwgdGhpcy5leHRyYWN0RGlzcGxheSh1c2VyKTtcbiAgICBjb25zdCBzdWJoZWFkaW5nID1cbiAgICAgIGRpc3BsYXlOYW1lID09PSB1c2VyPy5lbWFpbFxuICAgICAgICA/ICcnXG4gICAgICAgIDogdXNlcj8udXNlcl9tZXRhZGF0YT8uWyd0aXRsZSddIHx8IHVzZXI/LmVtYWlsIHx8ICcnO1xuXG4gICAgdGhpcy51c2VyRGlzcGxheU5hbWUubmV4dChkaXNwbGF5TmFtZSk7XG4gICAgdGhpcy51c2VyU3ViaGVhZGluZy5uZXh0KHN1YmhlYWRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0RGlzcGxheSh1c2VyOiBVc2VyIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBmaXJzdF9uYW1lLCBsYXN0X25hbWUgfSA9IHVzZXI/LnVzZXJfbWV0YWRhdGEgfHwge307XG4gICAgY29uc3QgZGlzcGxheSA9IGAke2ZpcnN0X25hbWUgfHwgJyd9ICR7bGFzdF9uYW1lIHx8ICcnfWAudHJpbSgpO1xuICAgIHJldHVybiB1c2VyID8gZGlzcGxheSB8fCB1c2VyLmVtYWlsIHx8IHVzZXIuaWQgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTaWduZWRJbikge1xuICAgICAgdGhpcy5zZXRTdGF0ZUZvclNpZ25lZE91dCgpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlQ2xpZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNsaWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IHVybCwga2V5IH0gPSB0aGlzLmNvbmZpZy5hcGkudmFsdWU7XG4gICAgdGhpcy5jbGllbnQgPSBjcmVhdGVDbGllbnQodXJsLCBrZXkpO1xuICAgIHRoaXMuY2xpZW50LmF1dGgub25BdXRoU3RhdGVDaGFuZ2UoKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRBdXRoU3RhdGUoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEF1dGhTdGF0ZShldmVudDogQXV0aENoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5sb2cuaW5mbyhgQXV0aCBzdGF0ZSBjaGFuZ2U6ICcke2V2ZW50fSdgKTtcbiAgICB0aGlzLmF1dGhDaGFuZ2UubmV4dChldmVudCk7XG4gICAgaWYgKGV2ZW50ID09PSAnSU5JVElBTF9TRVNTSU9OJykge1xuICAgICAgdGhpcy5pbml0aWFsaXplZC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkaW5nLm5leHQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdTSUdORURfSU4nKSB7XG4gICAgICB0aGlzLnNpZ25lZEluLm5leHQodHJ1ZSk7XG4gICAgICB0aGlzLnRyeUdldFNlc3Npb24oKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnU0lHTkVEX09VVCcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGVGb3JTaWduZWRPdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeUdldFNlc3Npb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5jbGllbnQuYXV0aC5nZXRTZXNzaW9uKCk7XG4gICAgY29uc3Qgbm9TZXNzaW9uID0gIWVycm9yICYmICFkYXRhLnNlc3Npb247XG5cbiAgICBpZiAobm9TZXNzaW9uKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcignTm8gc2Vzc2lvbiBpbmZvcm1hdGlvbiByZXRyaWV2ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXIgc2Vzc2lvbmAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlc3Npb24ubmV4dChkYXRhLnNlc3Npb24pO1xuXG4gICAgaWYgKGRhdGEuc2Vzc2lvbj8udXNlcikge1xuICAgICAgdGhpcy51c2VyLm5leHQoZGF0YS5zZXNzaW9uLnVzZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhdGVGb3JTaWduZWRPdXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXNzaW9uLm5leHQobnVsbCk7XG4gICAgdGhpcy5zaWduZWRJbi5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXIubmV4dChudWxsKTtcbiAgICB0aGlzLnVzZXJQcm9maWxlLm5leHQobnVsbCk7XG4gICAgdGhpcy51c2VyRGlzcGxheU5hbWUubmV4dCgnJyk7XG4gICAgdGhpcy51c2VyU3ViaGVhZGluZy5uZXh0KCcnKTtcbiAgfVxufVxuIl19