@arkstack/driver-h3 0.3.16 → 0.3.17
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 +4 -6
- package/dist/error-handler-nV_ImqPa.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/middlewares/index.d.ts +1 -7
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/middlewares/index.js +28 -19
- package/dist/middlewares/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -6,18 +6,16 @@ H3 driver package for Arkstack providing H3-specific implementations of core Ark
|
|
|
6
6
|
|
|
7
7
|
```ts
|
|
8
8
|
import { H3 } from 'h3';
|
|
9
|
-
import { auth
|
|
9
|
+
import { auth } from '@arkstack/driver-h3/middlewares';
|
|
10
10
|
|
|
11
11
|
const app = new H3();
|
|
12
12
|
|
|
13
13
|
app.use(auth);
|
|
14
|
-
app.use('/account', (
|
|
15
|
-
const context = event.context as AuthenticatedH3Context;
|
|
16
|
-
|
|
14
|
+
app.use('/account', ({ req }) => {
|
|
17
15
|
return {
|
|
18
|
-
user:
|
|
16
|
+
user: req.authUser,
|
|
19
17
|
};
|
|
20
18
|
});
|
|
21
19
|
```
|
|
22
20
|
|
|
23
|
-
The middleware expects `Authorization: Bearer <token>` and attaches `user`, `authUser`, and `authToken` to `event.context`.
|
|
21
|
+
The middleware expects `Authorization: Bearer <token>` and attaches `user`, `authUser`, and `authToken` to `event.context` and `event.req`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler-nV_ImqPa.d.ts","names":[],"sources":["../src/error-handler.ts"],"mappings":";;;cAMa,mBAAA,GAAuB,GAAA,EAAK,SAAA,GAAY,KAAA,WAAgB,KAAA,EAAO,OAAA,KAAO,YAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;KASY,YAAA,GAAe,UAAA,IAAoB,UAAA,EAAkB,MAAA;AAAA,UAEhD,eAAA;EACb,UAAA,GAAa,GAAA,EAAK,EAAA,KAAO,cAAA;EACzB,iBAAA,IAAqB,GAAA,EAAK,EAAA,EAAI,UAAA,aAAuB,cAAA;EACrD,SAAA,SAAkB,EAAA;EAClB,OAAA,IAAW,GAAA,EAAK,KAAA,WAAgB,KAAA,EAAO,OAAA;AAAA;AAAA,cAG9B,eAAA;EAIU,QAAA,EAAU,QAAA;EAH7B,MAAA;EACA,UAAA;cAEmB,QAAA,EAAU,QAAA;EAAA,IAKzB,OAAA,CAAA,GAAY,OAAA;AAAA;AAAA,cAQP,QAAA,SAAiB,iBAAA,CAAkB,EAAA,EAAI,YAAA;EAAA,SACvC,IAAA;EAAA,iBACQ,OAAA;cAOL,OAAA,EAAS,eAAA;EAUrB,SAAA,CAAA,GAAc,EAAA;EAYd,iBAAA,CAAmB,GAAA,EAAK,EAAA,EAAI,UAAA,WAAqB,cAAA;EAajD,UAAA,CAAY,GAAA,EAAK,EAAA,GAAK,cAAA;EAUtB,eAAA,CACI,GAAA,EAAK,EAAA,EACL,UAAA,EAAY,YAAA,GAAe,wBAAA,CAAyB,YAAA;EAqCxD,KAAA,CAAO,GAAA,EAAK,EAAA,EAAI,IAAA;AAAA"}
|
|
@@ -2,14 +2,8 @@ import "../error-handler-nV_ImqPa.js";
|
|
|
2
2
|
import { H3Middleware } from "../index.js";
|
|
3
3
|
import * as h3 from "h3";
|
|
4
4
|
import { H3Event } from "h3";
|
|
5
|
-
import { User } from "@arkstack/auth";
|
|
6
5
|
|
|
7
6
|
//#region src/middlewares/auth.d.ts
|
|
8
|
-
type AuthenticatedH3Context<TUser extends User = User> = {
|
|
9
|
-
user?: TUser;
|
|
10
|
-
authUser?: TUser;
|
|
11
|
-
authToken?: string;
|
|
12
|
-
};
|
|
13
7
|
declare const auth: (event: H3Event, next: () => unknown | Promise<unknown>) => Promise<unknown>;
|
|
14
8
|
//#endregion
|
|
15
9
|
//#region src/middlewares/request-logger.d.ts
|
|
@@ -22,5 +16,5 @@ declare const requestLogger: ({
|
|
|
22
16
|
//#region src/middlewares/static-asset-handler.d.ts
|
|
23
17
|
declare const staticAssetHandler: (publicPath?: string) => (event: H3Event) => Promise<h3.HTTPResponse | undefined> | undefined;
|
|
24
18
|
//#endregion
|
|
25
|
-
export {
|
|
19
|
+
export { auth, requestLogger, staticAssetHandler };
|
|
26
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/middlewares/auth.ts","../../src/middlewares/request-logger.ts","../../src/middlewares/static-asset-handler.ts"],"mappings":";;;;;;cAKa,IAAA,GAAc,KAAA,EAAO,OAAA,EAAS,IAAA,kBAAsB,OAAA,cAAgB,OAAA;;;cCcpE,aAAA;EAAiB;AAAA;EAG1B,iBAAA;AAAA,MACK,YAAA;;;cCnBI,kBAAA,GAAsB,UAAA,eAGvB,KAAA,EAAO,OAAA,KAAO,OAAA,CAAA,EAAA,CAAA,YAAA"}
|
|
@@ -1,33 +1,42 @@
|
|
|
1
1
|
import { serveStatic } from "h3";
|
|
2
|
-
import { Logger, nodeEnv } from "@arkstack/common";
|
|
2
|
+
import { Hook, Logger, nodeEnv } from "@arkstack/common";
|
|
3
3
|
import { Auth, AuthenticationException } from "@arkstack/auth";
|
|
4
4
|
import { readFile, stat } from "node:fs/promises";
|
|
5
5
|
import { join, resolve } from "node:path";
|
|
6
6
|
|
|
7
7
|
//#region src/middlewares/auth.ts
|
|
8
8
|
const auth = async (event, next) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
try {
|
|
10
|
+
const token = readBearerToken(event.req.headers.get("authorization"));
|
|
11
|
+
if (!token) throw new AuthenticationException("Unauthenticated", {
|
|
12
|
+
req: {
|
|
13
|
+
headers: event.req.headers,
|
|
14
|
+
method: event.req.method,
|
|
15
|
+
url: event.req.url,
|
|
16
|
+
path: getEventPath(event)
|
|
17
|
+
},
|
|
18
|
+
status: 401
|
|
19
|
+
});
|
|
20
|
+
if (Hook.has("middleware:auth", "before")) Hook.get("middleware:auth", "before")?.(event);
|
|
21
|
+
const requestSource = {
|
|
12
22
|
headers: event.req.headers,
|
|
13
23
|
method: event.req.method,
|
|
14
24
|
url: event.req.url,
|
|
15
25
|
path: getEventPath(event)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return await next();
|
|
26
|
+
};
|
|
27
|
+
const user = await Auth.make().setRequest(requestSource).authorizeToken(token);
|
|
28
|
+
event.context.user = user;
|
|
29
|
+
event.context.authUser = user;
|
|
30
|
+
event.context.authToken = token;
|
|
31
|
+
event.req.user = user;
|
|
32
|
+
event.req.authUser = user;
|
|
33
|
+
event.req.authToken = token;
|
|
34
|
+
if (Hook.has("middleware:auth", "after")) Hook.get("middleware:auth", "after")?.(event);
|
|
35
|
+
return await next();
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if (Hook.has("middleware:auth", "error")) Hook.get("middleware:auth", "error")?.(error, event);
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
31
40
|
};
|
|
32
41
|
const readBearerToken = (authorization) => {
|
|
33
42
|
if (!authorization?.startsWith("Bearer ")) return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/middlewares/auth.ts","../../src/middlewares/request-logger.ts","../../src/middlewares/static-asset-handler.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/middlewares/auth.ts","../../src/middlewares/request-logger.ts","../../src/middlewares/static-asset-handler.ts"],"sourcesContent":["import { Auth, AuthenticationException } from '@arkstack/auth'\n\nimport type { H3Event } from 'h3'\nimport { Hook } from '@arkstack/common'\n\nexport const auth = async (event: H3Event, next: () => unknown | Promise<unknown>) => {\n try {\n const token = readBearerToken(event.req.headers.get('authorization'))\n\n if (!token) {\n throw new AuthenticationException('Unauthenticated', {\n req: {\n headers: event.req.headers,\n method: event.req.method,\n url: event.req.url,\n path: getEventPath(event),\n },\n status: 401,\n })\n }\n\n if (Hook.has('middleware:auth', 'before'))\n Hook.get('middleware:auth', 'before')?.(event)\n\n const requestSource = {\n headers: event.req.headers,\n method: event.req.method,\n url: event.req.url,\n path: getEventPath(event),\n }\n const user = await Auth.make().setRequest(requestSource).authorizeToken(token)\n\n event.context.user = user\n event.context.authUser = user\n event.context.authToken = token;\n (event.req as any).user = user;\n (event.req as any).authUser = user;\n (event.req as any).authToken = token\n\n if (Hook.has('middleware:auth', 'after'))\n Hook.get('middleware:auth', 'after')?.(event)\n\n return await next()\n } catch (error) {\n if (Hook.has('middleware:auth', 'error'))\n Hook.get('middleware:auth', 'error')?.(error, event)\n\n throw error\n }\n}\n\nconst readBearerToken = (authorization: string | null) => {\n if (!authorization?.startsWith('Bearer ')) {\n return null\n }\n\n return authorization.substring(7)\n}\n\nconst getEventPath = (event: H3Event) => event.req._url?.pathname\n","import { Logger, nodeEnv } from '@arkstack/common'\n\nimport { H3Middleware } from '..'\n\nconst colors: Record<string, 'green' | 'blue' | 'yellow' | 'red' | 'cyan'> = {\n GET: 'green',\n POST: 'blue',\n PUT: 'yellow',\n DELETE: 'red',\n PATCH: 'cyan',\n}\n\n/**\n * Middleware to log incoming requests and their response times.\n * \n * @param config Configuration options for the request logger middleware.\n * @param config.allowInProduction If true, the logger will also log requests in production environment. Default is false. \n * @returns H3Middleware function\n */\nexport const requestLogger = ({\n allowInProduction = false,\n}: {\n allowInProduction?: boolean\n} = {}): H3Middleware => async (event, next) => {\n if (nodeEnv() === 'prod' && !allowInProduction) return next()\n\n await next()\n\n const start = Date.now()\n const req = event.req\n const status = event.res.status || 200\n const duration = Date.now() - start\n\n Logger.log([\n [`[${req.method}]`, colors[req.method] || 'green'],\n [req.url, 'cyan'],\n [status.toString(), status >= 500 ? 'red' : status >= 400 ? 'yellow' : 'green'],\n [`- ${duration}ms`, 'dim']\n ], ' ')\n}","import { H3Event, serveStatic } from 'h3'\nimport { readFile, stat } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\n\nexport const staticAssetHandler = (publicPath: string = 'public') => {\n const rootPath = resolve(process.cwd(), publicPath)\n\n return (event: H3Event) => {\n const { pathname } = new URL(event.req.url)\n\n if (!/\\.[a-zA-Z0-9]+$/.test(pathname)) return\n if (pathname.startsWith('/.') || pathname.includes('..')) return\n\n event.res.headers.set('Cache-Control', 'public, max-age=31536000, immutable')\n event.res.headers.set('Access-Control-Allow-Origin', '*')\n event.res.headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n event.res.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization')\n\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n const relativePath = id.replace(/^\\/+/, '')\n const file = join(rootPath, relativePath)\n\n return readFile(file).catch(() => null) as never\n },\n getMeta: async (id) => {\n const relativePath = id.replace(/^\\/+/, '')\n const file = join(rootPath, relativePath)\n const stats = await stat(file).catch(() => undefined)\n\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n }\n }\n },\n })\n }\n}"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arkstack/driver-h3",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.17",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "H3 driver package for Arkstack providing H3-specific implementations of core Arkstack features such as routing, middleware, and database integration.",
|
|
6
6
|
"homepage": "https://arkstack.toneflix.net",
|
|
@@ -36,13 +36,13 @@
|
|
|
36
36
|
"./package.json": "./package.json"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@arkstack/contract": "^0.3.
|
|
39
|
+
"@arkstack/contract": "^0.3.17"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"clear-router": "^2.3.
|
|
42
|
+
"clear-router": "^2.3.5",
|
|
43
43
|
"h3": "2.0.1-rc.16",
|
|
44
|
-
"@arkstack/
|
|
45
|
-
"@arkstack/
|
|
44
|
+
"@arkstack/auth": "^0.3.17",
|
|
45
|
+
"@arkstack/common": "^0.3.17"
|
|
46
46
|
},
|
|
47
47
|
"peerDependenciesMeta": {
|
|
48
48
|
"@arkstack/auth": {
|