@convex-dev/better-auth 0.9.5 → 0.9.7-alpha.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 +0 -41
- package/dist/commonjs/client/adapter.d.ts.map +1 -1
- package/dist/commonjs/client/adapter.js +1 -0
- package/dist/commonjs/client/adapter.js.map +1 -1
- package/dist/commonjs/client/adapterUtils.d.ts +6 -6
- package/dist/commonjs/client/createSchema.d.ts +2 -2
- package/dist/commonjs/client/createSchema.d.ts.map +1 -1
- package/dist/commonjs/client/createSchema.js +10 -5
- package/dist/commonjs/client/createSchema.js.map +1 -1
- package/dist/commonjs/client/index.d.ts +18 -15
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/component/adapter.d.ts +6 -6
- package/dist/commonjs/react-start/index.d.ts +17 -0
- package/dist/commonjs/react-start/index.d.ts.map +1 -1
- package/dist/commonjs/react-start/index.js +44 -0
- package/dist/commonjs/react-start/index.js.map +1 -1
- package/dist/esm/client/adapter.d.ts.map +1 -1
- package/dist/esm/client/adapter.js +1 -0
- package/dist/esm/client/adapter.js.map +1 -1
- package/dist/esm/client/adapterUtils.d.ts +6 -6
- package/dist/esm/client/createSchema.d.ts +2 -2
- package/dist/esm/client/createSchema.d.ts.map +1 -1
- package/dist/esm/client/createSchema.js +10 -5
- package/dist/esm/client/createSchema.js.map +1 -1
- package/dist/esm/client/index.d.ts +18 -15
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/component/adapter.d.ts +6 -6
- package/dist/esm/react-start/index.d.ts +17 -0
- package/dist/esm/react-start/index.d.ts.map +1 -1
- package/dist/esm/react-start/index.js +44 -0
- package/dist/esm/react-start/index.js.map +1 -1
- package/package.json +3 -2
- package/src/client/adapter.ts +1 -0
- package/src/client/createSchema.ts +18 -11
- package/src/client/index.ts +22 -15
- package/src/react-start/index.ts +61 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,eAAO,MAAM,aAAa,GAAI,SAAS,SAAS,gBAAgB,EAC9D,YAAY,UAAU,CAAC,SAAS,CAAC,WAKlC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,gBAAgB,EAC/D,YAAY,UAAU,CAAC,SAAS,CAAC;;;CAOlC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,SAAS,SAAS,gBAAgB,EACvE,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS;eAa3C,KAAK,SAAS,iBAAiB,CAAC,OAAO,CAAC,EACxC,OAAO,SAAS,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,SAEpC,KAAK,QACN,OAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;kBAInC,QAAQ,SAAS,iBAAiB,CAAC,UAAU,CAAC,oBAC9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,YAEjC,QAAQ,QACZ,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAItC,MAAM,SAAS,iBAAiB,CAAC,QAAQ,CAAC,oBAC1B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,UAEnC,MAAM,QACR,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;EAIzC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,OAAO,UAAU,CAAC,EAEvE,SAAS,OAAO,EAChB,OAAO;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;EAuBF,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,OAAO,EAChB,OAAO;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;;cA0BF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,gBAAoB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO;;;aAahD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,SAAS,SAAS,gBAAgB,EAC9D,SAAS,OAAO,EAChB,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC/C,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;;;EASlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,OAAO,EAChB,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,sBAkBrD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createCookieGetter } from "better-auth/cookies";
|
|
2
2
|
import { betterFetch } from "@better-fetch/fetch";
|
|
3
|
+
import * as jose from "jose";
|
|
3
4
|
import { JWT_COOKIE_NAME } from "../plugins/convex/index.js";
|
|
4
5
|
import { ConvexHttpClient } from "convex/browser";
|
|
5
6
|
import { getStaticAuth } from "../client/index.js";
|
|
@@ -8,6 +9,13 @@ export const getCookieName = (createAuth) => {
|
|
|
8
9
|
const cookie = createCookie(JWT_COOKIE_NAME);
|
|
9
10
|
return cookie.name;
|
|
10
11
|
};
|
|
12
|
+
export const getCookieNames = (createAuth) => {
|
|
13
|
+
const createCookie = createCookieGetter(getStaticAuth(createAuth).options);
|
|
14
|
+
return {
|
|
15
|
+
convexJwt: createCookie(JWT_COOKIE_NAME).name,
|
|
16
|
+
sessionToken: createCookie("session_token").name,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
11
19
|
export const setupFetchClient = async (createAuth, getCookie) => {
|
|
12
20
|
const createClient = () => {
|
|
13
21
|
const sessionCookieName = getCookieName(createAuth);
|
|
@@ -48,6 +56,42 @@ export const fetchSession = async (request, opts) => {
|
|
|
48
56
|
session,
|
|
49
57
|
};
|
|
50
58
|
};
|
|
59
|
+
export const fetchAuth = async (request, opts) => {
|
|
60
|
+
if (!request) {
|
|
61
|
+
throw new Error("No request found");
|
|
62
|
+
}
|
|
63
|
+
const convexSiteUrl = opts?.convexSiteUrl ?? process.env.VITE_CONVEX_SITE_URL;
|
|
64
|
+
if (!convexSiteUrl) {
|
|
65
|
+
throw new Error("VITE_CONVEX_SITE_URL is not set");
|
|
66
|
+
}
|
|
67
|
+
const { data } = await betterFetch("/api/auth/convex/token", {
|
|
68
|
+
baseURL: convexSiteUrl,
|
|
69
|
+
headers: {
|
|
70
|
+
cookie: request.headers.get("cookie") ?? "",
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
if (!data?.token) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const claims = jose.decodeJwt(data.token);
|
|
77
|
+
return {
|
|
78
|
+
token: data.token,
|
|
79
|
+
userId: claims.sub,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
export const getAuthFromCookie = (cookie, { tolerance = 10 } = {}) => {
|
|
83
|
+
if (!cookie) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const claims = jose.decodeJwt(cookie);
|
|
87
|
+
const exp = claims?.exp;
|
|
88
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
89
|
+
const isExpired = exp ? now > exp + tolerance : true;
|
|
90
|
+
if (isExpired) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
return { userId: claims?.sub, token: cookie };
|
|
94
|
+
};
|
|
51
95
|
export const getAuth = async (request, getCookie, createAuth, opts) => {
|
|
52
96
|
const sessionCookieName = getCookieName(createAuth);
|
|
53
97
|
const token = getCookie(sessionCookieName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/get-convex/better-auth/issues"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.9.
|
|
9
|
+
"version": "0.9.7-alpha.0",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"keywords": [
|
|
12
12
|
"convex",
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
},
|
|
155
155
|
"peerDependencies": {
|
|
156
156
|
"better-auth": "1.3.27",
|
|
157
|
-
"convex": "^1.
|
|
157
|
+
"convex": "^1.28.0",
|
|
158
158
|
"react": "^18.3.1 || ^19.0.0",
|
|
159
159
|
"react-dom": "^18.3.1 || ^19.0.0"
|
|
160
160
|
},
|
|
@@ -186,6 +186,7 @@
|
|
|
186
186
|
"dependencies": {
|
|
187
187
|
"common-tags": "^1.8.2",
|
|
188
188
|
"convex-helpers": "^0.1.95",
|
|
189
|
+
"jose": "^6.1.0",
|
|
189
190
|
"remeda": "^2.32.0",
|
|
190
191
|
"semver": "^7.7.3",
|
|
191
192
|
"type-fest": "^4.39.1",
|
package/src/client/adapter.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BetterAuthDBSchema, DBFieldAttribute } from "better-auth/db";
|
|
2
2
|
|
|
3
3
|
// Manually add fields to index on for schema generation,
|
|
4
4
|
// all fields in the schema specialFields are automatically indexed
|
|
@@ -13,14 +13,14 @@ export const indexFields = {
|
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
// Return map of unique, sortable, and reference fields
|
|
16
|
-
const specialFields = (tables:
|
|
16
|
+
const specialFields = (tables: BetterAuthDBSchema) =>
|
|
17
17
|
Object.fromEntries(
|
|
18
18
|
Object.entries(tables)
|
|
19
19
|
.map(([key, table]) => {
|
|
20
20
|
const fields = Object.fromEntries(
|
|
21
21
|
Object.entries(table.fields)
|
|
22
22
|
.map(([fieldKey, field]) => [
|
|
23
|
-
fieldKey,
|
|
23
|
+
field.fieldName ?? fieldKey,
|
|
24
24
|
{
|
|
25
25
|
...(field.sortable ? { sortable: true } : {}),
|
|
26
26
|
...(field.unique ? { unique: true } : {}),
|
|
@@ -38,10 +38,15 @@ const specialFields = (tables: BetterAuthDbSchema) =>
|
|
|
38
38
|
)
|
|
39
39
|
);
|
|
40
40
|
|
|
41
|
-
const mergedIndexFields = (tables:
|
|
41
|
+
const mergedIndexFields = (tables: BetterAuthDBSchema) =>
|
|
42
42
|
Object.fromEntries(
|
|
43
|
-
Object.entries(tables).map(([key]) => {
|
|
44
|
-
const manualIndexes =
|
|
43
|
+
Object.entries(tables).map(([key, table]) => {
|
|
44
|
+
const manualIndexes =
|
|
45
|
+
indexFields[key as keyof typeof indexFields]?.map((index) => {
|
|
46
|
+
return typeof index === "string"
|
|
47
|
+
? table.fields[index]?.fieldName ?? index
|
|
48
|
+
: index.map((i) => table.fields[i]?.fieldName ?? i);
|
|
49
|
+
}) || [];
|
|
45
50
|
const specialFieldIndexes = Object.keys(
|
|
46
51
|
specialFields(tables)[key as keyof ReturnType<typeof specialFields>] ||
|
|
47
52
|
{}
|
|
@@ -59,7 +64,7 @@ export const createSchema = async ({
|
|
|
59
64
|
file,
|
|
60
65
|
tables,
|
|
61
66
|
}: {
|
|
62
|
-
tables:
|
|
67
|
+
tables: BetterAuthDBSchema;
|
|
63
68
|
file?: string;
|
|
64
69
|
}) => {
|
|
65
70
|
// stop convex esbuild from throwing over this import, only runs
|
|
@@ -94,12 +99,13 @@ export const tables = {
|
|
|
94
99
|
Object.entries(table.fields).filter(([key]) => key !== "id")
|
|
95
100
|
);
|
|
96
101
|
|
|
97
|
-
function getType(name: string, field:
|
|
102
|
+
function getType(name: string, field: DBFieldAttribute) {
|
|
98
103
|
const type = field.type as
|
|
99
104
|
| "string"
|
|
100
105
|
| "number"
|
|
101
106
|
| "boolean"
|
|
102
107
|
| "date"
|
|
108
|
+
| "json"
|
|
103
109
|
| `${"string" | "number"}[]`;
|
|
104
110
|
|
|
105
111
|
const typeMap: Record<typeof type, string> = {
|
|
@@ -107,6 +113,7 @@ export const tables = {
|
|
|
107
113
|
boolean: `v.boolean()`,
|
|
108
114
|
number: `v.number()`,
|
|
109
115
|
date: `v.number()`,
|
|
116
|
+
json: `v.string()`,
|
|
110
117
|
"number[]": `v.array(v.number())`,
|
|
111
118
|
"string[]": `v.array(v.string())`,
|
|
112
119
|
} as const;
|
|
@@ -115,7 +122,7 @@ export const tables = {
|
|
|
115
122
|
|
|
116
123
|
const indexes =
|
|
117
124
|
mergedIndexFields(tables)[
|
|
118
|
-
|
|
125
|
+
tableKey as keyof typeof mergedIndexFields
|
|
119
126
|
]?.map((index) => {
|
|
120
127
|
const indexArray = Array.isArray(index) ? index.sort() : [index];
|
|
121
128
|
const indexName = indexArray.join("_");
|
|
@@ -126,12 +133,12 @@ export const tables = {
|
|
|
126
133
|
${Object.keys(fields)
|
|
127
134
|
.map((field) => {
|
|
128
135
|
const attr = fields[field]!;
|
|
129
|
-
const type = getType(field, attr as
|
|
136
|
+
const type = getType(field, attr as DBFieldAttribute);
|
|
130
137
|
const optional = (fieldSchema: string) =>
|
|
131
138
|
attr.required
|
|
132
139
|
? fieldSchema
|
|
133
140
|
: `v.optional(v.union(v.null(), ${fieldSchema}))`;
|
|
134
|
-
return ` ${field}: ${optional(type)},`;
|
|
141
|
+
return ` ${attr.fieldName ?? field}: ${optional(type)},`;
|
|
135
142
|
})
|
|
136
143
|
.join("\n")}
|
|
137
144
|
})${indexes.length > 0 ? `\n ${indexes.join("\n ")}` : ""},\n`;
|
package/src/client/index.ts
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
} from "convex/server";
|
|
20
20
|
import { type GenericId, Infer, v } from "convex/values";
|
|
21
21
|
import { convexAdapter } from "./adapter";
|
|
22
|
-
import { AdapterInstance, betterAuth } from "better-auth";
|
|
22
|
+
import { AdapterInstance, Auth, betterAuth } from "better-auth";
|
|
23
23
|
import { asyncMap } from "convex-helpers";
|
|
24
24
|
import { partial } from "convex-helpers/validators";
|
|
25
25
|
import {
|
|
@@ -44,16 +44,19 @@ export type CreateAdapter = <Ctx extends GenericCtx<GenericDataModel>>(
|
|
|
44
44
|
ctx: Ctx
|
|
45
45
|
) => AdapterInstance;
|
|
46
46
|
|
|
47
|
-
export type CreateAuth<
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
export type CreateAuth<
|
|
48
|
+
DataModel extends GenericDataModel,
|
|
49
|
+
A extends ReturnType<typeof betterAuth> = Auth,
|
|
50
|
+
> =
|
|
51
|
+
| ((ctx: GenericCtx<DataModel>) => A)
|
|
52
|
+
| ((ctx: GenericCtx<DataModel>, opts?: { optionsOnly?: boolean }) => A);
|
|
53
53
|
|
|
54
|
-
export const getStaticAuth = <
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
export const getStaticAuth = <
|
|
55
|
+
DataModel extends GenericDataModel,
|
|
56
|
+
Auth extends ReturnType<typeof betterAuth>,
|
|
57
|
+
>(
|
|
58
|
+
createAuth: CreateAuth<DataModel, Auth>
|
|
59
|
+
): Auth => {
|
|
57
60
|
return createAuth({} as any, { optionsOnly: true });
|
|
58
61
|
};
|
|
59
62
|
|
|
@@ -417,11 +420,11 @@ export type Triggers<
|
|
|
417
420
|
) => Promise<void>;
|
|
418
421
|
onUpdate?: <Ctx extends GenericMutationCtx<DataModel>>(
|
|
419
422
|
ctx: Ctx,
|
|
420
|
-
|
|
423
|
+
newDoc: Infer<Schema["tables"][K]["validator"]> & {
|
|
421
424
|
_id: string;
|
|
422
425
|
_creationTime: number;
|
|
423
426
|
},
|
|
424
|
-
|
|
427
|
+
oldDoc: Infer<Schema["tables"][K]["validator"]> & {
|
|
425
428
|
_id: string;
|
|
426
429
|
_creationTime: number;
|
|
427
430
|
}
|
|
@@ -451,10 +454,14 @@ export const createClient = <
|
|
|
451
454
|
local?: {
|
|
452
455
|
schema?: Schema;
|
|
453
456
|
};
|
|
454
|
-
authFunctions?: AuthFunctions;
|
|
455
457
|
verbose?: boolean;
|
|
456
|
-
|
|
457
|
-
|
|
458
|
+
} & (
|
|
459
|
+
| {
|
|
460
|
+
triggers: Triggers<DataModel, Schema>;
|
|
461
|
+
authFunctions: AuthFunctions;
|
|
462
|
+
}
|
|
463
|
+
| { triggers?: undefined }
|
|
464
|
+
)
|
|
458
465
|
) => {
|
|
459
466
|
type BetterAuthDataModel = DataModelFromSchemaDefinition<Schema>;
|
|
460
467
|
|
package/src/react-start/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
2
|
import { createCookieGetter } from "better-auth/cookies";
|
|
3
3
|
import { betterFetch } from "@better-fetch/fetch";
|
|
4
|
+
import * as jose from "jose";
|
|
4
5
|
import {
|
|
5
6
|
FunctionReference,
|
|
6
7
|
FunctionReturnType,
|
|
@@ -19,6 +20,16 @@ export const getCookieName = <DataModel extends GenericDataModel>(
|
|
|
19
20
|
return cookie.name;
|
|
20
21
|
};
|
|
21
22
|
|
|
23
|
+
export const getCookieNames = <DataModel extends GenericDataModel>(
|
|
24
|
+
createAuth: CreateAuth<DataModel>
|
|
25
|
+
) => {
|
|
26
|
+
const createCookie = createCookieGetter(getStaticAuth(createAuth).options);
|
|
27
|
+
return {
|
|
28
|
+
convexJwt: createCookie(JWT_COOKIE_NAME).name,
|
|
29
|
+
sessionToken: createCookie("session_token").name,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
22
33
|
export const setupFetchClient = async <DataModel extends GenericDataModel>(
|
|
23
34
|
createAuth: CreateAuth<DataModel>,
|
|
24
35
|
getCookie: (name: string) => string | undefined
|
|
@@ -95,6 +106,56 @@ export const fetchSession = async <
|
|
|
95
106
|
};
|
|
96
107
|
};
|
|
97
108
|
|
|
109
|
+
export const fetchAuth = async (
|
|
110
|
+
request: Request,
|
|
111
|
+
opts?: {
|
|
112
|
+
convexSiteUrl?: string;
|
|
113
|
+
verbose?: boolean;
|
|
114
|
+
}
|
|
115
|
+
) => {
|
|
116
|
+
if (!request) {
|
|
117
|
+
throw new Error("No request found");
|
|
118
|
+
}
|
|
119
|
+
const convexSiteUrl = opts?.convexSiteUrl ?? process.env.VITE_CONVEX_SITE_URL;
|
|
120
|
+
if (!convexSiteUrl) {
|
|
121
|
+
throw new Error("VITE_CONVEX_SITE_URL is not set");
|
|
122
|
+
}
|
|
123
|
+
const { data } = await betterFetch<{ token: string }>(
|
|
124
|
+
"/api/auth/convex/token",
|
|
125
|
+
{
|
|
126
|
+
baseURL: convexSiteUrl,
|
|
127
|
+
headers: {
|
|
128
|
+
cookie: request.headers.get("cookie") ?? "",
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
if (!data?.token) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const claims = jose.decodeJwt(data.token);
|
|
136
|
+
return {
|
|
137
|
+
token: data.token,
|
|
138
|
+
userId: claims.sub,
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export const getAuthFromCookie = (
|
|
143
|
+
cookie?: string,
|
|
144
|
+
{ tolerance = 10 }: { tolerance?: number } = {}
|
|
145
|
+
) => {
|
|
146
|
+
if (!cookie) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const claims = jose.decodeJwt(cookie);
|
|
150
|
+
const exp = claims?.exp;
|
|
151
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
152
|
+
const isExpired = exp ? now > exp + tolerance : true;
|
|
153
|
+
if (isExpired) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
return { userId: claims?.sub, token: cookie };
|
|
157
|
+
};
|
|
158
|
+
|
|
98
159
|
export const getAuth = async <DataModel extends GenericDataModel>(
|
|
99
160
|
request: Request,
|
|
100
161
|
getCookie: (name: string) => string | undefined,
|