@ganglion/xacpx-relay 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/auth.d.ts +6 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.js +1168 -0
- package/dist/db.d.ts +9 -0
- package/dist/gateway/instance-gateway.d.ts +30 -0
- package/dist/gateway/web-gateway.d.ts +11 -0
- package/dist/http/app.d.ts +33 -0
- package/dist/http/client-ip.d.ts +2 -0
- package/dist/maintenance.d.ts +22 -0
- package/dist/relay-web/assets/BrandLogo.vue_vue_type_script_setup_true_lang-CSPZDDtK.js +1 -0
- package/dist/relay-web/assets/DashboardView-AMivJ-D8.css +1 -0
- package/dist/relay-web/assets/DashboardView-Bhx2FJSv.js +256 -0
- package/dist/relay-web/assets/LoginView-CYhQnBi-.js +1 -0
- package/dist/relay-web/assets/SettingsView-hmSvIsKD.js +6 -0
- package/dist/relay-web/assets/index-DC1zO5jV.css +1 -0
- package/dist/relay-web/assets/index-DE2bTqBl.js +80 -0
- package/dist/relay-web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
- package/dist/relay-web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
- package/dist/relay-web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
- package/dist/relay-web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
- package/dist/relay-web/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
- package/dist/relay-web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
- package/dist/relay-web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
- package/dist/relay-web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
- package/dist/relay-web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
- package/dist/relay-web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
- package/dist/relay-web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
- package/dist/relay-web/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
- package/dist/relay-web/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
- package/dist/relay-web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
- package/dist/relay-web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
- package/dist/relay-web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
- package/dist/relay-web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
- package/dist/relay-web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
- package/dist/relay-web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
- package/dist/relay-web/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
- package/dist/relay-web/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
- package/dist/relay-web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
- package/dist/relay-web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
- package/dist/relay-web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
- package/dist/relay-web/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
- package/dist/relay-web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
- package/dist/relay-web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
- package/dist/relay-web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
- package/dist/relay-web/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
- package/dist/relay-web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
- package/dist/relay-web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- package/dist/relay-web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- package/dist/relay-web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
- package/dist/relay-web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
- package/dist/relay-web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- package/dist/relay-web/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
- package/dist/relay-web/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
- package/dist/relay-web/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
- package/dist/relay-web/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
- package/dist/relay-web/assets/theme-CaepIjgl.js +1 -0
- package/dist/relay-web/index.html +28 -0
- package/dist/server.d.ts +42 -0
- package/dist/stores/accounts.d.ts +74 -0
- package/dist/stores/instances.d.ts +42 -0
- package/dist/stores/messages.d.ts +30 -0
- package/package.json +24 -0
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SqlDriver {
|
|
2
|
+
exec(sql: string): void;
|
|
3
|
+
run(sql: string, params?: ReadonlyArray<string | number | null>): void;
|
|
4
|
+
get<T>(sql: string, params?: ReadonlyArray<string | number | null>): T | undefined;
|
|
5
|
+
all<T>(sql: string, params?: ReadonlyArray<string | number | null>): T[];
|
|
6
|
+
close(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function createSqlDriver(path: string): Promise<SqlDriver>;
|
|
9
|
+
export declare function initSchema(db: SqlDriver): void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type RelayEnvelope } from "@ganglion/xacpx-relay-protocol";
|
|
2
|
+
import type { AccountStore } from "../stores/accounts.js";
|
|
3
|
+
import type { InstanceStore } from "../stores/instances.js";
|
|
4
|
+
/** Single authoritative default for the gateway RPC timeout, shared by the server layer. */
|
|
5
|
+
export declare const DEFAULT_REQUEST_TIMEOUT_MS = 120000;
|
|
6
|
+
export interface GatewaySocket {
|
|
7
|
+
send(data: string): void;
|
|
8
|
+
close(code?: number, reason?: string): void;
|
|
9
|
+
on(event: "message", listener: (data: unknown) => void): unknown;
|
|
10
|
+
on(event: "close", listener: () => void): unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface InstanceGatewayDeps {
|
|
13
|
+
instances: Pick<InstanceStore, "redeemPairingToken" | "registerInstanceForAccount" | "verifyCredential" | "touch">;
|
|
14
|
+
accounts: Pick<AccountStore, "resolveLoginToken">;
|
|
15
|
+
requestTimeoutMs?: number;
|
|
16
|
+
onEvent?: (instanceId: string, accountId: string, envelope: RelayEnvelope) => void;
|
|
17
|
+
onStatusChange?: (instanceId: string, accountId: string, online: boolean) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare class InstanceGateway {
|
|
20
|
+
private readonly deps;
|
|
21
|
+
private readonly connections;
|
|
22
|
+
private readonly pending;
|
|
23
|
+
private seq;
|
|
24
|
+
constructor(deps: InstanceGatewayDeps);
|
|
25
|
+
isOnline(instanceId: string): boolean;
|
|
26
|
+
handleConnection(socket: GatewaySocket): void;
|
|
27
|
+
/** Returns the authed identity, or null (after replying/closing) when the handshake fails. */
|
|
28
|
+
private handleHandshake;
|
|
29
|
+
sendRequest(instanceId: string, type: string, payload: unknown): Promise<unknown>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type WebServerEvent } from "@ganglion/xacpx-relay-protocol";
|
|
2
|
+
export interface WebSocketLike {
|
|
3
|
+
send(data: string): void;
|
|
4
|
+
on(event: "close", listener: () => void): unknown;
|
|
5
|
+
}
|
|
6
|
+
/** Tracks authenticated browser sockets per account and fans events out to them. */
|
|
7
|
+
export declare class WebGateway {
|
|
8
|
+
private readonly byAccount;
|
|
9
|
+
register(accountId: string, socket: WebSocketLike): void;
|
|
10
|
+
broadcast(accountId: string, event: WebServerEvent): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { type LiveTurnSnapshotDto } from "@ganglion/xacpx-relay-protocol";
|
|
3
|
+
import type { AccountRow, AccountStore } from "../stores/accounts.js";
|
|
4
|
+
import type { InstanceStore } from "../stores/instances.js";
|
|
5
|
+
import type { MessageStore } from "../stores/messages.js";
|
|
6
|
+
export interface GatewayForApp {
|
|
7
|
+
isOnline(instanceId: string): boolean;
|
|
8
|
+
sendRequest(instanceId: string, type: string, payload: unknown): Promise<unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface AppDeps {
|
|
11
|
+
accounts: AccountStore;
|
|
12
|
+
instances: InstanceStore;
|
|
13
|
+
gateway: GatewayForApp;
|
|
14
|
+
messages: MessageStore;
|
|
15
|
+
/** Snapshot the in-flight turns for an instance (for the active-turns endpoint). */
|
|
16
|
+
activeTurns?: (instanceId: string) => LiveTurnSnapshotDto[];
|
|
17
|
+
webRoot?: string;
|
|
18
|
+
sessionTtlMs?: number;
|
|
19
|
+
pairingTtlMs?: number;
|
|
20
|
+
historyRetentionDays?: number;
|
|
21
|
+
maxMessagesPerSession?: number;
|
|
22
|
+
trustProxy?: boolean;
|
|
23
|
+
now?: () => Date;
|
|
24
|
+
}
|
|
25
|
+
export declare const LOGIN_MAX_FAILURES = 10;
|
|
26
|
+
export declare const GLOBAL_MAX_FAILURES = 200;
|
|
27
|
+
type Vars = {
|
|
28
|
+
Variables: {
|
|
29
|
+
account: AccountRow;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export declare function createApp(deps: AppDeps): Hono<Vars>;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AccountStore } from "./stores/accounts.js";
|
|
2
|
+
import type { InstanceStore } from "./stores/instances.js";
|
|
3
|
+
import type { MessageStore } from "./stores/messages.js";
|
|
4
|
+
export interface MaintenanceStores {
|
|
5
|
+
accounts: AccountStore;
|
|
6
|
+
instances: InstanceStore;
|
|
7
|
+
messages: MessageStore;
|
|
8
|
+
}
|
|
9
|
+
export interface MaintenanceOptions {
|
|
10
|
+
historyRetentionDays: number;
|
|
11
|
+
maxPerSession: number;
|
|
12
|
+
now?: () => Date;
|
|
13
|
+
}
|
|
14
|
+
export interface MaintenanceSummary {
|
|
15
|
+
messagesDeleted: number;
|
|
16
|
+
sessionsDeleted: number;
|
|
17
|
+
pairingTokensDeleted: number;
|
|
18
|
+
}
|
|
19
|
+
/** Runs one maintenance pass: prune old/excess messages, GC expired sessions/pairing tokens. */
|
|
20
|
+
export declare function runMaintenance(stores: MaintenanceStores, opts: MaintenanceOptions): MaintenanceSummary;
|
|
21
|
+
/** Starts a periodic maintenance loop. Returns a stop function. */
|
|
22
|
+
export declare function startMaintenanceLoop(stores: MaintenanceStores, opts: MaintenanceOptions, intervalMs: number, onError?: (err: unknown) => void): () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as e,o as s,c as a,O as n}from"./index-DE2bTqBl.js";const o={class:"flex items-center gap-2 select-none"},d=e({__name:"BrandLogo",setup(r){return(p,t)=>(s(),a("div",o,[...t[0]||(t[0]=[n('<svg data-test="brand-x" width="22" height="22" viewBox="0 0 24 24" fill="none" aria-hidden="true"><defs><linearGradient id="xacpxBrand" x1="3" y1="3" x2="21" y2="21" gradientUnits="userSpaceOnUse"><stop stop-color="#4F9BF5"></stop><stop offset="1" stop-color="#69D689"></stop></linearGradient></defs><path d="M5 5 L19 19 M19 5 L5 19" stroke="url(#xacpxBrand)" stroke-width="3.2" stroke-linecap="round"></path></svg><span class="text-[15px] font-semibold tracking-tight text-fg">xacpx</span><span class="text-fg-muted text-xs">· relay</span>',3)])]))}});export{d as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.stream-md>:first-child{margin-top:0}.stream-md>:last-child{margin-bottom:0}.stream-md p{margin:.5em 0;line-height:1.5}.stream-md h1,.stream-md h2,.stream-md h3,.stream-md h4{margin:.8em 0 .4em;font-weight:600;line-height:1.3}.stream-md h1{font-size:1.3em}.stream-md h2{font-size:1.2em}.stream-md h3{font-size:1.1em}.stream-md ul,.stream-md ol{margin:.5em 0;padding-left:1.4em}.stream-md ul{list-style:disc}.stream-md ol{list-style:decimal}.stream-md li{margin:.2em 0}.stream-md a{color:rgb(var(--c-accent));text-decoration:underline}.stream-md code{background:rgb(var(--c-surface));color:rgb(var(--c-fg));border-radius:4px;padding:.1em .3em;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}.stream-md pre{background:rgb(var(--c-bg));color:rgb(var(--c-fg));border:1px solid rgb(var(--c-border));border-radius:8px;padding:.65em .85em;overflow-x:auto;margin:.6em 0;box-shadow:var(--shadow-e1)}.stream-md pre::-webkit-scrollbar{height:8px}.stream-md pre::-webkit-scrollbar-thumb{background:rgb(var(--c-fg-muted) / .28);border-radius:8px}.stream-md pre::-webkit-scrollbar-track{background:transparent}.stream-md pre code{background:transparent;padding:0;color:inherit;font-size:13px;line-height:1.6}.stream-md .hljs-keyword,.stream-md .hljs-built_in,.stream-md .hljs-name,.stream-md .hljs-tag{color:rgb(var(--c-accent))}.stream-md .hljs-string,.stream-md .hljs-attr,.stream-md .hljs-symbol{color:rgb(var(--c-run))}.stream-md .hljs-comment,.stream-md .hljs-quote{color:rgb(var(--c-fg-muted))}.stream-md .hljs-number,.stream-md .hljs-literal{color:rgb(var(--c-info))}.stream-md blockquote{border-left:3px solid rgb(var(--c-border));margin:.6em 0;padding-left:.8em;color:rgb(var(--c-fg-muted))}.stream-md .md-table-wrap{max-width:100%;overflow-x:auto;margin:.6em 0}.stream-md .md-table-wrap::-webkit-scrollbar{height:8px}.stream-md .md-table-wrap::-webkit-scrollbar-thumb{background:rgb(var(--c-fg-muted) / .28);border-radius:8px}.stream-md .md-table-wrap::-webkit-scrollbar-track{background:transparent}.stream-md table{border-collapse:collapse}.stream-md img{max-width:100%;height:auto}.stream-md th,.stream-md td{border:1px solid rgb(var(--c-border));padding:.3em .6em}.stream-md hr{border:none;border-top:1px solid rgb(var(--c-border));margin:.8em 0}.cv-row[data-v-b30d2ff4]{content-visibility:auto;contain-intrinsic-size:auto 88px}
|