@kraki/head 0.1.0 → 0.2.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 +84 -0
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +6 -14
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +19 -49
- package/dist/server.js +405 -438
- package/dist/server.js.map +1 -1
- package/dist/storage.d.ts +4 -86
- package/dist/storage.js +26 -303
- package/dist/storage.js.map +1 -1
- package/package.json +11 -2
- package/dist/channel-manager.d.ts +0 -97
- package/dist/channel-manager.js +0 -215
- package/dist/channel-manager.js.map +0 -1
- package/dist/router.d.ts +0 -30
- package/dist/router.js +0 -217
- package/dist/router.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://github.com/corelli18512/kraki">
|
|
3
|
+
<img src="https://raw.githubusercontent.com/corelli18512/kraki/main/logo.png" alt="Kraki" width="140">
|
|
4
|
+
</a>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://github.com/corelli18512/kraki">GitHub repository</a>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
# @kraki/head
|
|
12
|
+
|
|
13
|
+
Thin encrypted relay that forwards messages between tentacles and apps.
|
|
14
|
+
|
|
15
|
+
> Preview: `@kraki/head` is still early-stage. Expect breaking changes while the hosted and self-hosted flows stabilize.
|
|
16
|
+
|
|
17
|
+
Use `@kraki/head` when you want to self-host the Kraki relay instead of using the hosted default.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
Run it once with `npx`:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx @kraki/head
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or install it globally:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm i -g @kraki/head
|
|
31
|
+
kraki-relay
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Quick start
|
|
35
|
+
|
|
36
|
+
Start a local relay:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx @kraki/head
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
By default the relay listens on `ws://localhost:4000` and stores user/device data in `kraki-head.db`.
|
|
43
|
+
|
|
44
|
+
Enable GitHub login for the web app:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
GITHUB_CLIENT_ID=your_client_id \
|
|
48
|
+
GITHUB_CLIENT_SECRET=your_client_secret \
|
|
49
|
+
npx @kraki/head --auth github
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## What the relay does
|
|
53
|
+
|
|
54
|
+
The relay has three jobs:
|
|
55
|
+
|
|
56
|
+
1. **Authenticate** — verify device identity on connect
|
|
57
|
+
2. **Forward blobs** — route unicast and broadcast envelopes to the right WebSocket connections
|
|
58
|
+
3. **Track identity** — maintain users and devices tables
|
|
59
|
+
|
|
60
|
+
It stores no messages, no sessions, and no content. All message bodies are encrypted blobs that the relay cannot read.
|
|
61
|
+
|
|
62
|
+
## Useful options
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
kraki-relay --port 8080
|
|
66
|
+
kraki-relay --db /path/to/kraki-head.db
|
|
67
|
+
kraki-relay --auth open
|
|
68
|
+
kraki-relay --auth github
|
|
69
|
+
kraki-relay --log debug
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Auth methods
|
|
73
|
+
|
|
74
|
+
The relay supports multiple authentication methods as a discriminated union: `github_token`, `github_oauth`, `pairing`, `challenge`, `apikey`, and `open`.
|
|
75
|
+
|
|
76
|
+
## Package naming
|
|
77
|
+
|
|
78
|
+
- `@kraki/head` installs the `kraki-relay` CLI
|
|
79
|
+
- `@kraki/tentacle` installs the `kraki` CLI
|
|
80
|
+
|
|
81
|
+
## Links
|
|
82
|
+
|
|
83
|
+
- Main docs: `https://github.com/corelli18512/kraki/blob/main/README.md`
|
|
84
|
+
- Security model: `https://github.com/corelli18512/kraki/blob/main/SECURITY.md`
|
package/dist/cli.d.ts
CHANGED
|
@@ -5,13 +5,11 @@
|
|
|
5
5
|
* Usage:
|
|
6
6
|
* npx @kraki/head
|
|
7
7
|
* npx @kraki/head --port 8080
|
|
8
|
-
* npx @kraki/head --auth github --e2e true
|
|
9
8
|
*
|
|
10
9
|
* Environment variables:
|
|
11
10
|
* PORT Server port (default: 4000)
|
|
12
11
|
* DB_PATH SQLite database path (default: kraki-head.db)
|
|
13
12
|
* AUTH_MODE Auth mode: open | github | apikey (default: open)
|
|
14
|
-
* E2E_MODE Enable E2E encryption: true | false (default: false)
|
|
15
13
|
* API_KEY API key for apikey auth mode
|
|
16
14
|
* GITHUB_CLIENT_ID GitHub OAuth App client ID (for web login)
|
|
17
15
|
* GITHUB_CLIENT_SECRET GitHub OAuth App client secret (for web login)
|
package/dist/cli.js
CHANGED
|
@@ -5,13 +5,11 @@
|
|
|
5
5
|
* Usage:
|
|
6
6
|
* npx @kraki/head
|
|
7
7
|
* npx @kraki/head --port 8080
|
|
8
|
-
* npx @kraki/head --auth github --e2e true
|
|
9
8
|
*
|
|
10
9
|
* Environment variables:
|
|
11
10
|
* PORT Server port (default: 4000)
|
|
12
11
|
* DB_PATH SQLite database path (default: kraki-head.db)
|
|
13
12
|
* AUTH_MODE Auth mode: open | github | apikey (default: open)
|
|
14
|
-
* E2E_MODE Enable E2E encryption: true | false (default: false)
|
|
15
13
|
* API_KEY API key for apikey auth mode
|
|
16
14
|
* GITHUB_CLIENT_ID GitHub OAuth App client ID (for web login)
|
|
17
15
|
* GITHUB_CLIENT_SECRET GitHub OAuth App client secret (for web login)
|
|
@@ -19,24 +17,24 @@
|
|
|
19
17
|
* LOG_PATH Log file path (optional)
|
|
20
18
|
*/
|
|
21
19
|
import { config as dotenvConfig } from 'dotenv';
|
|
20
|
+
import { readFileSync } from 'fs';
|
|
22
21
|
import { resolve, dirname } from 'path';
|
|
23
22
|
import { fileURLToPath } from 'url';
|
|
24
23
|
// Load .env from the head package directory (works regardless of cwd)
|
|
25
24
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
26
25
|
dotenvConfig({ path: resolve(__dirname, '..', '.env') });
|
|
26
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf-8'));
|
|
27
|
+
const VERSION = pkg.version;
|
|
27
28
|
import { createServer } from 'http';
|
|
28
29
|
import { Storage } from './storage.js';
|
|
29
|
-
import { ChannelManager } from './channel-manager.js';
|
|
30
|
-
import { Router } from './router.js';
|
|
31
30
|
import { HeadServer } from './server.js';
|
|
32
31
|
import { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
|
|
33
32
|
import { Logger, setGlobalLogger } from './logger.js';
|
|
34
|
-
const VERSION = '0.1.0';
|
|
35
33
|
// --- CLI flags ---
|
|
36
34
|
const args = process.argv.slice(2);
|
|
37
35
|
if (args.includes('--help') || args.includes('-h')) {
|
|
38
36
|
console.log(`
|
|
39
|
-
🦑 @kraki/head v${VERSION}
|
|
37
|
+
🦑 @kraki/head v${VERSION} — CLI entry point for the Kraki relay server.
|
|
40
38
|
|
|
41
39
|
Usage: kraki-relay [options]
|
|
42
40
|
|
|
@@ -44,7 +42,6 @@ if (args.includes('--help') || args.includes('-h')) {
|
|
|
44
42
|
--port <n> Server port (default: 4000, env: PORT)
|
|
45
43
|
--db <path> SQLite database path (default: kraki-head.db, env: DB_PATH)
|
|
46
44
|
--auth <mode> Auth mode: open | github | apikey (default: open, env: AUTH_MODE)
|
|
47
|
-
--e2e <bool> Enable E2E encryption (default: false, env: E2E_MODE)
|
|
48
45
|
--log <level> Log level: debug | info | warn | error (default: info)
|
|
49
46
|
--help, -h Show this help
|
|
50
47
|
--version, -v Show version
|
|
@@ -71,7 +68,6 @@ const AUTH_MODES = flag('auth', process.env.AUTH_MODE || 'open').split(',').map(
|
|
|
71
68
|
const API_KEY = process.env.API_KEY;
|
|
72
69
|
const GITHUB_CLIENT_ID = process.env.GITHUB_CLIENT_ID;
|
|
73
70
|
const GITHUB_CLIENT_SECRET = process.env.GITHUB_CLIENT_SECRET;
|
|
74
|
-
const E2E = flag('e2e', process.env.E2E_MODE || 'false') === 'true';
|
|
75
71
|
const PAIRING = process.env.PAIRING_ENABLED !== 'false'; // default true
|
|
76
72
|
const LOG_LEVEL = flag('log', process.env.LOG_LEVEL || 'info');
|
|
77
73
|
const LOG_PATH = process.env.LOG_PATH;
|
|
@@ -121,13 +117,10 @@ setGlobalLogger(logger);
|
|
|
121
117
|
logger.info('Kraki Head starting...');
|
|
122
118
|
const authProviders = createAuthProviders();
|
|
123
119
|
const storage = new Storage(DB_PATH);
|
|
124
|
-
const
|
|
125
|
-
const router = new Router(cm);
|
|
126
|
-
const head = new HeadServer(cm, router, {
|
|
120
|
+
const head = new HeadServer(storage, {
|
|
127
121
|
authProviders,
|
|
128
|
-
authModes: AUTH_MODES,
|
|
129
|
-
e2e: E2E,
|
|
130
122
|
pairingEnabled: PAIRING,
|
|
123
|
+
version: VERSION,
|
|
131
124
|
});
|
|
132
125
|
const httpServer = createServer((req, res) => {
|
|
133
126
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
@@ -138,7 +131,6 @@ httpServer.listen(PORT, () => {
|
|
|
138
131
|
logger.info(`Kraki Head listening on port ${PORT}`, {
|
|
139
132
|
ws: `ws://localhost:${PORT}`,
|
|
140
133
|
auth: AUTH_MODES.join(', '),
|
|
141
|
-
e2e: E2E,
|
|
142
134
|
pairing: PAIRING,
|
|
143
135
|
db: DB_PATH,
|
|
144
136
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export { Storage } from './storage.js';
|
|
2
|
-
export { ChannelManager } from './channel-manager.js';
|
|
3
|
-
export { Router } from './router.js';
|
|
4
2
|
export { HeadServer } from './server.js';
|
|
5
3
|
export type { HeadServerOptions } from './server.js';
|
|
6
4
|
export { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export { Storage } from './storage.js';
|
|
2
|
-
export { ChannelManager } from './channel-manager.js';
|
|
3
|
-
export { Router } from './router.js';
|
|
4
2
|
export { HeadServer } from './server.js';
|
|
5
3
|
export { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
|
|
6
4
|
export { Logger, getLogger, setGlobalLogger } from './logger.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE5G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,78 +1,48 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
2
|
import type { Server } from 'http';
|
|
3
|
-
import {
|
|
4
|
-
import { Router } from './router.js';
|
|
3
|
+
import { Storage } from './storage.js';
|
|
5
4
|
import type { AuthProvider } from './auth.js';
|
|
6
5
|
export interface HeadServerOptions {
|
|
7
|
-
/** Auth providers keyed by mode name. Falls back to authProvider if set. */
|
|
8
6
|
authProviders?: Map<string, AuthProvider>;
|
|
9
|
-
/** Supported auth mode names (for auth_info response) */
|
|
10
|
-
authModes?: string[];
|
|
11
|
-
/** Legacy single auth provider (used if authProviders not set) */
|
|
12
7
|
authProvider?: AuthProvider;
|
|
13
|
-
/** Enable E2E encryption mode */
|
|
14
|
-
e2e: boolean;
|
|
15
|
-
/** Max WebSocket message size in bytes. Default: 10MB */
|
|
16
8
|
maxPayload?: number;
|
|
17
|
-
/** Ping interval in ms. Default: 30000 (30s). Set 0 to disable. */
|
|
18
|
-
pingInterval?: number;
|
|
19
|
-
/** Pong timeout in ms. Default: 10000 (10s) */
|
|
20
|
-
pongTimeout?: number;
|
|
21
|
-
/** Allow QR pairing for adding devices. Default: true */
|
|
22
9
|
pairingEnabled?: boolean;
|
|
23
|
-
/** Pairing token TTL in seconds. Default: 300 (5 min) */
|
|
24
10
|
pairingTtl?: number;
|
|
11
|
+
version?: string;
|
|
25
12
|
}
|
|
26
13
|
export declare class HeadServer {
|
|
27
14
|
private wss;
|
|
28
|
-
private
|
|
29
|
-
private router;
|
|
15
|
+
private storage;
|
|
30
16
|
private options;
|
|
17
|
+
private static readonly PING_INTERVAL;
|
|
18
|
+
private connections;
|
|
19
|
+
private pairingTokens;
|
|
20
|
+
private userByDevice;
|
|
31
21
|
private clients;
|
|
32
22
|
private pingTimer;
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
private dedupCleanupTimer;
|
|
36
|
-
constructor(cm: ChannelManager, router: Router, options: HeadServerOptions);
|
|
37
|
-
/** Resolve the auth provider (multi-provider or legacy single). */
|
|
23
|
+
constructor(storage: Storage, options: HeadServerOptions);
|
|
24
|
+
private startPingInterval;
|
|
38
25
|
private getAuthProvider;
|
|
39
|
-
/** Get supported auth mode names. */
|
|
40
|
-
private getAuthModes;
|
|
41
|
-
/** Resolve auth provider by mode name (for multi-provider). */
|
|
42
26
|
private getAuthProviderForMode;
|
|
43
|
-
/** Get the GitHub OAuth client ID if configured (for auth_info_response). */
|
|
44
27
|
private getGitHubClientId;
|
|
45
|
-
/** Find the GitHubAuthProvider in the provider chain (unwrapping throttle). */
|
|
46
28
|
private findGitHubProvider;
|
|
47
|
-
/** Resolve the channel owner's user info for auth_ok. */
|
|
48
|
-
private getChannelOwnerUser;
|
|
49
|
-
/**
|
|
50
|
-
* Attach to an HTTP server for upgrade handling.
|
|
51
|
-
*/
|
|
52
29
|
attach(server: Server): void;
|
|
53
|
-
/**
|
|
54
|
-
* Accept a raw WebSocket connection (for testing without HTTP server).
|
|
55
|
-
*/
|
|
56
30
|
acceptConnection(ws: WebSocket): void;
|
|
57
31
|
private onConnection;
|
|
58
32
|
private onMessage;
|
|
59
|
-
private
|
|
60
|
-
private
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* creates a pairing token, responds, and requires no device registration.
|
|
64
|
-
*/
|
|
65
|
-
private handleRequestPairingToken;
|
|
33
|
+
private handleUnicast;
|
|
34
|
+
private handleBroadcast;
|
|
35
|
+
private removeConnection;
|
|
36
|
+
private sendAuthError;
|
|
66
37
|
private handleAuth;
|
|
67
38
|
private handlePairingAuth;
|
|
68
39
|
private handleChallengeResponse;
|
|
40
|
+
private completeAuth;
|
|
41
|
+
private handleCreatePairingToken;
|
|
42
|
+
private handleRequestPairingToken;
|
|
43
|
+
private broadcastDeviceJoined;
|
|
44
|
+
private broadcastDeviceLeft;
|
|
45
|
+
private getDeviceSummaries;
|
|
69
46
|
private sendError;
|
|
70
|
-
private startPingInterval;
|
|
71
|
-
private startDedupCleanup;
|
|
72
|
-
/** Guard against unbounded dedup set growth */
|
|
73
|
-
private trackClientMsgId;
|
|
74
|
-
/**
|
|
75
|
-
* Close the server and all connections.
|
|
76
|
-
*/
|
|
77
47
|
close(): void;
|
|
78
48
|
}
|