naystack 1.2.16 → 1.2.19
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/dist/auth/email/client.cjs.js +35 -7
- package/dist/auth/email/client.d.mts +13 -1
- package/dist/auth/email/client.d.ts +13 -1
- package/dist/auth/email/client.esm.js +34 -4
- package/dist/auth/email/index.cjs.js +23 -18
- package/dist/auth/email/index.d.mts +4 -12
- package/dist/auth/email/index.d.ts +4 -12
- package/dist/auth/email/index.esm.js +23 -18
- package/dist/auth/email/routes/delete.cjs.js +45 -1
- package/dist/auth/email/routes/delete.esm.js +45 -1
- package/dist/auth/email/routes/get.cjs.js +6 -2
- package/dist/auth/email/routes/get.d.mts +2 -2
- package/dist/auth/email/routes/get.d.ts +2 -2
- package/dist/auth/email/routes/get.esm.js +6 -2
- package/dist/auth/email/routes/post.cjs.js +3 -1
- package/dist/auth/email/routes/post.esm.js +3 -1
- package/dist/auth/email/routes/put.cjs.js +3 -0
- package/dist/auth/email/routes/put.esm.js +3 -0
- package/dist/auth/email/types.d.mts +5 -3
- package/dist/auth/email/types.d.ts +5 -3
- package/dist/auth/email/utils.cjs.js +8 -8
- package/dist/auth/email/utils.d.mts +3 -5
- package/dist/auth/email/utils.d.ts +3 -5
- package/dist/auth/email/utils.esm.js +7 -7
- package/dist/auth/index.cjs.js +23 -18
- package/dist/auth/index.d.mts +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.esm.js +23 -18
- package/dist/client/hooks.d.mts +2 -2
- package/dist/client/hooks.d.ts +2 -2
- package/dist/file/client.cjs.js +20 -23
- package/dist/file/client.d.mts +4 -10
- package/dist/file/client.d.ts +4 -10
- package/dist/file/client.esm.js +19 -22
- package/dist/file/index.cjs.js +47 -55
- package/dist/file/index.d.mts +0 -1
- package/dist/file/index.d.ts +0 -1
- package/dist/file/index.esm.js +47 -55
- package/dist/file/put.cjs.js +29 -58
- package/dist/file/put.d.mts +2 -1
- package/dist/file/put.d.ts +2 -1
- package/dist/file/put.esm.js +29 -58
- package/dist/file/setup.cjs.js +47 -55
- package/dist/file/setup.d.mts +16 -12
- package/dist/file/setup.d.ts +16 -12
- package/dist/file/setup.esm.js +47 -55
- package/dist/file/utils.cjs.js +29 -27
- package/dist/file/utils.d.mts +9 -6
- package/dist/file/utils.d.ts +9 -6
- package/dist/file/utils.esm.js +24 -22
- package/dist/graphql/client.cjs.js +11 -34
- package/dist/graphql/client.d.mts +3 -9
- package/dist/graphql/client.d.ts +3 -9
- package/dist/graphql/client.esm.js +8 -30
- package/dist/graphql/server.d.mts +2 -2
- package/dist/graphql/server.d.ts +2 -2
- package/dist/graphql/types.d.mts +2 -0
- package/dist/graphql/types.d.ts +2 -0
- package/package.json +1 -1
|
@@ -17,16 +17,40 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
|
|
20
|
-
// src/auth/email/client.
|
|
20
|
+
// src/auth/email/client.tsx
|
|
21
21
|
var client_exports = {};
|
|
22
22
|
__export(client_exports, {
|
|
23
|
-
|
|
23
|
+
TokenContext: () => TokenContext,
|
|
24
|
+
getApolloWrapper: () => getApolloWrapper,
|
|
25
|
+
getEmailAuthUtils: () => getEmailAuthUtils,
|
|
26
|
+
useSetToken: () => useSetToken,
|
|
27
|
+
useToken: () => useToken
|
|
24
28
|
});
|
|
25
29
|
module.exports = __toCommonJS(client_exports);
|
|
26
|
-
var import_client = require("naystack/graphql/client");
|
|
27
30
|
var import_react = require("react");
|
|
31
|
+
var TokenContext = (0, import_react.createContext)({
|
|
32
|
+
token: null,
|
|
33
|
+
setToken: () => null
|
|
34
|
+
});
|
|
35
|
+
var getApolloWrapper = (endpoint) => ({ children }) => {
|
|
36
|
+
const [token, setToken] = (0, import_react.useState)(null);
|
|
37
|
+
(0, import_react.useEffect)(() => {
|
|
38
|
+
fetch(endpoint, {
|
|
39
|
+
credentials: "include"
|
|
40
|
+
}).then((res) => res.json()).then((data) => setToken(data.accessToken));
|
|
41
|
+
}, []);
|
|
42
|
+
return /* @__PURE__ */ React.createElement(TokenContext.Provider, { value: { token, setToken } }, children);
|
|
43
|
+
};
|
|
44
|
+
function useToken() {
|
|
45
|
+
const { token } = (0, import_react.useContext)(TokenContext);
|
|
46
|
+
return token;
|
|
47
|
+
}
|
|
48
|
+
function useSetToken() {
|
|
49
|
+
const { setToken } = (0, import_react.useContext)(TokenContext);
|
|
50
|
+
return setToken;
|
|
51
|
+
}
|
|
28
52
|
function useSignUpWithEmail(endpoint) {
|
|
29
|
-
const setToken =
|
|
53
|
+
const setToken = useSetToken();
|
|
30
54
|
return (0, import_react.useCallback)(
|
|
31
55
|
async (data) => {
|
|
32
56
|
const res = await fetch(endpoint, {
|
|
@@ -45,7 +69,7 @@ function useSignUpWithEmail(endpoint) {
|
|
|
45
69
|
);
|
|
46
70
|
}
|
|
47
71
|
function useLoginWithEmail(endpoint) {
|
|
48
|
-
const setToken =
|
|
72
|
+
const setToken = useSetToken();
|
|
49
73
|
return (0, import_react.useCallback)(
|
|
50
74
|
async (data) => {
|
|
51
75
|
const res = await fetch(endpoint, {
|
|
@@ -64,7 +88,7 @@ function useLoginWithEmail(endpoint) {
|
|
|
64
88
|
);
|
|
65
89
|
}
|
|
66
90
|
function useLogout(endpoint) {
|
|
67
|
-
const setToken =
|
|
91
|
+
const setToken = useSetToken();
|
|
68
92
|
return (0, import_react.useCallback)(
|
|
69
93
|
async (data) => {
|
|
70
94
|
setToken(null);
|
|
@@ -86,5 +110,9 @@ function getEmailAuthUtils(endpoint) {
|
|
|
86
110
|
}
|
|
87
111
|
// Annotate the CommonJS export names for ESM import in node:
|
|
88
112
|
0 && (module.exports = {
|
|
89
|
-
|
|
113
|
+
TokenContext,
|
|
114
|
+
getApolloWrapper,
|
|
115
|
+
getEmailAuthUtils,
|
|
116
|
+
useSetToken,
|
|
117
|
+
useToken
|
|
90
118
|
});
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { Dispatch, SetStateAction } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const TokenContext: react.Context<{
|
|
5
|
+
token: string | null;
|
|
6
|
+
setToken: Dispatch<SetStateAction<string | null>>;
|
|
7
|
+
}>;
|
|
8
|
+
declare const getApolloWrapper: (endpoint: string) => ({ children }: {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}) => react.JSX.Element;
|
|
11
|
+
declare function useToken(): string | null;
|
|
12
|
+
declare function useSetToken(): Dispatch<SetStateAction<string | null>>;
|
|
1
13
|
declare function getEmailAuthUtils(endpoint: string): {
|
|
2
14
|
useSignUp: () => (data: object) => Promise<string | null>;
|
|
3
15
|
useLogin: () => (data: object) => Promise<string | null>;
|
|
4
16
|
useLogout: () => (data?: object) => Promise<void>;
|
|
5
17
|
};
|
|
6
18
|
|
|
7
|
-
export { getEmailAuthUtils };
|
|
19
|
+
export { TokenContext, getApolloWrapper, getEmailAuthUtils, useSetToken, useToken };
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { Dispatch, SetStateAction } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const TokenContext: react.Context<{
|
|
5
|
+
token: string | null;
|
|
6
|
+
setToken: Dispatch<SetStateAction<string | null>>;
|
|
7
|
+
}>;
|
|
8
|
+
declare const getApolloWrapper: (endpoint: string) => ({ children }: {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}) => react.JSX.Element;
|
|
11
|
+
declare function useToken(): string | null;
|
|
12
|
+
declare function useSetToken(): Dispatch<SetStateAction<string | null>>;
|
|
1
13
|
declare function getEmailAuthUtils(endpoint: string): {
|
|
2
14
|
useSignUp: () => (data: object) => Promise<string | null>;
|
|
3
15
|
useLogin: () => (data: object) => Promise<string | null>;
|
|
4
16
|
useLogout: () => (data?: object) => Promise<void>;
|
|
5
17
|
};
|
|
6
18
|
|
|
7
|
-
export { getEmailAuthUtils };
|
|
19
|
+
export { TokenContext, getApolloWrapper, getEmailAuthUtils, useSetToken, useToken };
|
|
@@ -1,6 +1,32 @@
|
|
|
1
|
-
// src/auth/email/client.
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
// src/auth/email/client.tsx
|
|
2
|
+
import {
|
|
3
|
+
createContext,
|
|
4
|
+
useCallback,
|
|
5
|
+
useContext,
|
|
6
|
+
useEffect,
|
|
7
|
+
useState
|
|
8
|
+
} from "react";
|
|
9
|
+
var TokenContext = createContext({
|
|
10
|
+
token: null,
|
|
11
|
+
setToken: () => null
|
|
12
|
+
});
|
|
13
|
+
var getApolloWrapper = (endpoint) => ({ children }) => {
|
|
14
|
+
const [token, setToken] = useState(null);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
fetch(endpoint, {
|
|
17
|
+
credentials: "include"
|
|
18
|
+
}).then((res) => res.json()).then((data) => setToken(data.accessToken));
|
|
19
|
+
}, []);
|
|
20
|
+
return /* @__PURE__ */ React.createElement(TokenContext.Provider, { value: { token, setToken } }, children);
|
|
21
|
+
};
|
|
22
|
+
function useToken() {
|
|
23
|
+
const { token } = useContext(TokenContext);
|
|
24
|
+
return token;
|
|
25
|
+
}
|
|
26
|
+
function useSetToken() {
|
|
27
|
+
const { setToken } = useContext(TokenContext);
|
|
28
|
+
return setToken;
|
|
29
|
+
}
|
|
4
30
|
function useSignUpWithEmail(endpoint) {
|
|
5
31
|
const setToken = useSetToken();
|
|
6
32
|
return useCallback(
|
|
@@ -61,5 +87,9 @@ function getEmailAuthUtils(endpoint) {
|
|
|
61
87
|
};
|
|
62
88
|
}
|
|
63
89
|
export {
|
|
64
|
-
|
|
90
|
+
TokenContext,
|
|
91
|
+
getApolloWrapper,
|
|
92
|
+
getEmailAuthUtils,
|
|
93
|
+
useSetToken,
|
|
94
|
+
useToken
|
|
65
95
|
};
|
|
@@ -128,42 +128,49 @@ async function verifyCaptcha(token, secret) {
|
|
|
128
128
|
}
|
|
129
129
|
return false;
|
|
130
130
|
}
|
|
131
|
-
var
|
|
131
|
+
var getContext = (refreshKey, signingKey, req) => {
|
|
132
132
|
const bearer = req.headers.get("authorization");
|
|
133
133
|
if (!bearer) {
|
|
134
134
|
const refresh = req.cookies.get("refresh")?.value;
|
|
135
135
|
const userId = getUserIdFromRefreshToken(refreshKey, refresh);
|
|
136
|
-
if (userId) return {
|
|
137
|
-
return null;
|
|
136
|
+
if (userId) return { userId, isRefreshID: true };
|
|
137
|
+
return { userId: null };
|
|
138
138
|
}
|
|
139
139
|
const token = bearer.slice(7);
|
|
140
140
|
try {
|
|
141
141
|
const res = (0, import_jsonwebtoken2.verify)(token, signingKey);
|
|
142
142
|
if (typeof res === "string") {
|
|
143
|
-
return null;
|
|
143
|
+
return { userId: null };
|
|
144
144
|
}
|
|
145
145
|
return {
|
|
146
|
-
|
|
146
|
+
userId: res.id
|
|
147
147
|
};
|
|
148
148
|
} catch {
|
|
149
149
|
}
|
|
150
|
-
return null;
|
|
150
|
+
return { userId: null };
|
|
151
151
|
};
|
|
152
152
|
|
|
153
153
|
// src/auth/email/routes/delete.ts
|
|
154
154
|
var getDeleteRoute = (options) => async (req) => {
|
|
155
|
-
if (options.onLogout)
|
|
155
|
+
if (options.onLogout) {
|
|
156
|
+
const ctx = await getContext(options.refreshKey, options.signingKey, req);
|
|
157
|
+
await options.onLogout?.(ctx.userId, req);
|
|
158
|
+
}
|
|
156
159
|
return getTokenizedResponse(void 0, "");
|
|
157
160
|
};
|
|
158
161
|
|
|
159
162
|
// src/auth/email/routes/get.ts
|
|
160
|
-
var getGetRoute = (options) => (req) => {
|
|
163
|
+
var getGetRoute = (options) => async (req) => {
|
|
161
164
|
const refresh = req.cookies.get("refresh")?.value;
|
|
162
165
|
const userID = getUserIdFromRefreshToken(options.refreshKey, refresh);
|
|
163
|
-
if (userID)
|
|
166
|
+
if (userID) {
|
|
167
|
+
if (options.onRefresh) {
|
|
168
|
+
await options.onRefresh?.(userID, req);
|
|
169
|
+
}
|
|
164
170
|
return getTokenizedResponse(
|
|
165
171
|
generateAccessToken(userID, options.signingKey)
|
|
166
172
|
);
|
|
173
|
+
}
|
|
167
174
|
return getTokenizedResponse();
|
|
168
175
|
};
|
|
169
176
|
|
|
@@ -188,7 +195,9 @@ var getPostRoute = (options) => async (req) => {
|
|
|
188
195
|
password: encryptedPassword
|
|
189
196
|
});
|
|
190
197
|
if (newUser) {
|
|
191
|
-
options.onSignUp
|
|
198
|
+
if (options.onSignUp) {
|
|
199
|
+
await options.onSignUp?.(newUser.id, req);
|
|
200
|
+
}
|
|
192
201
|
return getTokenizedResponse(
|
|
193
202
|
generateAccessToken(newUser.id, options.signingKey),
|
|
194
203
|
generateRefreshToken(newUser.id, options.refreshKey)
|
|
@@ -205,6 +214,9 @@ var getPutRoute = (options) => async (req) => {
|
|
|
205
214
|
if (!user)
|
|
206
215
|
return handleError(400, "A user does not exist", options.onError);
|
|
207
216
|
if (await verifyUser(user, data.password)) {
|
|
217
|
+
if (options.onLogin) {
|
|
218
|
+
await options.onLogin?.(user.id, req);
|
|
219
|
+
}
|
|
208
220
|
return getTokenizedResponse(
|
|
209
221
|
generateAccessToken(user.id, options.signingKey),
|
|
210
222
|
generateRefreshToken(user.id, options.refreshKey)
|
|
@@ -220,14 +232,7 @@ function getEmailAuthRoutes(options) {
|
|
|
220
232
|
POST: getPostRoute(options),
|
|
221
233
|
PUT: getPutRoute(options),
|
|
222
234
|
DELETE: getDeleteRoute(options),
|
|
223
|
-
getContext: (req) =>
|
|
224
|
-
const ids = getUserContext(options.refreshKey, options.signingKey, req);
|
|
225
|
-
if (!ids) return { userId: null };
|
|
226
|
-
if (ids.refreshUserID) {
|
|
227
|
-
return { userId: ids.refreshUserID, isRefreshID: true };
|
|
228
|
-
}
|
|
229
|
-
return { userId: ids.accessUserId };
|
|
230
|
-
}
|
|
235
|
+
getContext: (req) => getContext(options.refreshKey, options.signingKey, req)
|
|
231
236
|
};
|
|
232
237
|
}
|
|
233
238
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1,29 +1,21 @@
|
|
|
1
1
|
import * as next_server from 'next/server';
|
|
2
2
|
import { NextRequest } from 'next/server';
|
|
3
|
+
import { Context } from '../../graphql/types.mjs';
|
|
3
4
|
import { InitRoutesOptions } from './types.mjs';
|
|
4
5
|
import '../types.mjs';
|
|
5
6
|
|
|
6
7
|
declare function getEmailAuthRoutes(options: InitRoutesOptions): {
|
|
7
|
-
GET: (req: NextRequest) => next_server.NextResponse<{
|
|
8
|
+
GET: (req: NextRequest) => Promise<next_server.NextResponse<{
|
|
8
9
|
accessToken: string | undefined;
|
|
9
10
|
refreshToken: string | undefined;
|
|
10
|
-
}
|
|
11
|
+
}>>;
|
|
11
12
|
POST: (req: NextRequest) => Promise<next_server.NextResponse<unknown> | undefined>;
|
|
12
13
|
PUT: (req: NextRequest) => Promise<next_server.NextResponse<unknown> | undefined>;
|
|
13
14
|
DELETE: (req: NextRequest) => Promise<next_server.NextResponse<{
|
|
14
15
|
accessToken: string | undefined;
|
|
15
16
|
refreshToken: string | undefined;
|
|
16
17
|
}>>;
|
|
17
|
-
getContext: (req: NextRequest) =>
|
|
18
|
-
userId: null;
|
|
19
|
-
isRefreshID?: undefined;
|
|
20
|
-
} | {
|
|
21
|
-
userId: number;
|
|
22
|
-
isRefreshID: boolean;
|
|
23
|
-
} | {
|
|
24
|
-
userId: number | undefined;
|
|
25
|
-
isRefreshID?: undefined;
|
|
26
|
-
};
|
|
18
|
+
getContext: (req: NextRequest) => Context;
|
|
27
19
|
};
|
|
28
20
|
|
|
29
21
|
export { getEmailAuthRoutes };
|
|
@@ -1,29 +1,21 @@
|
|
|
1
1
|
import * as next_server from 'next/server';
|
|
2
2
|
import { NextRequest } from 'next/server';
|
|
3
|
+
import { Context } from '../../graphql/types.js';
|
|
3
4
|
import { InitRoutesOptions } from './types.js';
|
|
4
5
|
import '../types.js';
|
|
5
6
|
|
|
6
7
|
declare function getEmailAuthRoutes(options: InitRoutesOptions): {
|
|
7
|
-
GET: (req: NextRequest) => next_server.NextResponse<{
|
|
8
|
+
GET: (req: NextRequest) => Promise<next_server.NextResponse<{
|
|
8
9
|
accessToken: string | undefined;
|
|
9
10
|
refreshToken: string | undefined;
|
|
10
|
-
}
|
|
11
|
+
}>>;
|
|
11
12
|
POST: (req: NextRequest) => Promise<next_server.NextResponse<unknown> | undefined>;
|
|
12
13
|
PUT: (req: NextRequest) => Promise<next_server.NextResponse<unknown> | undefined>;
|
|
13
14
|
DELETE: (req: NextRequest) => Promise<next_server.NextResponse<{
|
|
14
15
|
accessToken: string | undefined;
|
|
15
16
|
refreshToken: string | undefined;
|
|
16
17
|
}>>;
|
|
17
|
-
getContext: (req: NextRequest) =>
|
|
18
|
-
userId: null;
|
|
19
|
-
isRefreshID?: undefined;
|
|
20
|
-
} | {
|
|
21
|
-
userId: number;
|
|
22
|
-
isRefreshID: boolean;
|
|
23
|
-
} | {
|
|
24
|
-
userId: number | undefined;
|
|
25
|
-
isRefreshID?: undefined;
|
|
26
|
-
};
|
|
18
|
+
getContext: (req: NextRequest) => Context;
|
|
27
19
|
};
|
|
28
20
|
|
|
29
21
|
export { getEmailAuthRoutes };
|
|
@@ -102,42 +102,49 @@ async function verifyCaptcha(token, secret) {
|
|
|
102
102
|
}
|
|
103
103
|
return false;
|
|
104
104
|
}
|
|
105
|
-
var
|
|
105
|
+
var getContext = (refreshKey, signingKey, req) => {
|
|
106
106
|
const bearer = req.headers.get("authorization");
|
|
107
107
|
if (!bearer) {
|
|
108
108
|
const refresh = req.cookies.get("refresh")?.value;
|
|
109
109
|
const userId = getUserIdFromRefreshToken(refreshKey, refresh);
|
|
110
|
-
if (userId) return {
|
|
111
|
-
return null;
|
|
110
|
+
if (userId) return { userId, isRefreshID: true };
|
|
111
|
+
return { userId: null };
|
|
112
112
|
}
|
|
113
113
|
const token = bearer.slice(7);
|
|
114
114
|
try {
|
|
115
115
|
const res = verify2(token, signingKey);
|
|
116
116
|
if (typeof res === "string") {
|
|
117
|
-
return null;
|
|
117
|
+
return { userId: null };
|
|
118
118
|
}
|
|
119
119
|
return {
|
|
120
|
-
|
|
120
|
+
userId: res.id
|
|
121
121
|
};
|
|
122
122
|
} catch {
|
|
123
123
|
}
|
|
124
|
-
return null;
|
|
124
|
+
return { userId: null };
|
|
125
125
|
};
|
|
126
126
|
|
|
127
127
|
// src/auth/email/routes/delete.ts
|
|
128
128
|
var getDeleteRoute = (options) => async (req) => {
|
|
129
|
-
if (options.onLogout)
|
|
129
|
+
if (options.onLogout) {
|
|
130
|
+
const ctx = await getContext(options.refreshKey, options.signingKey, req);
|
|
131
|
+
await options.onLogout?.(ctx.userId, req);
|
|
132
|
+
}
|
|
130
133
|
return getTokenizedResponse(void 0, "");
|
|
131
134
|
};
|
|
132
135
|
|
|
133
136
|
// src/auth/email/routes/get.ts
|
|
134
|
-
var getGetRoute = (options) => (req) => {
|
|
137
|
+
var getGetRoute = (options) => async (req) => {
|
|
135
138
|
const refresh = req.cookies.get("refresh")?.value;
|
|
136
139
|
const userID = getUserIdFromRefreshToken(options.refreshKey, refresh);
|
|
137
|
-
if (userID)
|
|
140
|
+
if (userID) {
|
|
141
|
+
if (options.onRefresh) {
|
|
142
|
+
await options.onRefresh?.(userID, req);
|
|
143
|
+
}
|
|
138
144
|
return getTokenizedResponse(
|
|
139
145
|
generateAccessToken(userID, options.signingKey)
|
|
140
146
|
);
|
|
147
|
+
}
|
|
141
148
|
return getTokenizedResponse();
|
|
142
149
|
};
|
|
143
150
|
|
|
@@ -162,7 +169,9 @@ var getPostRoute = (options) => async (req) => {
|
|
|
162
169
|
password: encryptedPassword
|
|
163
170
|
});
|
|
164
171
|
if (newUser) {
|
|
165
|
-
options.onSignUp
|
|
172
|
+
if (options.onSignUp) {
|
|
173
|
+
await options.onSignUp?.(newUser.id, req);
|
|
174
|
+
}
|
|
166
175
|
return getTokenizedResponse(
|
|
167
176
|
generateAccessToken(newUser.id, options.signingKey),
|
|
168
177
|
generateRefreshToken(newUser.id, options.refreshKey)
|
|
@@ -179,6 +188,9 @@ var getPutRoute = (options) => async (req) => {
|
|
|
179
188
|
if (!user)
|
|
180
189
|
return handleError(400, "A user does not exist", options.onError);
|
|
181
190
|
if (await verifyUser(user, data.password)) {
|
|
191
|
+
if (options.onLogin) {
|
|
192
|
+
await options.onLogin?.(user.id, req);
|
|
193
|
+
}
|
|
182
194
|
return getTokenizedResponse(
|
|
183
195
|
generateAccessToken(user.id, options.signingKey),
|
|
184
196
|
generateRefreshToken(user.id, options.refreshKey)
|
|
@@ -194,14 +206,7 @@ function getEmailAuthRoutes(options) {
|
|
|
194
206
|
POST: getPostRoute(options),
|
|
195
207
|
PUT: getPutRoute(options),
|
|
196
208
|
DELETE: getDeleteRoute(options),
|
|
197
|
-
getContext: (req) =>
|
|
198
|
-
const ids = getUserContext(options.refreshKey, options.signingKey, req);
|
|
199
|
-
if (!ids) return { userId: null };
|
|
200
|
-
if (ids.refreshUserID) {
|
|
201
|
-
return { userId: ids.refreshUserID, isRefreshID: true };
|
|
202
|
-
}
|
|
203
|
-
return { userId: ids.accessUserId };
|
|
204
|
-
}
|
|
209
|
+
getContext: (req) => getContext(options.refreshKey, options.signingKey, req)
|
|
205
210
|
};
|
|
206
211
|
}
|
|
207
212
|
export {
|
|
@@ -49,10 +49,54 @@ function getTokenizedResponse(accessToken, refreshToken) {
|
|
|
49
49
|
}
|
|
50
50
|
return response;
|
|
51
51
|
}
|
|
52
|
+
function getUserIdFromRefreshToken(refreshKey, refreshToken) {
|
|
53
|
+
if (refreshToken)
|
|
54
|
+
try {
|
|
55
|
+
const decoded = (0, import_jsonwebtoken.verify)(refreshToken, refreshKey);
|
|
56
|
+
if (typeof decoded !== "string" && typeof decoded.id === "number")
|
|
57
|
+
return decoded.id;
|
|
58
|
+
} catch (e) {
|
|
59
|
+
if (!(e instanceof import_jsonwebtoken.JsonWebTokenError)) console.error(e, "errors");
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/auth/email/utils.ts
|
|
66
|
+
var import_jsonwebtoken2 = require("jsonwebtoken");
|
|
67
|
+
|
|
68
|
+
// src/auth/utils/errors.ts
|
|
69
|
+
var import_server2 = require("next/server");
|
|
70
|
+
|
|
71
|
+
// src/auth/email/utils.ts
|
|
72
|
+
var getContext = (refreshKey, signingKey, req) => {
|
|
73
|
+
const bearer = req.headers.get("authorization");
|
|
74
|
+
if (!bearer) {
|
|
75
|
+
const refresh = req.cookies.get("refresh")?.value;
|
|
76
|
+
const userId = getUserIdFromRefreshToken(refreshKey, refresh);
|
|
77
|
+
if (userId) return { userId, isRefreshID: true };
|
|
78
|
+
return { userId: null };
|
|
79
|
+
}
|
|
80
|
+
const token = bearer.slice(7);
|
|
81
|
+
try {
|
|
82
|
+
const res = (0, import_jsonwebtoken2.verify)(token, signingKey);
|
|
83
|
+
if (typeof res === "string") {
|
|
84
|
+
return { userId: null };
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
userId: res.id
|
|
88
|
+
};
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
return { userId: null };
|
|
92
|
+
};
|
|
52
93
|
|
|
53
94
|
// src/auth/email/routes/delete.ts
|
|
54
95
|
var getDeleteRoute = (options) => async (req) => {
|
|
55
|
-
if (options.onLogout)
|
|
96
|
+
if (options.onLogout) {
|
|
97
|
+
const ctx = await getContext(options.refreshKey, options.signingKey, req);
|
|
98
|
+
await options.onLogout?.(ctx.userId, req);
|
|
99
|
+
}
|
|
56
100
|
return getTokenizedResponse(void 0, "");
|
|
57
101
|
};
|
|
58
102
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -23,10 +23,54 @@ function getTokenizedResponse(accessToken, refreshToken) {
|
|
|
23
23
|
}
|
|
24
24
|
return response;
|
|
25
25
|
}
|
|
26
|
+
function getUserIdFromRefreshToken(refreshKey, refreshToken) {
|
|
27
|
+
if (refreshToken)
|
|
28
|
+
try {
|
|
29
|
+
const decoded = verify(refreshToken, refreshKey);
|
|
30
|
+
if (typeof decoded !== "string" && typeof decoded.id === "number")
|
|
31
|
+
return decoded.id;
|
|
32
|
+
} catch (e) {
|
|
33
|
+
if (!(e instanceof JsonWebTokenError)) console.error(e, "errors");
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/auth/email/utils.ts
|
|
40
|
+
import { verify as verify2 } from "jsonwebtoken";
|
|
41
|
+
|
|
42
|
+
// src/auth/utils/errors.ts
|
|
43
|
+
import { NextResponse as NextResponse2 } from "next/server";
|
|
44
|
+
|
|
45
|
+
// src/auth/email/utils.ts
|
|
46
|
+
var getContext = (refreshKey, signingKey, req) => {
|
|
47
|
+
const bearer = req.headers.get("authorization");
|
|
48
|
+
if (!bearer) {
|
|
49
|
+
const refresh = req.cookies.get("refresh")?.value;
|
|
50
|
+
const userId = getUserIdFromRefreshToken(refreshKey, refresh);
|
|
51
|
+
if (userId) return { userId, isRefreshID: true };
|
|
52
|
+
return { userId: null };
|
|
53
|
+
}
|
|
54
|
+
const token = bearer.slice(7);
|
|
55
|
+
try {
|
|
56
|
+
const res = verify2(token, signingKey);
|
|
57
|
+
if (typeof res === "string") {
|
|
58
|
+
return { userId: null };
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
userId: res.id
|
|
62
|
+
};
|
|
63
|
+
} catch {
|
|
64
|
+
}
|
|
65
|
+
return { userId: null };
|
|
66
|
+
};
|
|
26
67
|
|
|
27
68
|
// src/auth/email/routes/delete.ts
|
|
28
69
|
var getDeleteRoute = (options) => async (req) => {
|
|
29
|
-
if (options.onLogout)
|
|
70
|
+
if (options.onLogout) {
|
|
71
|
+
const ctx = await getContext(options.refreshKey, options.signingKey, req);
|
|
72
|
+
await options.onLogout?.(ctx.userId, req);
|
|
73
|
+
}
|
|
30
74
|
return getTokenizedResponse(void 0, "");
|
|
31
75
|
};
|
|
32
76
|
export {
|
|
@@ -68,13 +68,17 @@ function getUserIdFromRefreshToken(refreshKey, refreshToken) {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// src/auth/email/routes/get.ts
|
|
71
|
-
var getGetRoute = (options) => (req) => {
|
|
71
|
+
var getGetRoute = (options) => async (req) => {
|
|
72
72
|
const refresh = req.cookies.get("refresh")?.value;
|
|
73
73
|
const userID = getUserIdFromRefreshToken(options.refreshKey, refresh);
|
|
74
|
-
if (userID)
|
|
74
|
+
if (userID) {
|
|
75
|
+
if (options.onRefresh) {
|
|
76
|
+
await options.onRefresh?.(userID, req);
|
|
77
|
+
}
|
|
75
78
|
return getTokenizedResponse(
|
|
76
79
|
generateAccessToken(userID, options.signingKey)
|
|
77
80
|
);
|
|
81
|
+
}
|
|
78
82
|
return getTokenizedResponse();
|
|
79
83
|
};
|
|
80
84
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -3,9 +3,9 @@ import { NextRequest } from 'next/server';
|
|
|
3
3
|
import { InitRoutesOptions } from '../types.mjs';
|
|
4
4
|
import '../../types.mjs';
|
|
5
5
|
|
|
6
|
-
declare const getGetRoute: (options: InitRoutesOptions) => (req: NextRequest) => next_server.NextResponse<{
|
|
6
|
+
declare const getGetRoute: (options: InitRoutesOptions) => (req: NextRequest) => Promise<next_server.NextResponse<{
|
|
7
7
|
accessToken: string | undefined;
|
|
8
8
|
refreshToken: string | undefined;
|
|
9
|
-
}
|
|
9
|
+
}>>;
|
|
10
10
|
|
|
11
11
|
export { getGetRoute };
|
|
@@ -3,9 +3,9 @@ import { NextRequest } from 'next/server';
|
|
|
3
3
|
import { InitRoutesOptions } from '../types.js';
|
|
4
4
|
import '../../types.js';
|
|
5
5
|
|
|
6
|
-
declare const getGetRoute: (options: InitRoutesOptions) => (req: NextRequest) => next_server.NextResponse<{
|
|
6
|
+
declare const getGetRoute: (options: InitRoutesOptions) => (req: NextRequest) => Promise<next_server.NextResponse<{
|
|
7
7
|
accessToken: string | undefined;
|
|
8
8
|
refreshToken: string | undefined;
|
|
9
|
-
}
|
|
9
|
+
}>>;
|
|
10
10
|
|
|
11
11
|
export { getGetRoute };
|
|
@@ -42,13 +42,17 @@ function getUserIdFromRefreshToken(refreshKey, refreshToken) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// src/auth/email/routes/get.ts
|
|
45
|
-
var getGetRoute = (options) => (req) => {
|
|
45
|
+
var getGetRoute = (options) => async (req) => {
|
|
46
46
|
const refresh = req.cookies.get("refresh")?.value;
|
|
47
47
|
const userID = getUserIdFromRefreshToken(options.refreshKey, refresh);
|
|
48
|
-
if (userID)
|
|
48
|
+
if (userID) {
|
|
49
|
+
if (options.onRefresh) {
|
|
50
|
+
await options.onRefresh?.(userID, req);
|
|
51
|
+
}
|
|
49
52
|
return getTokenizedResponse(
|
|
50
53
|
generateAccessToken(userID, options.signingKey)
|
|
51
54
|
);
|
|
55
|
+
}
|
|
52
56
|
return getTokenizedResponse();
|
|
53
57
|
};
|
|
54
58
|
export {
|
|
@@ -136,7 +136,9 @@ var getPostRoute = (options) => async (req) => {
|
|
|
136
136
|
password: encryptedPassword
|
|
137
137
|
});
|
|
138
138
|
if (newUser) {
|
|
139
|
-
options.onSignUp
|
|
139
|
+
if (options.onSignUp) {
|
|
140
|
+
await options.onSignUp?.(newUser.id, req);
|
|
141
|
+
}
|
|
140
142
|
return getTokenizedResponse(
|
|
141
143
|
generateAccessToken(newUser.id, options.signingKey),
|
|
142
144
|
generateRefreshToken(newUser.id, options.refreshKey)
|
|
@@ -112,7 +112,9 @@ var getPostRoute = (options) => async (req) => {
|
|
|
112
112
|
password: encryptedPassword
|
|
113
113
|
});
|
|
114
114
|
if (newUser) {
|
|
115
|
-
options.onSignUp
|
|
115
|
+
if (options.onSignUp) {
|
|
116
|
+
await options.onSignUp?.(newUser.id, req);
|
|
117
|
+
}
|
|
116
118
|
return getTokenizedResponse(
|
|
117
119
|
generateAccessToken(newUser.id, options.signingKey),
|
|
118
120
|
generateRefreshToken(newUser.id, options.refreshKey)
|
|
@@ -123,6 +123,9 @@ var getPutRoute = (options) => async (req) => {
|
|
|
123
123
|
if (!user)
|
|
124
124
|
return handleError(400, "A user does not exist", options.onError);
|
|
125
125
|
if (await verifyUser(user, data.password)) {
|
|
126
|
+
if (options.onLogin) {
|
|
127
|
+
await options.onLogin?.(user.id, req);
|
|
128
|
+
}
|
|
126
129
|
return getTokenizedResponse(
|
|
127
130
|
generateAccessToken(user.id, options.signingKey),
|
|
128
131
|
generateRefreshToken(user.id, options.refreshKey)
|
|
@@ -97,6 +97,9 @@ var getPutRoute = (options) => async (req) => {
|
|
|
97
97
|
if (!user)
|
|
98
98
|
return handleError(400, "A user does not exist", options.onError);
|
|
99
99
|
if (await verifyUser(user, data.password)) {
|
|
100
|
+
if (options.onLogin) {
|
|
101
|
+
await options.onLogin?.(user.id, req);
|
|
102
|
+
}
|
|
100
103
|
return getTokenizedResponse(
|
|
101
104
|
generateAccessToken(user.id, options.signingKey),
|
|
102
105
|
generateRefreshToken(user.id, options.refreshKey)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { NextRequest } from 'next/server';
|
|
1
2
|
import { UserOutput, UserInput, ErrorHandler } from '../types.mjs';
|
|
2
|
-
import 'next/server';
|
|
3
3
|
|
|
4
4
|
type InitRoutesOptions = {
|
|
5
5
|
getUser: (email: string) => Promise<UserOutput | undefined>;
|
|
@@ -8,8 +8,10 @@ type InitRoutesOptions = {
|
|
|
8
8
|
signingKey: string;
|
|
9
9
|
refreshKey: string;
|
|
10
10
|
turnstileKey?: string;
|
|
11
|
-
onSignUp?: (
|
|
12
|
-
|
|
11
|
+
onSignUp?: (userId: number | null, req: NextRequest) => Promise<void>;
|
|
12
|
+
onLogin?: (userId: number | null, req: NextRequest) => Promise<void>;
|
|
13
|
+
onRefresh?: (userId: number | null, req: NextRequest) => Promise<void>;
|
|
14
|
+
onLogout?: (userId: number | null, req: NextRequest) => Promise<void>;
|
|
13
15
|
};
|
|
14
16
|
|
|
15
17
|
export type { InitRoutesOptions };
|