@soulcraft/sdk 3.0.1 → 3.0.2
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.
|
@@ -69,11 +69,22 @@ export interface NamespaceWsHandlerConfig {
|
|
|
69
69
|
/**
|
|
70
70
|
* Shared router config — `authenticate`, `resolveBrain`, `providers`, `authorize`.
|
|
71
71
|
*
|
|
72
|
-
* The `authenticate` callback
|
|
73
|
-
*
|
|
74
|
-
*
|
|
72
|
+
* The `authenticate` callback is used as a fallback when no `wsTokenSecret` is
|
|
73
|
+
* provided. When `wsTokenSecret` IS provided, authentication uses the capability
|
|
74
|
+
* token from the `?token=` query param instead of cookies.
|
|
75
75
|
*/
|
|
76
76
|
router: NamespaceRouterConfig;
|
|
77
|
+
/**
|
|
78
|
+
* HMAC secret for verifying WebSocket capability tokens.
|
|
79
|
+
*
|
|
80
|
+
* When set, `handleUpgrade()` verifies the `?token=` query param using
|
|
81
|
+
* `verifyCapabilityToken()` instead of calling `routerConfig.authenticate()`.
|
|
82
|
+
* This is the recommended auth method — token-based auth avoids cookie
|
|
83
|
+
* forwarding issues in SvelteKit and other frameworks.
|
|
84
|
+
*
|
|
85
|
+
* Must match the secret used by the `/api/ws-token` endpoint at mint time.
|
|
86
|
+
*/
|
|
87
|
+
wsTokenSecret?: string;
|
|
77
88
|
/**
|
|
78
89
|
* Optional Y.js document manager for real-time collaborative editing.
|
|
79
90
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../../src/server/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,KAAK,EACV,qBAAqB,EAErB,WAAW,EAEZ,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../../src/server/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,KAAK,EACV,qBAAqB,EAErB,WAAW,EAEZ,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAO/D;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,MAAM,EAAE,qBAAqB,CAAA;IAE7B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAMD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,sCAAsC;IACtC,IAAI,EAAE,WAAW,CAAA;IACjB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAA;IACnB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;;;;;;;OASG;IACH,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5D;AAMD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;OAQG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;IAE1D;;;;;;;;;OASG;IACH,aAAa,CACX,OAAO,EAAE,SAAS,EAClB,IAAI,EAAE,WAAW,GAAG,UAAU,EAC9B,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;;;OAOG;IACH,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9C;;;;;OAKG;IACH,eAAe,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAA;CACjF;AAiCD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,CAoK7F"}
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
import { encode, decode } from '@msgpack/msgpack';
|
|
59
59
|
import { createNamespaceRouter } from './namespace-router.js';
|
|
60
60
|
import { YDocManager } from '../modules/brainy/ydoc-manager.js';
|
|
61
|
+
import { verifyCapabilityToken } from '../modules/brainy/auth.js';
|
|
61
62
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
62
63
|
// Factory
|
|
63
64
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -69,7 +70,7 @@ import { YDocManager } from '../modules/brainy/ydoc-manager.js';
|
|
|
69
70
|
* @returns A {@link NamespaceWsHandler} instance.
|
|
70
71
|
*/
|
|
71
72
|
export function createNamespaceWsHandler(config) {
|
|
72
|
-
const { router: routerConfig, ydocManager } = config;
|
|
73
|
+
const { router: routerConfig, wsTokenSecret, ydocManager } = config;
|
|
73
74
|
const router = createNamespaceRouter(routerConfig);
|
|
74
75
|
return {
|
|
75
76
|
async handleUpgrade(request) {
|
|
@@ -84,25 +85,52 @@ export function createNamespaceWsHandler(config) {
|
|
|
84
85
|
const workspaceId = request.headers.get('x-workspace-id') ??
|
|
85
86
|
url.searchParams.get('workspaceId') ??
|
|
86
87
|
scope;
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
88
|
+
// ── Authenticate ──────────────────────────────────────────────────
|
|
89
|
+
let user = null;
|
|
90
|
+
if (wsTokenSecret && token) {
|
|
91
|
+
// Token-based auth (recommended) — verify the capability token directly.
|
|
92
|
+
// The token encodes the user's emailHash and scope, signed with HMAC-SHA256.
|
|
93
|
+
// This avoids cookie-forwarding issues with SvelteKit and other frameworks.
|
|
94
|
+
try {
|
|
95
|
+
const claims = await verifyCapabilityToken(token, wsTokenSecret);
|
|
96
|
+
if (!claims) {
|
|
97
|
+
console.error('[SDK/ws] Token verification failed (invalid signature or expired)');
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
// Validate that the URL scope matches the token's scope
|
|
101
|
+
if (scope && claims.scope !== scope) {
|
|
102
|
+
console.error(`[SDK/ws] Scope mismatch: URL=${scope} token=${claims.scope}`);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
// Build a minimal UserContext from the token claims.
|
|
106
|
+
// The token only contains emailHash — that's enough for resolveBrain.
|
|
107
|
+
user = {
|
|
108
|
+
id: claims.email, // emailHash (token field is named 'email')
|
|
109
|
+
email: claims.email,
|
|
110
|
+
name: 'ws-user',
|
|
111
|
+
emailHash: claims.email,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error('[SDK/ws] Token verification threw:', err);
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
97
118
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
119
|
+
else {
|
|
120
|
+
// Cookie-based auth (fallback) — delegates to routerConfig.authenticate.
|
|
121
|
+
const ctx = { request, user: null, workspaceId };
|
|
122
|
+
try {
|
|
123
|
+
user = await routerConfig.authenticate(ctx);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
console.error('[SDK/ws] authenticate threw during upgrade:', err);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
101
129
|
}
|
|
102
130
|
if (!user)
|
|
103
131
|
return null;
|
|
104
132
|
// Resolve brain with the authenticated context.
|
|
105
|
-
ctx
|
|
133
|
+
const ctx = { request, user, workspaceId };
|
|
106
134
|
let brain;
|
|
107
135
|
try {
|
|
108
136
|
brain = await routerConfig.resolveBrain(ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-handler.js","sourceRoot":"","sources":["../../src/server/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AASjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"ws-handler.js","sourceRoot":"","sources":["../../src/server/ws-handler.ts"],"names":[],"mappings":"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"}
|