@endorr/core-sdk 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 +79 -0
- package/dist/client.d.ts +202 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +108 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +45 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/nextjs.d.ts +44 -0
- package/dist/nextjs.d.ts.map +1 -0
- package/dist/nextjs.js +92 -0
- package/dist/nextjs.js.map +1 -0
- package/dist/oauth.d.ts +64 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +122 -0
- package/dist/oauth.js.map +1 -0
- package/dist/react.d.ts +31 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +73 -0
- package/dist/react.js.map +1 -0
- package/dist/types.d.ts +205 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/upload.d.ts +19 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +35 -0
- package/dist/upload.js.map +1 -0
- package/package.json +48 -0
package/dist/nextjs.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { EndorrOAuth, generatePkce, randomState } from './oauth';
|
|
2
|
+
const enc = new TextEncoder();
|
|
3
|
+
async function hmac(secret, data) {
|
|
4
|
+
const key = await crypto.subtle.importKey('raw', enc.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
5
|
+
const sig = new Uint8Array(await crypto.subtle.sign('HMAC', key, enc.encode(data)));
|
|
6
|
+
let s = '';
|
|
7
|
+
for (const b of sig)
|
|
8
|
+
s += String.fromCharCode(b);
|
|
9
|
+
return btoa(s).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
10
|
+
}
|
|
11
|
+
function b64(s) { return btoa(unescape(encodeURIComponent(s))).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); }
|
|
12
|
+
function unb64(s) { return decodeURIComponent(escape(atob(s.replace(/-/g, '+').replace(/_/g, '/')))); }
|
|
13
|
+
async function seal(secret, p) {
|
|
14
|
+
const body = b64(JSON.stringify(p));
|
|
15
|
+
return `${body}.${await hmac(secret, body)}`;
|
|
16
|
+
}
|
|
17
|
+
async function open(secret, value) {
|
|
18
|
+
if (!value)
|
|
19
|
+
return null;
|
|
20
|
+
const [body, sig] = value.split('.');
|
|
21
|
+
if (!body || !sig || (await hmac(secret, body)) !== sig)
|
|
22
|
+
return null;
|
|
23
|
+
const p = JSON.parse(unb64(body));
|
|
24
|
+
if (Date.now() - p.t > 10 * 60_000)
|
|
25
|
+
return null;
|
|
26
|
+
return p;
|
|
27
|
+
}
|
|
28
|
+
function readCookie(req, name) {
|
|
29
|
+
for (const part of (req.headers.get('cookie') ?? '').split(';')) {
|
|
30
|
+
const [k, ...rest] = part.trim().split('=');
|
|
31
|
+
if (k === name)
|
|
32
|
+
return decodeURIComponent(rest.join('='));
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
function cookieAttrs(cfg, maxAge) {
|
|
37
|
+
const secure = cfg.secureCookies ?? cfg.redirectUri.startsWith('https://');
|
|
38
|
+
return `Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAge}${secure ? '; Secure' : ''}`;
|
|
39
|
+
}
|
|
40
|
+
export function createEndorrAuth(cfg) {
|
|
41
|
+
const oauth = new EndorrOAuth(cfg);
|
|
42
|
+
const cookieName = cfg.cookieName ?? '__endorr_login';
|
|
43
|
+
/** GET /auth/endorr/login?return_to=/somewhere&org_id=org_… → redirects to Core. */
|
|
44
|
+
async function login(req) {
|
|
45
|
+
const url = new URL(req.url);
|
|
46
|
+
const { verifier, challenge } = await generatePkce();
|
|
47
|
+
const state = randomState();
|
|
48
|
+
const nonce = randomState();
|
|
49
|
+
const returnTo = url.searchParams.get('return_to') ?? '/';
|
|
50
|
+
const safeReturn = returnTo.startsWith('/') && !returnTo.startsWith('//') ? returnTo : '/';
|
|
51
|
+
const target = oauth.authorizationUrl({
|
|
52
|
+
state, nonce, codeChallenge: challenge,
|
|
53
|
+
orgId: url.searchParams.get('org_id') ?? undefined,
|
|
54
|
+
prompt: url.searchParams.get('prompt') ?? undefined,
|
|
55
|
+
loginHint: url.searchParams.get('login_hint') ?? undefined,
|
|
56
|
+
});
|
|
57
|
+
const cookie = await seal(cfg.cookieSecret, { s: state, v: verifier, n: nonce, r: safeReturn, t: Date.now() });
|
|
58
|
+
return new Response(null, { status: 302, headers: { location: target, 'set-cookie': `${cookieName}=${encodeURIComponent(cookie)}; ${cookieAttrs(cfg, 600)}` } });
|
|
59
|
+
}
|
|
60
|
+
/** GET /auth/endorr/callback → exchanges the code, verifies the ID token, hands over to your session logic. */
|
|
61
|
+
async function callback(req, handlers) {
|
|
62
|
+
const clear = `${cookieName}=; ${cookieAttrs(cfg, 0)}`;
|
|
63
|
+
try {
|
|
64
|
+
const pending = await open(cfg.cookieSecret, readCookie(req, cookieName));
|
|
65
|
+
if (!pending)
|
|
66
|
+
throw new Error('Login attempt expired or missing. Start again.');
|
|
67
|
+
const { code } = oauth.parseCallback(new URL(req.url), pending.s);
|
|
68
|
+
const tokens = await oauth.exchangeCode(code, pending.v);
|
|
69
|
+
if (!tokens.id_token)
|
|
70
|
+
throw new Error('Core did not return an ID token (request the openid scope).');
|
|
71
|
+
const claims = await oauth.verifyIdToken(tokens.id_token, { nonce: pending.n });
|
|
72
|
+
const res = await handlers.onSuccess({ tokens, claims, returnTo: pending.r, request: req });
|
|
73
|
+
res.headers.append('set-cookie', clear);
|
|
74
|
+
return res;
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
78
|
+
const res = handlers.onError ? await handlers.onError(e, req) : new Response(`Login with Endorr failed: ${e.message}`, { status: 400, headers: { 'content-type': 'text/plain' } });
|
|
79
|
+
res.headers.append('set-cookie', clear);
|
|
80
|
+
return res;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { oauth, login, callback };
|
|
84
|
+
}
|
|
85
|
+
/** Route-file sugar: `export const { GET } = endorrLoginHandler(auth)`. */
|
|
86
|
+
export function endorrLoginHandler(auth) {
|
|
87
|
+
return { GET: (req) => auth.login(req) };
|
|
88
|
+
}
|
|
89
|
+
export function endorrCallbackHandler(auth, handlers) {
|
|
90
|
+
return { GET: (req) => auth.callback(req, handlers) };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=nextjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../src/nextjs.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { IdTokenClaims, TokenSet, UserInfo } from './types';
|
|
2
|
+
export interface OAuthConfig {
|
|
3
|
+
/** Core origin, e.g. https://auth.endorr.com. Also the OIDC issuer. */
|
|
4
|
+
issuer: string;
|
|
5
|
+
clientId: string;
|
|
6
|
+
/** Required for confidential clients (every Endorr product). Keep it server-side. */
|
|
7
|
+
clientSecret?: string;
|
|
8
|
+
redirectUri: string;
|
|
9
|
+
/** Default scopes for authorization URLs. */
|
|
10
|
+
scope?: string[];
|
|
11
|
+
fetch?: typeof fetch;
|
|
12
|
+
}
|
|
13
|
+
export declare const DEFAULT_SCOPES: string[];
|
|
14
|
+
/** RFC 7636 verifier + S256 challenge. Works in Node 18+, browsers and Workers (Web Crypto). */
|
|
15
|
+
export declare function generatePkce(): Promise<{
|
|
16
|
+
verifier: string;
|
|
17
|
+
challenge: string;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function randomState(): string;
|
|
20
|
+
export interface AuthorizationUrlOptions {
|
|
21
|
+
state: string;
|
|
22
|
+
codeChallenge: string;
|
|
23
|
+
nonce?: string;
|
|
24
|
+
scope?: string[];
|
|
25
|
+
/** Skip the organisation picker by naming the organisation the user should work in. */
|
|
26
|
+
orgId?: string;
|
|
27
|
+
prompt?: 'none' | 'login' | 'consent' | 'select_account';
|
|
28
|
+
loginHint?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Login with Endorr for confidential clients (Authorization Code + PKCE).
|
|
32
|
+
* All methods are server-side: the client secret and refresh tokens never reach a browser.
|
|
33
|
+
*/
|
|
34
|
+
export declare class EndorrOAuth {
|
|
35
|
+
private readonly cfg;
|
|
36
|
+
private jwks;
|
|
37
|
+
private readonly f;
|
|
38
|
+
readonly issuer: string;
|
|
39
|
+
constructor(cfg: OAuthConfig);
|
|
40
|
+
authorizationUrl(o: AuthorizationUrlOptions): string;
|
|
41
|
+
/** Parse the callback query. Throws EndorrOAuthError when Core reported an error. */
|
|
42
|
+
parseCallback(url: URL | string, expectedState: string): {
|
|
43
|
+
code: string;
|
|
44
|
+
};
|
|
45
|
+
private token;
|
|
46
|
+
exchangeCode(code: string, codeVerifier: string): Promise<TokenSet>;
|
|
47
|
+
/** Rotating refresh: always persist the returned refresh_token and discard the old one. */
|
|
48
|
+
refresh(refreshToken: string, scope?: string[]): Promise<TokenSet>;
|
|
49
|
+
revoke(token: string, hint?: 'access_token' | 'refresh_token'): Promise<void>;
|
|
50
|
+
/** Verify an ID token against the Core JWKS (issuer, audience, signature, expiry, optional nonce). */
|
|
51
|
+
verifyIdToken(idToken: string, opts?: {
|
|
52
|
+
nonce?: string;
|
|
53
|
+
}): Promise<IdTokenClaims>;
|
|
54
|
+
userinfo(accessToken: string): Promise<UserInfo>;
|
|
55
|
+
/** Where to send the user for Core-hosted screens (they come back via `return_to` when it is a registered origin). */
|
|
56
|
+
pages(returnTo?: string): {
|
|
57
|
+
login: string;
|
|
58
|
+
signup: string;
|
|
59
|
+
forgotPassword: string;
|
|
60
|
+
verifyEmail: string;
|
|
61
|
+
docs: string;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGjE,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,eAAO,MAAM,cAAc,UAAiG,CAAC;AAc7H,gGAAgG;AAChG,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAIrF;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,gBAAgB,CAAC;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,WAAW;IAKV,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJhC,OAAO,CAAC,IAAI,CAAsD;IAClE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAe;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEK,GAAG,EAAE,WAAW;IAK7C,gBAAgB,CAAC,CAAC,EAAE,uBAAuB,GAAG,MAAM;IAiBpD,qFAAqF;IACrF,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;YAU3D,KAAK;IAUnB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAInE,2FAA2F;IAC3F,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI5D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF,sGAAsG;IAChG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAOrF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMtD,sHAAsH;IACtH,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM;;;;;;;CAUxB"}
|
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createRemoteJWKSet, jwtVerify } from 'jose';
|
|
2
|
+
import { EndorrOAuthError } from './errors';
|
|
3
|
+
export const DEFAULT_SCOPES = ['openid', 'profile', 'email', 'offline_access', 'organizations', 'files:read', 'files:write'];
|
|
4
|
+
function b64url(bytes) {
|
|
5
|
+
let s = '';
|
|
6
|
+
for (const b of bytes)
|
|
7
|
+
s += String.fromCharCode(b);
|
|
8
|
+
return btoa(s).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
9
|
+
}
|
|
10
|
+
function randomBytes(n) {
|
|
11
|
+
const a = new Uint8Array(n);
|
|
12
|
+
crypto.getRandomValues(a);
|
|
13
|
+
return a;
|
|
14
|
+
}
|
|
15
|
+
/** RFC 7636 verifier + S256 challenge. Works in Node 18+, browsers and Workers (Web Crypto). */
|
|
16
|
+
export async function generatePkce() {
|
|
17
|
+
const verifier = b64url(randomBytes(48));
|
|
18
|
+
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
|
|
19
|
+
return { verifier, challenge: b64url(new Uint8Array(digest)) };
|
|
20
|
+
}
|
|
21
|
+
export function randomState() {
|
|
22
|
+
return b64url(randomBytes(24));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Login with Endorr for confidential clients (Authorization Code + PKCE).
|
|
26
|
+
* All methods are server-side: the client secret and refresh tokens never reach a browser.
|
|
27
|
+
*/
|
|
28
|
+
export class EndorrOAuth {
|
|
29
|
+
cfg;
|
|
30
|
+
jwks = null;
|
|
31
|
+
f;
|
|
32
|
+
issuer;
|
|
33
|
+
constructor(cfg) {
|
|
34
|
+
this.cfg = cfg;
|
|
35
|
+
this.issuer = cfg.issuer.replace(/\/$/, '');
|
|
36
|
+
this.f = cfg.fetch ?? fetch;
|
|
37
|
+
}
|
|
38
|
+
authorizationUrl(o) {
|
|
39
|
+
const u = new URL('/oauth/authorize', this.issuer);
|
|
40
|
+
const p = u.searchParams;
|
|
41
|
+
p.set('response_type', 'code');
|
|
42
|
+
p.set('client_id', this.cfg.clientId);
|
|
43
|
+
p.set('redirect_uri', this.cfg.redirectUri);
|
|
44
|
+
p.set('scope', (o.scope ?? this.cfg.scope ?? DEFAULT_SCOPES).join(' '));
|
|
45
|
+
p.set('state', o.state);
|
|
46
|
+
p.set('code_challenge', o.codeChallenge);
|
|
47
|
+
p.set('code_challenge_method', 'S256');
|
|
48
|
+
if (o.nonce)
|
|
49
|
+
p.set('nonce', o.nonce);
|
|
50
|
+
if (o.orgId)
|
|
51
|
+
p.set('org_id', o.orgId);
|
|
52
|
+
if (o.prompt)
|
|
53
|
+
p.set('prompt', o.prompt);
|
|
54
|
+
if (o.loginHint)
|
|
55
|
+
p.set('login_hint', o.loginHint);
|
|
56
|
+
return u.toString();
|
|
57
|
+
}
|
|
58
|
+
/** Parse the callback query. Throws EndorrOAuthError when Core reported an error. */
|
|
59
|
+
parseCallback(url, expectedState) {
|
|
60
|
+
const u = typeof url === 'string' ? new URL(url) : url;
|
|
61
|
+
const err = u.searchParams.get('error');
|
|
62
|
+
if (err)
|
|
63
|
+
throw new EndorrOAuthError(err, u.searchParams.get('error_description') ?? undefined);
|
|
64
|
+
if (u.searchParams.get('state') !== expectedState)
|
|
65
|
+
throw new EndorrOAuthError('invalid_state', 'The state parameter does not match this login attempt.');
|
|
66
|
+
const code = u.searchParams.get('code');
|
|
67
|
+
if (!code)
|
|
68
|
+
throw new EndorrOAuthError('invalid_request', 'Missing code.');
|
|
69
|
+
return { code };
|
|
70
|
+
}
|
|
71
|
+
async token(form) {
|
|
72
|
+
const headers = { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' };
|
|
73
|
+
if (this.cfg.clientSecret)
|
|
74
|
+
headers.authorization = 'Basic ' + btoa(`${encodeURIComponent(this.cfg.clientId)}:${encodeURIComponent(this.cfg.clientSecret)}`);
|
|
75
|
+
else
|
|
76
|
+
form.client_id = this.cfg.clientId;
|
|
77
|
+
const res = await this.f(`${this.issuer}/oauth/token`, { method: 'POST', headers, body: new URLSearchParams(form).toString() });
|
|
78
|
+
const body = (await res.json().catch(() => ({})));
|
|
79
|
+
if (!res.ok || body.error)
|
|
80
|
+
throw new EndorrOAuthError(body.error ?? 'server_error', body.error_description, res.status);
|
|
81
|
+
return body;
|
|
82
|
+
}
|
|
83
|
+
exchangeCode(code, codeVerifier) {
|
|
84
|
+
return this.token({ grant_type: 'authorization_code', code, redirect_uri: this.cfg.redirectUri, code_verifier: codeVerifier });
|
|
85
|
+
}
|
|
86
|
+
/** Rotating refresh: always persist the returned refresh_token and discard the old one. */
|
|
87
|
+
refresh(refreshToken, scope) {
|
|
88
|
+
return this.token({ grant_type: 'refresh_token', refresh_token: refreshToken, ...(scope ? { scope: scope.join(' ') } : {}) });
|
|
89
|
+
}
|
|
90
|
+
async revoke(token, hint) {
|
|
91
|
+
const headers = { 'content-type': 'application/x-www-form-urlencoded' };
|
|
92
|
+
if (this.cfg.clientSecret)
|
|
93
|
+
headers.authorization = 'Basic ' + btoa(`${encodeURIComponent(this.cfg.clientId)}:${encodeURIComponent(this.cfg.clientSecret)}`);
|
|
94
|
+
await this.f(`${this.issuer}/oauth/revoke`, { method: 'POST', headers, body: new URLSearchParams({ token, ...(hint ? { token_type_hint: hint } : {}), ...(this.cfg.clientSecret ? {} : { client_id: this.cfg.clientId }) }).toString() });
|
|
95
|
+
}
|
|
96
|
+
/** Verify an ID token against the Core JWKS (issuer, audience, signature, expiry, optional nonce). */
|
|
97
|
+
async verifyIdToken(idToken, opts = {}) {
|
|
98
|
+
this.jwks ??= createRemoteJWKSet(new URL(`${this.issuer}/.well-known/jwks.json`));
|
|
99
|
+
const { payload } = await jwtVerify(idToken, this.jwks, { issuer: this.issuer, audience: this.cfg.clientId });
|
|
100
|
+
if (opts.nonce !== undefined && payload.nonce !== opts.nonce)
|
|
101
|
+
throw new EndorrOAuthError('invalid_token', 'nonce mismatch');
|
|
102
|
+
return payload;
|
|
103
|
+
}
|
|
104
|
+
async userinfo(accessToken) {
|
|
105
|
+
const res = await this.f(`${this.issuer}/oauth/userinfo`, { headers: { authorization: `Bearer ${accessToken}` } });
|
|
106
|
+
if (!res.ok)
|
|
107
|
+
throw new EndorrOAuthError('invalid_token', `userinfo answered ${res.status}`, res.status);
|
|
108
|
+
return (await res.json());
|
|
109
|
+
}
|
|
110
|
+
/** Where to send the user for Core-hosted screens (they come back via `return_to` when it is a registered origin). */
|
|
111
|
+
pages(returnTo) {
|
|
112
|
+
const q = returnTo ? `?return_to=${encodeURIComponent(returnTo)}` : '';
|
|
113
|
+
return {
|
|
114
|
+
login: `${this.issuer}/login${q}`,
|
|
115
|
+
signup: `${this.issuer}/signup${q}`,
|
|
116
|
+
forgotPassword: `${this.issuer}/forgot-password`,
|
|
117
|
+
verifyEmail: `${this.issuer}/verify-email${q.replace('return_to', 'next')}`,
|
|
118
|
+
docs: `${this.issuer}/docs`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { EndorrClient, type ClientConfig } from './client';
|
|
3
|
+
import { type UploadOptions } from './upload';
|
|
4
|
+
import type { EndorrFile, Me } from './types';
|
|
5
|
+
export declare function EndorrProvider({ client, config, children }: {
|
|
6
|
+
client?: EndorrClient;
|
|
7
|
+
config?: ClientConfig;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
export declare function useEndorr(): EndorrClient;
|
|
11
|
+
/** Fetch-on-mount helper with a refresh function; use for `client.me.get()`, `client.folders.children(id)`, etc. */
|
|
12
|
+
export declare function useEndorrQuery<T>(fn: (client: EndorrClient) => Promise<T>, deps?: unknown[]): {
|
|
13
|
+
data: T | null;
|
|
14
|
+
error: Error | null;
|
|
15
|
+
loading: boolean;
|
|
16
|
+
refresh: () => Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
export declare function useEndorrMe(): {
|
|
19
|
+
data: Me | null;
|
|
20
|
+
error: Error | null;
|
|
21
|
+
loading: boolean;
|
|
22
|
+
refresh: () => Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
/** Direct-to-storage upload with progress. */
|
|
25
|
+
export declare function useEndorrUpload(): {
|
|
26
|
+
upload: (file: File, opts?: Omit<UploadOptions, "onProgress">) => Promise<EndorrFile | null>;
|
|
27
|
+
progress: number;
|
|
28
|
+
uploading: boolean;
|
|
29
|
+
error: Error | null;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAS9C,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAGjI;AAED,wBAAgB,SAAS,IAAI,YAAY,CAIxC;AAED,oHAAoH;AACpH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,OAAO,EAAO;;;;;EAa/F;AAED,wBAAgB,WAAW;;;;;EAE1B;AAED,8CAA8C;AAC9C,wBAAgB,eAAe;mBAKW,IAAI,SAAQ,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,KAAQ,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;;;;EAYxH"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { EndorrClient } from './client';
|
|
5
|
+
import { uploadFile } from './upload';
|
|
6
|
+
/**
|
|
7
|
+
* React glue for browser code. In the recommended (BFF) setup the browser never holds a Core
|
|
8
|
+
* token: point `baseUrl` at your own `/api/endorr` proxy which adds the Authorization header
|
|
9
|
+
* server-side. Pointing it at Core directly with `accessToken` also works for trusted internal tools.
|
|
10
|
+
*/
|
|
11
|
+
const Ctx = createContext(null);
|
|
12
|
+
export function EndorrProvider({ client, config, children }) {
|
|
13
|
+
const value = useMemo(() => client ?? new EndorrClient(config ?? { baseUrl: '/api/endorr', credentials: 'same-origin' }), [client, config]);
|
|
14
|
+
return _jsx(Ctx.Provider, { value: value, children: children });
|
|
15
|
+
}
|
|
16
|
+
export function useEndorr() {
|
|
17
|
+
const c = useContext(Ctx);
|
|
18
|
+
if (!c)
|
|
19
|
+
throw new Error('useEndorr must be used inside <EndorrProvider>');
|
|
20
|
+
return c;
|
|
21
|
+
}
|
|
22
|
+
/** Fetch-on-mount helper with a refresh function; use for `client.me.get()`, `client.folders.children(id)`, etc. */
|
|
23
|
+
export function useEndorrQuery(fn, deps = []) {
|
|
24
|
+
const client = useEndorr();
|
|
25
|
+
const [data, setData] = useState(null);
|
|
26
|
+
const [error, setError] = useState(null);
|
|
27
|
+
const [loading, setLoading] = useState(true);
|
|
28
|
+
const fnRef = useRef(fn);
|
|
29
|
+
fnRef.current = fn;
|
|
30
|
+
const run = useCallback(async () => {
|
|
31
|
+
setLoading(true);
|
|
32
|
+
setError(null);
|
|
33
|
+
try {
|
|
34
|
+
setData(await fnRef.current(client));
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
setError(e instanceof Error ? e : new Error(String(e)));
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
setLoading(false);
|
|
41
|
+
}
|
|
42
|
+
}, [client]);
|
|
43
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
44
|
+
useEffect(() => { void run(); }, [run, ...deps]);
|
|
45
|
+
return { data, error, loading, refresh: run };
|
|
46
|
+
}
|
|
47
|
+
export function useEndorrMe() {
|
|
48
|
+
return useEndorrQuery((c) => c.me.get());
|
|
49
|
+
}
|
|
50
|
+
/** Direct-to-storage upload with progress. */
|
|
51
|
+
export function useEndorrUpload() {
|
|
52
|
+
const client = useEndorr();
|
|
53
|
+
const [progress, setProgress] = useState(0);
|
|
54
|
+
const [uploading, setUploading] = useState(false);
|
|
55
|
+
const [error, setError] = useState(null);
|
|
56
|
+
const upload = useCallback(async (file, opts = {}) => {
|
|
57
|
+
setUploading(true);
|
|
58
|
+
setError(null);
|
|
59
|
+
setProgress(0);
|
|
60
|
+
try {
|
|
61
|
+
return await uploadFile(client, file, { ...opts, onProgress: setProgress });
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
setError(e instanceof Error ? e : new Error(String(e)));
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
setUploading(false);
|
|
69
|
+
}
|
|
70
|
+
}, [client]);
|
|
71
|
+
return { upload, progress, uploading, error };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
export type OrgRole = 'owner' | 'admin' | 'member';
|
|
2
|
+
export type ResourceRole = 'viewer' | 'editor' | 'manager';
|
|
3
|
+
export type ResourceType = 'folder' | 'file';
|
|
4
|
+
export type PrincipalType = 'organization' | 'team' | 'user';
|
|
5
|
+
export type StorageClass = 'temporary' | 'permanent';
|
|
6
|
+
export interface EndorrUser {
|
|
7
|
+
id: string;
|
|
8
|
+
email: string;
|
|
9
|
+
email_verified: boolean;
|
|
10
|
+
name: string;
|
|
11
|
+
avatar_url: string | null;
|
|
12
|
+
created_at: string;
|
|
13
|
+
}
|
|
14
|
+
export interface OrganizationSummary {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
kind: 'personal' | 'business';
|
|
18
|
+
role: OrgRole;
|
|
19
|
+
slug?: string;
|
|
20
|
+
joined_at?: string;
|
|
21
|
+
selected?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface Me {
|
|
24
|
+
user: EndorrUser;
|
|
25
|
+
organization: OrganizationSummary | null;
|
|
26
|
+
via: 'session' | 'bearer';
|
|
27
|
+
client_id: string | null;
|
|
28
|
+
scope: string[] | null;
|
|
29
|
+
}
|
|
30
|
+
export interface SessionInfo {
|
|
31
|
+
id: string;
|
|
32
|
+
current: boolean;
|
|
33
|
+
ip_address: string | null;
|
|
34
|
+
user_agent: string | null;
|
|
35
|
+
created_at: string;
|
|
36
|
+
last_seen_at: string;
|
|
37
|
+
expires_at: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ConnectedApp {
|
|
40
|
+
client_id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
product_key: string | null;
|
|
43
|
+
homepage_url: string | null;
|
|
44
|
+
scope: string[];
|
|
45
|
+
permissions: {
|
|
46
|
+
scope: string;
|
|
47
|
+
description: string;
|
|
48
|
+
}[];
|
|
49
|
+
granted_at: string;
|
|
50
|
+
last_used_at: string | null;
|
|
51
|
+
organization_id: string | null;
|
|
52
|
+
}
|
|
53
|
+
export interface Member {
|
|
54
|
+
user_id: string;
|
|
55
|
+
name: string;
|
|
56
|
+
email: string;
|
|
57
|
+
email_verified: boolean;
|
|
58
|
+
role: OrgRole;
|
|
59
|
+
joined_at: string;
|
|
60
|
+
you: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface Invite {
|
|
63
|
+
id: string;
|
|
64
|
+
email: string;
|
|
65
|
+
role: OrgRole;
|
|
66
|
+
invited_by?: string | null;
|
|
67
|
+
expires_at: string;
|
|
68
|
+
created_at?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface Team {
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
created_at: string;
|
|
74
|
+
members: {
|
|
75
|
+
user_id: string;
|
|
76
|
+
name: string;
|
|
77
|
+
email: string;
|
|
78
|
+
}[];
|
|
79
|
+
}
|
|
80
|
+
export interface Capabilities {
|
|
81
|
+
can_view: boolean;
|
|
82
|
+
can_edit: boolean;
|
|
83
|
+
can_manage: boolean;
|
|
84
|
+
}
|
|
85
|
+
export interface EndorrFile {
|
|
86
|
+
id: string;
|
|
87
|
+
organization_id: string;
|
|
88
|
+
folder_id: string | null;
|
|
89
|
+
name: string;
|
|
90
|
+
mime_type: string;
|
|
91
|
+
size_bytes: number;
|
|
92
|
+
sha256: string | null;
|
|
93
|
+
storage_class: StorageClass;
|
|
94
|
+
status: 'pending' | 'ready';
|
|
95
|
+
expires_at: string | null;
|
|
96
|
+
created_via: string;
|
|
97
|
+
created_by: string | null;
|
|
98
|
+
created_at: string;
|
|
99
|
+
updated_at: string;
|
|
100
|
+
capabilities: Capabilities;
|
|
101
|
+
created_via_name?: string;
|
|
102
|
+
path?: {
|
|
103
|
+
id: string;
|
|
104
|
+
name: string;
|
|
105
|
+
}[];
|
|
106
|
+
lineage?: {
|
|
107
|
+
derived_from: {
|
|
108
|
+
file_id: string;
|
|
109
|
+
relationship_type: string;
|
|
110
|
+
created_via: string;
|
|
111
|
+
}[];
|
|
112
|
+
derivatives: {
|
|
113
|
+
file_id: string;
|
|
114
|
+
relationship_type: string;
|
|
115
|
+
created_via: string;
|
|
116
|
+
}[];
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export interface EndorrFolder {
|
|
120
|
+
id: string;
|
|
121
|
+
organization_id: string;
|
|
122
|
+
parent_folder_id: string | null;
|
|
123
|
+
name: string;
|
|
124
|
+
created_by: string | null;
|
|
125
|
+
created_at: string;
|
|
126
|
+
updated_at: string;
|
|
127
|
+
capabilities: Capabilities;
|
|
128
|
+
path?: {
|
|
129
|
+
id: string;
|
|
130
|
+
name: string;
|
|
131
|
+
}[];
|
|
132
|
+
}
|
|
133
|
+
export interface UploadTicket {
|
|
134
|
+
file: EndorrFile;
|
|
135
|
+
upload: {
|
|
136
|
+
url: string;
|
|
137
|
+
method: 'PUT';
|
|
138
|
+
headers: Record<string, string>;
|
|
139
|
+
expires_at: string;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export interface DownloadTicket {
|
|
143
|
+
url: string;
|
|
144
|
+
expires_at: string;
|
|
145
|
+
file: EndorrFile;
|
|
146
|
+
}
|
|
147
|
+
export interface Grant {
|
|
148
|
+
id: string;
|
|
149
|
+
principal_type: PrincipalType;
|
|
150
|
+
principal_id: string;
|
|
151
|
+
principal_label?: string;
|
|
152
|
+
role: ResourceRole;
|
|
153
|
+
granted_by?: string | null;
|
|
154
|
+
created_at?: string;
|
|
155
|
+
}
|
|
156
|
+
export interface ShareLink {
|
|
157
|
+
id: string;
|
|
158
|
+
url: string;
|
|
159
|
+
resource_type: ResourceType;
|
|
160
|
+
resource_id: string;
|
|
161
|
+
expires_at: string | null;
|
|
162
|
+
max_downloads?: number | null;
|
|
163
|
+
}
|
|
164
|
+
export interface StorageUsage {
|
|
165
|
+
organization_id: string;
|
|
166
|
+
temporary_bytes: number;
|
|
167
|
+
permanent_bytes: number;
|
|
168
|
+
file_count: number;
|
|
169
|
+
}
|
|
170
|
+
export interface TokenSet {
|
|
171
|
+
access_token: string;
|
|
172
|
+
token_type: 'Bearer';
|
|
173
|
+
expires_in: number;
|
|
174
|
+
refresh_token?: string;
|
|
175
|
+
id_token?: string;
|
|
176
|
+
scope: string;
|
|
177
|
+
}
|
|
178
|
+
export interface IdTokenClaims {
|
|
179
|
+
iss: string;
|
|
180
|
+
sub: string;
|
|
181
|
+
aud: string | string[];
|
|
182
|
+
exp: number;
|
|
183
|
+
iat: number;
|
|
184
|
+
auth_time?: number;
|
|
185
|
+
nonce?: string;
|
|
186
|
+
email?: string;
|
|
187
|
+
email_verified?: boolean;
|
|
188
|
+
name?: string;
|
|
189
|
+
org_id?: string;
|
|
190
|
+
}
|
|
191
|
+
export interface UserInfo {
|
|
192
|
+
sub: string;
|
|
193
|
+
email?: string;
|
|
194
|
+
email_verified?: boolean;
|
|
195
|
+
name?: string;
|
|
196
|
+
updated_at?: number;
|
|
197
|
+
org_id?: string;
|
|
198
|
+
organizations?: {
|
|
199
|
+
id: string;
|
|
200
|
+
name: string;
|
|
201
|
+
kind: 'personal' | 'business';
|
|
202
|
+
role: OrgRole;
|
|
203
|
+
}[];
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,mFAAmF"}
|