@e280/authlocal
Version:
User-sovereign login system for everybody
55 lines • 2.31 kB
JavaScript
import { Kv, StorageDriver } from "@e280/kv";
import { ev, opSignal, signal } from "@benev/slate";
import { Depot } from "./depot/depot.js";
import { Time } from "../../tools/time.js";
import { generateSession } from "../../trust/exports/authority.js";
import { StoragePersistence } from "./storage-persistence.js";
import { setupInPopup } from "../../trust/postmessage/setup-in-popup.js";
export class Manager {
storagePersistence = new StoragePersistence();
purpose = signal({ kind: "manage" });
situationOp = opSignal();
depot = new Depot(new Kv(new StorageDriver(window.localStorage)));
dispose = ev(window, { storage: async () => {
await this.depot.identities.list();
} });
constructor() {
const { purpose } = this;
const isPopup = window.opener && window.opener !== window;
const isDebugLoginMode = location.search.includes("login");
if (isPopup) {
const popupWindow = window;
const appWindow = window.opener;
const { app, helloAndGetAppOrigin } = setupInPopup(popupWindow, appWindow);
helloAndGetAppOrigin().then(appOrigin => {
purpose.value = {
kind: "login",
appOrigin,
onDeny: async () => app.v1.login(null),
onIdentity: async (identity) => {
const session = await generateSession({
identity,
appOrigin,
expiresAt: Time.future.days(7),
authorityOrigin: popupWindow.origin,
});
await app.v1.login(session);
},
};
}).catch(err => {
// TODO we should go to a user-facing error route
console.error(err);
});
}
else if (isDebugLoginMode) {
const appOrigin = window.origin;
purpose.value = {
kind: "login",
appOrigin,
onDeny: async () => console.log("DENIED LOGIN"),
onIdentity: async (identity) => console.log("LOGIN", identity.id),
};
}
}
}
//# sourceMappingURL=manager.js.map