@supertokens/rownd-react 0.1.0-beta.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 +308 -0
- package/dist/components/RequireSignIn.d.ts +11 -0
- package/dist/components/RequireSignIn.js +18 -0
- package/dist/components/RequireSignIn.js.map +1 -0
- package/dist/components/SignedIn.d.ts +7 -0
- package/dist/components/SignedIn.js +11 -0
- package/dist/components/SignedIn.js.map +1 -0
- package/dist/components/SignedOut.d.ts +7 -0
- package/dist/components/SignedOut.js +11 -0
- package/dist/components/SignedOut.js.map +1 -0
- package/dist/context/HubScriptInjector/HubScriptInjector.d.ts +17 -0
- package/dist/context/HubScriptInjector/HubScriptInjector.js +34 -0
- package/dist/context/HubScriptInjector/HubScriptInjector.js.map +1 -0
- package/dist/context/HubScriptInjector/InternalProviderHubScriptInjector.d.ts +3 -0
- package/dist/context/HubScriptInjector/InternalProviderHubScriptInjector.js +19 -0
- package/dist/context/HubScriptInjector/InternalProviderHubScriptInjector.js.map +1 -0
- package/dist/context/InternalProvider.d.ts +9 -0
- package/dist/context/InternalProvider.js +13 -0
- package/dist/context/InternalProvider.js.map +1 -0
- package/dist/context/ReactRowndProvider.d.ts +4 -0
- package/dist/context/ReactRowndProvider.js +43 -0
- package/dist/context/ReactRowndProvider.js.map +1 -0
- package/dist/context/RowndContext.d.ts +33 -0
- package/dist/context/RowndContext.js +13 -0
- package/dist/context/RowndContext.js.map +1 -0
- package/dist/context/index.d.ts +7 -0
- package/dist/context/index.js +9 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/types.d.ts +112 -0
- package/dist/hooks/useHub.d.ts +48 -0
- package/dist/hooks/useHub.js +153 -0
- package/dist/hooks/useHub.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +13 -0
- package/dist/main.js.map +1 -0
- package/dist/next/RowndProvider.d.ts +5 -0
- package/dist/next/RowndProvider.js +9 -0
- package/dist/next/RowndProvider.js.map +1 -0
- package/dist/next/client/components/RequireSignIn.d.ts +5 -0
- package/dist/next/client/components/RequireSignIn.js +30 -0
- package/dist/next/client/components/RequireSignIn.js.map +1 -0
- package/dist/next/client/components/RowndServerStateSync.d.ts +2 -0
- package/dist/next/client/components/RowndServerStateSync.js +36 -0
- package/dist/next/client/components/RowndServerStateSync.js.map +1 -0
- package/dist/next/client/components/RowndServerStateSync.test.d.ts +1 -0
- package/dist/next/client/index.d.ts +5 -0
- package/dist/next/client/index.js +49 -0
- package/dist/next/client/index.js.map +1 -0
- package/dist/next/client/store/index.d.ts +3 -0
- package/dist/next/client/store/index.js +52 -0
- package/dist/next/client/store/index.js.map +1 -0
- package/dist/next/client/store/store.d.ts +13 -0
- package/dist/next/client/store/store.js +32 -0
- package/dist/next/client/store/store.js.map +1 -0
- package/dist/next/client/store/useStore.d.ts +3 -0
- package/dist/next/client/store/useStore.js +14 -0
- package/dist/next/client/store/useStore.js.map +1 -0
- package/dist/next/client/useRownd.d.ts +3 -0
- package/dist/next/client/useRownd.js +32 -0
- package/dist/next/client/useRownd.js.map +1 -0
- package/dist/next/client/withRowndRequireSignIn.d.ts +8 -0
- package/dist/next/client/withRowndRequireSignIn.js +19 -0
- package/dist/next/client/withRowndRequireSignIn.js.map +1 -0
- package/dist/next/index.d.ts +6 -0
- package/dist/next/server/getRowndAccessToken.d.ts +3 -0
- package/dist/next/server/getRowndAccessToken.js +11 -0
- package/dist/next/server/getRowndAccessToken.js.map +1 -0
- package/dist/next/server/getRowndUser.d.ts +11 -0
- package/dist/next/server/getRowndUser.js +11 -0
- package/dist/next/server/getRowndUser.js.map +1 -0
- package/dist/next/server/getRowndUserId.d.ts +3 -0
- package/dist/next/server/getRowndUserId.js +11 -0
- package/dist/next/server/getRowndUserId.js.map +1 -0
- package/dist/next/server/index.d.ts +8 -0
- package/dist/next/server/isAuthenticated.d.ts +3 -0
- package/dist/next/server/isAuthenticated.js +11 -0
- package/dist/next/server/isAuthenticated.js.map +1 -0
- package/dist/next/server/withRowndMiddleware.d.ts +4 -0
- package/dist/next/server/withRowndMiddleware.js +11 -0
- package/dist/next/server/withRowndMiddleware.js.map +1 -0
- package/dist/next/useRownd.d.ts +3 -0
- package/dist/next-server.d.ts +1 -0
- package/dist/next-server.js +15 -0
- package/dist/next-server.js.map +1 -0
- package/dist/next.d.ts +1 -0
- package/dist/next.js +11 -0
- package/dist/next.js.map +1 -0
- package/dist/remix/RemixRowndProvider.d.ts +5 -0
- package/dist/remix/RemixRowndProvider.js +28 -0
- package/dist/remix/RemixRowndProvider.js.map +1 -0
- package/dist/remix/client/RemixClientScript.d.ts +4 -0
- package/dist/remix/client/RemixClientScript.js +22 -0
- package/dist/remix/client/RemixClientScript.js.map +1 -0
- package/dist/remix/client/useRownd.d.ts +4 -0
- package/dist/remix/client/useRownd.js +35 -0
- package/dist/remix/client/useRownd.js.map +1 -0
- package/dist/remix/client/withRowndRequireSignIn.d.ts +4 -0
- package/dist/remix/client/withRowndRequireSignIn.js +27 -0
- package/dist/remix/client/withRowndRequireSignIn.js.map +1 -0
- package/dist/remix/index.d.ts +7 -0
- package/dist/remix/server/getRowndUser.d.ts +3 -0
- package/dist/remix/server/getRowndUser.js +11 -0
- package/dist/remix/server/getRowndUser.js.map +1 -0
- package/dist/remix/server/getRowndUserId.d.ts +1 -0
- package/dist/remix/server/getRowndUserId.js +8 -0
- package/dist/remix/server/getRowndUserId.js.map +1 -0
- package/dist/remix/server/index.d.ts +8 -0
- package/dist/remix/server/isAuthenticated.d.ts +1 -0
- package/dist/remix/server/isAuthenticated.js +8 -0
- package/dist/remix/server/isAuthenticated.js.map +1 -0
- package/dist/remix/server/withRowndActionHandler.d.ts +2 -0
- package/dist/remix/server/withRowndActionHandler.js +41 -0
- package/dist/remix/server/withRowndActionHandler.js.map +1 -0
- package/dist/remix/server/withRowndLoader.d.ts +13 -0
- package/dist/remix/server/withRowndLoader.js +19 -0
- package/dist/remix/server/withRowndLoader.js.map +1 -0
- package/dist/remix-server.d.ts +1 -0
- package/dist/remix-server.js +15 -0
- package/dist/remix-server.js.map +1 -0
- package/dist/remix.d.ts +1 -0
- package/dist/remix.js +17 -0
- package/dist/remix.js.map +1 -0
- package/dist/ssr/hooks/useCookie.d.ts +7 -0
- package/dist/ssr/hooks/useCookie.js +22 -0
- package/dist/ssr/hooks/useCookie.js.map +1 -0
- package/dist/ssr/server/cookie.d.ts +13 -0
- package/dist/ssr/server/cookie.js +51 -0
- package/dist/ssr/server/cookie.js.map +1 -0
- package/dist/ssr/server/token.d.ts +44 -0
- package/dist/ssr/server/token.js +128 -0
- package/dist/ssr/server/token.js.map +1 -0
- package/dist/ssr/server/token.test.d.ts +1 -0
- package/dist/utils/listeners.d.ts +8 -0
- package/dist/utils/listeners.js +15 -0
- package/dist/utils/listeners.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ROWND_TOKEN_CALLBACK_PATH as a, rowndCookie as r } from "../../ssr/server/cookie.js";
|
|
2
|
+
function l(t) {
|
|
3
|
+
return async function(n, o, e, s, c) {
|
|
4
|
+
return new URL(n.url).pathname === a ? i(n) : t(
|
|
5
|
+
n,
|
|
6
|
+
o,
|
|
7
|
+
e,
|
|
8
|
+
s,
|
|
9
|
+
c
|
|
10
|
+
);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
async function i(t) {
|
|
14
|
+
const n = t.body;
|
|
15
|
+
try {
|
|
16
|
+
const o = await new Response(n).text(), e = JSON.parse(o);
|
|
17
|
+
if (e != null && e.clear)
|
|
18
|
+
return new Response("Success", {
|
|
19
|
+
headers: {
|
|
20
|
+
"Set-Cookie": r.serialize({ accessToken: "" }, { maxAge: 0 })
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
const s = e == null ? void 0 : e.accessToken;
|
|
24
|
+
if (!s)
|
|
25
|
+
throw new Error("Missing access token");
|
|
26
|
+
return new Response("Success", {
|
|
27
|
+
headers: {
|
|
28
|
+
"Set-Cookie": r.serialize({
|
|
29
|
+
accessToken: s
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
} catch (o) {
|
|
34
|
+
return console.error("Failed to decode body text", o), new Response("Failed", { status: 400 });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
i as handleRowndTokenCallback,
|
|
39
|
+
l as withRowndHandleRequest
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=withRowndActionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withRowndActionHandler.js","sources":["../../../src/remix/server/withRowndActionHandler.ts"],"sourcesContent":["import { ROWND_TOKEN_CALLBACK_PATH, rowndCookie } from \"../../ssr/server/cookie\";\n\nexport function withRowndHandleRequest(\n handleRequest: (\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n remixContext: any,\n loadContext: any\n ) => Promise<unknown>\n) {\n return async function (\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n remixContext: any,\n loadContext: any\n ) {\n const url = new URL(request.url);\n if (url.pathname === ROWND_TOKEN_CALLBACK_PATH) {\n return handleRowndTokenCallback(request);\n }\n\n return handleRequest(\n request,\n responseStatusCode,\n responseHeaders,\n remixContext,\n loadContext\n );\n };\n}\n\nexport async function handleRowndTokenCallback(request: Request) {\n const body = request.body;\n try {\n const text = await new Response(body).text();\n const res = JSON.parse(text);\n\n if (res?.clear) {\n return new Response('Success', {\n headers: {\n 'Set-Cookie': rowndCookie.serialize({ accessToken: '' }, { maxAge: 0 }),\n },\n });\n }\n\n const accessToken = res?.accessToken;\n if (!accessToken) {\n throw new Error('Missing access token');\n }\n\n return new Response('Success', {\n headers: {\n 'Set-Cookie': rowndCookie.serialize({\n accessToken,\n }),\n },\n });\n } catch (err) {\n console.error('Failed to decode body text', err);\n return new Response('Failed', { status: 400 });\n }\n}\n"],"names":["withRowndHandleRequest","handleRequest","request","responseStatusCode","responseHeaders","remixContext","loadContext","ROWND_TOKEN_CALLBACK_PATH","handleRowndTokenCallback","body","text","res","rowndCookie","accessToken","err"],"mappings":";AAEO,SAASA,EACdC,GAOA;AACA,SAAO,eACLC,GACAC,GACAC,GACAC,GACAC,GACA;AAEA,WADY,IAAI,IAAIJ,EAAQ,GAAG,EACvB,aAAaK,IACZC,EAAyBN,CAAO,IAGlCD;AAAA,MACLC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF;AAEA,eAAsBE,EAAyBN,GAAkB;AAC/D,QAAMO,IAAOP,EAAQ;AACrB,MAAI;AACF,UAAMQ,IAAO,MAAM,IAAI,SAASD,CAAI,EAAE,KAAA,GAChCE,IAAM,KAAK,MAAMD,CAAI;AAE3B,QAAIC,KAAA,QAAAA,EAAK;AACP,aAAO,IAAI,SAAS,WAAW;AAAA,QAC7B,SAAS;AAAA,UACP,cAAcC,EAAY,UAAU,EAAE,aAAa,MAAM,EAAE,QAAQ,EAAA,CAAG;AAAA,QAAA;AAAA,MACxE,CACD;AAGH,UAAMC,IAAcF,KAAA,gBAAAA,EAAK;AACzB,QAAI,CAACE;AACH,YAAM,IAAI,MAAM,sBAAsB;AAGxC,WAAO,IAAI,SAAS,WAAW;AAAA,MAC7B,SAAS;AAAA,QACP,cAAcD,EAAY,UAAU;AAAA,UAClC,aAAAC;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IACH,CACD;AAAA,EACH,SAASC,GAAK;AACZ,mBAAQ,MAAM,8BAA8BA,CAAG,GACxC,IAAI,SAAS,UAAU,EAAE,QAAQ,KAAK;AAAA,EAC/C;AACF;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type LoaderFunctionArgs = {
|
|
2
|
+
request: Record<string, any>;
|
|
3
|
+
context: Record<string, any>;
|
|
4
|
+
} & any;
|
|
5
|
+
type RowndLoaderResponse = {
|
|
6
|
+
access_token: string;
|
|
7
|
+
is_authenticated: true;
|
|
8
|
+
user_id: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const withRowndLoader: (loader: (args: LoaderFunctionArgs, rowndResponse: RowndLoaderResponse) => Promise<any>, options?: {
|
|
11
|
+
onUnauthenticated?: (args: LoaderFunctionArgs) => void;
|
|
12
|
+
}) => (args: LoaderFunctionArgs) => Promise<any>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getRowndAuthenticationStatus as s } from "../../ssr/server/token.js";
|
|
2
|
+
const o = (a, t = {}) => async function(e) {
|
|
3
|
+
const { request: r } = e, n = await s(
|
|
4
|
+
r.headers.get("Cookie")
|
|
5
|
+
), u = n.is_expired, c = n.is_authenticated;
|
|
6
|
+
if (u)
|
|
7
|
+
return { is_expired: !0 };
|
|
8
|
+
if (!c) {
|
|
9
|
+
const i = t == null ? void 0 : t.onUnauthenticated;
|
|
10
|
+
return i ? i(e) : { is_authenticated: !1 };
|
|
11
|
+
}
|
|
12
|
+
return a(e, {
|
|
13
|
+
...n
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
export {
|
|
17
|
+
o as withRowndLoader
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=withRowndLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withRowndLoader.js","sources":["../../../src/remix/server/withRowndLoader.tsx"],"sourcesContent":["import { getRowndAuthenticationStatus } from '../../ssr/server/token';\n\ntype LoaderFunctionArgs = {\n request: Record<string, any>;\n context: Record<string, any>;\n} & any;\n\ntype RowndLoaderResponse = {\n access_token: string;\n is_authenticated: true;\n user_id: string;\n};\n\nexport const withRowndLoader = (\n loader: (args: LoaderFunctionArgs, rowndResponse: RowndLoaderResponse) => Promise<any>,\n options: {\n onUnauthenticated?: (args: LoaderFunctionArgs) => void;\n } = {}\n) => {\n return async function (args: LoaderFunctionArgs) {\n const { request } = args;\n const status = await getRowndAuthenticationStatus(\n request.headers.get('Cookie')\n );\n\n const isExpired = status.is_expired;\n const isAuthenticated = status.is_authenticated;\n\n if (isExpired) {\n return { is_expired: true };\n }\n\n if (!isAuthenticated) {\n const onUnauthenticatedCallback = options?.onUnauthenticated;\n if (onUnauthenticatedCallback) {\n return onUnauthenticatedCallback(args);\n }\n return { is_authenticated: false };\n }\n return loader(args, {\n ...status,\n });\n };\n};"],"names":["withRowndLoader","loader","options","args","request","status","getRowndAuthenticationStatus","isExpired","isAuthenticated","onUnauthenticatedCallback"],"mappings":";AAaO,MAAMA,IAAkB,CAC7BC,GACAC,IAEI,OAEG,eAAgBC,GAA0B;AAC/C,QAAM,EAAE,SAAAC,MAAYD,GACdE,IAAS,MAAMC;AAAA,IACnBF,EAAQ,QAAQ,IAAI,QAAQ;AAAA,EAAA,GAGxBG,IAAYF,EAAO,YACnBG,IAAkBH,EAAO;AAE/B,MAAIE;AACF,WAAO,EAAE,YAAY,GAAA;AAGvB,MAAI,CAACC,GAAiB;AACpB,UAAMC,IAA4BP,KAAA,gBAAAA,EAAS;AAC3C,WAAIO,IACKA,EAA0BN,CAAI,IAEhC,EAAE,kBAAkB,GAAA;AAAA,EAC7B;AACA,SAAOF,EAAOE,GAAM;AAAA,IAClB,GAAGE;AAAA,EAAA,CACJ;AACH;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './remix/server/index'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getRowndAuthenticationStatus as e } from "./ssr/server/token.js";
|
|
2
|
+
import { isAuthenticated as d } from "./remix/server/isAuthenticated.js";
|
|
3
|
+
import { withRowndHandleRequest as w } from "./remix/server/withRowndActionHandler.js";
|
|
4
|
+
import { withRowndLoader as i } from "./remix/server/withRowndLoader.js";
|
|
5
|
+
import { getRowndUser as p } from "./remix/server/getRowndUser.js";
|
|
6
|
+
import { getRowndUserId as R } from "./remix/server/getRowndUserId.js";
|
|
7
|
+
export {
|
|
8
|
+
e as getRowndAuthenticationStatus,
|
|
9
|
+
p as getRowndUser,
|
|
10
|
+
R as getRowndUserId,
|
|
11
|
+
d as isAuthenticated,
|
|
12
|
+
w as withRowndHandleRequest,
|
|
13
|
+
i as withRowndLoader
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=remix-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remix-server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/dist/remix.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './remix/index'
|
package/dist/remix.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RemixRowndProvider as t } from "./remix/RemixRowndProvider.js";
|
|
2
|
+
import { useRownd as i } from "./remix/client/useRownd.js";
|
|
3
|
+
import { default as d } from "./remix/client/RemixClientScript.js";
|
|
4
|
+
import { default as f } from "./remix/client/withRowndRequireSignIn.js";
|
|
5
|
+
import { getRowndAuthenticationStatus as w } from "./ssr/server/token.js";
|
|
6
|
+
import { withRowndHandleRequest as a } from "./remix/server/withRowndActionHandler.js";
|
|
7
|
+
import { withRowndLoader as u } from "./remix/server/withRowndLoader.js";
|
|
8
|
+
export {
|
|
9
|
+
d as RemixClientScript,
|
|
10
|
+
t as RemixRowndProvider,
|
|
11
|
+
w as getRowndAuthenticationStatus,
|
|
12
|
+
i as useRownd,
|
|
13
|
+
a as withRowndHandleRequest,
|
|
14
|
+
u as withRowndLoader,
|
|
15
|
+
f as withRowndRequireSignIn
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=remix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remix.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TRowndContext } from '../../context/types';
|
|
2
|
+
|
|
3
|
+
declare const useCookie: (useRownd: () => TRowndContext) => {
|
|
4
|
+
cookieSignIn: (callback?: () => void) => Promise<void>;
|
|
5
|
+
cookieSignOut: (callback?: () => void) => Promise<void>;
|
|
6
|
+
};
|
|
7
|
+
export default useCookie;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useCallback as i } from "react";
|
|
2
|
+
import { setCookie as u, clearCookie as g } from "../server/cookie.js";
|
|
3
|
+
const C = (n) => {
|
|
4
|
+
const { getAccessToken: e } = n(), s = i(
|
|
5
|
+
async (o) => {
|
|
6
|
+
const t = await e();
|
|
7
|
+
t && (await u(t), o == null || o());
|
|
8
|
+
},
|
|
9
|
+
[e]
|
|
10
|
+
), r = i(async (o) => {
|
|
11
|
+
try {
|
|
12
|
+
await g(), o == null || o();
|
|
13
|
+
} catch (t) {
|
|
14
|
+
console.log("Failed to sign out cookie: ", t);
|
|
15
|
+
}
|
|
16
|
+
}, []);
|
|
17
|
+
return { cookieSignIn: s, cookieSignOut: r };
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
C as default
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=useCookie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCookie.js","sources":["../../../src/ssr/hooks/useCookie.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { clearCookie, setCookie } from '../server/cookie';\nimport { TRowndContext } from '../../context/types';\n\nconst useCookie = (useRownd: () => TRowndContext) => {\n const { getAccessToken } = useRownd();\n\n const cookieSignIn = useCallback(\n async (callback?: () => void) => {\n const token = await getAccessToken();\n if (!token) {\n return;\n }\n await setCookie(token);\n callback?.();\n },\n [getAccessToken]\n );\n\n const cookieSignOut = useCallback(async (callback?: () => void) => {\n try {\n await clearCookie();\n callback?.();\n } catch (err) {\n console.log('Failed to sign out cookie: ', err);\n }\n }, []);\n\n return { cookieSignIn, cookieSignOut };\n};\n\nexport default useCookie;\n"],"names":["useCookie","useRownd","getAccessToken","cookieSignIn","useCallback","callback","token","setCookie","cookieSignOut","clearCookie","err"],"mappings":";;AAIA,MAAMA,IAAY,CAACC,MAAkC;AACnD,QAAM,EAAE,gBAAAC,EAAA,IAAmBD,EAAA,GAErBE,IAAeC;AAAA,IACnB,OAAOC,MAA0B;AAC/B,YAAMC,IAAQ,MAAMJ,EAAA;AACpB,MAAKI,MAGL,MAAMC,EAAUD,CAAK,GACrBD,KAAA,QAAAA;AAAA,IACF;AAAA,IACA,CAACH,CAAc;AAAA,EAAA,GAGXM,IAAgBJ,EAAY,OAAOC,MAA0B;AACjE,QAAI;AACF,YAAMI,EAAA,GACNJ,KAAA,QAAAA;AAAA,IACF,SAASK,GAAK;AACZ,cAAQ,IAAI,+BAA+BA,CAAG;AAAA,IAChD;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,cAAAP,GAAc,eAAAK,EAAA;AACzB;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RowndCookieData = {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
};
|
|
4
|
+
export declare const ROWND_COOKIE_ID = "rownd-session";
|
|
5
|
+
export declare const ROWND_TOKEN_CALLBACK_PATH = "/api/rownd-token-callback";
|
|
6
|
+
export declare const setCookie: (token: string) => Promise<string | undefined>;
|
|
7
|
+
export declare const clearCookie: () => Promise<void>;
|
|
8
|
+
export declare const rowndCookie: {
|
|
9
|
+
parse: (header: string | null) => undefined | RowndCookieData;
|
|
10
|
+
serialize: (data: RowndCookieData, { maxAge }?: {
|
|
11
|
+
maxAge?: number;
|
|
12
|
+
}) => string;
|
|
13
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const d = "rownd-session", p = (o, r = "/") => ({
|
|
2
|
+
parse: (t) => {
|
|
3
|
+
if (!t) return;
|
|
4
|
+
const n = t.split(";");
|
|
5
|
+
for (const e of n) {
|
|
6
|
+
const [s, a] = e.split("=");
|
|
7
|
+
if (decodeURIComponent(s.trim()) === o)
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(decodeURIComponent(a.trim()));
|
|
10
|
+
} catch (c) {
|
|
11
|
+
console.error("Failed to parse cookie", c);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
serialize: (t, { maxAge: n = 3600 } = {}) => {
|
|
17
|
+
let e = `${encodeURIComponent(o)}=${encodeURIComponent(
|
|
18
|
+
JSON.stringify(t)
|
|
19
|
+
)}`;
|
|
20
|
+
return e += "; Secure", e += "; HttpOnly", e += `; Max-Age=${n}`, e += "; SameSite=Strict", e += `; Path=${r}`, e;
|
|
21
|
+
}
|
|
22
|
+
}), i = "/api/rownd-token-callback", l = async (o) => {
|
|
23
|
+
try {
|
|
24
|
+
return await fetch(i, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
"Content-Type": "application/json"
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({ accessToken: o })
|
|
30
|
+
}), o;
|
|
31
|
+
} catch (r) {
|
|
32
|
+
console.error("Failed to set cookie: ", r);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}, u = async () => {
|
|
36
|
+
await fetch(i, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: {
|
|
39
|
+
"Content-Type": "application/json"
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify({ clear: !0 })
|
|
42
|
+
});
|
|
43
|
+
}, C = p(d);
|
|
44
|
+
export {
|
|
45
|
+
d as ROWND_COOKIE_ID,
|
|
46
|
+
i as ROWND_TOKEN_CALLBACK_PATH,
|
|
47
|
+
u as clearCookie,
|
|
48
|
+
C as rowndCookie,
|
|
49
|
+
l as setCookie
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=cookie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie.js","sources":["../../../src/ssr/server/cookie.ts"],"sourcesContent":["export type RowndCookieData = {\n accessToken: string;\n};\n\nexport const ROWND_COOKIE_ID = 'rownd-session';\n\nconst createCookie = (id: string, path: string = '/') => {\n return {\n parse: (header: string | null): undefined | RowndCookieData => {\n if (!header) return undefined;\n const cookies = header.split(';');\n\n for (const cookie of cookies) {\n const [name, value] = cookie.split('=');\n\n if (decodeURIComponent(name.trim()) === id) {\n try {\n const parsedValue = JSON.parse(decodeURIComponent(value.trim()));\n return parsedValue;\n } catch (err) {\n console.error('Failed to parse cookie', err);\n return undefined;\n }\n }\n }\n\n return undefined;\n },\n serialize: (data: RowndCookieData, { maxAge = 3600 }: { maxAge?: number } = {}): string => {\n let cookie = `${encodeURIComponent(id)}=${encodeURIComponent(\n JSON.stringify(data)\n )}`;\n\n cookie += '; Secure';\n cookie += '; HttpOnly';\n cookie += `; Max-Age=${maxAge}`;\n cookie += '; SameSite=Strict';\n cookie += `; Path=${path}`;\n\n return cookie;\n },\n };\n};\n\nexport const ROWND_TOKEN_CALLBACK_PATH = '/api/rownd-token-callback';\n\nexport const setCookie = async (token: string): Promise<string | undefined> => {\n try {\n await fetch(ROWND_TOKEN_CALLBACK_PATH, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ accessToken: token }),\n });\n return token;\n } catch (err) {\n console.error('Failed to set cookie: ', err);\n return undefined; \n }\n};\n\nexport const clearCookie = async (): Promise<void> => {\n await fetch(ROWND_TOKEN_CALLBACK_PATH, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ clear: true }),\n });\n};\n\nexport const rowndCookie = createCookie(ROWND_COOKIE_ID);\n"],"names":["ROWND_COOKIE_ID","createCookie","id","path","header","cookies","cookie","name","value","err","data","maxAge","ROWND_TOKEN_CALLBACK_PATH","setCookie","token","clearCookie","rowndCookie"],"mappings":"AAIO,MAAMA,IAAkB,iBAEzBC,IAAe,CAACC,GAAYC,IAAe,SACxC;AAAA,EACL,OAAO,CAACC,MAAuD;AAC7D,QAAI,CAACA,EAAQ;AACb,UAAMC,IAAUD,EAAO,MAAM,GAAG;AAEhC,eAAWE,KAAUD,GAAS;AAC5B,YAAM,CAACE,GAAMC,CAAK,IAAIF,EAAO,MAAM,GAAG;AAEtC,UAAI,mBAAmBC,EAAK,KAAA,CAAM,MAAML;AACtC,YAAI;AAEF,iBADoB,KAAK,MAAM,mBAAmBM,EAAM,KAAA,CAAM,CAAC;AAAA,QAEjE,SAASC,GAAK;AACZ,kBAAQ,MAAM,0BAA0BA,CAAG;AAC3C;AAAA,QACF;AAAA,IAEJ;AAAA,EAGF;AAAA,EACA,WAAW,CAACC,GAAuB,EAAE,QAAAC,IAAS,KAAA,IAA8B,CAAA,MAAe;AACzF,QAAIL,IAAS,GAAG,mBAAmBJ,CAAE,CAAC,IAAI;AAAA,MACxC,KAAK,UAAUQ,CAAI;AAAA,IAAA,CACpB;AAED,WAAAJ,KAAU,YACVA,KAAU,cACVA,KAAU,aAAaK,CAAM,IAC7BL,KAAU,qBACVA,KAAU,UAAUH,CAAI,IAEjBG;AAAA,EACT;AAAA,IAISM,IAA4B,6BAE5BC,IAAY,OAAOC,MAA+C;AAC7E,MAAI;AACF,iBAAM,MAAMF,GAA2B;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAAA;AAAA,MAElB,MAAM,KAAK,UAAU,EAAE,aAAaE,GAAO;AAAA,IAAA,CAC5C,GACMA;AAAA,EACT,SAASL,GAAK;AACZ,YAAQ,MAAM,0BAA0BA,CAAG;AAC3C;AAAA,EACF;AACF,GAEaM,IAAc,YAA2B;AACpD,QAAM,MAAMH,GAA2B;AAAA,IACrC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAAA;AAAA,IAElB,MAAM,KAAK,UAAU,EAAE,OAAO,IAAM;AAAA,EAAA,CACrC;AACH,GAEaI,IAAcf,EAAaD,CAAe;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { UserContext } from '../../context/types';
|
|
2
|
+
import * as jose from 'jose';
|
|
3
|
+
export type RowndAuthenticatedUser = {
|
|
4
|
+
user_id: string;
|
|
5
|
+
access_token: string;
|
|
6
|
+
};
|
|
7
|
+
export type IsAuthenticatedResponse = {
|
|
8
|
+
user_id: string;
|
|
9
|
+
access_token: string;
|
|
10
|
+
is_authenticated: true;
|
|
11
|
+
is_expired: boolean;
|
|
12
|
+
err: undefined;
|
|
13
|
+
} | {
|
|
14
|
+
user_id: undefined;
|
|
15
|
+
access_token: undefined;
|
|
16
|
+
is_authenticated: false;
|
|
17
|
+
is_expired: boolean;
|
|
18
|
+
err: Error;
|
|
19
|
+
};
|
|
20
|
+
export declare const CLAIM_USER_ID = "https://auth.rownd.io/app_user_id";
|
|
21
|
+
export declare const getSuperTokensApiUrl: () => URL;
|
|
22
|
+
export declare const getSuperTokensApiBasePath: () => string;
|
|
23
|
+
export declare const getSuperTokensApiBaseUrl: () => URL;
|
|
24
|
+
type Keystore = (protectedHeader?: jose.JWSHeaderParameters, token?: jose.FlattenedJWSInput) => Promise<jose.KeyLike>;
|
|
25
|
+
export declare class TokenHandler {
|
|
26
|
+
private readonly joseInstance;
|
|
27
|
+
private keystoreCache;
|
|
28
|
+
constructor(joseInstance?: typeof jose);
|
|
29
|
+
getKeystore(): Promise<Keystore>;
|
|
30
|
+
getRowndAuthenticationStatus(cookie: string | null, { allowExpired }?: {
|
|
31
|
+
allowExpired?: boolean;
|
|
32
|
+
}): Promise<IsAuthenticatedResponse>;
|
|
33
|
+
determineAccessTokenFromCookie(cookie: string): string | undefined;
|
|
34
|
+
validateAccessToken(accessToken?: string): Promise<{
|
|
35
|
+
payload: jose.JWTPayload;
|
|
36
|
+
accessToken: string;
|
|
37
|
+
}>;
|
|
38
|
+
getRowndUserData(accessToken: string): Promise<null | UserContext>;
|
|
39
|
+
}
|
|
40
|
+
export declare const getRowndAuthenticationStatus: (cookie: string | null, { allowExpired }?: {
|
|
41
|
+
allowExpired?: boolean;
|
|
42
|
+
}) => Promise<IsAuthenticatedResponse>;
|
|
43
|
+
export declare const getRowndUserData: (accessToken: string) => Promise<null | UserContext>;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import * as u from "jose";
|
|
2
|
+
import { rowndCookie as h } from "./cookie.js";
|
|
3
|
+
const d = "https://auth.rownd.io/app_user_id", w = () => {
|
|
4
|
+
let a;
|
|
5
|
+
const t = "https://api.rownd.io";
|
|
6
|
+
try {
|
|
7
|
+
a = new URL(
|
|
8
|
+
process.env.ROWND_SUPERTOKENS_API_DOMAIN ?? process.env.ROWND_API_URL ?? t
|
|
9
|
+
);
|
|
10
|
+
} catch {
|
|
11
|
+
a = new URL(t);
|
|
12
|
+
}
|
|
13
|
+
return a;
|
|
14
|
+
}, l = () => {
|
|
15
|
+
const a = process.env.ROWND_SUPERTOKENS_API_BASE_PATH || "/auth";
|
|
16
|
+
return a.startsWith("/") ? a : `/${a}`;
|
|
17
|
+
}, c = () => new URL(l(), w().origin), _ = 1800;
|
|
18
|
+
class p {
|
|
19
|
+
constructor(t = u) {
|
|
20
|
+
this.joseInstance = t;
|
|
21
|
+
}
|
|
22
|
+
async getKeystore() {
|
|
23
|
+
if (this.keystoreCache && this.keystoreCache.expiresAt >= Date.now())
|
|
24
|
+
return this.keystoreCache.keystore;
|
|
25
|
+
const e = await (await fetch(
|
|
26
|
+
`${c().origin}${c().pathname.replace(/\/$/, "")}/jwt/jwks.json`
|
|
27
|
+
)).json(), s = this.joseInstance.createLocalJWKSet(e);
|
|
28
|
+
return this.keystoreCache = {
|
|
29
|
+
keystore: s,
|
|
30
|
+
expiresAt: (Date.now() / 1e3 + _) * 1e3
|
|
31
|
+
}, s;
|
|
32
|
+
}
|
|
33
|
+
async getRowndAuthenticationStatus(t, { allowExpired: e = !1 } = {}) {
|
|
34
|
+
let s;
|
|
35
|
+
try {
|
|
36
|
+
if (!t)
|
|
37
|
+
throw new Error("Cookie is null");
|
|
38
|
+
if (s = this.determineAccessTokenFromCookie(t), !s)
|
|
39
|
+
throw new Error("Cookie is missing access token");
|
|
40
|
+
const { payload: r, accessToken: n } = await this.validateAccessToken(s), o = r == null ? void 0 : r[d];
|
|
41
|
+
if (!o)
|
|
42
|
+
throw new Error("Payload is missing user id claim");
|
|
43
|
+
return {
|
|
44
|
+
user_id: o,
|
|
45
|
+
access_token: n,
|
|
46
|
+
is_authenticated: !0,
|
|
47
|
+
is_expired: !1,
|
|
48
|
+
err: void 0
|
|
49
|
+
};
|
|
50
|
+
} catch (r) {
|
|
51
|
+
let n = !1;
|
|
52
|
+
if (r.name === "JWTExpired" && (n = !0), n && e && s) {
|
|
53
|
+
await this.joseInstance.compactVerify(s, await this.getKeystore());
|
|
54
|
+
const o = this.joseInstance.decodeJwt(s);
|
|
55
|
+
return {
|
|
56
|
+
user_id: o == null ? void 0 : o[d],
|
|
57
|
+
access_token: s,
|
|
58
|
+
is_authenticated: !0,
|
|
59
|
+
is_expired: n,
|
|
60
|
+
err: void 0
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (r.name === "JWKSNoMatchingKey")
|
|
64
|
+
throw new Error(r.message + ". Do you need to update the ROWND_SUPERTOKENS_API_DOMAIN env var?");
|
|
65
|
+
return {
|
|
66
|
+
is_authenticated: !1,
|
|
67
|
+
user_id: void 0,
|
|
68
|
+
access_token: void 0,
|
|
69
|
+
is_expired: n,
|
|
70
|
+
err: r
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
determineAccessTokenFromCookie(t) {
|
|
75
|
+
let e;
|
|
76
|
+
try {
|
|
77
|
+
const s = JSON.parse(t);
|
|
78
|
+
s.accessToken && (e = s);
|
|
79
|
+
} catch {
|
|
80
|
+
}
|
|
81
|
+
return e || (e = h.parse(t)), e == null ? void 0 : e.accessToken;
|
|
82
|
+
}
|
|
83
|
+
async validateAccessToken(t) {
|
|
84
|
+
if (!t)
|
|
85
|
+
throw new Error("Cookie does not have accessToken");
|
|
86
|
+
const e = await this.getKeystore();
|
|
87
|
+
return {
|
|
88
|
+
payload: (await this.joseInstance.jwtVerify(t, e)).payload,
|
|
89
|
+
accessToken: t
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async getRowndUserData(t) {
|
|
93
|
+
await this.validateAccessToken(t);
|
|
94
|
+
let e;
|
|
95
|
+
try {
|
|
96
|
+
const s = c(), r = await fetch(`${s.origin}${s.pathname.replace(/\/$/, "")}/plugin/rownd/user`, {
|
|
97
|
+
headers: {
|
|
98
|
+
Authorization: `Bearer ${t}`
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (!r.ok)
|
|
102
|
+
return null;
|
|
103
|
+
e = await r.json();
|
|
104
|
+
} catch (s) {
|
|
105
|
+
return console.error("Error fetching user data:", s), null;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
data: e.data || {},
|
|
109
|
+
groups: e.groups || [],
|
|
110
|
+
redacted_fields: e.redacted_fields || e.redacted || [],
|
|
111
|
+
verified_data: e.verified_data || {},
|
|
112
|
+
meta: e.meta || {},
|
|
113
|
+
instant_user: e.instant_user,
|
|
114
|
+
is_loading: !!e.is_loading
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const i = new p(), f = i.getRowndAuthenticationStatus.bind(i), g = i.getRowndUserData.bind(i);
|
|
119
|
+
export {
|
|
120
|
+
d as CLAIM_USER_ID,
|
|
121
|
+
p as TokenHandler,
|
|
122
|
+
f as getRowndAuthenticationStatus,
|
|
123
|
+
g as getRowndUserData,
|
|
124
|
+
l as getSuperTokensApiBasePath,
|
|
125
|
+
c as getSuperTokensApiBaseUrl,
|
|
126
|
+
w as getSuperTokensApiUrl
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sources":["../../../src/ssr/server/token.ts"],"sourcesContent":["import * as jose from 'jose';\nimport { rowndCookie, RowndCookieData } from './cookie';\nimport { UserContext } from '../../context/types';\n\nexport type RowndAuthenticatedUser = {\n user_id: string;\n access_token: string;\n}\n\nexport type IsAuthenticatedResponse =\n | {\n user_id: string;\n access_token: string;\n is_authenticated: true;\n is_expired: boolean;\n err: undefined;\n }\n | {\n user_id: undefined;\n access_token: undefined;\n is_authenticated: false;\n is_expired: boolean;\n err: Error;\n };\n\nexport const CLAIM_USER_ID = 'https://auth.rownd.io/app_user_id';\n\nexport const getSuperTokensApiUrl = (): URL => {\n let url: URL;\n const defaultUrl = 'https://api.rownd.io';\n try {\n url = new URL(\n process.env.ROWND_SUPERTOKENS_API_DOMAIN ??\n process.env.ROWND_API_URL ??\n defaultUrl\n );\n } catch {\n url = new URL(defaultUrl);\n }\n return url;\n}\n\nexport const getSuperTokensApiBasePath = (): string => {\n const basePath = process.env.ROWND_SUPERTOKENS_API_BASE_PATH || '/auth';\n return basePath.startsWith('/') ? basePath : `/${basePath}`;\n}\n\nexport const getSuperTokensApiBaseUrl = (): URL => {\n return new URL(getSuperTokensApiBasePath(), getSuperTokensApiUrl().origin);\n}\n\nconst KEYSTORE_CACHE_TTL = 1800; // 30 minutes\ntype Keystore = (\n protectedHeader?: jose.JWSHeaderParameters,\n token?: jose.FlattenedJWSInput\n) => Promise<jose.KeyLike>;\n\nexport class TokenHandler {\n private keystoreCache: undefined | { keystore: Keystore; expiresAt: number };\n\n constructor(\n private readonly joseInstance: typeof jose = jose,\n ) {}\n\n async getKeystore(): Promise<Keystore> {\n\n if (this.keystoreCache && this.keystoreCache.expiresAt >= Date.now()) {\n return this.keystoreCache.keystore;\n }\n\n const jwksRes = await fetch(\n `${getSuperTokensApiBaseUrl().origin}${getSuperTokensApiBaseUrl().pathname.replace(/\\/$/, '')}/jwt/jwks.json`\n );\n const jwks = await jwksRes.json();\n\n const keystore = this.joseInstance.createLocalJWKSet(jwks);\n\n this.keystoreCache = {\n keystore,\n expiresAt: (Date.now() / 1000 + KEYSTORE_CACHE_TTL) * 1000,\n };\n\n return keystore;\n }\n\n async getRowndAuthenticationStatus(\n cookie: string | null,\n { allowExpired = false }: { allowExpired?: boolean } = {}\n ): Promise<IsAuthenticatedResponse> {\n let unverifiedAccessToken: string | undefined;\n try {\n if (!cookie) {\n throw new Error('Cookie is null');\n }\n\n unverifiedAccessToken = this.determineAccessTokenFromCookie(cookie);\n\n if (!unverifiedAccessToken) {\n throw new Error('Cookie is missing access token');\n }\n\n const { payload, accessToken } = await this.validateAccessToken(unverifiedAccessToken);\n const userId = payload?.[CLAIM_USER_ID] as string | undefined;\n\n if (!userId) {\n throw new Error('Payload is missing user id claim');\n }\n\n return {\n user_id: userId,\n access_token: accessToken,\n is_authenticated: true,\n is_expired: false,\n err: undefined,\n };\n } catch (err) {\n let isExpired = false;\n\n if ((err as Error).name === 'JWTExpired') {\n isExpired = true;\n }\n\n if (isExpired && allowExpired && unverifiedAccessToken) {\n // At least make sure the token is properly signed\n await this.joseInstance.compactVerify(unverifiedAccessToken, await this.getKeystore());\n\n const payload = this.joseInstance.decodeJwt(unverifiedAccessToken);\n\n return {\n user_id: payload?.[CLAIM_USER_ID] as string,\n access_token: unverifiedAccessToken,\n is_authenticated: true,\n is_expired: isExpired,\n err: undefined,\n }\n }\n\n // This likely indicates an issue with configuration,\n // so better to throw than to fail somewhat silently.\n if ((err as Error).name === 'JWKSNoMatchingKey') {\n throw new Error((err as Error).message + '. Do you need to update the ROWND_SUPERTOKENS_API_DOMAIN env var?');\n }\n\n return {\n is_authenticated: false,\n user_id: undefined,\n access_token: undefined,\n is_expired: isExpired,\n err: err as Error,\n };\n }\n }\n\n determineAccessTokenFromCookie(cookie: string): string | undefined {\n let cookieData: RowndCookieData | undefined\n\n // First, try to parse as JSON\n try {\n const parsedCookie = JSON.parse(cookie);\n if (parsedCookie.accessToken) {\n cookieData = parsedCookie\n }\n } catch {\n // Do nothing\n }\n\n // If that fails, try to parse as a cookie string\n if (!cookieData) {\n cookieData = rowndCookie.parse(cookie);\n }\n\n return cookieData?.accessToken\n }\n\n async validateAccessToken(\n accessToken?: string\n ): Promise<{\n payload: jose.JWTPayload;\n accessToken: string;\n }> {\n\n if (!accessToken) {\n throw new Error('Cookie does not have accessToken');\n }\n\n const keystore = await this.getKeystore();\n\n return {\n payload: (await this.joseInstance.jwtVerify(accessToken, keystore)).payload,\n accessToken,\n };\n }\n\n async getRowndUserData(accessToken: string): Promise<null | UserContext> {\n await this.validateAccessToken(accessToken);\n\n let userData: Partial<UserContext> & { redacted?: string[] };\n\n try {\n const baseUrl = getSuperTokensApiBaseUrl();\n const userDataRes = await fetch(`${baseUrl.origin}${baseUrl.pathname.replace(/\\/$/, '')}/plugin/rownd/user`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!userDataRes.ok) {\n return null;\n }\n\n userData = await userDataRes.json();\n } catch (err) {\n console.error('Error fetching user data:', err);\n return null;\n }\n\n return {\n data: userData.data || {},\n groups: userData.groups || [],\n redacted_fields: userData.redacted_fields || userData.redacted || [],\n verified_data: userData.verified_data || {},\n meta: userData.meta || {},\n instant_user: userData.instant_user,\n is_loading: Boolean(userData.is_loading),\n };\n }\n}\n\n// Default implementation\nconst defaultTokenHandler = new TokenHandler();\n\nexport const getRowndAuthenticationStatus = defaultTokenHandler.getRowndAuthenticationStatus.bind(defaultTokenHandler);\nexport const getRowndUserData = defaultTokenHandler.getRowndUserData.bind(defaultTokenHandler);\n"],"names":["CLAIM_USER_ID","getSuperTokensApiUrl","url","defaultUrl","getSuperTokensApiBasePath","basePath","getSuperTokensApiBaseUrl","KEYSTORE_CACHE_TTL","TokenHandler","joseInstance","jose","jwks","keystore","cookie","allowExpired","unverifiedAccessToken","payload","accessToken","userId","err","isExpired","cookieData","parsedCookie","rowndCookie","userData","baseUrl","userDataRes","defaultTokenHandler","getRowndAuthenticationStatus","getRowndUserData"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { UserDataContext } from '../context/types';
|
|
2
|
+
|
|
3
|
+
export declare const unsubscribeOnAuthenticatedListener: (id: string) => void;
|
|
4
|
+
export declare const addOnAuthenticatedListener: (callback: (userData: UserDataContext) => void) => string;
|
|
5
|
+
export declare const getOnAuthenticatedListeners: () => {
|
|
6
|
+
id: string;
|
|
7
|
+
callback: (userData: UserDataContext) => void;
|
|
8
|
+
}[];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
let e = [];
|
|
2
|
+
const s = (n) => {
|
|
3
|
+
e = e.filter(
|
|
4
|
+
(t) => t.id !== n
|
|
5
|
+
);
|
|
6
|
+
}, i = (n) => {
|
|
7
|
+
const t = Math.random().toString(36).substring(2, 15);
|
|
8
|
+
return e.push({ id: t, callback: n }), t;
|
|
9
|
+
}, r = () => e;
|
|
10
|
+
export {
|
|
11
|
+
i as addOnAuthenticatedListener,
|
|
12
|
+
r as getOnAuthenticatedListeners,
|
|
13
|
+
s as unsubscribeOnAuthenticatedListener
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=listeners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listeners.js","sources":["../../src/utils/listeners.ts"],"sourcesContent":["import { UserDataContext } from '../context/types';\n\nlet onAuthenticatedListeners: {\n id: string;\n callback: (userData: UserDataContext) => void;\n}[] = [];\n\nexport const unsubscribeOnAuthenticatedListener = (id: string) => {\n onAuthenticatedListeners = onAuthenticatedListeners.filter(\n (listener) => listener.id !== id\n );\n};\n\nexport const addOnAuthenticatedListener = (\n callback: (userData: UserDataContext) => void\n): string => {\n const id = Math.random().toString(36).substring(2, 15);\n onAuthenticatedListeners.push({ id, callback });\n return id;\n};\n\nexport const getOnAuthenticatedListeners = () => onAuthenticatedListeners; \n"],"names":["onAuthenticatedListeners","unsubscribeOnAuthenticatedListener","id","listener","addOnAuthenticatedListener","callback","getOnAuthenticatedListeners"],"mappings":"AAEA,IAAIA,IAGE,CAAA;AAEC,MAAMC,IAAqC,CAACC,MAAe;AAChE,EAAAF,IAA2BA,EAAyB;AAAA,IAClD,CAACG,MAAaA,EAAS,OAAOD;AAAA,EAAA;AAElC,GAEaE,IAA6B,CACxCC,MACW;AACX,QAAMH,IAAK,KAAK,SAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AACrD,SAAAF,EAAyB,KAAK,EAAE,IAAAE,GAAI,UAAAG,EAAA,CAAU,GACvCH;AACT,GAEaI,IAA8B,MAAMN;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@supertokens/rownd-react",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"module": "dist/main.js",
|
|
5
|
+
"types": "dist/main.d.ts",
|
|
6
|
+
"files": [
|
|
7
|
+
"*"
|
|
8
|
+
],
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/main.js",
|
|
12
|
+
"types": "./dist/main.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./next": {
|
|
15
|
+
"import": "./dist/next.js",
|
|
16
|
+
"types": "./dist/next.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./remix": {
|
|
19
|
+
"import": "./dist/remix.js",
|
|
20
|
+
"types": "./dist/remix.d.ts"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"private": false,
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"react": ">=17.0",
|
|
27
|
+
"react-dom": ">=17.0"
|
|
28
|
+
},
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/rownd/react.git"
|
|
32
|
+
},
|
|
33
|
+
"version": "0.1.0-beta.0"
|
|
34
|
+
}
|