celestya 0.0.4 → 0.0.5

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.
@@ -0,0 +1,66 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare module "iron-session" {
4
+ interface IronSessionData<U, T> {
5
+ user?: U;
6
+ token?: {
7
+ jwt: string;
8
+ refresh: string;
9
+ decoded: T;
10
+ };
11
+ }
12
+ }
13
+
14
+ interface ILoginData {
15
+ data: object;
16
+ redirect?: string;
17
+ onErrorUrl?: string;
18
+ }
19
+ interface IRegisterData {
20
+ data: object;
21
+ redirect?: string;
22
+ onErrorUrl?: string;
23
+ }
24
+ interface IOAuthData {
25
+ state: string;
26
+ oAuthUrl: string;
27
+ onErrorUrl?: string;
28
+ }
29
+ interface IResponseError {
30
+ error: string;
31
+ message: string;
32
+ }
33
+ interface IResponseSuccess<T, U> {
34
+ error: null;
35
+ data: T;
36
+ details: U;
37
+ }
38
+ interface IAuthContext<U> {
39
+ isLoggedIn: boolean;
40
+ ready: boolean;
41
+ user: U;
42
+ login: (data: ILoginData) => Promise<string>;
43
+ register: (data: IRegisterData) => Promise<string>;
44
+ oAuth: (data: IOAuthData) => Promise<string>;
45
+ logout: () => Promise<string>;
46
+ refreshUser: (force?: boolean) => Promise<void>;
47
+ get: <T, U = any>(url: string) => Promise<ResponseType<T, U>>;
48
+ post: <T, U = any>(url: string, body: any) => Promise<ResponseType<T, U>>;
49
+ del: <T, U = any>(url: string) => Promise<ResponseType<T, U>>;
50
+ }
51
+ interface IAuthContextOptions {
52
+ children: React.ReactNode;
53
+ routePrefix?: string;
54
+ }
55
+ interface IChildProps {
56
+ children?: React.ReactNode;
57
+ }
58
+ type ResponseType<T, U = any> = IResponseError | IResponseSuccess<T, U>;
59
+
60
+ type LogoutProps = React.FC<React.ComponentProps<'div'> & IChildProps>;
61
+
62
+ declare const AuthProvider: <IU>({ children, routePrefix, }: IAuthContextOptions) => react_jsx_runtime.JSX.Element;
63
+ declare const Logout: LogoutProps;
64
+ declare const useAuth: () => IAuthContext<any>;
65
+
66
+ export { AuthProvider, Logout, useAuth };
@@ -0,0 +1,66 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare module "iron-session" {
4
+ interface IronSessionData<U, T> {
5
+ user?: U;
6
+ token?: {
7
+ jwt: string;
8
+ refresh: string;
9
+ decoded: T;
10
+ };
11
+ }
12
+ }
13
+
14
+ interface ILoginData {
15
+ data: object;
16
+ redirect?: string;
17
+ onErrorUrl?: string;
18
+ }
19
+ interface IRegisterData {
20
+ data: object;
21
+ redirect?: string;
22
+ onErrorUrl?: string;
23
+ }
24
+ interface IOAuthData {
25
+ state: string;
26
+ oAuthUrl: string;
27
+ onErrorUrl?: string;
28
+ }
29
+ interface IResponseError {
30
+ error: string;
31
+ message: string;
32
+ }
33
+ interface IResponseSuccess<T, U> {
34
+ error: null;
35
+ data: T;
36
+ details: U;
37
+ }
38
+ interface IAuthContext<U> {
39
+ isLoggedIn: boolean;
40
+ ready: boolean;
41
+ user: U;
42
+ login: (data: ILoginData) => Promise<string>;
43
+ register: (data: IRegisterData) => Promise<string>;
44
+ oAuth: (data: IOAuthData) => Promise<string>;
45
+ logout: () => Promise<string>;
46
+ refreshUser: (force?: boolean) => Promise<void>;
47
+ get: <T, U = any>(url: string) => Promise<ResponseType<T, U>>;
48
+ post: <T, U = any>(url: string, body: any) => Promise<ResponseType<T, U>>;
49
+ del: <T, U = any>(url: string) => Promise<ResponseType<T, U>>;
50
+ }
51
+ interface IAuthContextOptions {
52
+ children: React.ReactNode;
53
+ routePrefix?: string;
54
+ }
55
+ interface IChildProps {
56
+ children?: React.ReactNode;
57
+ }
58
+ type ResponseType<T, U = any> = IResponseError | IResponseSuccess<T, U>;
59
+
60
+ type LogoutProps = React.FC<React.ComponentProps<'div'> & IChildProps>;
61
+
62
+ declare const AuthProvider: <IU>({ children, routePrefix, }: IAuthContextOptions) => react_jsx_runtime.JSX.Element;
63
+ declare const Logout: LogoutProps;
64
+ declare const useAuth: () => IAuthContext<any>;
65
+
66
+ export { AuthProvider, Logout, useAuth };
@@ -0,0 +1,234 @@
1
+ "use client";
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/client/index.ts
22
+ var client_exports = {};
23
+ __export(client_exports, {
24
+ AuthProvider: () => AuthProvider,
25
+ Logout: () => Logout,
26
+ useAuth: () => useAuth
27
+ });
28
+ module.exports = __toCommonJS(client_exports);
29
+
30
+ // src/client/contextProvider.tsx
31
+ var import_react = require("react");
32
+
33
+ // src/client/request.ts
34
+ async function gFetch({
35
+ url,
36
+ options
37
+ }) {
38
+ const response = await fetch(url, {
39
+ method: "GET",
40
+ ...options
41
+ });
42
+ return await response.json();
43
+ }
44
+ async function pFetch({
45
+ url,
46
+ body
47
+ }) {
48
+ const response = await fetch(url, {
49
+ method: "POST",
50
+ headers: { "Content-Type": "application/json" },
51
+ body: JSON.stringify(body)
52
+ });
53
+ return await response.json();
54
+ }
55
+ async function dFetch({
56
+ url,
57
+ options
58
+ }) {
59
+ const response = await fetch(url, {
60
+ method: "DELETE",
61
+ ...options
62
+ });
63
+ return await response.json();
64
+ }
65
+
66
+ // src/client/contextProvider.tsx
67
+ var import_navigation = require("next/navigation");
68
+ var import_jsx_runtime = require("react/jsx-runtime");
69
+ var AuthContext = (0, import_react.createContext)(null);
70
+ var AuthContextProvider = ({
71
+ children,
72
+ routePrefix = "/api"
73
+ }) => {
74
+ const [isLoggedIn, setIsLoggedIn] = (0, import_react.useState)(false);
75
+ const [ready, setReady] = (0, import_react.useState)(false);
76
+ const [user, setUser] = (0, import_react.useState)({});
77
+ const router = (0, import_navigation.useRouter)();
78
+ const loginRoute = routePrefix + "/login";
79
+ const registerRoute = routePrefix + "/register";
80
+ const logoutRoute = routePrefix + "/logout";
81
+ const userRoute = routePrefix + "/user";
82
+ const oAuthRoute = routePrefix + "/oauth";
83
+ const proxyRoute = routePrefix + "/proxy";
84
+ const login = async (loginData) => {
85
+ try {
86
+ const res = await pFetch({
87
+ url: loginRoute,
88
+ body: loginData.data
89
+ });
90
+ setIsLoggedIn(true);
91
+ if (res.error) throw new Error(res.message);
92
+ return loginData.redirect || "/";
93
+ } catch (e) {
94
+ return `${loginData.onErrorUrl || "/"}?error=${e.message}`;
95
+ }
96
+ };
97
+ const register = async (registerData) => {
98
+ try {
99
+ const res = await pFetch({
100
+ url: registerRoute,
101
+ body: registerData.data
102
+ });
103
+ if (res.error) throw new Error(res.message);
104
+ return `${registerData.redirect || "/"}?success=true`;
105
+ } catch (e) {
106
+ return `${registerData.onErrorUrl || "/"}?error=${e.message}`;
107
+ }
108
+ };
109
+ const oAuth = async ({
110
+ state,
111
+ oAuthUrl,
112
+ onErrorUrl
113
+ }) => {
114
+ try {
115
+ const url = new URL(oAuthRoute, "http://localhost/");
116
+ url.searchParams.set("authUrl", oAuthUrl);
117
+ if (state && state !== "/") url.searchParams.set("state", state);
118
+ const response = await gFetch({ url: url.pathname + url.search });
119
+ return response.data;
120
+ } catch (e) {
121
+ return `${onErrorUrl || "/"}?error=${e.message}`;
122
+ }
123
+ };
124
+ const logout = async () => {
125
+ try {
126
+ const data = await gFetch({
127
+ url: logoutRoute,
128
+ options: { cache: "no-store" }
129
+ });
130
+ setIsLoggedIn(false);
131
+ setUser({});
132
+ return data.data;
133
+ } catch (e) {
134
+ console.log(e);
135
+ return "/";
136
+ }
137
+ };
138
+ const refreshUser = async (force) => {
139
+ try {
140
+ const data = await gFetch({
141
+ url: `${userRoute}${force ? "?force=true" : ""}`,
142
+ options: { cache: "no-store" }
143
+ });
144
+ if (!data.error) {
145
+ setUser(data.data);
146
+ setIsLoggedIn(true);
147
+ } else {
148
+ setUser({});
149
+ setIsLoggedIn(false);
150
+ }
151
+ setReady(true);
152
+ router.refresh();
153
+ } catch (e) {
154
+ console.log("refreshUser error: ", e);
155
+ }
156
+ };
157
+ const get = async (url) => {
158
+ try {
159
+ const r = await gFetch({ url: `${proxyRoute}${url}` });
160
+ return r;
161
+ } catch (e) {
162
+ return { error: "getRequestError", message: e.message };
163
+ }
164
+ };
165
+ const post = async (url, body) => {
166
+ try {
167
+ const r = await pFetch({
168
+ url: `${proxyRoute}${url}`,
169
+ body
170
+ });
171
+ return r;
172
+ } catch (e) {
173
+ return { error: "getRequestError", message: e.message };
174
+ }
175
+ };
176
+ const del = async (url) => {
177
+ try {
178
+ const r = await dFetch({ url: `${proxyRoute}${url}` });
179
+ return r;
180
+ } catch (e) {
181
+ return { error: "getRequestError", message: e.message };
182
+ }
183
+ };
184
+ (0, import_react.useEffect)(() => {
185
+ if (!ready) refreshUser();
186
+ }, []);
187
+ const provider = {
188
+ ready,
189
+ login,
190
+ register,
191
+ logout,
192
+ isLoggedIn,
193
+ refreshUser,
194
+ user,
195
+ oAuth,
196
+ get,
197
+ post,
198
+ del
199
+ /* upload, */
200
+ };
201
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AuthContext.Provider, { value: provider, children });
202
+ };
203
+ var contextProvider_default = AuthContextProvider;
204
+
205
+ // src/client/useAuth.ts
206
+ var import_react2 = require("react");
207
+ var useAuthContext = () => {
208
+ return (0, import_react2.useContext)(AuthContext);
209
+ };
210
+ var useAuth_default = useAuthContext;
211
+
212
+ // src/client/Logout.tsx
213
+ var import_jsx_runtime2 = require("react/jsx-runtime");
214
+ var LogoutComponent = ({ children, ...props }) => {
215
+ const { logout } = useAuth_default();
216
+ const handleLogout = async (e) => {
217
+ e.preventDefault();
218
+ await logout();
219
+ };
220
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { onClick: handleLogout, ...props, children });
221
+ };
222
+ var Logout_default = LogoutComponent;
223
+
224
+ // src/client/index.ts
225
+ var AuthProvider = contextProvider_default;
226
+ var Logout = Logout_default;
227
+ var useAuth = useAuth_default;
228
+ // Annotate the CommonJS export names for ESM import in node:
229
+ 0 && (module.exports = {
230
+ AuthProvider,
231
+ Logout,
232
+ useAuth
233
+ });
234
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/index.ts","../../src/client/contextProvider.tsx","../../src/client/request.ts","../../src/client/useAuth.ts","../../src/client/Logout.tsx"],"sourcesContent":["import AuthContextProvider from \"./contextProvider\";\nimport LogoutComponent from \"./Logout\";\nimport useAuthContext from \"./useAuth\";\n\nexport const AuthProvider = AuthContextProvider;\nexport const Logout = LogoutComponent;\nexport const useAuth = useAuthContext;\n","\"use client\";\n\nimport { createContext, useEffect, useState } from \"react\";\nimport {\n IAuthContext,\n IAuthContextOptions,\n ILoginData,\n IOAuthData,\n IRegisterData,\n ResponseType,\n} from \"../types/internal\";\n\nimport { dFetch, gFetch, pFetch } from \"./request\";\n\nimport { useRouter } from \"next/navigation\";\n/* +\n Frontend context for providing login, logout, register and refresh\n 'use client' needed for using -> client components only\n server components need to use useSession()\n*/\n\nexport const AuthContext = createContext<IAuthContext<any>>(null as any);\n\nconst AuthContextProvider = <IU,>({\n children,\n routePrefix = \"/api\",\n}: IAuthContextOptions) => {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [ready, setReady] = useState(false);\n const [user, setUser] = useState<IU | {}>({});\n\n const router = useRouter();\n\n // POST /session/login\n const loginRoute = routePrefix + \"/login\";\n\n // POST /session/refresh\n const registerRoute = routePrefix + \"/register\";\n\n // GET /session/logout\n const logoutRoute = routePrefix + \"/logout\";\n\n // GET /session\n const userRoute = routePrefix + \"/user\";\n\n // GET /session/oauth/API_OAUTH_URL\n const oAuthRoute = routePrefix + \"/oauth\";\n\n // GET/POST/DELETE /proxy/URL\n const proxyRoute = routePrefix + \"/proxy\";\n\n const login = async (loginData: ILoginData): Promise<string> => {\n try {\n const res = await pFetch({\n url: loginRoute,\n body: loginData.data,\n });\n\n setIsLoggedIn(true);\n\n if (res.error) throw new Error(res.message);\n\n return loginData.redirect || \"/\";\n } catch (e: any) {\n return `${loginData.onErrorUrl || \"/\"}?error=${e.message}`;\n }\n };\n\n const register = async (registerData: IRegisterData): Promise<string> => {\n try {\n const res = await pFetch({\n url: registerRoute,\n body: registerData.data,\n });\n\n if (res.error) throw new Error(res.message);\n\n return `${registerData.redirect || \"/\"}?success=true`;\n } catch (e: any) {\n return `${registerData.onErrorUrl || \"/\"}?error=${e.message}`;\n }\n };\n\n const oAuth = async ({\n state,\n oAuthUrl,\n onErrorUrl,\n }: IOAuthData): Promise<string> => {\n try {\n const url = new URL(oAuthRoute, \"http://localhost/\");\n\n url.searchParams.set(\"authUrl\", oAuthUrl);\n\n if (state && state !== \"/\") url.searchParams.set(\"state\", state);\n\n const response = await gFetch({ url: url.pathname + url.search });\n\n return response.data;\n } catch (e: any) {\n return `${onErrorUrl || \"/\"}?error=${e.message}`;\n }\n };\n\n const logout = async (): Promise<string> => {\n try {\n const data = await gFetch({\n url: logoutRoute,\n options: { cache: \"no-store\" },\n });\n\n setIsLoggedIn(false);\n setUser({});\n\n return data.data;\n } catch (e: any) {\n console.log(e);\n return \"/\";\n }\n };\n\n const refreshUser = async (force?: boolean): Promise<void> => {\n try {\n const data = await gFetch({\n url: `${userRoute}${force ? \"?force=true\" : \"\"}`,\n options: { cache: \"no-store\" },\n });\n\n if (!data.error) {\n setUser(data.data);\n setIsLoggedIn(true);\n } else {\n setUser({});\n setIsLoggedIn(false);\n }\n\n setReady(true);\n\n router.refresh();\n } catch (e) {\n console.log(\"refreshUser error: \", e);\n }\n };\n\n const get = async <T, U>(url: string): Promise<ResponseType<T, U>> => {\n try {\n const r = await gFetch({ url: `${proxyRoute}${url}` });\n\n return r;\n } catch (e: any) {\n return { error: \"getRequestError\", message: e.message };\n }\n };\n\n const post = async <T, U = any>(\n url: string,\n body: any\n ): Promise<ResponseType<T, U>> => {\n try {\n const r = await pFetch({\n url: `${proxyRoute}${url}`,\n body,\n });\n\n return r;\n } catch (e: any) {\n return { error: \"getRequestError\", message: e.message };\n }\n };\n\n const del = async <T, U>(url: string): Promise<ResponseType<T, U>> => {\n try {\n const r = await dFetch({ url: `${proxyRoute}${url}` });\n\n return r;\n } catch (e: any) {\n return { error: \"getRequestError\", message: e.message };\n }\n };\n\n /**\n * Can only be used if user is logged in! and already initialised\n * @param url url for upload\n * @param formData form data\n * @param setProgress progress dispatch\n * @returns object with data or error\n */\n /* const upload = async <T, U = any>(\n url: string,\n formName: string,\n files: File[],\n setProgress: (p: number) => void,\n ): Promise<TRequest<T, U>> => {\n try {\n if (!user.token) throw new Error('user not logged in')\n \n const res: Error | XMLHttpRequest = await new Promise(\n (resolve, reject) => {\n try {\n const xhr = new XMLHttpRequest()\n const formData = new FormData()\n \n for (let i = 0; i < files.length; i++)\n formData.append(formName, files[i])\n \n xhr.open('POST', `${API_URL}${url}`, true)\n xhr.setRequestHeader('Authorization', `Bearer ${user.token}`)\n xhr.upload.onprogress = (ev: ProgressEvent<EventTarget>) => {\n if (ev.lengthComputable) {\n const percentComplete = (ev.loaded / ev.total) * 100\n setProgress(percentComplete)\n }\n }\n \n xhr.onload = function () {\n console.log('break3?', this)\n return this.status === 200\n ? resolve(this)\n : reject(new Error('Error while uploading: ' + this.status))\n }\n \n xhr.onerror = (ev: ProgressEvent<EventTarget>) => {\n console.log('break2', ev.target)\n reject(ev)\n }\n \n xhr.send(formData)\n } catch (e) {\n console.log('break1', e)\n reject(e)\n }\n },\n )\n \n if (res instanceof Error) throw res\n \n const data: any = JSON.parse(res.responseText)\n \n if (data.error) throw new Error(data.data)\n \n return { data: data.data }\n } catch (e) {\n console.log('break4', e)\n return { error: e.message || 'upload error' }\n }\n }\n \n const getContext = () => {\n let context = user.id\n \n if (!user.id) {\n // if not logged in\n const cookie = document.cookie\n .split(';')\n .find((c) => c.includes('cycle_cid'))\n \n if (cookie) {\n // use cookie value\n context = cookie.split('=')[1]\n } else {\n // set new cookie\n context =\n Math.random().toString(36).substring(2, 15) +\n Math.random().toString(36).substring(2, 15)\n \n document.cookie = `cycle_cid=${context};path=/;max-age=31536000`\n }\n }\n \n return context\n }\n \n const event = async (name: string, value?: any): Promise<boolean> => {\n try {\n const contextId = getContext()\n \n const r = await fetch(NOFY_API_URL + '/event', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Basic ' + ANALYTICS_KEY,\n },\n body: JSON.stringify({\n source: IS_PROD ? 'cycle-frontend' : 'cycle-frontend-dev',\n contextId,\n name,\n value,\n }),\n })\n \n const res = await r.json()\n if (res.error) throw new Error(res.error)\n \n return true\n } catch (e) {\n console.log('#> event error: ', e)\n return false\n }\n }\n \n const pageView = async (url: string, referer?: string): Promise<boolean> => {\n try {\n const contextId = getContext()\n \n const r = await fetch(NOFY_API_URL + '/log/count', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Basic ' + ANALYTICS_KEY,\n },\n body: JSON.stringify({\n meta: {\n contextId,\n type: 'pageview',\n },\n referer,\n identifier: url,\n }),\n })\n \n const res = await r.json()\n if (res.error) throw new Error(res.error)\n \n return true\n } catch (e) {\n console.log('#> event error: ', e)\n return false\n }\n } */\n\n useEffect(() => {\n if (!ready) refreshUser();\n }, []);\n\n const provider = {\n ready,\n login,\n register,\n logout,\n isLoggedIn,\n refreshUser,\n user,\n oAuth,\n get,\n post,\n del,\n /* upload, */\n };\n\n return (\n <AuthContext.Provider value={provider}>{children}</AuthContext.Provider>\n );\n};\n\nexport default AuthContextProvider;\n","export async function gFetch({\n url,\n options,\n}: {\n url: string | URL;\n options?: object;\n}) {\n const response: Response = await fetch(url, {\n method: \"GET\",\n ...options,\n });\n\n return await response.json();\n}\n\nexport async function pFetch({\n url,\n body,\n}: {\n url: string | URL;\n body: object;\n}) {\n const response: Response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n return await response.json();\n}\n\nexport async function dFetch({\n url,\n options,\n}: {\n url: string | URL;\n options?: object;\n}) {\n const response: Response = await fetch(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return await response.json();\n}\n","import { useContext } from \"react\";\nimport { AuthContext } from \"./contextProvider\";\n\nconst useAuthContext = () => {\n return useContext(AuthContext);\n};\n\nexport default useAuthContext;\n","'use client'\n\nimport { IChildProps } from \"../types/internal\";\nimport useAuthContext from \"./useAuth\";\n\nexport type LogoutProps = React.FC<React.ComponentProps<'div'> & IChildProps>\n\nconst LogoutComponent: LogoutProps = ({ children, ...props }) => {\n const { logout } = useAuthContext()\n\n const handleLogout = async (e: any) => {\n e.preventDefault()\n await logout()\n }\n\n return (\n <div onClick={handleLogout} {...props}>\n {children}\n </div>\n )\n}\n\nexport default LogoutComponent"],"mappings":"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","names":["import_react","import_jsx_runtime"]}
@@ -0,0 +1,206 @@
1
+ "use client";
2
+
3
+ // src/client/contextProvider.tsx
4
+ import { createContext, useEffect, useState } from "react";
5
+
6
+ // src/client/request.ts
7
+ async function gFetch({
8
+ url,
9
+ options
10
+ }) {
11
+ const response = await fetch(url, {
12
+ method: "GET",
13
+ ...options
14
+ });
15
+ return await response.json();
16
+ }
17
+ async function pFetch({
18
+ url,
19
+ body
20
+ }) {
21
+ const response = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body)
25
+ });
26
+ return await response.json();
27
+ }
28
+ async function dFetch({
29
+ url,
30
+ options
31
+ }) {
32
+ const response = await fetch(url, {
33
+ method: "DELETE",
34
+ ...options
35
+ });
36
+ return await response.json();
37
+ }
38
+
39
+ // src/client/contextProvider.tsx
40
+ import { useRouter } from "next/navigation";
41
+ import { jsx } from "react/jsx-runtime";
42
+ var AuthContext = createContext(null);
43
+ var AuthContextProvider = ({
44
+ children,
45
+ routePrefix = "/api"
46
+ }) => {
47
+ const [isLoggedIn, setIsLoggedIn] = useState(false);
48
+ const [ready, setReady] = useState(false);
49
+ const [user, setUser] = useState({});
50
+ const router = useRouter();
51
+ const loginRoute = routePrefix + "/login";
52
+ const registerRoute = routePrefix + "/register";
53
+ const logoutRoute = routePrefix + "/logout";
54
+ const userRoute = routePrefix + "/user";
55
+ const oAuthRoute = routePrefix + "/oauth";
56
+ const proxyRoute = routePrefix + "/proxy";
57
+ const login = async (loginData) => {
58
+ try {
59
+ const res = await pFetch({
60
+ url: loginRoute,
61
+ body: loginData.data
62
+ });
63
+ setIsLoggedIn(true);
64
+ if (res.error) throw new Error(res.message);
65
+ return loginData.redirect || "/";
66
+ } catch (e) {
67
+ return `${loginData.onErrorUrl || "/"}?error=${e.message}`;
68
+ }
69
+ };
70
+ const register = async (registerData) => {
71
+ try {
72
+ const res = await pFetch({
73
+ url: registerRoute,
74
+ body: registerData.data
75
+ });
76
+ if (res.error) throw new Error(res.message);
77
+ return `${registerData.redirect || "/"}?success=true`;
78
+ } catch (e) {
79
+ return `${registerData.onErrorUrl || "/"}?error=${e.message}`;
80
+ }
81
+ };
82
+ const oAuth = async ({
83
+ state,
84
+ oAuthUrl,
85
+ onErrorUrl
86
+ }) => {
87
+ try {
88
+ const url = new URL(oAuthRoute, "http://localhost/");
89
+ url.searchParams.set("authUrl", oAuthUrl);
90
+ if (state && state !== "/") url.searchParams.set("state", state);
91
+ const response = await gFetch({ url: url.pathname + url.search });
92
+ return response.data;
93
+ } catch (e) {
94
+ return `${onErrorUrl || "/"}?error=${e.message}`;
95
+ }
96
+ };
97
+ const logout = async () => {
98
+ try {
99
+ const data = await gFetch({
100
+ url: logoutRoute,
101
+ options: { cache: "no-store" }
102
+ });
103
+ setIsLoggedIn(false);
104
+ setUser({});
105
+ return data.data;
106
+ } catch (e) {
107
+ console.log(e);
108
+ return "/";
109
+ }
110
+ };
111
+ const refreshUser = async (force) => {
112
+ try {
113
+ const data = await gFetch({
114
+ url: `${userRoute}${force ? "?force=true" : ""}`,
115
+ options: { cache: "no-store" }
116
+ });
117
+ if (!data.error) {
118
+ setUser(data.data);
119
+ setIsLoggedIn(true);
120
+ } else {
121
+ setUser({});
122
+ setIsLoggedIn(false);
123
+ }
124
+ setReady(true);
125
+ router.refresh();
126
+ } catch (e) {
127
+ console.log("refreshUser error: ", e);
128
+ }
129
+ };
130
+ const get = async (url) => {
131
+ try {
132
+ const r = await gFetch({ url: `${proxyRoute}${url}` });
133
+ return r;
134
+ } catch (e) {
135
+ return { error: "getRequestError", message: e.message };
136
+ }
137
+ };
138
+ const post = async (url, body) => {
139
+ try {
140
+ const r = await pFetch({
141
+ url: `${proxyRoute}${url}`,
142
+ body
143
+ });
144
+ return r;
145
+ } catch (e) {
146
+ return { error: "getRequestError", message: e.message };
147
+ }
148
+ };
149
+ const del = async (url) => {
150
+ try {
151
+ const r = await dFetch({ url: `${proxyRoute}${url}` });
152
+ return r;
153
+ } catch (e) {
154
+ return { error: "getRequestError", message: e.message };
155
+ }
156
+ };
157
+ useEffect(() => {
158
+ if (!ready) refreshUser();
159
+ }, []);
160
+ const provider = {
161
+ ready,
162
+ login,
163
+ register,
164
+ logout,
165
+ isLoggedIn,
166
+ refreshUser,
167
+ user,
168
+ oAuth,
169
+ get,
170
+ post,
171
+ del
172
+ /* upload, */
173
+ };
174
+ return /* @__PURE__ */ jsx(AuthContext.Provider, { value: provider, children });
175
+ };
176
+ var contextProvider_default = AuthContextProvider;
177
+
178
+ // src/client/useAuth.ts
179
+ import { useContext } from "react";
180
+ var useAuthContext = () => {
181
+ return useContext(AuthContext);
182
+ };
183
+ var useAuth_default = useAuthContext;
184
+
185
+ // src/client/Logout.tsx
186
+ import { jsx as jsx2 } from "react/jsx-runtime";
187
+ var LogoutComponent = ({ children, ...props }) => {
188
+ const { logout } = useAuth_default();
189
+ const handleLogout = async (e) => {
190
+ e.preventDefault();
191
+ await logout();
192
+ };
193
+ return /* @__PURE__ */ jsx2("div", { onClick: handleLogout, ...props, children });
194
+ };
195
+ var Logout_default = LogoutComponent;
196
+
197
+ // src/client/index.ts
198
+ var AuthProvider = contextProvider_default;
199
+ var Logout = Logout_default;
200
+ var useAuth = useAuth_default;
201
+ export {
202
+ AuthProvider,
203
+ Logout,
204
+ useAuth
205
+ };
206
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/contextProvider.tsx","../../src/client/request.ts","../../src/client/useAuth.ts","../../src/client/Logout.tsx","../../src/client/index.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useEffect, useState } from \"react\";\nimport {\n IAuthContext,\n IAuthContextOptions,\n ILoginData,\n IOAuthData,\n IRegisterData,\n ResponseType,\n} from \"../types/internal\";\n\nimport { dFetch, gFetch, pFetch } from \"./request\";\n\nimport { useRouter } from \"next/navigation\";\n/* +\n Frontend context for providing login, logout, register and refresh\n 'use client' needed for using -> client components only\n server components need to use useSession()\n*/\n\nexport const AuthContext = createContext<IAuthContext<any>>(null as any);\n\nconst AuthContextProvider = <IU,>({\n children,\n routePrefix = \"/api\",\n}: IAuthContextOptions) => {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [ready, setReady] = useState(false);\n const [user, setUser] = useState<IU | {}>({});\n\n const router = useRouter();\n\n // POST /session/login\n const loginRoute = routePrefix + \"/login\";\n\n // POST /session/refresh\n const registerRoute = routePrefix + \"/register\";\n\n // GET /session/logout\n const logoutRoute = routePrefix + \"/logout\";\n\n // GET /session\n const userRoute = routePrefix + \"/user\";\n\n // GET /session/oauth/API_OAUTH_URL\n const oAuthRoute = routePrefix + \"/oauth\";\n\n // GET/POST/DELETE /proxy/URL\n const proxyRoute = routePrefix + \"/proxy\";\n\n const login = async (loginData: ILoginData): Promise<string> => {\n try {\n const res = await pFetch({\n url: loginRoute,\n body: loginData.data,\n });\n\n setIsLoggedIn(true);\n\n if (res.error) throw new Error(res.message);\n\n return loginData.redirect || \"/\";\n } catch (e: any) {\n return `${loginData.onErrorUrl || \"/\"}?error=${e.message}`;\n }\n };\n\n const register = async (registerData: IRegisterData): Promise<string> => {\n try {\n const res = await pFetch({\n url: registerRoute,\n body: registerData.data,\n });\n\n if (res.error) throw new Error(res.message);\n\n return `${registerData.redirect || \"/\"}?success=true`;\n } catch (e: any) {\n return `${registerData.onErrorUrl || \"/\"}?error=${e.message}`;\n }\n };\n\n const oAuth = async ({\n state,\n oAuthUrl,\n onErrorUrl,\n }: IOAuthData): Promise<string> => {\n try {\n const url = new URL(oAuthRoute, \"http://localhost/\");\n\n url.searchParams.set(\"authUrl\", oAuthUrl);\n\n if (state && state !== \"/\") url.searchParams.set(\"state\", state);\n\n const response = await gFetch({ url: url.pathname + url.search });\n\n return response.data;\n } catch (e: any) {\n return `${onErrorUrl || \"/\"}?error=${e.message}`;\n }\n };\n\n const logout = async (): Promise<string> => {\n try {\n const data = await gFetch({\n url: logoutRoute,\n options: { cache: \"no-store\" },\n });\n\n setIsLoggedIn(false);\n setUser({});\n\n return data.data;\n } catch (e: any) {\n console.log(e);\n return \"/\";\n }\n };\n\n const refreshUser = async (force?: boolean): Promise<void> => {\n try {\n const data = await gFetch({\n url: `${userRoute}${force ? \"?force=true\" : \"\"}`,\n options: { cache: \"no-store\" },\n });\n\n if (!data.error) {\n setUser(data.data);\n setIsLoggedIn(true);\n } else {\n setUser({});\n setIsLoggedIn(false);\n }\n\n setReady(true);\n\n router.refresh();\n } catch (e) {\n console.log(\"refreshUser error: \", e);\n }\n };\n\n const get = async <T, U>(url: string): Promise<ResponseType<T, U>> => {\n try {\n const r = await gFetch({ url: `${proxyRoute}${url}` });\n\n return r;\n } catch (e: any) {\n return { error: \"getRequestError\", message: e.message };\n }\n };\n\n const post = async <T, U = any>(\n url: string,\n body: any\n ): Promise<ResponseType<T, U>> => {\n try {\n const r = await pFetch({\n url: `${proxyRoute}${url}`,\n body,\n });\n\n return r;\n } catch (e: any) {\n return { error: \"getRequestError\", message: e.message };\n }\n };\n\n const del = async <T, U>(url: string): Promise<ResponseType<T, U>> => {\n try {\n const r = await dFetch({ url: `${proxyRoute}${url}` });\n\n return r;\n } catch (e: any) {\n return { error: \"getRequestError\", message: e.message };\n }\n };\n\n /**\n * Can only be used if user is logged in! and already initialised\n * @param url url for upload\n * @param formData form data\n * @param setProgress progress dispatch\n * @returns object with data or error\n */\n /* const upload = async <T, U = any>(\n url: string,\n formName: string,\n files: File[],\n setProgress: (p: number) => void,\n ): Promise<TRequest<T, U>> => {\n try {\n if (!user.token) throw new Error('user not logged in')\n \n const res: Error | XMLHttpRequest = await new Promise(\n (resolve, reject) => {\n try {\n const xhr = new XMLHttpRequest()\n const formData = new FormData()\n \n for (let i = 0; i < files.length; i++)\n formData.append(formName, files[i])\n \n xhr.open('POST', `${API_URL}${url}`, true)\n xhr.setRequestHeader('Authorization', `Bearer ${user.token}`)\n xhr.upload.onprogress = (ev: ProgressEvent<EventTarget>) => {\n if (ev.lengthComputable) {\n const percentComplete = (ev.loaded / ev.total) * 100\n setProgress(percentComplete)\n }\n }\n \n xhr.onload = function () {\n console.log('break3?', this)\n return this.status === 200\n ? resolve(this)\n : reject(new Error('Error while uploading: ' + this.status))\n }\n \n xhr.onerror = (ev: ProgressEvent<EventTarget>) => {\n console.log('break2', ev.target)\n reject(ev)\n }\n \n xhr.send(formData)\n } catch (e) {\n console.log('break1', e)\n reject(e)\n }\n },\n )\n \n if (res instanceof Error) throw res\n \n const data: any = JSON.parse(res.responseText)\n \n if (data.error) throw new Error(data.data)\n \n return { data: data.data }\n } catch (e) {\n console.log('break4', e)\n return { error: e.message || 'upload error' }\n }\n }\n \n const getContext = () => {\n let context = user.id\n \n if (!user.id) {\n // if not logged in\n const cookie = document.cookie\n .split(';')\n .find((c) => c.includes('cycle_cid'))\n \n if (cookie) {\n // use cookie value\n context = cookie.split('=')[1]\n } else {\n // set new cookie\n context =\n Math.random().toString(36).substring(2, 15) +\n Math.random().toString(36).substring(2, 15)\n \n document.cookie = `cycle_cid=${context};path=/;max-age=31536000`\n }\n }\n \n return context\n }\n \n const event = async (name: string, value?: any): Promise<boolean> => {\n try {\n const contextId = getContext()\n \n const r = await fetch(NOFY_API_URL + '/event', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Basic ' + ANALYTICS_KEY,\n },\n body: JSON.stringify({\n source: IS_PROD ? 'cycle-frontend' : 'cycle-frontend-dev',\n contextId,\n name,\n value,\n }),\n })\n \n const res = await r.json()\n if (res.error) throw new Error(res.error)\n \n return true\n } catch (e) {\n console.log('#> event error: ', e)\n return false\n }\n }\n \n const pageView = async (url: string, referer?: string): Promise<boolean> => {\n try {\n const contextId = getContext()\n \n const r = await fetch(NOFY_API_URL + '/log/count', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Basic ' + ANALYTICS_KEY,\n },\n body: JSON.stringify({\n meta: {\n contextId,\n type: 'pageview',\n },\n referer,\n identifier: url,\n }),\n })\n \n const res = await r.json()\n if (res.error) throw new Error(res.error)\n \n return true\n } catch (e) {\n console.log('#> event error: ', e)\n return false\n }\n } */\n\n useEffect(() => {\n if (!ready) refreshUser();\n }, []);\n\n const provider = {\n ready,\n login,\n register,\n logout,\n isLoggedIn,\n refreshUser,\n user,\n oAuth,\n get,\n post,\n del,\n /* upload, */\n };\n\n return (\n <AuthContext.Provider value={provider}>{children}</AuthContext.Provider>\n );\n};\n\nexport default AuthContextProvider;\n","export async function gFetch({\n url,\n options,\n}: {\n url: string | URL;\n options?: object;\n}) {\n const response: Response = await fetch(url, {\n method: \"GET\",\n ...options,\n });\n\n return await response.json();\n}\n\nexport async function pFetch({\n url,\n body,\n}: {\n url: string | URL;\n body: object;\n}) {\n const response: Response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n return await response.json();\n}\n\nexport async function dFetch({\n url,\n options,\n}: {\n url: string | URL;\n options?: object;\n}) {\n const response: Response = await fetch(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return await response.json();\n}\n","import { useContext } from \"react\";\nimport { AuthContext } from \"./contextProvider\";\n\nconst useAuthContext = () => {\n return useContext(AuthContext);\n};\n\nexport default useAuthContext;\n","'use client'\n\nimport { IChildProps } from \"../types/internal\";\nimport useAuthContext from \"./useAuth\";\n\nexport type LogoutProps = React.FC<React.ComponentProps<'div'> & IChildProps>\n\nconst LogoutComponent: LogoutProps = ({ children, ...props }) => {\n const { logout } = useAuthContext()\n\n const handleLogout = async (e: any) => {\n e.preventDefault()\n await logout()\n }\n\n return (\n <div onClick={handleLogout} {...props}>\n {children}\n </div>\n )\n}\n\nexport default LogoutComponent","import AuthContextProvider from \"./contextProvider\";\nimport LogoutComponent from \"./Logout\";\nimport useAuthContext from \"./useAuth\";\n\nexport const AuthProvider = AuthContextProvider;\nexport const Logout = LogoutComponent;\nexport const useAuth = useAuthContext;\n"],"mappings":"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","names":["jsx"]}
@@ -0,0 +1,49 @@
1
+ import { IronSessionData, IronSession } from 'iron-session';
2
+ import { NextRequest } from 'next/server';
3
+
4
+ declare module "iron-session" {
5
+ interface IronSessionData<U, T> {
6
+ user?: U;
7
+ token?: {
8
+ jwt: string;
9
+ refresh: string;
10
+ decoded: T;
11
+ };
12
+ }
13
+ }
14
+ interface DefaultUser {
15
+ [key: string]: any;
16
+ }
17
+ interface Token {
18
+ token: string;
19
+ }
20
+
21
+ type ServerSideSession<U> = IronSessionData<U, Token>;
22
+
23
+ type Params = string[];
24
+ interface IRequestOptions {
25
+ params: {
26
+ endpoint: Params;
27
+ };
28
+ }
29
+ interface IConfig {
30
+ host: string;
31
+ route: string;
32
+ apiUrl: string;
33
+ userEndpoint: string;
34
+ debug?: boolean;
35
+ }
36
+ type Session<U = DefaultUser> = IronSession<ServerSideSession<U>>;
37
+ interface IServerSideRequestOptions {
38
+ method?: string;
39
+ body?: JSON;
40
+ }
41
+
42
+ declare function proxy(method: string, request: NextRequest, options: IRequestOptions, config: IConfig): Promise<any>;
43
+
44
+ declare const Proxy: typeof proxy;
45
+ declare const getSession: <U = DefaultUser>() => Promise<Session<U>>;
46
+ declare const debug: () => void;
47
+ declare const apiFetch: (url: string, options: IServerSideRequestOptions, config: IConfig) => Promise<any>;
48
+
49
+ export { type IConfig, type IRequestOptions, Proxy, type Session, apiFetch, debug, getSession };
@@ -0,0 +1,49 @@
1
+ import { IronSessionData, IronSession } from 'iron-session';
2
+ import { NextRequest } from 'next/server';
3
+
4
+ declare module "iron-session" {
5
+ interface IronSessionData<U, T> {
6
+ user?: U;
7
+ token?: {
8
+ jwt: string;
9
+ refresh: string;
10
+ decoded: T;
11
+ };
12
+ }
13
+ }
14
+ interface DefaultUser {
15
+ [key: string]: any;
16
+ }
17
+ interface Token {
18
+ token: string;
19
+ }
20
+
21
+ type ServerSideSession<U> = IronSessionData<U, Token>;
22
+
23
+ type Params = string[];
24
+ interface IRequestOptions {
25
+ params: {
26
+ endpoint: Params;
27
+ };
28
+ }
29
+ interface IConfig {
30
+ host: string;
31
+ route: string;
32
+ apiUrl: string;
33
+ userEndpoint: string;
34
+ debug?: boolean;
35
+ }
36
+ type Session<U = DefaultUser> = IronSession<ServerSideSession<U>>;
37
+ interface IServerSideRequestOptions {
38
+ method?: string;
39
+ body?: JSON;
40
+ }
41
+
42
+ declare function proxy(method: string, request: NextRequest, options: IRequestOptions, config: IConfig): Promise<any>;
43
+
44
+ declare const Proxy: typeof proxy;
45
+ declare const getSession: <U = DefaultUser>() => Promise<Session<U>>;
46
+ declare const debug: () => void;
47
+ declare const apiFetch: (url: string, options: IServerSideRequestOptions, config: IConfig) => Promise<any>;
48
+
49
+ export { type IConfig, type IRequestOptions, Proxy, type Session, apiFetch, debug, getSession };
package/dist/index.js ADDED
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ Proxy: () => Proxy2,
24
+ apiFetch: () => apiFetch,
25
+ debug: () => debug2,
26
+ getSession: () => getSession
27
+ });
28
+ module.exports = __toCommonJS(src_exports);
29
+
30
+ // src/server/api.ts
31
+ var import_cache = require("next/cache");
32
+
33
+ // src/server/errors.ts
34
+ var requestError = () => Response.json({
35
+ error: "requestError",
36
+ message: "error while sending request through proxy"
37
+ });
38
+ var invalidEndpoint = () => Response.json({
39
+ error: "invalidEndpoint",
40
+ message: "invalid endpoint"
41
+ });
42
+ var sessionError = () => Response.json({
43
+ error: "noSession",
44
+ message: "no session found"
45
+ });
46
+
47
+ // src/server/api.ts
48
+ var import_jwt_decode = require("jwt-decode");
49
+
50
+ // src/server/session.ts
51
+ var import_iron_session = require("iron-session");
52
+ var import_headers = require("next/headers");
53
+ var sessionOptions = {
54
+ password: process.env.CELESTYA_SECRET || "PLEASE_SET_PASSWORD",
55
+ cookieName: process.env.CELESTYA_COOKIE_NAME || "PLEASE_SET_COOKIE_NAME",
56
+ cookieOptions: { secure: process.env.SECURE === "true" || false }
57
+ };
58
+ var getSessionServerside = async () => {
59
+ const session = await (0, import_iron_session.getIronSession)(
60
+ (0, import_headers.cookies)(),
61
+ sessionOptions
62
+ );
63
+ return session;
64
+ };
65
+ var session_default = getSessionServerside;
66
+
67
+ // src/server/api.ts
68
+ var rHandler = {
69
+ GET: {
70
+ user: ({ request, config }) => getUser(request, config),
71
+ logout: ({ config }) => logout(config),
72
+ debug: () => debug(),
73
+ oauth: ({ request, config }) => oauth(request, config),
74
+ oauth_callback: ({ request, config }) => oauth_callback(request, config),
75
+ proxy: ({ request, config, options }) => proxyFunction("GET", request, config, options)
76
+ },
77
+ POST: {
78
+ login: ({ request, config }) => login(request, config),
79
+ proxy: ({ request, config, options }) => proxyFunction("POST", request, config, options)
80
+ },
81
+ DELETE: {
82
+ proxy: ({ request, config, options }) => proxyFunction("DELETE", request, config, options)
83
+ }
84
+ };
85
+ async function proxy(method, request, options, config) {
86
+ try {
87
+ const parameters = {
88
+ request,
89
+ path: options.params.endpoint[0] || request.nextUrl.pathname.replace(config.route, ""),
90
+ options: options.params.endpoint,
91
+ config
92
+ };
93
+ if (config.debug) console.log("#> proxy:", parameters);
94
+ if (rHandler[method][parameters.path])
95
+ return await rHandler[method][parameters.path](parameters);
96
+ return invalidEndpoint();
97
+ } catch (e) {
98
+ console.log("#> proxyError:", e);
99
+ return requestError();
100
+ }
101
+ }
102
+ async function login(request, config) {
103
+ const session = await session_default();
104
+ const formData = await request.json();
105
+ const response = await fetch(`${config.apiUrl}/login`, {
106
+ method: "POST",
107
+ headers: { "Content-Type": "application/json" },
108
+ body: JSON.stringify(formData)
109
+ });
110
+ const res = await response.json();
111
+ if (config.debug) console.log("#> login", res);
112
+ if (res.error) return Response.json(res);
113
+ const dec = (0, import_jwt_decode.jwtDecode)(res.data.token);
114
+ session.token = {
115
+ jwt: res.data.token,
116
+ refresh: res.data.refresh || "refresh_token",
117
+ decoded: dec
118
+ };
119
+ await session.save();
120
+ return Response.json({
121
+ redirect: "/"
122
+ });
123
+ }
124
+ async function getUser(request, config) {
125
+ const session = await session_default();
126
+ if (!session || !session.token) return sessionError();
127
+ const force = request.nextUrl.searchParams.get("force") == "true";
128
+ if (session.user && !force)
129
+ return Response.json({
130
+ data: session.user
131
+ });
132
+ const response = await fetch(
133
+ `${config.apiUrl}${config.userEndpoint}`,
134
+ {
135
+ method: "GET",
136
+ headers: {
137
+ "Content-Type": "application/json",
138
+ Authorization: "Bearer " + session.token.jwt
139
+ }
140
+ }
141
+ );
142
+ const res = await response.json();
143
+ if (config.debug) console.log("#> getUser", res);
144
+ if (res.error) return Response.json(res);
145
+ session.user = res.data;
146
+ await session.save();
147
+ return Response.json({
148
+ data: session.user
149
+ });
150
+ }
151
+ async function oauth(request, config) {
152
+ const authUrl = request.nextUrl.searchParams.get("authUrl");
153
+ if (!authUrl) throw new Error("No authUrl provided");
154
+ const url = new URL(config.route + "/oauth_callback", config.host);
155
+ const state = request.nextUrl.searchParams.get("state");
156
+ if (state) url.searchParams.set("state", state);
157
+ const response = await fetch(
158
+ `${config.apiUrl}${authUrl}?returnUrl=${encodeURIComponent(
159
+ url.toString()
160
+ )}`
161
+ );
162
+ const res = await response.json();
163
+ if (config.debug) console.log("#> oauth", res);
164
+ if (res.error) return Response.json(res);
165
+ return Response.json({
166
+ data: res.data
167
+ });
168
+ }
169
+ async function oauth_callback(request, config) {
170
+ const session = await session_default();
171
+ const token = request.nextUrl.searchParams.get("token");
172
+ const refresh = request.nextUrl.searchParams.get("refresh");
173
+ const state = request.nextUrl.searchParams.get("state");
174
+ if (!token) throw new Error("No token provided");
175
+ const dec = (0, import_jwt_decode.jwtDecode)(token);
176
+ session.token = {
177
+ jwt: token,
178
+ refresh: refresh || "refresh_token",
179
+ decoded: dec
180
+ };
181
+ await session.save();
182
+ if (state)
183
+ return Response.redirect(
184
+ state.includes("http") ? state : config.host + state
185
+ );
186
+ return Response.redirect(config.host);
187
+ }
188
+ async function logout(config) {
189
+ const session = await session_default();
190
+ session.destroy();
191
+ (0, import_cache.revalidatePath)(config.host, "layout");
192
+ return Response.json({
193
+ redirect: "/"
194
+ });
195
+ }
196
+ async function debug() {
197
+ const session = await session_default();
198
+ return Response.json(session);
199
+ }
200
+ async function proxyFunction(method, request, config, options) {
201
+ var _a;
202
+ const session = await session_default();
203
+ const opts = {
204
+ method,
205
+ headers: {
206
+ "Content-Type": "application/json",
207
+ Authorization: "Bearer " + ((_a = session.token) == null ? void 0 : _a.jwt)
208
+ }
209
+ };
210
+ if (method === "POST") opts.body = JSON.stringify(await request.json());
211
+ options.shift();
212
+ const response = await fetch(
213
+ `${config.apiUrl}/${options.join("/")}${request.nextUrl.search}`,
214
+ opts
215
+ );
216
+ const res = await response.json();
217
+ if (config.debug) console.log("#> getProxyFunction", res);
218
+ return Response.json(res);
219
+ }
220
+
221
+ // src/server/fetch.ts
222
+ var serverSideFetch = async (url, options, config) => {
223
+ var _a;
224
+ const session = await session_default();
225
+ const opts = {
226
+ method: options.method || "GET",
227
+ headers: {
228
+ "Content-Type": "application/json",
229
+ Authorization: "Bearer " + ((_a = session.token) == null ? void 0 : _a.jwt)
230
+ }
231
+ };
232
+ if (options.body) opts.body = JSON.stringify(options.body);
233
+ const response = await fetch(`${config.apiUrl}${url}`, opts);
234
+ const res = await response.json();
235
+ return res;
236
+ };
237
+
238
+ // src/server/test.ts
239
+ var Debug = () => {
240
+ console.log("#> sessionOptions: ", sessionOptions);
241
+ };
242
+ var test_default = Debug;
243
+
244
+ // src/index.ts
245
+ var Proxy2 = proxy;
246
+ var getSession = session_default;
247
+ var debug2 = test_default;
248
+ var apiFetch = serverSideFetch;
249
+ // Annotate the CommonJS export names for ESM import in node:
250
+ 0 && (module.exports = {
251
+ Proxy,
252
+ apiFetch,
253
+ debug,
254
+ getSession
255
+ });
256
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/server/api.ts","../src/server/errors.ts","../src/server/session.ts","../src/server/fetch.ts","../src/server/test.ts"],"sourcesContent":["import proxy from \"./server/api\";\nimport { serverSideFetch } from \"./server/fetch\";\nimport getSessionServerside from \"./server/session\";\nimport Debug from \"./server/test\";\n\nexport const Proxy = proxy;\nexport const getSession = getSessionServerside;\nexport const debug = Debug;\nexport const apiFetch = serverSideFetch;\n\nimport { IConfig, IRequestOptions, Session } from \"./types\";\n\nexport { IConfig, IRequestOptions, Session };\n","import { NextRequest } from \"next/server\";\nimport { revalidatePath } from \"next/cache\";\nimport { requestError } from \"./errors\";\nimport { invalidEndpoint, sessionError } from \"./errors\";\nimport { jwtDecode } from \"jwt-decode\";\nimport { IConfig, IRequestOptions, RouteHandler } from \"../types\";\nimport getSessionServerside from \"./session\";\n\nconst rHandler: RouteHandler = {\n GET: {\n user: ({ request, config }) => getUser(request, config),\n logout: ({ config }) => logout(config),\n debug: () => debug(),\n oauth: ({ request, config }) => oauth(request, config),\n oauth_callback: ({ request, config }) =>\n oauth_callback(request, config),\n proxy: ({ request, config, options }) =>\n proxyFunction(\"GET\", request, config, options),\n },\n POST: {\n login: ({ request, config }) => login(request, config),\n proxy: ({ request, config, options }) =>\n proxyFunction(\"POST\", request, config, options),\n },\n DELETE: {\n proxy: ({ request, config, options }) =>\n proxyFunction(\"DELETE\", request, config, options),\n },\n};\n\nexport default async function proxy(\n method: string,\n request: NextRequest,\n options: IRequestOptions,\n config: IConfig\n) {\n try {\n const parameters = {\n request,\n path:\n options.params.endpoint[0] ||\n request.nextUrl.pathname.replace(config.route, \"\"),\n options: options.params.endpoint,\n config,\n };\n\n if (config.debug) console.log(\"#> proxy:\", parameters);\n\n //console.log(`[${method}]: /${parameters.path}`);\n\n if (rHandler[method][parameters.path])\n return await rHandler[method][parameters.path](parameters);\n\n return invalidEndpoint();\n } catch (e) {\n console.log(\"#> proxyError:\", e);\n return requestError();\n }\n}\n\nasync function login(request: NextRequest, config: IConfig) {\n const session = await getSessionServerside();\n const formData = await request.json();\n\n const response: Response = await fetch(`${config.apiUrl}/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(formData),\n });\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> login\", res);\n\n if (res.error) return Response.json(res);\n\n const dec: any = jwtDecode(res.data.token);\n\n session.token = {\n jwt: res.data.token,\n refresh: res.data.refresh || \"refresh_token\",\n decoded: dec,\n };\n\n await session.save();\n\n return Response.json({\n redirect: \"/\",\n });\n}\n\nasync function getUser(request: NextRequest, config: IConfig) {\n const session = await getSessionServerside<any>();\n\n if (!session || !session.token) return sessionError();\n\n const force = request.nextUrl.searchParams.get(\"force\") == \"true\";\n\n // * User already exists in session\n if (session.user && !force)\n return Response.json({\n data: session.user,\n });\n\n // * User does not exist in session\n const response: Response = await fetch(\n `${config.apiUrl}${config.userEndpoint}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer \" + session.token.jwt,\n },\n }\n );\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> getUser\", res);\n\n if (res.error) return Response.json(res);\n\n session.user = res.data;\n\n await session.save();\n\n return Response.json({\n data: session.user,\n });\n}\n\nasync function oauth(request: NextRequest, config: IConfig) {\n const authUrl = request.nextUrl.searchParams.get(\"authUrl\");\n\n if (!authUrl) throw new Error(\"No authUrl provided\");\n\n const url = new URL(config.route + \"/oauth_callback\", config.host);\n\n const state = request.nextUrl.searchParams.get(\"state\");\n if (state) url.searchParams.set(\"state\", state);\n\n const response: Response = await fetch(\n `${config.apiUrl}${authUrl}?returnUrl=${encodeURIComponent(\n url.toString()\n )}`\n );\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> oauth\", res);\n\n if (res.error) return Response.json(res);\n\n return Response.json({\n data: res.data,\n });\n}\n\nasync function oauth_callback(request: NextRequest, config: IConfig) {\n const session = await getSessionServerside();\n const token = request.nextUrl.searchParams.get(\"token\");\n const refresh = request.nextUrl.searchParams.get(\"refresh\");\n const state = request.nextUrl.searchParams.get(\"state\");\n\n if (!token) throw new Error(\"No token provided\");\n\n const dec: any = jwtDecode(token);\n\n session.token = {\n jwt: token,\n refresh: refresh || \"refresh_token\",\n decoded: dec,\n };\n\n await session.save();\n\n if (state)\n return Response.redirect(\n state.includes(\"http\") ? state : config.host + state\n );\n\n return Response.redirect(config.host);\n}\n\nasync function logout(config: IConfig) {\n const session = await getSessionServerside();\n\n session.destroy();\n\n revalidatePath(config.host, \"layout\");\n\n //return Response.redirect(config.host);\n\n return Response.json({\n redirect: \"/\",\n });\n}\n\nasync function debug() {\n const session = await getSessionServerside();\n\n return Response.json(session);\n}\n\n// TODO: add refresh logic\n\nasync function proxyFunction(\n method: string,\n request: NextRequest,\n config: IConfig,\n options: string[]\n) {\n const session = await getSessionServerside();\n\n const opts: RequestInit = {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer \" + session.token?.jwt,\n },\n };\n\n if (method === \"POST\") opts.body = JSON.stringify(await request.json());\n\n options.shift();\n const response: Response = await fetch(\n `${config.apiUrl}/${options.join(\"/\")}${request.nextUrl.search}`,\n opts\n );\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> getProxyFunction\", res);\n\n return Response.json(res);\n}\n","export const requestError = () =>\n Response.json({\n error: \"requestError\",\n message: \"error while sending request through proxy\",\n });\n\nexport const invalidEndpoint = () =>\n Response.json({\n error: \"invalidEndpoint\",\n message: \"invalid endpoint\",\n });\n\nexport const sessionError = () =>\n Response.json({\n error: \"noSession\",\n message: \"no session found\",\n });\n","import { SessionOptions } from \"iron-session\";\nimport { getIronSession } from \"iron-session\";\nimport { cookies } from \"next/headers\";\nimport { ServerSideSession } from \"../types/internal\";\nimport { Session } from \"../types\";\n\ndeclare module \"iron-session\" {\n interface IronSessionData<U, T> {\n user?: U;\n token?: {\n jwt: string;\n refresh: string;\n decoded: T;\n };\n }\n}\n\nexport interface DefaultUser {\n [key: string]: any;\n}\n\nexport interface Token {\n token: string;\n}\n\nexport const sessionOptions: SessionOptions = {\n password: process.env.CELESTYA_SECRET || \"PLEASE_SET_PASSWORD\",\n cookieName: process.env.CELESTYA_COOKIE_NAME || \"PLEASE_SET_COOKIE_NAME\",\n cookieOptions: { secure: process.env.SECURE === \"true\" || false },\n};\n\nconst getSessionServerside = async <U = DefaultUser>() => {\n const session: Session<U> = await getIronSession<ServerSideSession<U>>(\n cookies(),\n sessionOptions\n );\n\n return session;\n};\n\nexport default getSessionServerside;\n","import { IConfig, IServerSideRequestOptions } from \"../types\";\nimport getSessionServerside from \"./session\";\n\nexport const serverSideFetch = async (\n url: string,\n options: IServerSideRequestOptions,\n config: IConfig\n) => {\n const session = await getSessionServerside();\n\n const opts: RequestInit = {\n method: options.method || \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer \" + session.token?.jwt,\n },\n };\n\n if (options.body) opts.body = JSON.stringify(options.body);\n\n const response: Response = await fetch(`${config.apiUrl}${url}`, opts);\n\n const res = await response.json();\n\n return res;\n};\n","import { sessionOptions } from \"./session\";\n\nconst Debug = () => {\n console.log(\"#> sessionOptions: \", sessionOptions);\n};\n\nexport default Debug;\n"],"mappings":"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","names":["Proxy","debug","Proxy","debug"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,226 @@
1
+ // src/server/api.ts
2
+ import { revalidatePath } from "next/cache";
3
+
4
+ // src/server/errors.ts
5
+ var requestError = () => Response.json({
6
+ error: "requestError",
7
+ message: "error while sending request through proxy"
8
+ });
9
+ var invalidEndpoint = () => Response.json({
10
+ error: "invalidEndpoint",
11
+ message: "invalid endpoint"
12
+ });
13
+ var sessionError = () => Response.json({
14
+ error: "noSession",
15
+ message: "no session found"
16
+ });
17
+
18
+ // src/server/api.ts
19
+ import { jwtDecode } from "jwt-decode";
20
+
21
+ // src/server/session.ts
22
+ import { getIronSession } from "iron-session";
23
+ import { cookies } from "next/headers";
24
+ var sessionOptions = {
25
+ password: process.env.CELESTYA_SECRET || "PLEASE_SET_PASSWORD",
26
+ cookieName: process.env.CELESTYA_COOKIE_NAME || "PLEASE_SET_COOKIE_NAME",
27
+ cookieOptions: { secure: process.env.SECURE === "true" || false }
28
+ };
29
+ var getSessionServerside = async () => {
30
+ const session = await getIronSession(
31
+ cookies(),
32
+ sessionOptions
33
+ );
34
+ return session;
35
+ };
36
+ var session_default = getSessionServerside;
37
+
38
+ // src/server/api.ts
39
+ var rHandler = {
40
+ GET: {
41
+ user: ({ request, config }) => getUser(request, config),
42
+ logout: ({ config }) => logout(config),
43
+ debug: () => debug(),
44
+ oauth: ({ request, config }) => oauth(request, config),
45
+ oauth_callback: ({ request, config }) => oauth_callback(request, config),
46
+ proxy: ({ request, config, options }) => proxyFunction("GET", request, config, options)
47
+ },
48
+ POST: {
49
+ login: ({ request, config }) => login(request, config),
50
+ proxy: ({ request, config, options }) => proxyFunction("POST", request, config, options)
51
+ },
52
+ DELETE: {
53
+ proxy: ({ request, config, options }) => proxyFunction("DELETE", request, config, options)
54
+ }
55
+ };
56
+ async function proxy(method, request, options, config) {
57
+ try {
58
+ const parameters = {
59
+ request,
60
+ path: options.params.endpoint[0] || request.nextUrl.pathname.replace(config.route, ""),
61
+ options: options.params.endpoint,
62
+ config
63
+ };
64
+ if (config.debug) console.log("#> proxy:", parameters);
65
+ if (rHandler[method][parameters.path])
66
+ return await rHandler[method][parameters.path](parameters);
67
+ return invalidEndpoint();
68
+ } catch (e) {
69
+ console.log("#> proxyError:", e);
70
+ return requestError();
71
+ }
72
+ }
73
+ async function login(request, config) {
74
+ const session = await session_default();
75
+ const formData = await request.json();
76
+ const response = await fetch(`${config.apiUrl}/login`, {
77
+ method: "POST",
78
+ headers: { "Content-Type": "application/json" },
79
+ body: JSON.stringify(formData)
80
+ });
81
+ const res = await response.json();
82
+ if (config.debug) console.log("#> login", res);
83
+ if (res.error) return Response.json(res);
84
+ const dec = jwtDecode(res.data.token);
85
+ session.token = {
86
+ jwt: res.data.token,
87
+ refresh: res.data.refresh || "refresh_token",
88
+ decoded: dec
89
+ };
90
+ await session.save();
91
+ return Response.json({
92
+ redirect: "/"
93
+ });
94
+ }
95
+ async function getUser(request, config) {
96
+ const session = await session_default();
97
+ if (!session || !session.token) return sessionError();
98
+ const force = request.nextUrl.searchParams.get("force") == "true";
99
+ if (session.user && !force)
100
+ return Response.json({
101
+ data: session.user
102
+ });
103
+ const response = await fetch(
104
+ `${config.apiUrl}${config.userEndpoint}`,
105
+ {
106
+ method: "GET",
107
+ headers: {
108
+ "Content-Type": "application/json",
109
+ Authorization: "Bearer " + session.token.jwt
110
+ }
111
+ }
112
+ );
113
+ const res = await response.json();
114
+ if (config.debug) console.log("#> getUser", res);
115
+ if (res.error) return Response.json(res);
116
+ session.user = res.data;
117
+ await session.save();
118
+ return Response.json({
119
+ data: session.user
120
+ });
121
+ }
122
+ async function oauth(request, config) {
123
+ const authUrl = request.nextUrl.searchParams.get("authUrl");
124
+ if (!authUrl) throw new Error("No authUrl provided");
125
+ const url = new URL(config.route + "/oauth_callback", config.host);
126
+ const state = request.nextUrl.searchParams.get("state");
127
+ if (state) url.searchParams.set("state", state);
128
+ const response = await fetch(
129
+ `${config.apiUrl}${authUrl}?returnUrl=${encodeURIComponent(
130
+ url.toString()
131
+ )}`
132
+ );
133
+ const res = await response.json();
134
+ if (config.debug) console.log("#> oauth", res);
135
+ if (res.error) return Response.json(res);
136
+ return Response.json({
137
+ data: res.data
138
+ });
139
+ }
140
+ async function oauth_callback(request, config) {
141
+ const session = await session_default();
142
+ const token = request.nextUrl.searchParams.get("token");
143
+ const refresh = request.nextUrl.searchParams.get("refresh");
144
+ const state = request.nextUrl.searchParams.get("state");
145
+ if (!token) throw new Error("No token provided");
146
+ const dec = jwtDecode(token);
147
+ session.token = {
148
+ jwt: token,
149
+ refresh: refresh || "refresh_token",
150
+ decoded: dec
151
+ };
152
+ await session.save();
153
+ if (state)
154
+ return Response.redirect(
155
+ state.includes("http") ? state : config.host + state
156
+ );
157
+ return Response.redirect(config.host);
158
+ }
159
+ async function logout(config) {
160
+ const session = await session_default();
161
+ session.destroy();
162
+ revalidatePath(config.host, "layout");
163
+ return Response.json({
164
+ redirect: "/"
165
+ });
166
+ }
167
+ async function debug() {
168
+ const session = await session_default();
169
+ return Response.json(session);
170
+ }
171
+ async function proxyFunction(method, request, config, options) {
172
+ var _a;
173
+ const session = await session_default();
174
+ const opts = {
175
+ method,
176
+ headers: {
177
+ "Content-Type": "application/json",
178
+ Authorization: "Bearer " + ((_a = session.token) == null ? void 0 : _a.jwt)
179
+ }
180
+ };
181
+ if (method === "POST") opts.body = JSON.stringify(await request.json());
182
+ options.shift();
183
+ const response = await fetch(
184
+ `${config.apiUrl}/${options.join("/")}${request.nextUrl.search}`,
185
+ opts
186
+ );
187
+ const res = await response.json();
188
+ if (config.debug) console.log("#> getProxyFunction", res);
189
+ return Response.json(res);
190
+ }
191
+
192
+ // src/server/fetch.ts
193
+ var serverSideFetch = async (url, options, config) => {
194
+ var _a;
195
+ const session = await session_default();
196
+ const opts = {
197
+ method: options.method || "GET",
198
+ headers: {
199
+ "Content-Type": "application/json",
200
+ Authorization: "Bearer " + ((_a = session.token) == null ? void 0 : _a.jwt)
201
+ }
202
+ };
203
+ if (options.body) opts.body = JSON.stringify(options.body);
204
+ const response = await fetch(`${config.apiUrl}${url}`, opts);
205
+ const res = await response.json();
206
+ return res;
207
+ };
208
+
209
+ // src/server/test.ts
210
+ var Debug = () => {
211
+ console.log("#> sessionOptions: ", sessionOptions);
212
+ };
213
+ var test_default = Debug;
214
+
215
+ // src/index.ts
216
+ var Proxy = proxy;
217
+ var getSession = session_default;
218
+ var debug2 = test_default;
219
+ var apiFetch = serverSideFetch;
220
+ export {
221
+ Proxy,
222
+ apiFetch,
223
+ debug2 as debug,
224
+ getSession
225
+ };
226
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/api.ts","../src/server/errors.ts","../src/server/session.ts","../src/server/fetch.ts","../src/server/test.ts","../src/index.ts"],"sourcesContent":["import { NextRequest } from \"next/server\";\nimport { revalidatePath } from \"next/cache\";\nimport { requestError } from \"./errors\";\nimport { invalidEndpoint, sessionError } from \"./errors\";\nimport { jwtDecode } from \"jwt-decode\";\nimport { IConfig, IRequestOptions, RouteHandler } from \"../types\";\nimport getSessionServerside from \"./session\";\n\nconst rHandler: RouteHandler = {\n GET: {\n user: ({ request, config }) => getUser(request, config),\n logout: ({ config }) => logout(config),\n debug: () => debug(),\n oauth: ({ request, config }) => oauth(request, config),\n oauth_callback: ({ request, config }) =>\n oauth_callback(request, config),\n proxy: ({ request, config, options }) =>\n proxyFunction(\"GET\", request, config, options),\n },\n POST: {\n login: ({ request, config }) => login(request, config),\n proxy: ({ request, config, options }) =>\n proxyFunction(\"POST\", request, config, options),\n },\n DELETE: {\n proxy: ({ request, config, options }) =>\n proxyFunction(\"DELETE\", request, config, options),\n },\n};\n\nexport default async function proxy(\n method: string,\n request: NextRequest,\n options: IRequestOptions,\n config: IConfig\n) {\n try {\n const parameters = {\n request,\n path:\n options.params.endpoint[0] ||\n request.nextUrl.pathname.replace(config.route, \"\"),\n options: options.params.endpoint,\n config,\n };\n\n if (config.debug) console.log(\"#> proxy:\", parameters);\n\n //console.log(`[${method}]: /${parameters.path}`);\n\n if (rHandler[method][parameters.path])\n return await rHandler[method][parameters.path](parameters);\n\n return invalidEndpoint();\n } catch (e) {\n console.log(\"#> proxyError:\", e);\n return requestError();\n }\n}\n\nasync function login(request: NextRequest, config: IConfig) {\n const session = await getSessionServerside();\n const formData = await request.json();\n\n const response: Response = await fetch(`${config.apiUrl}/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(formData),\n });\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> login\", res);\n\n if (res.error) return Response.json(res);\n\n const dec: any = jwtDecode(res.data.token);\n\n session.token = {\n jwt: res.data.token,\n refresh: res.data.refresh || \"refresh_token\",\n decoded: dec,\n };\n\n await session.save();\n\n return Response.json({\n redirect: \"/\",\n });\n}\n\nasync function getUser(request: NextRequest, config: IConfig) {\n const session = await getSessionServerside<any>();\n\n if (!session || !session.token) return sessionError();\n\n const force = request.nextUrl.searchParams.get(\"force\") == \"true\";\n\n // * User already exists in session\n if (session.user && !force)\n return Response.json({\n data: session.user,\n });\n\n // * User does not exist in session\n const response: Response = await fetch(\n `${config.apiUrl}${config.userEndpoint}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer \" + session.token.jwt,\n },\n }\n );\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> getUser\", res);\n\n if (res.error) return Response.json(res);\n\n session.user = res.data;\n\n await session.save();\n\n return Response.json({\n data: session.user,\n });\n}\n\nasync function oauth(request: NextRequest, config: IConfig) {\n const authUrl = request.nextUrl.searchParams.get(\"authUrl\");\n\n if (!authUrl) throw new Error(\"No authUrl provided\");\n\n const url = new URL(config.route + \"/oauth_callback\", config.host);\n\n const state = request.nextUrl.searchParams.get(\"state\");\n if (state) url.searchParams.set(\"state\", state);\n\n const response: Response = await fetch(\n `${config.apiUrl}${authUrl}?returnUrl=${encodeURIComponent(\n url.toString()\n )}`\n );\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> oauth\", res);\n\n if (res.error) return Response.json(res);\n\n return Response.json({\n data: res.data,\n });\n}\n\nasync function oauth_callback(request: NextRequest, config: IConfig) {\n const session = await getSessionServerside();\n const token = request.nextUrl.searchParams.get(\"token\");\n const refresh = request.nextUrl.searchParams.get(\"refresh\");\n const state = request.nextUrl.searchParams.get(\"state\");\n\n if (!token) throw new Error(\"No token provided\");\n\n const dec: any = jwtDecode(token);\n\n session.token = {\n jwt: token,\n refresh: refresh || \"refresh_token\",\n decoded: dec,\n };\n\n await session.save();\n\n if (state)\n return Response.redirect(\n state.includes(\"http\") ? state : config.host + state\n );\n\n return Response.redirect(config.host);\n}\n\nasync function logout(config: IConfig) {\n const session = await getSessionServerside();\n\n session.destroy();\n\n revalidatePath(config.host, \"layout\");\n\n //return Response.redirect(config.host);\n\n return Response.json({\n redirect: \"/\",\n });\n}\n\nasync function debug() {\n const session = await getSessionServerside();\n\n return Response.json(session);\n}\n\n// TODO: add refresh logic\n\nasync function proxyFunction(\n method: string,\n request: NextRequest,\n config: IConfig,\n options: string[]\n) {\n const session = await getSessionServerside();\n\n const opts: RequestInit = {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer \" + session.token?.jwt,\n },\n };\n\n if (method === \"POST\") opts.body = JSON.stringify(await request.json());\n\n options.shift();\n const response: Response = await fetch(\n `${config.apiUrl}/${options.join(\"/\")}${request.nextUrl.search}`,\n opts\n );\n\n const res = await response.json();\n\n if (config.debug) console.log(\"#> getProxyFunction\", res);\n\n return Response.json(res);\n}\n","export const requestError = () =>\n Response.json({\n error: \"requestError\",\n message: \"error while sending request through proxy\",\n });\n\nexport const invalidEndpoint = () =>\n Response.json({\n error: \"invalidEndpoint\",\n message: \"invalid endpoint\",\n });\n\nexport const sessionError = () =>\n Response.json({\n error: \"noSession\",\n message: \"no session found\",\n });\n","import { SessionOptions } from \"iron-session\";\nimport { getIronSession } from \"iron-session\";\nimport { cookies } from \"next/headers\";\nimport { ServerSideSession } from \"../types/internal\";\nimport { Session } from \"../types\";\n\ndeclare module \"iron-session\" {\n interface IronSessionData<U, T> {\n user?: U;\n token?: {\n jwt: string;\n refresh: string;\n decoded: T;\n };\n }\n}\n\nexport interface DefaultUser {\n [key: string]: any;\n}\n\nexport interface Token {\n token: string;\n}\n\nexport const sessionOptions: SessionOptions = {\n password: process.env.CELESTYA_SECRET || \"PLEASE_SET_PASSWORD\",\n cookieName: process.env.CELESTYA_COOKIE_NAME || \"PLEASE_SET_COOKIE_NAME\",\n cookieOptions: { secure: process.env.SECURE === \"true\" || false },\n};\n\nconst getSessionServerside = async <U = DefaultUser>() => {\n const session: Session<U> = await getIronSession<ServerSideSession<U>>(\n cookies(),\n sessionOptions\n );\n\n return session;\n};\n\nexport default getSessionServerside;\n","import { IConfig, IServerSideRequestOptions } from \"../types\";\nimport getSessionServerside from \"./session\";\n\nexport const serverSideFetch = async (\n url: string,\n options: IServerSideRequestOptions,\n config: IConfig\n) => {\n const session = await getSessionServerside();\n\n const opts: RequestInit = {\n method: options.method || \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer \" + session.token?.jwt,\n },\n };\n\n if (options.body) opts.body = JSON.stringify(options.body);\n\n const response: Response = await fetch(`${config.apiUrl}${url}`, opts);\n\n const res = await response.json();\n\n return res;\n};\n","import { sessionOptions } from \"./session\";\n\nconst Debug = () => {\n console.log(\"#> sessionOptions: \", sessionOptions);\n};\n\nexport default Debug;\n","import proxy from \"./server/api\";\nimport { serverSideFetch } from \"./server/fetch\";\nimport getSessionServerside from \"./server/session\";\nimport Debug from \"./server/test\";\n\nexport const Proxy = proxy;\nexport const getSession = getSessionServerside;\nexport const debug = Debug;\nexport const apiFetch = serverSideFetch;\n\nimport { IConfig, IRequestOptions, Session } from \"./types\";\n\nexport { IConfig, IRequestOptions, Session };\n"],"mappings":"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","names":["debug"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "celestya",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Highly opinionated session management tool for NextJS",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {