@vasanthcambium/marketplace-auth 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 +84 -0
- package/dist/browser/client.d.ts +3 -0
- package/dist/browser/client.d.ts.map +1 -0
- package/dist/browser/client.js +74 -0
- package/dist/browser/client.js.map +1 -0
- package/dist/browser/index.d.ts +12 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/types.d.ts +19 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/react/AppProvider.d.ts +9 -0
- package/dist/react/AppProvider.d.ts.map +1 -0
- package/dist/react/AppProvider.js +36 -0
- package/dist/react/AppProvider.js.map +1 -0
- package/dist/react/index.d.ts +13 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +12 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useAccount.d.ts +9 -0
- package/dist/react/useAccount.d.ts.map +1 -0
- package/dist/react/useAccount.js +16 -0
- package/dist/react/useAccount.js.map +1 -0
- package/dist/react/useNBI.d.ts +10 -0
- package/dist/react/useNBI.d.ts.map +1 -0
- package/dist/react/useNBI.js +15 -0
- package/dist/react/useNBI.js.map +1 -0
- package/dist/react/useNBIMutation.d.ts +15 -0
- package/dist/react/useNBIMutation.d.ts.map +1 -0
- package/dist/react/useNBIMutation.js +31 -0
- package/dist/react/useNBIMutation.js.map +1 -0
- package/dist/react/useSession.d.ts +8 -0
- package/dist/react/useSession.d.ts.map +1 -0
- package/dist/react/useSession.js +22 -0
- package/dist/react/useSession.js.map +1 -0
- package/dist/server/createApp.d.ts +3 -0
- package/dist/server/createApp.d.ts.map +1 -0
- package/dist/server/createApp.js +201 -0
- package/dist/server/createApp.js.map +1 -0
- package/dist/server/express.d.ts +11 -0
- package/dist/server/express.d.ts.map +1 -0
- package/dist/server/express.js +86 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/hono.d.ts +4 -0
- package/dist/server/hono.d.ts.map +1 -0
- package/dist/server/hono.js +66 -0
- package/dist/server/hono.js.map +1 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +19 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/session.d.ts +15 -0
- package/dist/server/session.d.ts.map +1 -0
- package/dist/server/session.js +20 -0
- package/dist/server/session.js.map +1 -0
- package/dist/server/types.d.ts +60 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/shared/errors.d.ts +33 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +59 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/regions.d.ts +3 -0
- package/dist/shared/regions.d.ts.map +1 -0
- package/dist/shared/regions.js +13 -0
- package/dist/shared/regions.js.map +1 -0
- package/dist/shared/types.d.ts +41 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +7 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { createRemoteJWKSet, jwtVerify, SignJWT } from 'jose';
|
|
2
|
+
import { request as undiciRequest } from 'undici';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { regionToNbiUrl } from '../shared/regions.js';
|
|
5
|
+
import { NonceVerificationError, TokenExchangeError, SessionNotFoundError, UpstreamError, } from '../shared/errors.js';
|
|
6
|
+
import { memorySessionStore, redisSessionStore } from './session.js';
|
|
7
|
+
const DEFAULT_COOKIE_NAME = 'cn_session';
|
|
8
|
+
const DEFAULT_TTL_SECONDS = 28_800;
|
|
9
|
+
export function createApp(config) {
|
|
10
|
+
const ttlSeconds = config.sessionTtlSeconds ?? DEFAULT_TTL_SECONDS;
|
|
11
|
+
const jwksUrl = config.authServicePublicKeyUrl
|
|
12
|
+
?? `${config.authServiceUrl}/.well-known/jwks.json`;
|
|
13
|
+
const sessionStore = resolveSessionStore(config);
|
|
14
|
+
const jwks = createRemoteJWKSet(new URL(jwksUrl));
|
|
15
|
+
const nbiBaseUrl = regionToNbiUrl(config.region);
|
|
16
|
+
const tokenEndpoint = `${config.authServiceUrl.replace(/\/$/, '')}/oauth/token`;
|
|
17
|
+
let readyPromise = null;
|
|
18
|
+
const app = {
|
|
19
|
+
config: Object.freeze({ ...config }),
|
|
20
|
+
async ready() {
|
|
21
|
+
readyPromise ??= (async () => {
|
|
22
|
+
if (!config.devMode) {
|
|
23
|
+
await jwks({ alg: 'RS256', kid: undefined }).catch(() => undefined);
|
|
24
|
+
}
|
|
25
|
+
})();
|
|
26
|
+
return readyPromise;
|
|
27
|
+
},
|
|
28
|
+
async close() { },
|
|
29
|
+
async handleLaunch(launchToken) {
|
|
30
|
+
if (config.devMode) {
|
|
31
|
+
const session = await mintDevSession(app, sessionStore, ttlSeconds);
|
|
32
|
+
return { session, redirectTo: '/' };
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
await jwtVerify(launchToken, jwks, {
|
|
36
|
+
issuer: config.authServiceUrl,
|
|
37
|
+
audience: config.appId,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
throw new NonceVerificationError(err);
|
|
42
|
+
}
|
|
43
|
+
const body = new URLSearchParams({
|
|
44
|
+
grant_type: 'launch_nonce',
|
|
45
|
+
nonce: launchToken,
|
|
46
|
+
client_id: config.appCredentials.clientId,
|
|
47
|
+
client_secret: config.appCredentials.clientSecret,
|
|
48
|
+
});
|
|
49
|
+
const res = await undiciRequest(tokenEndpoint, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
52
|
+
body: body.toString(),
|
|
53
|
+
});
|
|
54
|
+
if (res.statusCode < 200 || res.statusCode >= 300) {
|
|
55
|
+
const errorBody = await res.body.text();
|
|
56
|
+
throw new TokenExchangeError(res.statusCode, errorBody);
|
|
57
|
+
}
|
|
58
|
+
const json = await res.body.json();
|
|
59
|
+
const session = await materializeSession(json, sessionStore);
|
|
60
|
+
return { session, redirectTo: '/' };
|
|
61
|
+
},
|
|
62
|
+
async proxy(req, sessionId) {
|
|
63
|
+
const session = await sessionStore.get(sessionId);
|
|
64
|
+
if (!session)
|
|
65
|
+
throw new SessionNotFoundError();
|
|
66
|
+
await config.hooks?.beforeProxy?.(req, session);
|
|
67
|
+
const upstreamUrl = nbiBaseUrl + req.url;
|
|
68
|
+
const upstreamHeaders = {
|
|
69
|
+
...req.headers,
|
|
70
|
+
'authorization': `Bearer ${session.accessToken}`,
|
|
71
|
+
};
|
|
72
|
+
delete upstreamHeaders['host'];
|
|
73
|
+
delete upstreamHeaders['cookie'];
|
|
74
|
+
delete upstreamHeaders['connection'];
|
|
75
|
+
const buildInit = () => {
|
|
76
|
+
const init = {
|
|
77
|
+
method: req.method,
|
|
78
|
+
headers: upstreamHeaders,
|
|
79
|
+
};
|
|
80
|
+
if (req.body != null)
|
|
81
|
+
init.body = JSON.stringify(req.body);
|
|
82
|
+
return init;
|
|
83
|
+
};
|
|
84
|
+
let res = await undiciRequest(upstreamUrl, buildInit());
|
|
85
|
+
if (res.statusCode === 401) {
|
|
86
|
+
await this.refreshAccessToken(sessionId);
|
|
87
|
+
const refreshed = await sessionStore.get(sessionId);
|
|
88
|
+
if (refreshed) {
|
|
89
|
+
upstreamHeaders['authorization'] = `Bearer ${refreshed.accessToken}`;
|
|
90
|
+
res = await undiciRequest(upstreamUrl, buildInit());
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const respText = await res.body.text();
|
|
94
|
+
let parsed = respText;
|
|
95
|
+
try {
|
|
96
|
+
parsed = respText ? JSON.parse(respText) : undefined;
|
|
97
|
+
}
|
|
98
|
+
catch { /* keep text */ }
|
|
99
|
+
const response = {
|
|
100
|
+
status: res.statusCode,
|
|
101
|
+
headers: Object.fromEntries(Object.entries(res.headers)
|
|
102
|
+
.filter(([k]) => !['transfer-encoding', 'connection'].includes(k))
|
|
103
|
+
.map(([k, v]) => [k, Array.isArray(v) ? v.join(', ') : String(v)])),
|
|
104
|
+
body: parsed,
|
|
105
|
+
};
|
|
106
|
+
await config.hooks?.afterProxy?.(req, response, session);
|
|
107
|
+
if (response.status >= 500) {
|
|
108
|
+
throw new UpstreamError(response.status, `NBI upstream returned ${response.status}`);
|
|
109
|
+
}
|
|
110
|
+
return response;
|
|
111
|
+
},
|
|
112
|
+
async refreshAccessToken(sessionId) {
|
|
113
|
+
const session = await sessionStore.get(sessionId);
|
|
114
|
+
if (!session)
|
|
115
|
+
throw new SessionNotFoundError();
|
|
116
|
+
if (config.devMode)
|
|
117
|
+
return session;
|
|
118
|
+
const body = new URLSearchParams({
|
|
119
|
+
grant_type: 'refresh_token',
|
|
120
|
+
refresh_token: session.jwt ?? '',
|
|
121
|
+
client_id: config.appCredentials.clientId,
|
|
122
|
+
client_secret: config.appCredentials.clientSecret,
|
|
123
|
+
});
|
|
124
|
+
const res = await undiciRequest(tokenEndpoint, {
|
|
125
|
+
method: 'POST',
|
|
126
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
127
|
+
body: body.toString(),
|
|
128
|
+
});
|
|
129
|
+
if (res.statusCode < 200 || res.statusCode >= 300) {
|
|
130
|
+
const errorBody = await res.body.text();
|
|
131
|
+
throw new TokenExchangeError(res.statusCode, errorBody);
|
|
132
|
+
}
|
|
133
|
+
const json = await res.body.json();
|
|
134
|
+
const refreshed = {
|
|
135
|
+
...session,
|
|
136
|
+
jwt: json.jwt ?? session.jwt,
|
|
137
|
+
accessToken: json.access_token,
|
|
138
|
+
expiresAt: Date.now() + json.expires_in * 1000,
|
|
139
|
+
};
|
|
140
|
+
await sessionStore.set(sessionId, refreshed);
|
|
141
|
+
return refreshed;
|
|
142
|
+
},
|
|
143
|
+
async getSession(sessionId) { return sessionStore.get(sessionId); },
|
|
144
|
+
async invalidateSession(sessionId) { await sessionStore.delete(sessionId); },
|
|
145
|
+
};
|
|
146
|
+
return app;
|
|
147
|
+
}
|
|
148
|
+
function resolveSessionStore(config) {
|
|
149
|
+
const v = config.sessionStore ?? 'memory';
|
|
150
|
+
if (v === 'memory')
|
|
151
|
+
return memorySessionStore();
|
|
152
|
+
if (v === 'redis') {
|
|
153
|
+
if (!config.redisUrl)
|
|
154
|
+
throw new Error('sessionStore=redis requires redisUrl');
|
|
155
|
+
return redisSessionStore({ url: config.redisUrl });
|
|
156
|
+
}
|
|
157
|
+
return v;
|
|
158
|
+
}
|
|
159
|
+
async function materializeSession(t, store) {
|
|
160
|
+
const session = {
|
|
161
|
+
id: randomUUID(),
|
|
162
|
+
appId: t.app_id,
|
|
163
|
+
jwt: t.jwt,
|
|
164
|
+
accessToken: t.access_token,
|
|
165
|
+
expiresAt: Date.now() + t.expires_in * 1000,
|
|
166
|
+
accountCid: t.account_cid,
|
|
167
|
+
userRole: t.user_role,
|
|
168
|
+
permission: t.permission,
|
|
169
|
+
scopes: t.scopes,
|
|
170
|
+
apiRoutes: t.api_routes,
|
|
171
|
+
};
|
|
172
|
+
await store.set(session.id, session);
|
|
173
|
+
return session;
|
|
174
|
+
}
|
|
175
|
+
async function mintDevSession(app, store, ttlSeconds) {
|
|
176
|
+
const placeholderJwt = await new SignJWT({ sub: 'dev-user', app_id: app.config.appId })
|
|
177
|
+
.setProtectedHeader({ alg: 'HS256' })
|
|
178
|
+
.setExpirationTime('8h')
|
|
179
|
+
.sign(new TextEncoder().encode('marketplace-auth-dev-only'));
|
|
180
|
+
const session = {
|
|
181
|
+
id: randomUUID(),
|
|
182
|
+
appId: app.config.appId,
|
|
183
|
+
jwt: placeholderJwt,
|
|
184
|
+
accessToken: 'dev-access-token',
|
|
185
|
+
expiresAt: Date.now() + ttlSeconds * 1000,
|
|
186
|
+
accountCid: 'dev-account-001',
|
|
187
|
+
userRole: 'admin',
|
|
188
|
+
permission: 'read-write',
|
|
189
|
+
scopes: {
|
|
190
|
+
tenant: { account_cid: 'dev-account-001', mcids: [] },
|
|
191
|
+
network: {},
|
|
192
|
+
},
|
|
193
|
+
apiRoutes: [
|
|
194
|
+
{ method: 'GET', path: '/api/v2/devices', description: 'dev stub' },
|
|
195
|
+
{ method: 'GET', path: '/api/v2/devices/{device_id}', description: 'dev stub' },
|
|
196
|
+
],
|
|
197
|
+
};
|
|
198
|
+
await store.set(session.id, session);
|
|
199
|
+
return session;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=createApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createApp.js","sourceRoot":"","sources":["../../src/server/createApp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
import type { App } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Express middleware that installs:
|
|
5
|
+
* GET /launch?token=... (token from cnMaestro UI; named param TBD by Rupam's team)
|
|
6
|
+
* ANY /api/*
|
|
7
|
+
* GET /healthz
|
|
8
|
+
* POST /logout
|
|
9
|
+
*/
|
|
10
|
+
export declare function expressMiddleware(app: App): RequestHandler;
|
|
11
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAmC,MAAM,SAAS,CAAC;AAE/E,OAAO,KAAK,EAAE,GAAG,EAAgB,MAAM,YAAY,CAAC;AAIpD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc,CA8E1D"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { parse as parseCookie, serialize as serializeCookie } from 'cookie';
|
|
2
|
+
import { AuthError } from '../shared/errors.js';
|
|
3
|
+
const DEFAULT_COOKIE_NAME = 'cn_session';
|
|
4
|
+
/**
|
|
5
|
+
* Express middleware that installs:
|
|
6
|
+
* GET /launch?token=... (token from cnMaestro UI; named param TBD by Rupam's team)
|
|
7
|
+
* ANY /api/*
|
|
8
|
+
* GET /healthz
|
|
9
|
+
* POST /logout
|
|
10
|
+
*/
|
|
11
|
+
export function expressMiddleware(app) {
|
|
12
|
+
const cookieName = app.config.sessionCookieName ?? DEFAULT_COOKIE_NAME;
|
|
13
|
+
return async (req, res, next) => {
|
|
14
|
+
try {
|
|
15
|
+
if (req.path === '/healthz' && req.method === 'GET') {
|
|
16
|
+
res.json({
|
|
17
|
+
version: '0.1.0-alpha.1',
|
|
18
|
+
appId: app.config.appId,
|
|
19
|
+
region: app.config.region,
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (req.path === '/launch' && req.method === 'GET') {
|
|
24
|
+
// Accept either ?token= or ?nonce= for forward-compat with the
|
|
25
|
+
// exact param name cnMaestro UI ends up using.
|
|
26
|
+
const launchToken = String(req.query.token ?? req.query.nonce ?? '');
|
|
27
|
+
if (!launchToken) {
|
|
28
|
+
res.status(400).json({ error: 'missing launch token' });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const { session, redirectTo } = await app.handleLaunch(launchToken);
|
|
32
|
+
res.setHeader('Set-Cookie', serializeCookie(cookieName, session.id, {
|
|
33
|
+
httpOnly: true,
|
|
34
|
+
secure: process.env.NODE_ENV === 'production',
|
|
35
|
+
sameSite: 'lax',
|
|
36
|
+
path: '/',
|
|
37
|
+
maxAge: app.config.sessionTtlSeconds ?? 28_800,
|
|
38
|
+
}));
|
|
39
|
+
res.redirect(302, redirectTo);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (req.path === '/logout' && req.method === 'POST') {
|
|
43
|
+
const cookies = parseCookie(req.headers.cookie ?? '');
|
|
44
|
+
const sessionId = cookies[cookieName];
|
|
45
|
+
if (sessionId)
|
|
46
|
+
await app.invalidateSession(sessionId);
|
|
47
|
+
res.setHeader('Set-Cookie', serializeCookie(cookieName, '', { path: '/', maxAge: 0 }));
|
|
48
|
+
res.status(204).end();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (req.path.startsWith('/api/')) {
|
|
52
|
+
const cookies = parseCookie(req.headers.cookie ?? '');
|
|
53
|
+
const sessionId = cookies[cookieName];
|
|
54
|
+
if (!sessionId) {
|
|
55
|
+
res.status(401).json({ error: 'no_session' });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const proxyReq = {
|
|
59
|
+
method: req.method,
|
|
60
|
+
url: req.originalUrl,
|
|
61
|
+
headers: Object.fromEntries(Object.entries(req.headers).map(([k, v]) => [k, Array.isArray(v) ? v.join(', ') : String(v ?? '')])),
|
|
62
|
+
body: req.body,
|
|
63
|
+
};
|
|
64
|
+
const proxyRes = await app.proxy(proxyReq, sessionId);
|
|
65
|
+
for (const [k, v] of Object.entries(proxyRes.headers))
|
|
66
|
+
res.setHeader(k, v);
|
|
67
|
+
res.status(proxyRes.status).send(proxyRes.body);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
next();
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (err instanceof AuthError) {
|
|
74
|
+
const status = err.code === 'session_not_found' ? 401 :
|
|
75
|
+
err.code === 'nonce_verification_failed' ? 400 :
|
|
76
|
+
err.code === 'token_exchange_failed' ? 502 :
|
|
77
|
+
500;
|
|
78
|
+
res.status(status).json({ error: err.code, message: err.message });
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
next(err);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/server/hono.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,KAAK,EAAE,GAAG,EAAgB,MAAM,YAAY,CAAC;AAIpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB,CAiE1D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { parse as parseCookie, serialize as serializeCookie } from 'cookie';
|
|
2
|
+
import { AuthError } from '../shared/errors.js';
|
|
3
|
+
const DEFAULT_COOKIE_NAME = 'cn_session';
|
|
4
|
+
export function honoMiddleware(app) {
|
|
5
|
+
const cookieName = app.config.sessionCookieName ?? DEFAULT_COOKIE_NAME;
|
|
6
|
+
return async (c, next) => {
|
|
7
|
+
const url = new URL(c.req.url);
|
|
8
|
+
try {
|
|
9
|
+
if (url.pathname === '/healthz' && c.req.method === 'GET') {
|
|
10
|
+
return c.json({ version: '0.1.0-alpha.1', appId: app.config.appId, region: app.config.region });
|
|
11
|
+
}
|
|
12
|
+
if (url.pathname === '/launch' && c.req.method === 'GET') {
|
|
13
|
+
const launchToken = url.searchParams.get('token') ?? url.searchParams.get('nonce') ?? '';
|
|
14
|
+
if (!launchToken)
|
|
15
|
+
return c.json({ error: 'missing launch token' }, 400);
|
|
16
|
+
const { session, redirectTo } = await app.handleLaunch(launchToken);
|
|
17
|
+
c.header('Set-Cookie', serializeCookie(cookieName, session.id, {
|
|
18
|
+
httpOnly: true, secure: true, sameSite: 'lax', path: '/',
|
|
19
|
+
maxAge: app.config.sessionTtlSeconds ?? 28_800,
|
|
20
|
+
}));
|
|
21
|
+
return c.redirect(redirectTo, 302);
|
|
22
|
+
}
|
|
23
|
+
if (url.pathname === '/logout' && c.req.method === 'POST') {
|
|
24
|
+
const cookies = parseCookie(c.req.header('cookie') ?? '');
|
|
25
|
+
const sessionId = cookies[cookieName];
|
|
26
|
+
if (sessionId)
|
|
27
|
+
await app.invalidateSession(sessionId);
|
|
28
|
+
c.header('Set-Cookie', serializeCookie(cookieName, '', { path: '/', maxAge: 0 }));
|
|
29
|
+
return c.body(null, 204);
|
|
30
|
+
}
|
|
31
|
+
if (url.pathname.startsWith('/api/')) {
|
|
32
|
+
const cookies = parseCookie(c.req.header('cookie') ?? '');
|
|
33
|
+
const sessionId = cookies[cookieName];
|
|
34
|
+
if (!sessionId)
|
|
35
|
+
return c.json({ error: 'no_session' }, 401);
|
|
36
|
+
const body = c.req.method === 'GET' || c.req.method === 'HEAD'
|
|
37
|
+
? undefined
|
|
38
|
+
: await c.req.json().catch(() => undefined);
|
|
39
|
+
const reqHeaders = {};
|
|
40
|
+
c.req.raw.headers.forEach((v, k) => { reqHeaders[k] = v; });
|
|
41
|
+
const proxyReq = {
|
|
42
|
+
method: c.req.method,
|
|
43
|
+
url: url.pathname + url.search,
|
|
44
|
+
headers: reqHeaders,
|
|
45
|
+
body,
|
|
46
|
+
};
|
|
47
|
+
const res = await app.proxy(proxyReq, sessionId);
|
|
48
|
+
for (const [k, v] of Object.entries(res.headers))
|
|
49
|
+
c.header(k, v);
|
|
50
|
+
return c.json(res.body, res.status);
|
|
51
|
+
}
|
|
52
|
+
return next();
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err instanceof AuthError) {
|
|
56
|
+
const status = err.code === 'session_not_found' ? 401 :
|
|
57
|
+
err.code === 'nonce_verification_failed' ? 400 :
|
|
58
|
+
err.code === 'token_exchange_failed' ? 502 :
|
|
59
|
+
500;
|
|
60
|
+
return c.json({ error: err.code, message: err.message }, status);
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=hono.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/server/hono.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEzC,MAAM,UAAU,cAAc,CAAC,GAAQ;IACrC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,mBAAmB,CAAC;IAEvE,OAAO,KAAK,EAAE,CAAU,EAAE,IAAI,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC1D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAClG,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACzD,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACzF,IAAI,CAAC,WAAW;oBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;gBACxE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;gBACpE,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;oBAC7D,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;oBACxD,MAAM,EAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,MAAM;iBACjD,CAAC,CAAC,CAAC;gBACJ,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1D,MAAM,OAAO,GAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBACtC,IAAI,SAAS;oBAAE,MAAM,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBACtD,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3B,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBACtC,IAAI,CAAC,SAAS;oBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;gBAE5D,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM;oBAC5D,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAE9C,MAAM,UAAU,GAA2B,EAAE,CAAC;gBAC9C,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAiB;oBAC7B,MAAM,EAAG,CAAC,CAAC,GAAG,CAAC,MAAM;oBACrB,GAAG,EAAM,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM;oBAClC,OAAO,EAAE,UAAU;oBACnB,IAAI;iBACL,CAAC;gBACF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACjD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;oBAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAa,CAAC,CAAC;YAC7C,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;gBAC7B,MAAM,MAAM,GACV,GAAG,CAAC,IAAI,KAAK,mBAAmB,CAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC/C,GAAG,CAAC,IAAI,KAAK,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBAChD,GAAG,CAAC,IAAI,KAAK,uBAAuB,CAAI,CAAC,CAAC,GAAG,CAAC,CAAC;4BAC/C,GAAG,CAAC;gBACN,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,MAAa,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cmbmwifi/marketplace-auth/server — Node BFF helper.
|
|
3
|
+
*
|
|
4
|
+
* import { createApp, expressMiddleware } from '@cmbmwifi/marketplace-auth/server';
|
|
5
|
+
*
|
|
6
|
+
* Verifies the launch handshake from cnMaestro UI, manages the session cookie,
|
|
7
|
+
* proxies authenticated NBI calls to the regional NBI-API tier.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: the exact launch handshake (token format, exchange endpoint, claims) is
|
|
10
|
+
* captured in this file as a pluggable contract. Defaults are placeholder —
|
|
11
|
+
* once the cnMaestro UI handoff spec lands, only `verifyLaunchToken` and
|
|
12
|
+
* `exchangeForAccessToken` change. Everything else is contract-stable.
|
|
13
|
+
*/
|
|
14
|
+
export { createApp } from './createApp.js';
|
|
15
|
+
export { expressMiddleware } from './express.js';
|
|
16
|
+
export { honoMiddleware } from './hono.js';
|
|
17
|
+
export { memorySessionStore, redisSessionStore } from './session.js';
|
|
18
|
+
export type { App, AppConfig, AppCredentials, ProxyRequest, ProxyResponse, SessionStore, } from './types.js';
|
|
19
|
+
export type { ApiRoute, Permission, Region, Session, UserRole, } from '../shared/types.js';
|
|
20
|
+
export { AuthError, NonceVerificationError, TokenExchangeError, SessionNotFoundError, UpstreamError, } from '../shared/errors.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,YAAY,EACV,GAAG,EACH,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,QAAQ,EACR,UAAU,EACV,MAAM,EACN,OAAO,EACP,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,GACd,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cmbmwifi/marketplace-auth/server — Node BFF helper.
|
|
3
|
+
*
|
|
4
|
+
* import { createApp, expressMiddleware } from '@cmbmwifi/marketplace-auth/server';
|
|
5
|
+
*
|
|
6
|
+
* Verifies the launch handshake from cnMaestro UI, manages the session cookie,
|
|
7
|
+
* proxies authenticated NBI calls to the regional NBI-API tier.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: the exact launch handshake (token format, exchange endpoint, claims) is
|
|
10
|
+
* captured in this file as a pluggable contract. Defaults are placeholder —
|
|
11
|
+
* once the cnMaestro UI handoff spec lands, only `verifyLaunchToken` and
|
|
12
|
+
* `exchangeForAccessToken` change. Everything else is contract-stable.
|
|
13
|
+
*/
|
|
14
|
+
export { createApp } from './createApp.js';
|
|
15
|
+
export { expressMiddleware } from './express.js';
|
|
16
|
+
export { honoMiddleware } from './hono.js';
|
|
17
|
+
export { memorySessionStore, redisSessionStore } from './session.js';
|
|
18
|
+
export { AuthError, NonceVerificationError, TokenExchangeError, SessionNotFoundError, UpstreamError, } from '../shared/errors.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAoBrE,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,GACd,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SessionStore } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory store. Single-process only. Use for dev or single-task ECS deploys.
|
|
4
|
+
*/
|
|
5
|
+
export declare function memorySessionStore(): SessionStore;
|
|
6
|
+
/**
|
|
7
|
+
* Redis-backed store. Stub. Wire ioredis or redis@4 when first ECS deploy
|
|
8
|
+
* needs auto-scaling beyond a single task.
|
|
9
|
+
*/
|
|
10
|
+
export declare function redisSessionStore(config: {
|
|
11
|
+
url: string;
|
|
12
|
+
keyPrefix?: string;
|
|
13
|
+
ttlSeconds?: number;
|
|
14
|
+
}): SessionStore;
|
|
15
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/server/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAOjD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAKhH"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory store. Single-process only. Use for dev or single-task ECS deploys.
|
|
3
|
+
*/
|
|
4
|
+
export function memorySessionStore() {
|
|
5
|
+
const store = new Map();
|
|
6
|
+
return {
|
|
7
|
+
async get(id) { return store.get(id) ?? null; },
|
|
8
|
+
async set(id, session) { store.set(id, session); },
|
|
9
|
+
async delete(id) { store.delete(id); },
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Redis-backed store. Stub. Wire ioredis or redis@4 when first ECS deploy
|
|
14
|
+
* needs auto-scaling beyond a single task.
|
|
15
|
+
*/
|
|
16
|
+
export function redisSessionStore(config) {
|
|
17
|
+
void config;
|
|
18
|
+
throw new Error('redisSessionStore is not implemented yet. Provide a custom SessionStore via createApp({ sessionStore }).');
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/server/session.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACzC,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,EAAE,IAAgB,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,IAAO,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACrD,KAAK,CAAC,MAAM,CAAC,EAAE,IAAa,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAgE;IAChG,KAAK,MAAM,CAAC;IACZ,MAAM,IAAI,KAAK,CACb,0GAA0G,CAC3G,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Region, Session } from '../shared/types.js';
|
|
2
|
+
export interface AppCredentials {
|
|
3
|
+
clientId: string;
|
|
4
|
+
clientSecret: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SessionStore {
|
|
7
|
+
get(id: string): Promise<Session | null>;
|
|
8
|
+
set(id: string, session: Session): Promise<void>;
|
|
9
|
+
delete(id: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export interface AppConfig {
|
|
12
|
+
appId: string;
|
|
13
|
+
region: Region;
|
|
14
|
+
/** Auth Service base URL (or whatever the cnMaestro UI handoff endpoint is). */
|
|
15
|
+
authServiceUrl: string;
|
|
16
|
+
/** JWKS URL for verifying the launch token signature. */
|
|
17
|
+
authServicePublicKeyUrl?: string;
|
|
18
|
+
/** App credentials (client_id + client_secret), kept server-side only. */
|
|
19
|
+
appCredentials: AppCredentials;
|
|
20
|
+
sessionStore?: 'memory' | 'redis' | SessionStore;
|
|
21
|
+
redisUrl?: string;
|
|
22
|
+
sessionCookieName?: string;
|
|
23
|
+
sessionTtlSeconds?: number;
|
|
24
|
+
/** When true, skip the real launch handshake and mint a local dev JWT. */
|
|
25
|
+
devMode?: boolean;
|
|
26
|
+
hooks?: {
|
|
27
|
+
beforeProxy?: (req: ProxyRequest, session: Session) => Promise<void>;
|
|
28
|
+
afterProxy?: (req: ProxyRequest, res: ProxyResponse, session: Session) => Promise<void>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface ProxyRequest {
|
|
32
|
+
method: string;
|
|
33
|
+
url: string;
|
|
34
|
+
headers: Record<string, string>;
|
|
35
|
+
body?: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface ProxyResponse {
|
|
38
|
+
status: number;
|
|
39
|
+
headers: Record<string, string>;
|
|
40
|
+
body?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface App {
|
|
43
|
+
ready(): Promise<void>;
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Handle a launch from cnMaestro UI. The launchToken is whatever the UI hands
|
|
47
|
+
* to your BFF (kept generic so a different handshake can plug in without
|
|
48
|
+
* changing call sites).
|
|
49
|
+
*/
|
|
50
|
+
handleLaunch(launchToken: string): Promise<{
|
|
51
|
+
session: Session;
|
|
52
|
+
redirectTo: string;
|
|
53
|
+
}>;
|
|
54
|
+
proxy(req: ProxyRequest, sessionId: string): Promise<ProxyResponse>;
|
|
55
|
+
refreshAccessToken(sessionId: string): Promise<Session>;
|
|
56
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
57
|
+
invalidateSession(sessionId: string): Promise<void>;
|
|
58
|
+
readonly config: Readonly<AppConfig>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,0EAA0E;IAC1E,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACrE,UAAU,CAAC,EAAG,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1F,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,GAAG;IAClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;OAIG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAErF,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACpE,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACvD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes shared across server, browser, and React subpaths.
|
|
3
|
+
* Branded so consumers can `instanceof`-check across module boundaries.
|
|
4
|
+
*/
|
|
5
|
+
export declare class AuthError extends Error {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
readonly cause?: unknown | undefined;
|
|
8
|
+
constructor(message: string, code: string, cause?: unknown | undefined);
|
|
9
|
+
}
|
|
10
|
+
export declare class NonceVerificationError extends AuthError {
|
|
11
|
+
constructor(cause?: unknown);
|
|
12
|
+
}
|
|
13
|
+
export declare class TokenExchangeError extends AuthError {
|
|
14
|
+
readonly status: number;
|
|
15
|
+
constructor(status: number, body: unknown);
|
|
16
|
+
}
|
|
17
|
+
export declare class SessionNotFoundError extends AuthError {
|
|
18
|
+
constructor();
|
|
19
|
+
}
|
|
20
|
+
export declare class UpstreamError extends AuthError {
|
|
21
|
+
readonly status: number;
|
|
22
|
+
constructor(status: number, message: string);
|
|
23
|
+
}
|
|
24
|
+
export declare class BridgeHttpError extends Error {
|
|
25
|
+
readonly status: number;
|
|
26
|
+
readonly statusText: string;
|
|
27
|
+
readonly body: unknown;
|
|
28
|
+
constructor(status: number, statusText: string, body: unknown);
|
|
29
|
+
}
|
|
30
|
+
export declare class SessionExpiredError extends Error {
|
|
31
|
+
constructor();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,SAAU,SAAQ,KAAK;aACW,IAAI,EAAE,MAAM;aAAkB,KAAK,CAAC,EAAE,OAAO;gBAA9E,OAAO,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,OAAO,YAAA;CAI3F;AAID,qBAAa,sBAAuB,SAAQ,SAAS;gBACvC,KAAK,CAAC,EAAE,OAAO;CAG5B;AAED,qBAAa,kBAAmB,SAAQ,SAAS;aACnB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAG1D;AAED,qBAAa,oBAAqB,SAAQ,SAAS;;CAIlD;AAED,qBAAa,aAAc,SAAQ,SAAS;aACd,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAG5D;AAID,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,OAAO;gBAFb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO;CAKhC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C"}
|