feat: Passwordless cross-device authentication

- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
This commit is contained in:
Bernt
2026-07-07 07:11:50 +00:00
parent 4aa984ad74
commit 6989a98d75
61843 changed files with 5491611 additions and 872231 deletions
+5
View File
@@ -0,0 +1,5 @@
import { CallbackFunction } from "./types";
export interface IOptions {
spread: boolean;
}
export default function asCallback<T>(promise: Promise<T>, nodeback: CallbackFunction<T>, options?: IOptions): Promise<T>;
+41
View File
@@ -0,0 +1,41 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("./utils");
function throwLater(e) {
setTimeout(function () {
throw e;
}, 0);
}
function asCallback(promise, nodeback, options) {
if (typeof nodeback === "function") {
promise.then((val) => {
let ret;
if (options !== undefined &&
Object(options).spread &&
Array.isArray(val)) {
ret = utils_1.tryCatch(nodeback).apply(undefined, [null].concat(val));
}
else {
ret =
val === undefined
? utils_1.tryCatch(nodeback)(null)
: utils_1.tryCatch(nodeback)(null, val);
}
if (ret === utils_1.errorObj) {
throwLater(ret.e);
}
}, (cause) => {
if (!cause) {
const newReason = new Error(cause + "");
Object.assign(newReason, { cause });
cause = newReason;
}
const ret = utils_1.tryCatch(nodeback)(cause);
if (ret === utils_1.errorObj) {
throwLater(ret.e);
}
});
}
return promise;
}
exports.default = asCallback;
+1
View File
@@ -0,0 +1 @@
export declare type CallbackFunction<T> = ((err: null, val: T) => void) | ((err: Error) => void);
+2
View File
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
+9
View File
@@ -0,0 +1,9 @@
import { CallbackFunction } from "./types";
export declare const errorObj: {
e: {};
};
declare function tryCatcher<T>(err: Error, val?: T): void | {
e: Error;
};
export declare function tryCatch<T>(fn: CallbackFunction<T>): typeof tryCatcher;
export {};
+23
View File
@@ -0,0 +1,23 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.tryCatch = exports.errorObj = void 0;
//Try catch is not supported in optimizing
//compiler, so it is isolated
exports.errorObj = { e: {} };
let tryCatchTarget;
function tryCatcher(err, val) {
try {
const target = tryCatchTarget;
tryCatchTarget = null;
return target.apply(this, arguments);
}
catch (e) {
exports.errorObj.e = e;
return exports.errorObj;
}
}
function tryCatch(fn) {
tryCatchTarget = fn;
return tryCatcher;
}
exports.tryCatch = tryCatch;