@e280/authlocal
Version:
User-sovereign login system for everybody
46 lines (36 loc) • 843 B
text/typescript
import {defer} from "@e280/stz"
import {Messenger, WindowConduit} from "@e280/renraku"
import {AppFns} from "./app-fns.js"
//
// this facilitates postMessages,
// and is installed on the authority side
//
export function setupInPopup(
popupWindow: Window,
appWindow: WindowProxy,
) {
const conduit = new WindowConduit(
popupWindow,
appWindow,
"*",
() => true,
)
const appOriginDeferred = defer<string>()
conduit.recv.sub((_m, {origin}) => {
conduit.targetOrigin = origin
appOriginDeferred.resolve(origin)
})
const messenger = new Messenger<AppFns>({
conduit,
timeout: Infinity,
})
async function helloAndGetAppOrigin() {
await messenger.remote.v1.hello()
return appOriginDeferred.promise
}
return {
helloAndGetAppOrigin,
app: messenger.remote as AppFns,
dispose: () => conduit.dispose(),
}
}