Add native self-hosted instance connection to fluxer_desktop
Trimmed monorepo checkout (fluxer_desktop + packages/voice_engine_v2 + tools/ci) with a "Connect to a Different Server" menu item and popout that lets the desktop app switch to any self-hosted Fluxer instance, plus fixes for well-known discovery on single-domain self-hosted deployments and a false-positive ERR_ABORTED on same-origin client redirects during the switch. Defaults to chat.fluxr.chat and uses an isolated userData directory from the official build.
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import webauthn from '../index.js';
|
||||
|
||||
test('loader resolves supported native filenames', () => {
|
||||
assert.equal(webauthn._private.nativeFileName('darwin', 'x64'), 'webauthn.darwin-x64.node');
|
||||
assert.equal(webauthn._private.nativeFileName('darwin', 'arm64'), 'webauthn.darwin-arm64.node');
|
||||
assert.equal(webauthn._private.nativeFileName('linux', 'x64'), 'webauthn.linux-x64-gnu.node');
|
||||
assert.equal(webauthn._private.nativeFileName('linux', 'arm64'), 'webauthn.linux-arm64-gnu.node');
|
||||
assert.equal(webauthn._private.nativeFileName('win32', 'x64'), 'webauthn.win32-x64-msvc.node');
|
||||
assert.equal(webauthn._private.nativeFileName('win32', 'arm64'), 'webauthn.win32-arm64-msvc.node');
|
||||
assert.equal(webauthn._private.nativeFileName('freebsd', 'x64'), null);
|
||||
});
|
||||
|
||||
test('loader exposes the Fluxer WebAuthn surface', async () => {
|
||||
assert.equal(typeof webauthn.create, 'function');
|
||||
assert.equal(typeof webauthn.get, 'function');
|
||||
assert.equal(typeof webauthn.getBackendInfo, 'function');
|
||||
assert.equal(typeof webauthn.isSupported, 'function');
|
||||
const info = webauthn.getBackendInfo();
|
||||
const supported = await webauthn.isSupported();
|
||||
assert.equal(typeof supported, 'boolean');
|
||||
assert.equal(supported, info.supported);
|
||||
assert.equal(typeof info, 'object');
|
||||
assert.equal(typeof info.target, 'string');
|
||||
assert.equal(typeof info.backend, 'string');
|
||||
assert.equal(typeof info.supported, 'boolean');
|
||||
assert.equal(typeof info.ceremoniesImplemented, 'boolean');
|
||||
});
|
||||
|
||||
test('normalization creates spec-shaped client data and Windows transport bits', () => {
|
||||
const challenge = Buffer.from([1, 2, 3, 4]);
|
||||
const normalized = webauthn._private.normalizeCreateOptions({
|
||||
origin: 'https://web.canary.fluxer.app/channels/@me',
|
||||
challenge,
|
||||
rp: {id: 'fluxer.app', name: 'Fluxer'},
|
||||
user: {id: Buffer.from('user'), name: 'name', displayName: 'Name'},
|
||||
pubKeyCredParams: [{type: 'public-key', alg: -7}],
|
||||
authenticatorSelection: {
|
||||
authenticatorAttachment: 'platform',
|
||||
residentKey: 'preferred',
|
||||
userVerification: 'required',
|
||||
},
|
||||
excludeCredentials: [{type: 'public-key', id: Buffer.from('cred'), transports: ['internal', 'hybrid']}],
|
||||
attestation: 'none',
|
||||
});
|
||||
assert.equal(normalized.rpId, 'fluxer.app');
|
||||
assert.equal(normalized.authenticatorAttachment, 1);
|
||||
assert.equal(normalized.userVerification, 1);
|
||||
assert.equal(normalized.preferResidentKey, true);
|
||||
assert.equal(normalized.requireResidentKey, false);
|
||||
assert.equal(normalized.excludeCredentials[0].transports, 0x10 | 0x20);
|
||||
assert.deepEqual(JSON.parse(normalized.clientDataJSON.toString('utf8')), {
|
||||
type: 'webauthn.create',
|
||||
challenge: 'AQIDBA',
|
||||
origin: 'https://web.canary.fluxer.app',
|
||||
crossOrigin: false,
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user