@lastshotlabs/bunshot 0.0.5 → 0.0.7

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.
Files changed (47) hide show
  1. package/README.md +37 -6
  2. package/dist/adapters/memoryAuth.js +207 -0
  3. package/dist/adapters/mongoAuth.js +93 -0
  4. package/dist/adapters/sqliteAuth.js +242 -0
  5. package/dist/app.js +175 -0
  6. package/dist/cli.js +92 -48
  7. package/dist/index.js +37 -2
  8. package/dist/lib/HttpError.js +7 -0
  9. package/dist/lib/appConfig.js +17 -0
  10. package/dist/lib/authAdapter.js +7 -0
  11. package/dist/lib/authRateLimit.js +77 -0
  12. package/dist/lib/constants.js +2 -0
  13. package/dist/lib/context.js +8 -0
  14. package/dist/lib/emailVerification.js +77 -0
  15. package/dist/lib/fingerprint.js +36 -0
  16. package/dist/lib/jwt.js +11 -0
  17. package/dist/lib/logger.js +7 -0
  18. package/dist/lib/mongo.js +73 -0
  19. package/dist/lib/oauth.js +82 -0
  20. package/dist/lib/queue.js +4 -0
  21. package/dist/lib/redis.js +50 -0
  22. package/dist/lib/roles.js +22 -0
  23. package/dist/lib/session.js +68 -0
  24. package/dist/lib/validate.js +14 -0
  25. package/dist/lib/ws.js +64 -0
  26. package/dist/middleware/bearerAuth.js +10 -0
  27. package/dist/middleware/botProtection.js +50 -0
  28. package/dist/middleware/cacheResponse.js +158 -0
  29. package/dist/middleware/cors.js +17 -0
  30. package/dist/middleware/errorHandler.js +13 -0
  31. package/dist/middleware/identify.js +33 -0
  32. package/dist/middleware/index.js +1 -0
  33. package/dist/middleware/logger.js +7 -0
  34. package/dist/middleware/rateLimit.js +20 -0
  35. package/dist/middleware/requireRole.js +36 -0
  36. package/dist/middleware/requireVerifiedEmail.js +25 -0
  37. package/dist/middleware/userAuth.js +6 -0
  38. package/dist/models/AuthUser.js +14 -0
  39. package/dist/routes/auth.js +206 -0
  40. package/dist/routes/health.js +22 -0
  41. package/dist/routes/home.js +16 -0
  42. package/dist/routes/oauth.js +150 -0
  43. package/dist/schemas/auth.js +9 -0
  44. package/dist/server.js +53 -0
  45. package/dist/services/auth.js +54 -0
  46. package/dist/ws/index.js +31 -0
  47. package/package.json +2 -2
@@ -0,0 +1,54 @@
1
+ import { getAuthAdapter } from "../lib/authAdapter";
2
+ import { HttpError } from "../lib/HttpError";
3
+ import { signToken, verifyToken } from "../lib/jwt";
4
+ import { createSession, deleteSession } from "../lib/session";
5
+ import { getDefaultRole, getPrimaryField, getEmailVerificationConfig } from "../lib/appConfig";
6
+ import { createVerificationToken } from "../lib/emailVerification";
7
+ export const register = async (identifier, password) => {
8
+ const hashed = await Bun.password.hash(password);
9
+ const adapter = getAuthAdapter();
10
+ const user = await adapter.create(identifier, hashed);
11
+ const role = getDefaultRole();
12
+ if (role)
13
+ await adapter.setRoles(user.id, [role]);
14
+ const token = await signToken(user.id);
15
+ await createSession(user.id, token);
16
+ const evConfig = getEmailVerificationConfig();
17
+ if (evConfig && getPrimaryField() === "email") {
18
+ try {
19
+ const verificationToken = await createVerificationToken(user.id, identifier);
20
+ await evConfig.onSend(identifier, verificationToken);
21
+ }
22
+ catch (e) {
23
+ console.error("[email-verification] Failed to send verification email:", e);
24
+ }
25
+ }
26
+ return token;
27
+ };
28
+ export const login = async (identifier, password) => {
29
+ const adapter = getAuthAdapter();
30
+ const findFn = adapter.findByIdentifier ?? adapter.findByEmail.bind(adapter);
31
+ const user = await findFn(identifier);
32
+ if (!user || !(await Bun.password.verify(password, user.passwordHash))) {
33
+ throw new HttpError(401, "Invalid credentials");
34
+ }
35
+ const evConfig = getEmailVerificationConfig();
36
+ if (evConfig && getPrimaryField() === "email" && adapter.getEmailVerified) {
37
+ const verified = await adapter.getEmailVerified(user.id);
38
+ if (evConfig.required && !verified) {
39
+ throw new HttpError(403, "Email not verified");
40
+ }
41
+ const token = await signToken(user.id);
42
+ await createSession(user.id, token);
43
+ return { token, emailVerified: verified };
44
+ }
45
+ const token = await signToken(user.id);
46
+ await createSession(user.id, token);
47
+ return { token };
48
+ };
49
+ export const logout = async (token) => {
50
+ if (token) {
51
+ const payload = await verifyToken(token);
52
+ await deleteSession(payload.sub);
53
+ }
54
+ };
@@ -0,0 +1,31 @@
1
+ import { verifyToken } from "../lib/jwt";
2
+ import { getSession } from "../lib/session";
3
+ import { COOKIE_TOKEN } from "../lib/constants";
4
+ export const createWsUpgradeHandler = (server) => async (req) => {
5
+ let userId = null;
6
+ try {
7
+ const token = req.headers.get("cookie")
8
+ ?.match(new RegExp(`(?:^|;\\s*)${COOKIE_TOKEN}=([^;]+)`))?.[1] ?? null;
9
+ if (token) {
10
+ const payload = await verifyToken(token);
11
+ const stored = await getSession(payload.sub);
12
+ if (stored === token)
13
+ userId = payload.sub;
14
+ }
15
+ }
16
+ catch { /* unauthenticated — userId stays null */ }
17
+ const upgraded = server.upgrade(req, { data: { id: crypto.randomUUID(), userId, rooms: new Set() } });
18
+ return upgraded ? undefined : Response.json({ error: "Upgrade failed" }, { status: 400 });
19
+ };
20
+ export const websocket = {
21
+ open(ws) {
22
+ console.log(`[ws] connected: ${ws.data.id}`);
23
+ ws.send(JSON.stringify({ event: "connected", id: ws.data.id }));
24
+ },
25
+ message(ws, message) {
26
+ ws.send(message);
27
+ },
28
+ close(ws) {
29
+ console.log(`[ws] disconnected: ${ws.data.id}`);
30
+ },
31
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastshotlabs/bunshot",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "Batteries-included Bun + Hono API framework — auth, sessions, rate limiting, WebSocket, queues, and OpenAPI docs out of the box",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,7 +31,7 @@
31
31
  "dist"
32
32
  ],
33
33
  "scripts": {
34
- "build": "bun build src/index.ts --outdir dist --minify --target bun --external '*' && bun build src/cli.ts --outdir dist --minify --target bun --external '*' && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
34
+ "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && bun build src/cli.ts --outdir dist --minify --target bun",
35
35
  "prepublishOnly": "bun run build",
36
36
  "release": "npm version patch && npm publish",
37
37
  "dev": "bun --watch src/index.ts",