trustline 0.0.1 → 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/LICENSE +21 -0
- package/README.md +339 -0
- package/dist/adapters/mysql/index.cjs +199 -0
- package/dist/adapters/mysql/index.cjs.map +1 -0
- package/dist/adapters/mysql/index.d.cts +6 -0
- package/dist/adapters/mysql/index.d.ts +6 -0
- package/dist/adapters/mysql/index.js +21 -0
- package/dist/adapters/mysql/index.js.map +1 -0
- package/dist/adapters/postgres/index.cjs +199 -0
- package/dist/adapters/postgres/index.cjs.map +1 -0
- package/dist/adapters/postgres/index.d.cts +6 -0
- package/dist/adapters/postgres/index.d.ts +6 -0
- package/dist/adapters/postgres/index.js +21 -0
- package/dist/adapters/postgres/index.js.map +1 -0
- package/dist/adapters/sqlite/index.cjs +216 -0
- package/dist/adapters/sqlite/index.cjs.map +1 -0
- package/dist/adapters/sqlite/index.d.cts +6 -0
- package/dist/adapters/sqlite/index.d.ts +6 -0
- package/dist/adapters/sqlite/index.js +28 -0
- package/dist/adapters/sqlite/index.js.map +1 -0
- package/dist/chunk-CTPFKR4O.js +157 -0
- package/dist/chunk-CTPFKR4O.js.map +1 -0
- package/dist/chunk-GF3NKEEK.js +18 -0
- package/dist/chunk-GF3NKEEK.js.map +1 -0
- package/dist/client/index.cjs +141 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +18 -0
- package/dist/client/index.d.ts +18 -0
- package/dist/client/index.js +104 -0
- package/dist/client/index.js.map +1 -0
- package/dist/frameworks/express/index.cjs +121 -0
- package/dist/frameworks/express/index.cjs.map +1 -0
- package/dist/frameworks/express/index.d.cts +18 -0
- package/dist/frameworks/express/index.d.ts +18 -0
- package/dist/frameworks/express/index.js +83 -0
- package/dist/frameworks/express/index.js.map +1 -0
- package/dist/frameworks/fastify/index.cjs +158 -0
- package/dist/frameworks/fastify/index.cjs.map +1 -0
- package/dist/frameworks/fastify/index.d.cts +25 -0
- package/dist/frameworks/fastify/index.d.ts +25 -0
- package/dist/frameworks/fastify/index.js +120 -0
- package/dist/frameworks/fastify/index.js.map +1 -0
- package/dist/frameworks/hono/index.cjs +117 -0
- package/dist/frameworks/hono/index.cjs.map +1 -0
- package/dist/frameworks/hono/index.d.cts +17 -0
- package/dist/frameworks/hono/index.d.ts +17 -0
- package/dist/frameworks/hono/index.js +79 -0
- package/dist/frameworks/hono/index.js.map +1 -0
- package/dist/index-Dc4GFume.d.ts +34 -0
- package/dist/index-DqkKZOlH.d.cts +34 -0
- package/dist/index.cjs +571 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +14 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +537 -0
- package/dist/index.js.map +1 -0
- package/dist/interface-BzT_DC3u.d.cts +38 -0
- package/dist/interface-BzT_DC3u.d.ts +38 -0
- package/dist/token-BtfYGd9K.d.cts +33 -0
- package/dist/token-BtfYGd9K.d.ts +33 -0
- package/package.json +125 -3
- package/index.js +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AuthError
|
|
3
|
+
} from "../../chunk-GF3NKEEK.js";
|
|
4
|
+
|
|
5
|
+
// src/frameworks/hono/index.ts
|
|
6
|
+
import { Hono } from "hono";
|
|
7
|
+
import { createMiddleware } from "hono/factory";
|
|
8
|
+
function createHonoProvider(provider) {
|
|
9
|
+
const app = new Hono();
|
|
10
|
+
app.get(
|
|
11
|
+
"/.well-known/jwks.json",
|
|
12
|
+
async (context) => provider.handle(
|
|
13
|
+
new Request(context.req.raw.url, {
|
|
14
|
+
method: "GET",
|
|
15
|
+
headers: context.req.raw.headers
|
|
16
|
+
})
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
app.post(
|
|
20
|
+
"/token",
|
|
21
|
+
async (context) => provider.handle(
|
|
22
|
+
new Request(context.req.raw.url, {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: context.req.raw.headers,
|
|
25
|
+
body: context.req.raw.body
|
|
26
|
+
})
|
|
27
|
+
)
|
|
28
|
+
);
|
|
29
|
+
return app;
|
|
30
|
+
}
|
|
31
|
+
function createHonoGuard(guard) {
|
|
32
|
+
return createMiddleware(async (context, next) => {
|
|
33
|
+
const header = context.req.header("authorization");
|
|
34
|
+
const token = getBearerToken(header);
|
|
35
|
+
if (!token) {
|
|
36
|
+
return context.json(
|
|
37
|
+
{
|
|
38
|
+
error: "missing_token",
|
|
39
|
+
message: "Missing bearer token"
|
|
40
|
+
},
|
|
41
|
+
401
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const identity = await guard.verify(token);
|
|
46
|
+
context.set("trustline", identity);
|
|
47
|
+
await next();
|
|
48
|
+
} catch (error) {
|
|
49
|
+
const authError = error instanceof AuthError ? error : new AuthError(
|
|
50
|
+
"invalid_token",
|
|
51
|
+
"Token verification failed",
|
|
52
|
+
401,
|
|
53
|
+
error
|
|
54
|
+
);
|
|
55
|
+
return context.json(
|
|
56
|
+
{
|
|
57
|
+
error: authError.code,
|
|
58
|
+
message: authError.message
|
|
59
|
+
},
|
|
60
|
+
authError.status
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function getBearerToken(header) {
|
|
66
|
+
if (!header) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const [scheme, token] = header.split(/\s+/, 2);
|
|
70
|
+
if (scheme?.toLowerCase() !== "bearer" || !token) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return token;
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
createHonoGuard,
|
|
77
|
+
createHonoProvider
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/frameworks/hono/index.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { createMiddleware } from \"hono/factory\";\n\nimport { AuthError } from \"../../core/errors\";\nimport type { ServiceIdentity } from \"../../core/token\";\nimport type { Provider } from \"../../provider\";\n\nexport interface GuardVerifier {\n verify(token: string): Promise<ServiceIdentity>;\n}\n\nexport function createHonoProvider(provider: Provider): Hono {\n const app = new Hono();\n\n app.get(\"/.well-known/jwks.json\", async (context) =>\n provider.handle(\n new Request(context.req.raw.url, {\n method: \"GET\",\n headers: context.req.raw.headers,\n }),\n ),\n );\n\n app.post(\"/token\", async (context) =>\n provider.handle(\n new Request(context.req.raw.url, {\n method: \"POST\",\n headers: context.req.raw.headers,\n body: context.req.raw.body,\n }),\n ),\n );\n\n return app;\n}\n\nexport function createHonoGuard(guard: GuardVerifier) {\n return createMiddleware(async (context, next) => {\n const header = context.req.header(\"authorization\");\n const token = getBearerToken(header);\n\n if (!token) {\n return context.json(\n {\n error: \"missing_token\",\n message: \"Missing bearer token\",\n },\n 401,\n );\n }\n\n try {\n const identity = await guard.verify(token);\n context.set(\"trustline\", identity);\n await next();\n } catch (error) {\n const authError =\n error instanceof AuthError\n ? error\n : new AuthError(\n \"invalid_token\",\n \"Token verification failed\",\n 401,\n error,\n );\n return context.json(\n {\n error: authError.code,\n message: authError.message,\n },\n authError.status as 401 | 403,\n );\n }\n });\n}\n\nfunction getBearerToken(header: string | undefined): string | null {\n if (!header) {\n return null;\n }\n\n const [scheme, token] = header.split(/\\s+/, 2);\n if (scheme?.toLowerCase() !== \"bearer\" || !token) {\n return null;\n }\n\n return token;\n}\n"],"mappings":";;;;;AAAA,SAAS,YAAY;AACrB,SAAS,wBAAwB;AAU1B,SAAS,mBAAmB,UAA0B;AAC3D,QAAM,MAAM,IAAI,KAAK;AAErB,MAAI;AAAA,IAAI;AAAA,IAA0B,OAAO,YACvC,SAAS;AAAA,MACP,IAAI,QAAQ,QAAQ,IAAI,IAAI,KAAK;AAAA,QAC/B,QAAQ;AAAA,QACR,SAAS,QAAQ,IAAI,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI;AAAA,IAAK;AAAA,IAAU,OAAO,YACxB,SAAS;AAAA,MACP,IAAI,QAAQ,QAAQ,IAAI,IAAI,KAAK;AAAA,QAC/B,QAAQ;AAAA,QACR,SAAS,QAAQ,IAAI,IAAI;AAAA,QACzB,MAAM,QAAQ,IAAI,IAAI;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAsB;AACpD,SAAO,iBAAiB,OAAO,SAAS,SAAS;AAC/C,UAAM,SAAS,QAAQ,IAAI,OAAO,eAAe;AACjD,UAAM,QAAQ,eAAe,MAAM;AAEnC,QAAI,CAAC,OAAO;AACV,aAAO,QAAQ;AAAA,QACb;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,OAAO,KAAK;AACzC,cAAQ,IAAI,aAAa,QAAQ;AACjC,YAAM,KAAK;AAAA,IACb,SAAS,OAAO;AACd,YAAM,YACJ,iBAAiB,YACb,QACA,IAAI;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACN,aAAO,QAAQ;AAAA,QACb;AAAA,UACE,OAAO,UAAU;AAAA,UACjB,SAAS,UAAU;AAAA,QACrB;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,QAA2C;AACjE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,QAAQ,KAAK,IAAI,OAAO,MAAM,OAAO,CAAC;AAC7C,MAAI,QAAQ,YAAY,MAAM,YAAY,CAAC,OAAO;AAChD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { b as ServiceClient, a as StorageAdapter, d as SigningAlgorithm } from './interface-BzT_DC3u.js';
|
|
2
|
+
|
|
3
|
+
interface ProviderOptions {
|
|
4
|
+
issuer: string;
|
|
5
|
+
storage: StorageAdapter;
|
|
6
|
+
signing?: {
|
|
7
|
+
algorithm?: SigningAlgorithm;
|
|
8
|
+
privateKey?: string;
|
|
9
|
+
keyId?: string;
|
|
10
|
+
};
|
|
11
|
+
token?: {
|
|
12
|
+
ttl?: number;
|
|
13
|
+
};
|
|
14
|
+
env?: string;
|
|
15
|
+
}
|
|
16
|
+
interface CreateProviderClientInput {
|
|
17
|
+
name: string;
|
|
18
|
+
scopes?: string[];
|
|
19
|
+
}
|
|
20
|
+
interface CreatedProviderClient {
|
|
21
|
+
clientId: string;
|
|
22
|
+
clientSecret: string;
|
|
23
|
+
}
|
|
24
|
+
interface Provider {
|
|
25
|
+
handle(request: Request): Promise<Response>;
|
|
26
|
+
clients: {
|
|
27
|
+
create(input: CreateProviderClientInput): Promise<CreatedProviderClient>;
|
|
28
|
+
list(): Promise<ServiceClient[]>;
|
|
29
|
+
revoke(clientId: string): Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
declare function createProvider(options: ProviderOptions): Provider;
|
|
33
|
+
|
|
34
|
+
export { type CreateProviderClientInput as C, type Provider as P, type CreatedProviderClient as a, type ProviderOptions as b, createProvider as c };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { b as ServiceClient, a as StorageAdapter, d as SigningAlgorithm } from './interface-BzT_DC3u.cjs';
|
|
2
|
+
|
|
3
|
+
interface ProviderOptions {
|
|
4
|
+
issuer: string;
|
|
5
|
+
storage: StorageAdapter;
|
|
6
|
+
signing?: {
|
|
7
|
+
algorithm?: SigningAlgorithm;
|
|
8
|
+
privateKey?: string;
|
|
9
|
+
keyId?: string;
|
|
10
|
+
};
|
|
11
|
+
token?: {
|
|
12
|
+
ttl?: number;
|
|
13
|
+
};
|
|
14
|
+
env?: string;
|
|
15
|
+
}
|
|
16
|
+
interface CreateProviderClientInput {
|
|
17
|
+
name: string;
|
|
18
|
+
scopes?: string[];
|
|
19
|
+
}
|
|
20
|
+
interface CreatedProviderClient {
|
|
21
|
+
clientId: string;
|
|
22
|
+
clientSecret: string;
|
|
23
|
+
}
|
|
24
|
+
interface Provider {
|
|
25
|
+
handle(request: Request): Promise<Response>;
|
|
26
|
+
clients: {
|
|
27
|
+
create(input: CreateProviderClientInput): Promise<CreatedProviderClient>;
|
|
28
|
+
list(): Promise<ServiceClient[]>;
|
|
29
|
+
revoke(clientId: string): Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
declare function createProvider(options: ProviderOptions): Provider;
|
|
33
|
+
|
|
34
|
+
export { type CreateProviderClientInput as C, type Provider as P, type CreatedProviderClient as a, type ProviderOptions as b, createProvider as c };
|