securequ 1.0.12 → 1.0.14

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/client/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SecurequClientConfig, HttpRequestInit, RequestBody } from './types.js';
1
+ import { SecurequClientConfig, HttpRequestInit } from './types.js';
2
2
 
3
3
  declare class SecurequClient {
4
4
  private config;
@@ -16,10 +16,10 @@ declare class SecurequClient {
16
16
  private path;
17
17
  private handshake;
18
18
  send(path: string, init?: HttpRequestInit): Promise<Response>;
19
- get(path: string, init?: HttpRequestInit): Promise<Response>;
20
- post(path: string, body: RequestBody, init?: HttpRequestInit): Promise<Response>;
21
- put(path: string, body: RequestBody, init?: HttpRequestInit): Promise<Response>;
22
- delete(path: string, init?: HttpRequestInit): Promise<Response>;
19
+ get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>): Promise<string>;
20
+ post(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<string>;
21
+ put(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<string>;
22
+ delete(path: string, init?: Omit<HttpRequestInit, 'method'>): Promise<string>;
23
23
  }
24
24
 
25
- export { SecurequClient, SecurequClient as default };
25
+ export { SecurequClient as default };
package/client/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var crypto=require('../include/lib/crypto.js'),signeture=require('../include/signeture.js'),urlpath=require('../include/lib/urlpath.js'),xanFetch=require('xanfetch'),responseValue=require('../include/responseValue.js'),cache=require('../include/lib/cache.js');class SecurequClient {
1
+ 'use strict';var crypto=require('../include/lib/crypto.js'),signeture=require('../include/signeture.js'),urlpath=require('../include/lib/urlpath.js'),xanFetch=require('xanfetch'),responseValue=require('../include/responseValue.js'),cache=require('../include/lib/cache.js');class SecurequClient {
2
2
  constructor(config) {
3
3
  this.token = '';
4
4
  this.tokenLoading = false;
@@ -38,7 +38,7 @@
38
38
  const params = new URLSearchParams(search);
39
39
  const paramsObject = Object.fromEntries(params.entries());
40
40
  let split = pathname.split("/").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);
41
- path = `${this.config.path}/${split.join("/")}`;
41
+ path = `${this.config.basepath}/${split.join("/")}`;
42
42
  if (Object.keys(paramsObject).length) {
43
43
  for (let key in paramsObject) {
44
44
  paramsObject[urlpath.encrypt(key)] = paramsObject[key];
@@ -56,19 +56,32 @@
56
56
  return path;
57
57
  }
58
58
  async handshake() {
59
+ var _a, _b, _c;
59
60
  this.tokenLoading = true;
60
- const res = await xanFetch(this.path(`/handshake`), {
61
- method: "GET",
62
- headers: Object.assign(Object.assign({}, this.config.headers), { [signeture.key]: this.signerure }),
63
- });
64
- const value = responseValue.decrypt(await res.text(), this.signerure);
65
- const token = crypto.decrypt(value, this.secret);
66
- this.token = token;
67
- this.reqkey = token.substring(0, token.length / 2);
61
+ const res = await xanFetch(this.path(`/handshake`), Object.assign(Object.assign({}, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), { method: "GET", headers: Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), { [signeture.key]: this.signerure }) }));
68
62
  this.tokenLoading = false;
63
+ if (res.ok) {
64
+ const txt = await res.text();
65
+ const value = responseValue.decrypt(txt, this.signerure);
66
+ const token = crypto.decrypt(value, this.secret);
67
+ this.token = token;
68
+ this.reqkey = token.substring(0, token.length / 2);
69
+ }
70
+ else {
71
+ throw new Error("Handshake failed");
72
+ }
69
73
  }
70
74
  async send(path, init) {
71
- if (path === '/handshake') {
75
+ var _a, _b, _c;
76
+ if (init === null || init === void 0 ? void 0 : init.params) {
77
+ let url = new URL(path, window.location.origin);
78
+ for (let key in init.params) {
79
+ url.searchParams.set(key, init.params[key]);
80
+ }
81
+ path = url.pathname + url.search;
82
+ }
83
+ let url = new URL(path, window.location.origin);
84
+ if (url.pathname === '/handshake') {
72
85
  throw new Error("Path is not allowed");
73
86
  }
74
87
  if (this.tokenLoading) {
@@ -84,64 +97,73 @@
84
97
  if (!this.token) {
85
98
  await this.handshake();
86
99
  }
87
- const info = Object.assign(Object.assign({ method: "GET" }, init), { headers: Object.assign(Object.assign(Object.assign({}, this.config.headers), init === null || init === void 0 ? void 0 : init.headers), { [signeture.key]: this.signerure }) });
88
- const cache_res = this.getCache(path, info.method);
89
- if (cache_res) {
90
- return cache_res.clone();
100
+ const httpOption = Object.assign(Object.assign(Object.assign({ method: "GET" }, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), init), { headers: Object.assign(Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), init === null || init === void 0 ? void 0 : init.headers), { [signeture.key]: this.signerure }) });
101
+ if (this.config.cache === true || this.config.cache) {
102
+ const cache_res = this.getCache(path, httpOption.method);
103
+ if (cache_res) {
104
+ return cache_res.clone();
105
+ }
91
106
  }
92
- if (info.body) {
107
+ if (httpOption.body) {
93
108
  if (!this.token)
94
109
  throw new Error("Token not loaded");
95
110
  const body = new FormData();
96
111
  let _data = {};
97
112
  let hasFile = false;
98
- for (let key in info.body) {
113
+ for (let key in httpOption.body) {
99
114
  let ukey = urlpath.encrypt(key);
100
- if (info.body[key] instanceof File) {
101
- body.append(ukey, info.body[key]);
115
+ if (httpOption.body[key] instanceof File) {
116
+ body.append(ukey, httpOption.body[key]);
102
117
  hasFile = true;
103
118
  }
104
119
  else {
105
- _data[ukey] = info.body[key];
120
+ _data[ukey] = httpOption.body[key];
106
121
  }
107
122
  }
108
123
  body.append(this.reqkey, crypto.encrypt(_data, this.token));
109
124
  if (!hasFile) {
110
- info.body = new URLSearchParams(body);
111
- if (!info.headers['Content-Type']) {
112
- info.headers['Content-Type'] = 'application/x-www-form-urlencoded';
125
+ httpOption.body = new URLSearchParams(body);
126
+ if (!httpOption.headers['Content-Type']) {
127
+ httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';
113
128
  }
114
129
  }
115
130
  else {
116
- if (info.method === "GET") {
117
- info.method = "POST";
131
+ if (httpOption.method === "GET") {
132
+ httpOption.method = "POST";
118
133
  }
119
- info.body = body;
120
- if (!info.headers['Content-Type']) {
121
- info.headers['Content-Type'] = 'multipart/form-data';
134
+ httpOption.body = body;
135
+ if (!httpOption.headers['Content-Type']) {
136
+ httpOption.headers['Content-Type'] = 'multipart/form-data';
122
137
  }
123
138
  }
124
139
  }
125
- const response = await xanFetch(this.path(path), info);
140
+ const response = await xanFetch(this.path(path), httpOption);
126
141
  const res = response.clone();
127
142
  const text = await response.text();
128
143
  const value = responseValue.decrypt(text, this.signerure);
144
+ if (!response.ok) {
145
+ throw new Error(value);
146
+ }
129
147
  res.text = async () => value;
130
- if (this.config.cache === true && res.ok) {
131
- this.setCache(path, info.method, res.clone());
148
+ if ((this.config.cache === true || this.config.cache) && res.ok) {
149
+ this.setCache(path, httpOption.method, res.clone());
132
150
  }
133
151
  return res;
134
152
  }
135
153
  async get(path, init) {
136
- return await this.send(path, init);
154
+ const res = await this.send(path, init);
155
+ return await res.text();
137
156
  }
138
- async post(path, body, init) {
139
- return await this.send(path, Object.assign(Object.assign({}, init), { method: "POST", body: body }));
157
+ async post(path, init) {
158
+ const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "POST" }));
159
+ return await res.text();
140
160
  }
141
- async put(path, body, init) {
142
- return await this.send(path, Object.assign(Object.assign({}, init), { method: "PUT", body: body }));
161
+ async put(path, init) {
162
+ const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "PUT" }));
163
+ return await res.text();
143
164
  }
144
165
  async delete(path, init) {
145
- return await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
166
+ const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
167
+ return await res.text();
146
168
  }
147
- }exports.SecurequClient=SecurequClient;exports.default=SecurequClient;//# sourceMappingURL=index.js.map
169
+ }module.exports=SecurequClient;//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/client/index.ts"],"sourcesContent":["import crypto from \"../include/lib/crypto\";\nimport signeture from \"../include/signeture\";\nimport urlpath from \"../include/lib/urlpath\";\nimport { HttpRequestInit, RequestBody, SecurequClientConfig } from \"./types\";\nimport xanFetch from 'xanfetch'\nimport responseValue from \"../include/responseValue\";\nimport SecurequCache from \"../include/lib/cache\";\n\nexport class SecurequClient {\n private config: SecurequClientConfig;\n private token: string = '';\n private tokenLoading: boolean = false;\n private Cache = new SecurequCache<Response>({ ttl: 1000 * 60 * 60, limit: 100 });\n\n private secret: string;\n private secret_length: number;\n private signerure: string;\n private reqkey: string = '';\n\n constructor(config: SecurequClientConfig) {\n this.config = { ...config }\n const secret = crypto.makeSecret(config.secret)\n this.config.secret = secret;\n this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);\n this.secret = crypto.makeSecret(secret.substring(0, this.secret_length))\n this.signerure = signeture.make(this.secret, this.secret);\n }\n\n private setCache(path: string, method: string, response: any) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n this.Cache.set(cacheKey, response);\n } else if (this.config.cache) {\n this.config.cache.set(cacheKey, response);\n }\n }\n\n private getCache(path: string, method: string,) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n return this.Cache.get(cacheKey);\n } else if (this.config.cache) {\n return this.config.cache.get(cacheKey);\n }\n }\n\n private PATH_CACHE = new SecurequCache<string>({ ttl: 1000 * 60 * 60, limit: 100 });\n private path(path: string) {\n let pathKey = path\n let has = this.PATH_CACHE.get(pathKey)\n if (!has) {\n const { search, pathname } = new URL(path, window.location.origin);\n const params = new URLSearchParams(search);\n const paramsObject = Object.fromEntries(params.entries());\n let split = pathname.split(\"/\").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);\n path = `${this.config.path}/${split.join(\"/\")}`;\n if (Object.keys(paramsObject).length) {\n for (let key in paramsObject) {\n paramsObject[urlpath.encrypt(key)] = paramsObject[key]\n delete paramsObject[key]\n }\n const string = JSON.stringify(paramsObject)\n const text = encodeURIComponent(crypto.encrypt(string, this.token));\n path += `?${this.reqkey}=${text}`;\n }\n this.PATH_CACHE.set(pathKey, path);\n } else {\n path = has\n }\n return path\n }\n\n private async handshake() {\n this.tokenLoading = true;\n const res = await xanFetch(this.path(`/handshake`), {\n method: \"GET\",\n headers: {\n ...this.config.headers,\n [signeture.key]: this.signerure\n },\n })\n\n const value: any = responseValue.decrypt(await res.text(), this.signerure)\n const token = crypto.decrypt(value, this.secret)\n this.token = token;\n this.reqkey = token.substring(0, token.length / 2);\n this.tokenLoading = false;\n }\n\n async send(path: string, init?: HttpRequestInit): Promise<Response> {\n if (path === '/handshake') {\n throw new Error(\"Path is not allowed\")\n }\n if (this.tokenLoading) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.tokenLoading) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n\n if (!this.token) {\n await this.handshake();\n }\n\n const info: any = {\n method: \"GET\",\n ...init,\n headers: {\n ...this.config.headers,\n ...init?.headers,\n [signeture.key]: this.signerure\n },\n }\n\n const cache_res = this.getCache(path, info.method);\n if (cache_res) {\n return cache_res.clone();\n }\n\n if (info.body) {\n if (!this.token) throw new Error(\"Token not loaded\")\n const body = new FormData();\n let _data: any = {}\n let hasFile = false;\n for (let key in info.body) {\n let ukey = urlpath.encrypt(key);\n if (info.body[key] instanceof File) {\n body.append(ukey, info.body[key]);\n hasFile = true;\n } else {\n _data[ukey] = info.body[key];\n }\n }\n\n body.append(this.reqkey, crypto.encrypt(_data, this.token));\n\n if (!hasFile) {\n info.body = new URLSearchParams(body as any);\n if (!info.headers['Content-Type']) {\n info.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n }\n } else {\n if (info.method === \"GET\") {\n info.method = \"POST\"\n }\n info.body = body\n if (!info.headers['Content-Type']) {\n info.headers['Content-Type'] = 'multipart/form-data';\n }\n }\n }\n\n const response = await xanFetch(this.path(path), info);\n const res = response.clone();\n const text = await response.text();\n const value: any = responseValue.decrypt(text, this.signerure)\n res.text = async () => value;\n if (this.config.cache === true && res.ok) {\n this.setCache(path, info.method, res.clone());\n }\n return res\n }\n\n async get(path: string, init?: HttpRequestInit) {\n return await this.send(path, init);\n }\n\n async post(path: string, body: RequestBody, init?: HttpRequestInit) {\n return await this.send(path, {\n ...init,\n method: \"POST\",\n body: body\n });\n }\n\n async put(path: string, body: RequestBody, init?: HttpRequestInit) {\n return await this.send(path, {\n ...init,\n method: \"PUT\",\n body: body\n });\n }\n\n async delete(path: string, init?: HttpRequestInit) {\n return await this.send(path, {\n ...init,\n method: \"DELETE\",\n });\n }\n}\n\nexport default SecurequClient;"],"names":["SecurequCache"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/client/index.ts"],"sourcesContent":["import crypto from \"../include/lib/crypto\";\nimport signeture from \"../include/signeture\";\nimport urlpath from \"../include/lib/urlpath\";\nimport { HttpRequestInit, RequestBody, SecurequClientConfig } from \"./types\";\nimport xanFetch from 'xanfetch'\nimport responseValue from \"../include/responseValue\";\nimport SecurequCache from \"../include/lib/cache\";\n\nclass SecurequClient {\n private config: SecurequClientConfig;\n private token: string = '';\n private tokenLoading: boolean = false;\n private Cache = new SecurequCache<Response>({ ttl: 1000 * 60 * 60, limit: 100 });\n\n private secret: string;\n private secret_length: number;\n private signerure: string;\n private reqkey: string = '';\n\n constructor(config: SecurequClientConfig) {\n this.config = { ...config }\n const secret = crypto.makeSecret(config.secret)\n this.config.secret = secret;\n this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);\n this.secret = crypto.makeSecret(secret.substring(0, this.secret_length))\n this.signerure = signeture.make(this.secret, this.secret);\n }\n\n private setCache(path: string, method: string, response: any) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n this.Cache.set(cacheKey, response);\n } else if (this.config.cache) {\n this.config.cache.set(cacheKey, response);\n }\n }\n\n private getCache(path: string, method: string,) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n return this.Cache.get(cacheKey);\n } else if (this.config.cache) {\n return this.config.cache.get(cacheKey);\n }\n }\n\n private PATH_CACHE = new SecurequCache<string>({ ttl: 1000 * 60 * 60, limit: 100 });\n private path(path: string) {\n let pathKey = path\n let has = this.PATH_CACHE.get(pathKey)\n if (!has) {\n const { search, pathname } = new URL(path, window.location.origin);\n const params = new URLSearchParams(search);\n const paramsObject = Object.fromEntries(params.entries());\n let split = pathname.split(\"/\").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);\n path = `${this.config.basepath}/${split.join(\"/\")}`;\n if (Object.keys(paramsObject).length) {\n for (let key in paramsObject) {\n paramsObject[urlpath.encrypt(key)] = paramsObject[key]\n delete paramsObject[key]\n }\n const string = JSON.stringify(paramsObject)\n const text = encodeURIComponent(crypto.encrypt(string, this.token));\n path += `?${this.reqkey}=${text}`;\n }\n this.PATH_CACHE.set(pathKey, path);\n } else {\n path = has\n }\n return path\n }\n\n private async handshake() {\n this.tokenLoading = true;\n const res = await xanFetch(this.path(`/handshake`), {\n ...this.config?.defaultOptions,\n method: \"GET\",\n headers: {\n ...this.config?.defaultOptions?.headers,\n [signeture.key]: this.signerure\n },\n })\n this.tokenLoading = false;\n\n if (res.ok) {\n const txt = await res.text();\n const value: any = responseValue.decrypt(txt, this.signerure)\n const token = crypto.decrypt(value, this.secret)\n this.token = token;\n this.reqkey = token.substring(0, token.length / 2);\n } else {\n throw new Error(\"Handshake failed\");\n }\n }\n\n async send(path: string, init?: HttpRequestInit): Promise<Response> {\n if (init?.params) {\n let url = new URL(path, window.location.origin);\n for (let key in init.params) {\n url.searchParams.set(key, (init.params as any)[key]);\n }\n path = url.pathname + url.search;\n }\n let url = new URL(path, window.location.origin);\n if (url.pathname === '/handshake') {\n throw new Error(\"Path is not allowed\")\n }\n if (this.tokenLoading) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.tokenLoading) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n\n if (!this.token) {\n await this.handshake();\n }\n\n const httpOption: any = {\n method: \"GET\",\n ...this.config?.defaultOptions,\n ...init,\n headers: {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n [signeture.key]: this.signerure\n },\n }\n\n if (this.config.cache === true || this.config.cache) {\n const cache_res = this.getCache(path, httpOption.method);\n if (cache_res) {\n return cache_res.clone();\n }\n }\n\n if (httpOption.body) {\n if (!this.token) throw new Error(\"Token not loaded\")\n const body = new FormData();\n let _data: any = {}\n let hasFile = false;\n for (let key in httpOption.body) {\n let ukey = urlpath.encrypt(key);\n if (httpOption.body[key] instanceof File) {\n body.append(ukey, httpOption.body[key]);\n hasFile = true;\n } else {\n _data[ukey] = httpOption.body[key];\n }\n }\n\n body.append(this.reqkey, crypto.encrypt(_data, this.token));\n\n if (!hasFile) {\n httpOption.body = new URLSearchParams(body as any);\n if (!httpOption.headers['Content-Type']) {\n httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n }\n } else {\n if (httpOption.method === \"GET\") {\n httpOption.method = \"POST\"\n }\n httpOption.body = body\n if (!httpOption.headers['Content-Type']) {\n httpOption.headers['Content-Type'] = 'multipart/form-data';\n }\n }\n }\n\n const response = await xanFetch(this.path(path), httpOption);\n const res = response.clone();\n const text = await response.text();\n const value: any = responseValue.decrypt(text, this.signerure)\n if (!response.ok) {\n throw new Error(value);\n }\n res.text = async () => value;\n if ((this.config.cache === true || this.config.cache) && res.ok) {\n this.setCache(path, httpOption.method, res.clone());\n }\n return res\n }\n\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\n const res = await this.send(path, init);\n return await res.text()\n }\n\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n const res = await this.send(path, {\n ...init,\n method: \"POST\",\n });\n return await res.text();\n }\n\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n const res = await this.send(path, {\n ...init,\n method: \"PUT\",\n });\n return await res.text();\n }\n\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n const res = await this.send(path, {\n ...init,\n method: \"DELETE\",\n });\n return await res.text();\n }\n}\n\nexport default SecurequClient;"],"names":["SecurequCache"],"mappings":"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"}
package/client/index.mjs CHANGED
@@ -38,7 +38,7 @@ import crypto from'../include/lib/crypto.mjs';import signeture from'../include/s
38
38
  const params = new URLSearchParams(search);
39
39
  const paramsObject = Object.fromEntries(params.entries());
40
40
  let split = pathname.split("/").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);
41
- path = `${this.config.path}/${split.join("/")}`;
41
+ path = `${this.config.basepath}/${split.join("/")}`;
42
42
  if (Object.keys(paramsObject).length) {
43
43
  for (let key in paramsObject) {
44
44
  paramsObject[urlpath.encrypt(key)] = paramsObject[key];
@@ -56,19 +56,32 @@ import crypto from'../include/lib/crypto.mjs';import signeture from'../include/s
56
56
  return path;
57
57
  }
58
58
  async handshake() {
59
+ var _a, _b, _c;
59
60
  this.tokenLoading = true;
60
- const res = await xanFetch(this.path(`/handshake`), {
61
- method: "GET",
62
- headers: Object.assign(Object.assign({}, this.config.headers), { [signeture.key]: this.signerure }),
63
- });
64
- const value = responseValue.decrypt(await res.text(), this.signerure);
65
- const token = crypto.decrypt(value, this.secret);
66
- this.token = token;
67
- this.reqkey = token.substring(0, token.length / 2);
61
+ const res = await xanFetch(this.path(`/handshake`), Object.assign(Object.assign({}, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), { method: "GET", headers: Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), { [signeture.key]: this.signerure }) }));
68
62
  this.tokenLoading = false;
63
+ if (res.ok) {
64
+ const txt = await res.text();
65
+ const value = responseValue.decrypt(txt, this.signerure);
66
+ const token = crypto.decrypt(value, this.secret);
67
+ this.token = token;
68
+ this.reqkey = token.substring(0, token.length / 2);
69
+ }
70
+ else {
71
+ throw new Error("Handshake failed");
72
+ }
69
73
  }
70
74
  async send(path, init) {
71
- if (path === '/handshake') {
75
+ var _a, _b, _c;
76
+ if (init === null || init === void 0 ? void 0 : init.params) {
77
+ let url = new URL(path, window.location.origin);
78
+ for (let key in init.params) {
79
+ url.searchParams.set(key, init.params[key]);
80
+ }
81
+ path = url.pathname + url.search;
82
+ }
83
+ let url = new URL(path, window.location.origin);
84
+ if (url.pathname === '/handshake') {
72
85
  throw new Error("Path is not allowed");
73
86
  }
74
87
  if (this.tokenLoading) {
@@ -84,64 +97,73 @@ import crypto from'../include/lib/crypto.mjs';import signeture from'../include/s
84
97
  if (!this.token) {
85
98
  await this.handshake();
86
99
  }
87
- const info = Object.assign(Object.assign({ method: "GET" }, init), { headers: Object.assign(Object.assign(Object.assign({}, this.config.headers), init === null || init === void 0 ? void 0 : init.headers), { [signeture.key]: this.signerure }) });
88
- const cache_res = this.getCache(path, info.method);
89
- if (cache_res) {
90
- return cache_res.clone();
100
+ const httpOption = Object.assign(Object.assign(Object.assign({ method: "GET" }, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultOptions), init), { headers: Object.assign(Object.assign(Object.assign({}, (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultOptions) === null || _c === void 0 ? void 0 : _c.headers), init === null || init === void 0 ? void 0 : init.headers), { [signeture.key]: this.signerure }) });
101
+ if (this.config.cache === true || this.config.cache) {
102
+ const cache_res = this.getCache(path, httpOption.method);
103
+ if (cache_res) {
104
+ return cache_res.clone();
105
+ }
91
106
  }
92
- if (info.body) {
107
+ if (httpOption.body) {
93
108
  if (!this.token)
94
109
  throw new Error("Token not loaded");
95
110
  const body = new FormData();
96
111
  let _data = {};
97
112
  let hasFile = false;
98
- for (let key in info.body) {
113
+ for (let key in httpOption.body) {
99
114
  let ukey = urlpath.encrypt(key);
100
- if (info.body[key] instanceof File) {
101
- body.append(ukey, info.body[key]);
115
+ if (httpOption.body[key] instanceof File) {
116
+ body.append(ukey, httpOption.body[key]);
102
117
  hasFile = true;
103
118
  }
104
119
  else {
105
- _data[ukey] = info.body[key];
120
+ _data[ukey] = httpOption.body[key];
106
121
  }
107
122
  }
108
123
  body.append(this.reqkey, crypto.encrypt(_data, this.token));
109
124
  if (!hasFile) {
110
- info.body = new URLSearchParams(body);
111
- if (!info.headers['Content-Type']) {
112
- info.headers['Content-Type'] = 'application/x-www-form-urlencoded';
125
+ httpOption.body = new URLSearchParams(body);
126
+ if (!httpOption.headers['Content-Type']) {
127
+ httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';
113
128
  }
114
129
  }
115
130
  else {
116
- if (info.method === "GET") {
117
- info.method = "POST";
131
+ if (httpOption.method === "GET") {
132
+ httpOption.method = "POST";
118
133
  }
119
- info.body = body;
120
- if (!info.headers['Content-Type']) {
121
- info.headers['Content-Type'] = 'multipart/form-data';
134
+ httpOption.body = body;
135
+ if (!httpOption.headers['Content-Type']) {
136
+ httpOption.headers['Content-Type'] = 'multipart/form-data';
122
137
  }
123
138
  }
124
139
  }
125
- const response = await xanFetch(this.path(path), info);
140
+ const response = await xanFetch(this.path(path), httpOption);
126
141
  const res = response.clone();
127
142
  const text = await response.text();
128
143
  const value = responseValue.decrypt(text, this.signerure);
144
+ if (!response.ok) {
145
+ throw new Error(value);
146
+ }
129
147
  res.text = async () => value;
130
- if (this.config.cache === true && res.ok) {
131
- this.setCache(path, info.method, res.clone());
148
+ if ((this.config.cache === true || this.config.cache) && res.ok) {
149
+ this.setCache(path, httpOption.method, res.clone());
132
150
  }
133
151
  return res;
134
152
  }
135
153
  async get(path, init) {
136
- return await this.send(path, init);
154
+ const res = await this.send(path, init);
155
+ return await res.text();
137
156
  }
138
- async post(path, body, init) {
139
- return await this.send(path, Object.assign(Object.assign({}, init), { method: "POST", body: body }));
157
+ async post(path, init) {
158
+ const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "POST" }));
159
+ return await res.text();
140
160
  }
141
- async put(path, body, init) {
142
- return await this.send(path, Object.assign(Object.assign({}, init), { method: "PUT", body: body }));
161
+ async put(path, init) {
162
+ const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "PUT" }));
163
+ return await res.text();
143
164
  }
144
165
  async delete(path, init) {
145
- return await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
166
+ const res = await this.send(path, Object.assign(Object.assign({}, init), { method: "DELETE" }));
167
+ return await res.text();
146
168
  }
147
- }export{SecurequClient,SecurequClient as default};//# sourceMappingURL=index.mjs.map
169
+ }export{SecurequClient as default};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/client/index.ts"],"sourcesContent":["import crypto from \"../include/lib/crypto\";\nimport signeture from \"../include/signeture\";\nimport urlpath from \"../include/lib/urlpath\";\nimport { HttpRequestInit, RequestBody, SecurequClientConfig } from \"./types\";\nimport xanFetch from 'xanfetch'\nimport responseValue from \"../include/responseValue\";\nimport SecurequCache from \"../include/lib/cache\";\n\nexport class SecurequClient {\n private config: SecurequClientConfig;\n private token: string = '';\n private tokenLoading: boolean = false;\n private Cache = new SecurequCache<Response>({ ttl: 1000 * 60 * 60, limit: 100 });\n\n private secret: string;\n private secret_length: number;\n private signerure: string;\n private reqkey: string = '';\n\n constructor(config: SecurequClientConfig) {\n this.config = { ...config }\n const secret = crypto.makeSecret(config.secret)\n this.config.secret = secret;\n this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);\n this.secret = crypto.makeSecret(secret.substring(0, this.secret_length))\n this.signerure = signeture.make(this.secret, this.secret);\n }\n\n private setCache(path: string, method: string, response: any) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n this.Cache.set(cacheKey, response);\n } else if (this.config.cache) {\n this.config.cache.set(cacheKey, response);\n }\n }\n\n private getCache(path: string, method: string,) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n return this.Cache.get(cacheKey);\n } else if (this.config.cache) {\n return this.config.cache.get(cacheKey);\n }\n }\n\n private PATH_CACHE = new SecurequCache<string>({ ttl: 1000 * 60 * 60, limit: 100 });\n private path(path: string) {\n let pathKey = path\n let has = this.PATH_CACHE.get(pathKey)\n if (!has) {\n const { search, pathname } = new URL(path, window.location.origin);\n const params = new URLSearchParams(search);\n const paramsObject = Object.fromEntries(params.entries());\n let split = pathname.split(\"/\").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);\n path = `${this.config.path}/${split.join(\"/\")}`;\n if (Object.keys(paramsObject).length) {\n for (let key in paramsObject) {\n paramsObject[urlpath.encrypt(key)] = paramsObject[key]\n delete paramsObject[key]\n }\n const string = JSON.stringify(paramsObject)\n const text = encodeURIComponent(crypto.encrypt(string, this.token));\n path += `?${this.reqkey}=${text}`;\n }\n this.PATH_CACHE.set(pathKey, path);\n } else {\n path = has\n }\n return path\n }\n\n private async handshake() {\n this.tokenLoading = true;\n const res = await xanFetch(this.path(`/handshake`), {\n method: \"GET\",\n headers: {\n ...this.config.headers,\n [signeture.key]: this.signerure\n },\n })\n\n const value: any = responseValue.decrypt(await res.text(), this.signerure)\n const token = crypto.decrypt(value, this.secret)\n this.token = token;\n this.reqkey = token.substring(0, token.length / 2);\n this.tokenLoading = false;\n }\n\n async send(path: string, init?: HttpRequestInit): Promise<Response> {\n if (path === '/handshake') {\n throw new Error(\"Path is not allowed\")\n }\n if (this.tokenLoading) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.tokenLoading) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n\n if (!this.token) {\n await this.handshake();\n }\n\n const info: any = {\n method: \"GET\",\n ...init,\n headers: {\n ...this.config.headers,\n ...init?.headers,\n [signeture.key]: this.signerure\n },\n }\n\n const cache_res = this.getCache(path, info.method);\n if (cache_res) {\n return cache_res.clone();\n }\n\n if (info.body) {\n if (!this.token) throw new Error(\"Token not loaded\")\n const body = new FormData();\n let _data: any = {}\n let hasFile = false;\n for (let key in info.body) {\n let ukey = urlpath.encrypt(key);\n if (info.body[key] instanceof File) {\n body.append(ukey, info.body[key]);\n hasFile = true;\n } else {\n _data[ukey] = info.body[key];\n }\n }\n\n body.append(this.reqkey, crypto.encrypt(_data, this.token));\n\n if (!hasFile) {\n info.body = new URLSearchParams(body as any);\n if (!info.headers['Content-Type']) {\n info.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n }\n } else {\n if (info.method === \"GET\") {\n info.method = \"POST\"\n }\n info.body = body\n if (!info.headers['Content-Type']) {\n info.headers['Content-Type'] = 'multipart/form-data';\n }\n }\n }\n\n const response = await xanFetch(this.path(path), info);\n const res = response.clone();\n const text = await response.text();\n const value: any = responseValue.decrypt(text, this.signerure)\n res.text = async () => value;\n if (this.config.cache === true && res.ok) {\n this.setCache(path, info.method, res.clone());\n }\n return res\n }\n\n async get(path: string, init?: HttpRequestInit) {\n return await this.send(path, init);\n }\n\n async post(path: string, body: RequestBody, init?: HttpRequestInit) {\n return await this.send(path, {\n ...init,\n method: \"POST\",\n body: body\n });\n }\n\n async put(path: string, body: RequestBody, init?: HttpRequestInit) {\n return await this.send(path, {\n ...init,\n method: \"PUT\",\n body: body\n });\n }\n\n async delete(path: string, init?: HttpRequestInit) {\n return await this.send(path, {\n ...init,\n method: \"DELETE\",\n });\n }\n}\n\nexport default SecurequClient;"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/client/index.ts"],"sourcesContent":["import crypto from \"../include/lib/crypto\";\nimport signeture from \"../include/signeture\";\nimport urlpath from \"../include/lib/urlpath\";\nimport { HttpRequestInit, RequestBody, SecurequClientConfig } from \"./types\";\nimport xanFetch from 'xanfetch'\nimport responseValue from \"../include/responseValue\";\nimport SecurequCache from \"../include/lib/cache\";\n\nclass SecurequClient {\n private config: SecurequClientConfig;\n private token: string = '';\n private tokenLoading: boolean = false;\n private Cache = new SecurequCache<Response>({ ttl: 1000 * 60 * 60, limit: 100 });\n\n private secret: string;\n private secret_length: number;\n private signerure: string;\n private reqkey: string = '';\n\n constructor(config: SecurequClientConfig) {\n this.config = { ...config }\n const secret = crypto.makeSecret(config.secret)\n this.config.secret = secret;\n this.secret_length = secret.length - (Math.floor(Math.random() * 11) + 5);\n this.secret = crypto.makeSecret(secret.substring(0, this.secret_length))\n this.signerure = signeture.make(this.secret, this.secret);\n }\n\n private setCache(path: string, method: string, response: any) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n this.Cache.set(cacheKey, response);\n } else if (this.config.cache) {\n this.config.cache.set(cacheKey, response);\n }\n }\n\n private getCache(path: string, method: string,) {\n const cacheKey = `${method}:${path}`;\n if (this.config.cache === true) {\n return this.Cache.get(cacheKey);\n } else if (this.config.cache) {\n return this.config.cache.get(cacheKey);\n }\n }\n\n private PATH_CACHE = new SecurequCache<string>({ ttl: 1000 * 60 * 60, limit: 100 });\n private path(path: string) {\n let pathKey = path\n let has = this.PATH_CACHE.get(pathKey)\n if (!has) {\n const { search, pathname } = new URL(path, window.location.origin);\n const params = new URLSearchParams(search);\n const paramsObject = Object.fromEntries(params.entries());\n let split = pathname.split(\"/\").map((s) => urlpath.encrypt(s)).filter((s) => s.length > 0);\n path = `${this.config.basepath}/${split.join(\"/\")}`;\n if (Object.keys(paramsObject).length) {\n for (let key in paramsObject) {\n paramsObject[urlpath.encrypt(key)] = paramsObject[key]\n delete paramsObject[key]\n }\n const string = JSON.stringify(paramsObject)\n const text = encodeURIComponent(crypto.encrypt(string, this.token));\n path += `?${this.reqkey}=${text}`;\n }\n this.PATH_CACHE.set(pathKey, path);\n } else {\n path = has\n }\n return path\n }\n\n private async handshake() {\n this.tokenLoading = true;\n const res = await xanFetch(this.path(`/handshake`), {\n ...this.config?.defaultOptions,\n method: \"GET\",\n headers: {\n ...this.config?.defaultOptions?.headers,\n [signeture.key]: this.signerure\n },\n })\n this.tokenLoading = false;\n\n if (res.ok) {\n const txt = await res.text();\n const value: any = responseValue.decrypt(txt, this.signerure)\n const token = crypto.decrypt(value, this.secret)\n this.token = token;\n this.reqkey = token.substring(0, token.length / 2);\n } else {\n throw new Error(\"Handshake failed\");\n }\n }\n\n async send(path: string, init?: HttpRequestInit): Promise<Response> {\n if (init?.params) {\n let url = new URL(path, window.location.origin);\n for (let key in init.params) {\n url.searchParams.set(key, (init.params as any)[key]);\n }\n path = url.pathname + url.search;\n }\n let url = new URL(path, window.location.origin);\n if (url.pathname === '/handshake') {\n throw new Error(\"Path is not allowed\")\n }\n if (this.tokenLoading) {\n await new Promise((resolve) => {\n const interval = setInterval(() => {\n if (!this.tokenLoading) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n })\n }\n\n if (!this.token) {\n await this.handshake();\n }\n\n const httpOption: any = {\n method: \"GET\",\n ...this.config?.defaultOptions,\n ...init,\n headers: {\n ...this.config?.defaultOptions?.headers,\n ...init?.headers,\n [signeture.key]: this.signerure\n },\n }\n\n if (this.config.cache === true || this.config.cache) {\n const cache_res = this.getCache(path, httpOption.method);\n if (cache_res) {\n return cache_res.clone();\n }\n }\n\n if (httpOption.body) {\n if (!this.token) throw new Error(\"Token not loaded\")\n const body = new FormData();\n let _data: any = {}\n let hasFile = false;\n for (let key in httpOption.body) {\n let ukey = urlpath.encrypt(key);\n if (httpOption.body[key] instanceof File) {\n body.append(ukey, httpOption.body[key]);\n hasFile = true;\n } else {\n _data[ukey] = httpOption.body[key];\n }\n }\n\n body.append(this.reqkey, crypto.encrypt(_data, this.token));\n\n if (!hasFile) {\n httpOption.body = new URLSearchParams(body as any);\n if (!httpOption.headers['Content-Type']) {\n httpOption.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n }\n } else {\n if (httpOption.method === \"GET\") {\n httpOption.method = \"POST\"\n }\n httpOption.body = body\n if (!httpOption.headers['Content-Type']) {\n httpOption.headers['Content-Type'] = 'multipart/form-data';\n }\n }\n }\n\n const response = await xanFetch(this.path(path), httpOption);\n const res = response.clone();\n const text = await response.text();\n const value: any = responseValue.decrypt(text, this.signerure)\n if (!response.ok) {\n throw new Error(value);\n }\n res.text = async () => value;\n if ((this.config.cache === true || this.config.cache) && res.ok) {\n this.setCache(path, httpOption.method, res.clone());\n }\n return res\n }\n\n async get(path: string, init?: Omit<HttpRequestInit, 'body' | 'method'>) {\n const res = await this.send(path, init);\n return await res.text()\n }\n\n async post(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n const res = await this.send(path, {\n ...init,\n method: \"POST\",\n });\n return await res.text();\n }\n\n async put(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n const res = await this.send(path, {\n ...init,\n method: \"PUT\",\n });\n return await res.text();\n }\n\n async delete(path: string, init?: Omit<HttpRequestInit, 'method'>) {\n const res = await this.send(path, {\n ...init,\n method: \"DELETE\",\n });\n return await res.text();\n }\n}\n\nexport default SecurequClient;"],"names":[],"mappings":"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"}
package/client/types.d.ts CHANGED
@@ -1,7 +1,9 @@
1
+ import { XanFetchOptions } from 'xanfetch/types';
2
+
1
3
  type SecurequClientConfig = {
2
4
  secret: string;
3
- path?: string;
4
- headers?: Record<string, string>;
5
+ basepath?: string;
6
+ defaultOptions?: XanFetchOptions;
5
7
  cache?: boolean | {
6
8
  get: (key: string) => any;
7
9
  set: (key: string, response: Response) => void;
@@ -10,7 +12,7 @@ type SecurequClientConfig = {
10
12
  type RequestBody = {
11
13
  [key: string]: any;
12
14
  };
13
- type HttpRequestInit = Omit<RequestInit, 'body'> & {
15
+ type HttpRequestInit = Omit<XanFetchOptions, 'body'> & {
14
16
  body?: RequestBody;
15
17
  };
16
18
 
@@ -9,7 +9,7 @@ function encrypt(data, secret) {
9
9
  secret = hash(secret).substring(0, 32);
10
10
  const key = new TextEncoder().encode(secret);
11
11
  const nonce = nacl.randomBytes(nacl.secretbox.nonceLength);
12
- const compressed = pako.default.compress(data, true); // Ensure it returns Uint8Array
12
+ const compressed = pako.compress(data, true); // Ensure it returns Uint8Array
13
13
  const encrypted = nacl.secretbox(compressed, nonce, key);
14
14
  return base64.encode(new Uint8Array([...nonce, ...encrypted]));
15
15
  }
@@ -29,7 +29,7 @@ function decrypt(data, secret) {
29
29
  const decrypted = nacl.secretbox.open(ciphertext, nonce, key);
30
30
  if (!decrypted)
31
31
  throw new Error("Decryption failed!");
32
- const decompressed = pako.default.decompress(decrypted); // Decompress as string
32
+ const decompressed = pako.decompress(decrypted); // Decompress as string
33
33
  try {
34
34
  return JSON.parse(decompressed);
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sources":["../../../src/include/lib/crypto.ts"],"sourcesContent":["import nacl from \"tweetnacl\";\nimport base64 from \"./base64\";\nimport pako from \"./pako\";\n\n/**\n * Encrypts data using TweetNaCl, compresses it with Pako (Gzip), and encodes it in Base64.\n * @param data - The plaintext data to encrypt.\n * @param secret - The secret key as a string.\n * @returns A Base64 encoded string (nonce + compressed ciphertext).\n */\nfunction encrypt(data: string | object, secret: string): string {\n data = typeof data === \"object\" ? JSON.stringify(data) : data\n secret = hash(secret).substring(0, 32)\n const key = new TextEncoder().encode(secret);\n const nonce = nacl.randomBytes(nacl.secretbox.nonceLength);\n const compressed = pako.compress(data, true) as Uint8Array // Ensure it returns Uint8Array\n const encrypted = nacl.secretbox(compressed, nonce, key);\n return base64.encode(new Uint8Array([...nonce, ...encrypted]));\n}\n\n/**\n * Decrypts a Base64-encoded NaCl-encrypted data, decompresses it with Pako (Gzip).\n * @param data - The Base64 encoded string (nonce + compressed ciphertext).\n * @param secret - The secret key as a string.\n * @returns The decrypted plaintext string.\n */\nfunction decrypt(data: string, secret: string): string {\n try {\n secret = hash(secret).substring(0, 32)\n const key = new TextEncoder().encode(secret);\n const encryptedBytes = base64.decode(data);\n const nonce = encryptedBytes.slice(0, nacl.secretbox.nonceLength);\n const ciphertext = encryptedBytes.slice(nacl.secretbox.nonceLength);\n const decrypted = nacl.secretbox.open(ciphertext, nonce, key);\n if (!decrypted) throw new Error(\"Decryption failed!\");\n const decompressed = pako.decompress(decrypted); // Decompress as string\n try {\n return JSON.parse(decompressed);\n } catch (error) {\n return decompressed;\n }\n } catch (error) {\n throw new Error(\"Invalid encrypted data.\");\n }\n}\n\n/**\n * Hashes a string using NaCl's hash function.\n * @param data - The input string to hash.\n * @returns The hash of the input string.\n */\nlet hashed = new Map<string, string>();\nfunction hash(data: string): string {\n if (hashed.has(data)) return hashed.get(data) as string\n const inputBytes = new TextEncoder().encode(data);\n const hashedData = nacl.hash(inputBytes);\n const d = Array.from(hashedData)\n .map(byte => byte.toString(16).padStart(2, '0'))\n .join('');\n hashed.set(data, d)\n return d\n}\n\nconst makeSecret = (secret: string) => {\n return hash(secret).substring(0, 32);\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n hash,\n makeSecret\n};\n\nexport default crypto;\n"],"names":["pako"],"mappings":"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"}
1
+ {"version":3,"file":"crypto.js","sources":["../../../src/include/lib/crypto.ts"],"sourcesContent":["import nacl from \"tweetnacl\";\nimport base64 from \"./base64\";\nimport pako from \"./pako\";\n\n/**\n * Encrypts data using TweetNaCl, compresses it with Pako (Gzip), and encodes it in Base64.\n * @param data - The plaintext data to encrypt.\n * @param secret - The secret key as a string.\n * @returns A Base64 encoded string (nonce + compressed ciphertext).\n */\nfunction encrypt(data: string | object, secret: string): string {\n data = typeof data === \"object\" ? JSON.stringify(data) : data\n secret = hash(secret).substring(0, 32)\n const key = new TextEncoder().encode(secret);\n const nonce = nacl.randomBytes(nacl.secretbox.nonceLength);\n const compressed = pako.compress(data, true) as Uint8Array // Ensure it returns Uint8Array\n const encrypted = nacl.secretbox(compressed, nonce, key);\n return base64.encode(new Uint8Array([...nonce, ...encrypted]));\n}\n\n/**\n * Decrypts a Base64-encoded NaCl-encrypted data, decompresses it with Pako (Gzip).\n * @param data - The Base64 encoded string (nonce + compressed ciphertext).\n * @param secret - The secret key as a string.\n * @returns The decrypted plaintext string.\n */\nfunction decrypt(data: string, secret: string): string {\n try {\n secret = hash(secret).substring(0, 32)\n const key = new TextEncoder().encode(secret);\n const encryptedBytes = base64.decode(data);\n const nonce = encryptedBytes.slice(0, nacl.secretbox.nonceLength);\n const ciphertext = encryptedBytes.slice(nacl.secretbox.nonceLength);\n const decrypted = nacl.secretbox.open(ciphertext, nonce, key);\n if (!decrypted) throw new Error(\"Decryption failed!\");\n const decompressed = pako.decompress(decrypted); // Decompress as string\n try {\n return JSON.parse(decompressed);\n } catch (error) {\n return decompressed;\n }\n } catch (error) {\n throw new Error(\"Invalid encrypted data.\");\n }\n}\n\n/**\n * Hashes a string using NaCl's hash function.\n * @param data - The input string to hash.\n * @returns The hash of the input string.\n */\nlet hashed = new Map<string, string>();\nfunction hash(data: string): string {\n if (hashed.has(data)) return hashed.get(data) as string\n const inputBytes = new TextEncoder().encode(data);\n const hashedData = nacl.hash(inputBytes);\n const d = Array.from(hashedData)\n .map(byte => byte.toString(16).padStart(2, '0'))\n .join('');\n hashed.set(data, d)\n return d\n}\n\nconst makeSecret = (secret: string) => {\n return hash(secret).substring(0, 32);\n}\n\nconst crypto = {\n encrypt,\n decrypt,\n hash,\n makeSecret\n};\n\nexport default crypto;\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var pako$1=require('pako'),base64=require('./base64.js');/**
1
+ 'use strict';var pako$1=require('pako'),base64=require('./base64.js');/**
2
2
  * Compresses a string message using Pako (Gzip).
3
3
  * @param message - The plaintext string message to compress.
4
4
  * @returns A Base64 encoded string of the compressed data.
@@ -25,4 +25,4 @@ function decompress(data) {
25
25
  var pako = {
26
26
  compress,
27
27
  decompress
28
- };exports.compress=compress;exports.decompress=decompress;exports.default=pako;//# sourceMappingURL=pako.js.map
28
+ };module.exports=pako;//# sourceMappingURL=pako.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pako.js","sources":["../../../src/include/lib/pako.ts"],"sourcesContent":["import pako from \"pako\";\nimport base64 from \"./base64\";\n\n/**\n * Compresses a string message using Pako (Gzip).\n * @param message - The plaintext string message to compress.\n * @returns A Base64 encoded string of the compressed data.\n */\nexport function compress(data: string, returnUnit8?: boolean): string | Uint8Array {\n const encoded = new TextEncoder().encode(data);\n const compressed = pako.gzip(encoded);\n if (returnUnit8) return compressed;\n return base64.encode(compressed);\n}\n\n/**\n * Decompresses a Base64 encoded compressed message using Pako (Gzip).\n * @param data - The Base64 encoded compressed data.\n * @returns The decompressed plaintext string.\n */\nexport function decompress(data: string | Uint8Array): string {\n if (typeof data === 'string') {\n data = base64.decode(data);\n }\n const decompressed = pako.ungzip(data);\n return new TextDecoder().decode(decompressed);\n}\n\nexport default {\n compress,\n decompress\n}"],"names":["pako"],"mappings":"+HAGA;;;;AAIG;AACG,SAAU,QAAQ,CAAC,IAAY,EAAE,WAAqB,EAAA;IACzD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9C,MAAM,UAAU,GAAGA,MAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACrC,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,UAAU;AAClC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACnC;AAEA;;;;AAIG;AACG,SAAU,UAAU,CAAC,IAAyB,EAAA;AACjD,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC3B,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5B,IAAA;IACD,MAAM,YAAY,GAAGA,MAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACtC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AAChD;AAEA,WAAe;IACZ,QAAQ;IACR;CACF"}
1
+ {"version":3,"file":"pako.js","sources":["../../../src/include/lib/pako.ts"],"sourcesContent":["import pako from \"pako\";\nimport base64 from \"./base64\";\n\n/**\n * Compresses a string message using Pako (Gzip).\n * @param message - The plaintext string message to compress.\n * @returns A Base64 encoded string of the compressed data.\n */\nfunction compress(data: string, returnUnit8?: boolean): string | Uint8Array {\n const encoded = new TextEncoder().encode(data);\n const compressed = pako.gzip(encoded);\n if (returnUnit8) return compressed;\n return base64.encode(compressed);\n}\n\n/**\n * Decompresses a Base64 encoded compressed message using Pako (Gzip).\n * @param data - The Base64 encoded compressed data.\n * @returns The decompressed plaintext string.\n */\nfunction decompress(data: string | Uint8Array): string {\n if (typeof data === 'string') {\n data = base64.decode(data);\n }\n const decompressed = pako.ungzip(data);\n return new TextDecoder().decode(decompressed);\n}\n\nexport default {\n compress,\n decompress\n}"],"names":["pako"],"mappings":"sEAGA;;;;AAIG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,WAAqB,EAAA;IAClD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9C,MAAM,UAAU,GAAGA,MAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACrC,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,UAAU;AAClC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACnC;AAEA;;;;AAIG;AACH,SAAS,UAAU,CAAC,IAAyB,EAAA;AAC1C,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC3B,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5B,IAAA;IACD,MAAM,YAAY,GAAGA,MAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACtC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AAChD;AAEA,WAAe;IACZ,QAAQ;IACR;CACF"}
@@ -25,4 +25,4 @@ function decompress(data) {
25
25
  var pako = {
26
26
  compress,
27
27
  decompress
28
- };export{compress,decompress,pako as default};//# sourceMappingURL=pako.mjs.map
28
+ };export{pako as default};//# sourceMappingURL=pako.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pako.mjs","sources":["../../../src/include/lib/pako.ts"],"sourcesContent":["import pako from \"pako\";\nimport base64 from \"./base64\";\n\n/**\n * Compresses a string message using Pako (Gzip).\n * @param message - The plaintext string message to compress.\n * @returns A Base64 encoded string of the compressed data.\n */\nexport function compress(data: string, returnUnit8?: boolean): string | Uint8Array {\n const encoded = new TextEncoder().encode(data);\n const compressed = pako.gzip(encoded);\n if (returnUnit8) return compressed;\n return base64.encode(compressed);\n}\n\n/**\n * Decompresses a Base64 encoded compressed message using Pako (Gzip).\n * @param data - The Base64 encoded compressed data.\n * @returns The decompressed plaintext string.\n */\nexport function decompress(data: string | Uint8Array): string {\n if (typeof data === 'string') {\n data = base64.decode(data);\n }\n const decompressed = pako.ungzip(data);\n return new TextDecoder().decode(decompressed);\n}\n\nexport default {\n compress,\n decompress\n}"],"names":["pako"],"mappings":"0DAGA;;;;AAIG;AACG,SAAU,QAAQ,CAAC,IAAY,EAAE,WAAqB,EAAA;IACzD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9C,MAAM,UAAU,GAAGA,MAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACrC,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,UAAU;AAClC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACnC;AAEA;;;;AAIG;AACG,SAAU,UAAU,CAAC,IAAyB,EAAA;AACjD,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC3B,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5B,IAAA;IACD,MAAM,YAAY,GAAGA,MAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACtC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AAChD;AAEA,WAAe;IACZ,QAAQ;IACR;CACF"}
1
+ {"version":3,"file":"pako.mjs","sources":["../../../src/include/lib/pako.ts"],"sourcesContent":["import pako from \"pako\";\nimport base64 from \"./base64\";\n\n/**\n * Compresses a string message using Pako (Gzip).\n * @param message - The plaintext string message to compress.\n * @returns A Base64 encoded string of the compressed data.\n */\nfunction compress(data: string, returnUnit8?: boolean): string | Uint8Array {\n const encoded = new TextEncoder().encode(data);\n const compressed = pako.gzip(encoded);\n if (returnUnit8) return compressed;\n return base64.encode(compressed);\n}\n\n/**\n * Decompresses a Base64 encoded compressed message using Pako (Gzip).\n * @param data - The Base64 encoded compressed data.\n * @returns The decompressed plaintext string.\n */\nfunction decompress(data: string | Uint8Array): string {\n if (typeof data === 'string') {\n data = base64.decode(data);\n }\n const decompressed = pako.ungzip(data);\n return new TextDecoder().decode(decompressed);\n}\n\nexport default {\n compress,\n decompress\n}"],"names":["pako"],"mappings":"0DAGA;;;;AAIG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,WAAqB,EAAA;IAClD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9C,MAAM,UAAU,GAAGA,MAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACrC,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,UAAU;AAClC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACnC;AAEA;;;;AAIG;AACH,SAAS,UAAU,CAAC,IAAyB,EAAA;AAC1C,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC3B,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5B,IAAA;IACD,MAAM,YAAY,GAAGA,MAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACtC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AAChD;AAEA,WAAe;IACZ,QAAQ;IACR;CACF"}
package/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var index=require('./server/index.js'),index$1=require('./client/index.js');exports.SecurequServer=index.SecurequServer;exports.SecurequClient=index$1.SecurequClient;//# sourceMappingURL=index.js.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var index=require('./server/index.js'),index$1=require('./client/index.js');exports.SecurequServer=index;exports.SecurequClient=index$1;//# sourceMappingURL=index.js.map
package/index.mjs CHANGED
@@ -1 +1 @@
1
- export{SecurequServer}from'./server/index.mjs';export{SecurequClient}from'./client/index.mjs';//# sourceMappingURL=index.mjs.map
1
+ export{default as SecurequServer}from'./server/index.mjs';export{default as SecurequClient}from'./client/index.mjs';//# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "securequ",
3
- "version": "1.0.12",
3
+ "version": "1.0.14",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "dependencies": {
7
7
  "pako": "^2.1.0",
8
8
  "path-to-regexp": "^8.2.0",
9
9
  "tweetnacl": "^1.0.3",
10
- "xanfetch": "^1.0.7"
10
+ "xanfetch": "^1.0.8"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^22.15.24",
package/server/index.d.ts CHANGED
@@ -15,4 +15,4 @@ declare class SecurequServer {
15
15
  listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse>;
16
16
  }
17
17
 
18
- export { SecurequServer, SecurequServer as default };
18
+ export { SecurequServer as default };
package/server/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var pathToRegexp=require('path-to-regexp'),crypto=require('../include/lib/crypto.js'),reverser=require('../include/lib/reverser.js'),responseValue=require('../include/responseValue.js'),signeture=require('../include/signeture.js'),cache=require('../include/lib/cache.js');class SecurequServer {
1
+ 'use strict';var pathToRegexp=require('path-to-regexp'),crypto=require('../include/lib/crypto.js'),reverser=require('../include/lib/reverser.js'),responseValue=require('../include/responseValue.js'),signeture=require('../include/signeture.js'),cache=require('../include/lib/cache.js');class SecurequServer {
2
2
  constructor(config) {
3
3
  this.HandlerCache = new cache({ ttl: 1000 * 60 * 60, limit: 100 });
4
4
  this.routes = {
@@ -55,7 +55,6 @@
55
55
  const clientSecret = signeture.verify(listenerInfo.signeture);
56
56
  const { path, body, method } = listenerInfo;
57
57
  const url = new URL(path, "http://localhost");
58
- // format the path
59
58
  url.pathname = url.pathname.replace(this.config.basepath, "/");
60
59
  let split = url.pathname.split("/").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);
61
60
  url.pathname = `/${split.join("/")}`;
@@ -73,7 +72,7 @@
73
72
  searchParams[ukey] = decripted[key];
74
73
  }
75
74
  }
76
- if (body[reqkey]) {
75
+ if (body && body[reqkey]) {
77
76
  let decripted = crypto.decrypt(body[reqkey], handshakeSecret);
78
77
  for (let key in decripted) {
79
78
  let ukey = reverser.decrypt(key);
@@ -113,4 +112,4 @@
113
112
  value: 'Not Found'
114
113
  };
115
114
  }
116
- }exports.SecurequServer=SecurequServer;exports.default=SecurequServer;//# sourceMappingURL=index.js.map
115
+ }module.exports=SecurequServer;//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import { match } from \"path-to-regexp\";\nimport crypto from \"../include/lib/crypto\";\nimport reverser from \"../include/lib/reverser\";\nimport responseValue from \"../include/responseValue\";\nimport signeture from \"../include/signeture\";\nimport { HandlerFunction, HandlerInfo, HTTPMethods, ListenerInfo, RouteFactory, ServerResponse, SecurequServerConfig } from \"./types\";\nimport SecurequCache from \"../include/lib/cache\";\n\nexport class SecurequServer {\n private HandlerCache = new SecurequCache<HandlerFunction>({ ttl: 1000 * 60 * 60, limit: 100 });\n private routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n private config: SecurequServerConfig;\n private secret: string = crypto.makeSecret(Math.random().toString(36).substring(7));\n\n constructor(config: SecurequServerConfig) {\n this.config = { ...config }\n }\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n\n async handleRequest(info: HandlerInfo, args?: any) {\n const { path, method } = info;\n let cacheHandler = this.HandlerCache.get(`${method}:${path}`);\n if (cacheHandler) {\n await cacheHandler(info, args)\n return\n }\n let values: any = Object.values(this.routes[method]);\n for (let value of values) {\n let { test, handler } = value\n const match = test(path)\n if (match) {\n info.params = match.params;\n await handler(info, args)\n this.HandlerCache.set(`${method}:${path}`, handler)\n }\n }\n }\n\n async listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse> {\n try {\n if (!listenerInfo.signeture || !listenerInfo.path || !listenerInfo.method) throw new Error(\"Invalid Request\");\n\n const clientSecret = signeture.verify(listenerInfo.signeture);\n const { path, body, method } = listenerInfo;\n const url = new URL(path, \"http://localhost\");\n\n // format the path\n url.pathname = url.pathname.replace(this.config.basepath, \"/\")\n let split = url.pathname.split(\"/\").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);\n url.pathname = `/${split.join(\"/\")}`;\n\n // handle handshake \n const handshakeSecret = crypto.makeSecret(this.secret + clientSecret);\n const reqkey = handshakeSecret.substring(0, handshakeSecret.length / 2);\n\n if (method === 'GET' && url.pathname === \"/handshake\") {\n throw crypto.encrypt(handshakeSecret, clientSecret)\n }\n\n let data: any = {}, searchParams: any = {}\n\n if (url.searchParams.has(reqkey)) {\n let decripted: any = crypto.decrypt(url.searchParams.get(reqkey) as string, handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n searchParams[ukey] = decripted[key]\n }\n }\n\n if (body[reqkey]) {\n let decripted: any = crypto.decrypt(body[reqkey], handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n data[ukey] = decripted[key]\n }\n }\n\n // handle the request\n await this.handleRequest({\n method,\n path: url.pathname,\n body: data,\n searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n if (info instanceof Error) {\n return {\n status: 404,\n value: responseValue.encrypt(info.message, listenerInfo.signeture)\n }\n } else if (info instanceof Response) {\n let text = await info.text();\n return {\n status: info.status,\n value: responseValue.encrypt(text, listenerInfo.signeture)\n }\n }\n return {\n status: 200,\n value: responseValue.encrypt(info, listenerInfo.signeture)\n };\n }\n\n return {\n status: 404,\n value: 'Not Found'\n };\n }\n}\n\nexport default SecurequServer;"],"names":["SecurequCache","match"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["import { match } from \"path-to-regexp\";\nimport crypto from \"../include/lib/crypto\";\nimport reverser from \"../include/lib/reverser\";\nimport responseValue from \"../include/responseValue\";\nimport signeture from \"../include/signeture\";\nimport { HandlerFunction, HandlerInfo, HTTPMethods, ListenerInfo, RouteFactory, ServerResponse, SecurequServerConfig } from \"./types\";\nimport SecurequCache from \"../include/lib/cache\";\n\nclass SecurequServer {\n private HandlerCache = new SecurequCache<HandlerFunction>({ ttl: 1000 * 60 * 60, limit: 100 });\n private routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n private config: SecurequServerConfig;\n private secret: string = crypto.makeSecret(Math.random().toString(36).substring(7));\n\n constructor(config: SecurequServerConfig) {\n this.config = { ...config }\n }\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n\n async handleRequest(info: HandlerInfo, args?: any) {\n const { path, method } = info;\n let cacheHandler = this.HandlerCache.get(`${method}:${path}`);\n if (cacheHandler) {\n await cacheHandler(info, args)\n return\n }\n let values: any = Object.values(this.routes[method]);\n for (let value of values) {\n let { test, handler } = value\n const match = test(path)\n if (match) {\n info.params = match.params;\n await handler(info, args)\n this.HandlerCache.set(`${method}:${path}`, handler)\n }\n }\n }\n\n async listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse> {\n try {\n if (!listenerInfo.signeture || !listenerInfo.path || !listenerInfo.method) throw new Error(\"Invalid Request\");\n\n const clientSecret = signeture.verify(listenerInfo.signeture);\n const { path, body, method } = listenerInfo;\n const url = new URL(path, \"http://localhost\");\n url.pathname = url.pathname.replace(this.config.basepath, \"/\")\n let split = url.pathname.split(\"/\").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);\n url.pathname = `/${split.join(\"/\")}`;\n\n // handle handshake \n const handshakeSecret = crypto.makeSecret(this.secret + clientSecret);\n const reqkey = handshakeSecret.substring(0, handshakeSecret.length / 2);\n\n if (method === 'GET' && url.pathname === \"/handshake\") {\n throw crypto.encrypt(handshakeSecret, clientSecret)\n }\n\n let data: any = {}, searchParams: any = {}\n\n if (url.searchParams.has(reqkey)) {\n let decripted: any = crypto.decrypt(url.searchParams.get(reqkey) as string, handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n searchParams[ukey] = decripted[key]\n }\n }\n\n if (body && body[reqkey]) {\n let decripted: any = crypto.decrypt(body[reqkey], handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n data[ukey] = decripted[key]\n }\n }\n\n // handle the request\n await this.handleRequest({\n method,\n path: url.pathname,\n body: data,\n searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n if (info instanceof Error) {\n return {\n status: 404,\n value: responseValue.encrypt(info.message, listenerInfo.signeture)\n }\n } else if (info instanceof Response) {\n let text = await info.text();\n return {\n status: info.status,\n value: responseValue.encrypt(text, listenerInfo.signeture)\n }\n }\n return {\n status: 200,\n value: responseValue.encrypt(info, listenerInfo.signeture)\n };\n }\n\n return {\n status: 404,\n value: 'Not Found'\n };\n }\n}\n\nexport default SecurequServer;"],"names":["SecurequCache","match"],"mappings":"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"}
package/server/index.mjs CHANGED
@@ -55,7 +55,6 @@ import {match}from'path-to-regexp';import crypto from'../include/lib/crypto.mjs'
55
55
  const clientSecret = signeture.verify(listenerInfo.signeture);
56
56
  const { path, body, method } = listenerInfo;
57
57
  const url = new URL(path, "http://localhost");
58
- // format the path
59
58
  url.pathname = url.pathname.replace(this.config.basepath, "/");
60
59
  let split = url.pathname.split("/").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);
61
60
  url.pathname = `/${split.join("/")}`;
@@ -73,7 +72,7 @@ import {match}from'path-to-regexp';import crypto from'../include/lib/crypto.mjs'
73
72
  searchParams[ukey] = decripted[key];
74
73
  }
75
74
  }
76
- if (body[reqkey]) {
75
+ if (body && body[reqkey]) {
77
76
  let decripted = crypto.decrypt(body[reqkey], handshakeSecret);
78
77
  for (let key in decripted) {
79
78
  let ukey = reverser.decrypt(key);
@@ -113,4 +112,4 @@ import {match}from'path-to-regexp';import crypto from'../include/lib/crypto.mjs'
113
112
  value: 'Not Found'
114
113
  };
115
114
  }
116
- }export{SecurequServer,SecurequServer as default};//# sourceMappingURL=index.mjs.map
115
+ }export{SecurequServer as default};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/server/index.ts"],"sourcesContent":["import { match } from \"path-to-regexp\";\nimport crypto from \"../include/lib/crypto\";\nimport reverser from \"../include/lib/reverser\";\nimport responseValue from \"../include/responseValue\";\nimport signeture from \"../include/signeture\";\nimport { HandlerFunction, HandlerInfo, HTTPMethods, ListenerInfo, RouteFactory, ServerResponse, SecurequServerConfig } from \"./types\";\nimport SecurequCache from \"../include/lib/cache\";\n\nexport class SecurequServer {\n private HandlerCache = new SecurequCache<HandlerFunction>({ ttl: 1000 * 60 * 60, limit: 100 });\n private routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n private config: SecurequServerConfig;\n private secret: string = crypto.makeSecret(Math.random().toString(36).substring(7));\n\n constructor(config: SecurequServerConfig) {\n this.config = { ...config }\n }\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n\n async handleRequest(info: HandlerInfo, args?: any) {\n const { path, method } = info;\n let cacheHandler = this.HandlerCache.get(`${method}:${path}`);\n if (cacheHandler) {\n await cacheHandler(info, args)\n return\n }\n let values: any = Object.values(this.routes[method]);\n for (let value of values) {\n let { test, handler } = value\n const match = test(path)\n if (match) {\n info.params = match.params;\n await handler(info, args)\n this.HandlerCache.set(`${method}:${path}`, handler)\n }\n }\n }\n\n async listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse> {\n try {\n if (!listenerInfo.signeture || !listenerInfo.path || !listenerInfo.method) throw new Error(\"Invalid Request\");\n\n const clientSecret = signeture.verify(listenerInfo.signeture);\n const { path, body, method } = listenerInfo;\n const url = new URL(path, \"http://localhost\");\n\n // format the path\n url.pathname = url.pathname.replace(this.config.basepath, \"/\")\n let split = url.pathname.split(\"/\").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);\n url.pathname = `/${split.join(\"/\")}`;\n\n // handle handshake \n const handshakeSecret = crypto.makeSecret(this.secret + clientSecret);\n const reqkey = handshakeSecret.substring(0, handshakeSecret.length / 2);\n\n if (method === 'GET' && url.pathname === \"/handshake\") {\n throw crypto.encrypt(handshakeSecret, clientSecret)\n }\n\n let data: any = {}, searchParams: any = {}\n\n if (url.searchParams.has(reqkey)) {\n let decripted: any = crypto.decrypt(url.searchParams.get(reqkey) as string, handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n searchParams[ukey] = decripted[key]\n }\n }\n\n if (body[reqkey]) {\n let decripted: any = crypto.decrypt(body[reqkey], handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n data[ukey] = decripted[key]\n }\n }\n\n // handle the request\n await this.handleRequest({\n method,\n path: url.pathname,\n body: data,\n searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n if (info instanceof Error) {\n return {\n status: 404,\n value: responseValue.encrypt(info.message, listenerInfo.signeture)\n }\n } else if (info instanceof Response) {\n let text = await info.text();\n return {\n status: info.status,\n value: responseValue.encrypt(text, listenerInfo.signeture)\n }\n }\n return {\n status: 200,\n value: responseValue.encrypt(info, listenerInfo.signeture)\n };\n }\n\n return {\n status: 404,\n value: 'Not Found'\n };\n }\n}\n\nexport default SecurequServer;"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/server/index.ts"],"sourcesContent":["import { match } from \"path-to-regexp\";\nimport crypto from \"../include/lib/crypto\";\nimport reverser from \"../include/lib/reverser\";\nimport responseValue from \"../include/responseValue\";\nimport signeture from \"../include/signeture\";\nimport { HandlerFunction, HandlerInfo, HTTPMethods, ListenerInfo, RouteFactory, ServerResponse, SecurequServerConfig } from \"./types\";\nimport SecurequCache from \"../include/lib/cache\";\n\nclass SecurequServer {\n private HandlerCache = new SecurequCache<HandlerFunction>({ ttl: 1000 * 60 * 60, limit: 100 });\n private routes: RouteFactory = {\n GET: {},\n POST: {},\n PUT: {},\n DELETE: {}\n };\n private config: SecurequServerConfig;\n private secret: string = crypto.makeSecret(Math.random().toString(36).substring(7));\n\n constructor(config: SecurequServerConfig) {\n this.config = { ...config }\n }\n\n async addRoute(path: string, method: HTTPMethods, handler: HandlerFunction) {\n if (this.routes[method][path]) return\n this.routes[method][path] = {\n handler,\n test: match(path)\n }\n }\n\n async get(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'GET', handler)\n }\n\n async post(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'POST', handler)\n }\n\n async put(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'PUT', handler)\n }\n\n async delete(path: string, handler: HandlerFunction) {\n this.addRoute(path, 'DELETE', handler)\n }\n\n async handleRequest(info: HandlerInfo, args?: any) {\n const { path, method } = info;\n let cacheHandler = this.HandlerCache.get(`${method}:${path}`);\n if (cacheHandler) {\n await cacheHandler(info, args)\n return\n }\n let values: any = Object.values(this.routes[method]);\n for (let value of values) {\n let { test, handler } = value\n const match = test(path)\n if (match) {\n info.params = match.params;\n await handler(info, args)\n this.HandlerCache.set(`${method}:${path}`, handler)\n }\n }\n }\n\n async listen(listenerInfo: ListenerInfo, args?: any): Promise<ServerResponse> {\n try {\n if (!listenerInfo.signeture || !listenerInfo.path || !listenerInfo.method) throw new Error(\"Invalid Request\");\n\n const clientSecret = signeture.verify(listenerInfo.signeture);\n const { path, body, method } = listenerInfo;\n const url = new URL(path, \"http://localhost\");\n url.pathname = url.pathname.replace(this.config.basepath, \"/\")\n let split = url.pathname.split(\"/\").map((s) => reverser.decrypt(s)).filter((s) => s.length > 0);\n url.pathname = `/${split.join(\"/\")}`;\n\n // handle handshake \n const handshakeSecret = crypto.makeSecret(this.secret + clientSecret);\n const reqkey = handshakeSecret.substring(0, handshakeSecret.length / 2);\n\n if (method === 'GET' && url.pathname === \"/handshake\") {\n throw crypto.encrypt(handshakeSecret, clientSecret)\n }\n\n let data: any = {}, searchParams: any = {}\n\n if (url.searchParams.has(reqkey)) {\n let decripted: any = crypto.decrypt(url.searchParams.get(reqkey) as string, handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n searchParams[ukey] = decripted[key]\n }\n }\n\n if (body && body[reqkey]) {\n let decripted: any = crypto.decrypt(body[reqkey], handshakeSecret)\n for (let key in decripted) {\n let ukey = reverser.decrypt(key)\n data[ukey] = decripted[key]\n }\n }\n\n // handle the request\n await this.handleRequest({\n method,\n path: url.pathname,\n body: data,\n searchParams,\n params: {}\n }, args);\n } catch (info: any) {\n if (info instanceof Error) {\n return {\n status: 404,\n value: responseValue.encrypt(info.message, listenerInfo.signeture)\n }\n } else if (info instanceof Response) {\n let text = await info.text();\n return {\n status: info.status,\n value: responseValue.encrypt(text, listenerInfo.signeture)\n }\n }\n return {\n status: 200,\n value: responseValue.encrypt(info, listenerInfo.signeture)\n };\n }\n\n return {\n status: 404,\n value: 'Not Found'\n };\n }\n}\n\nexport default SecurequServer;"],"names":[],"mappings":"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"}