speexjs 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +555 -0
  2. package/dist/cli/index.d.ts +1 -0
  3. package/dist/cli/index.js +1017 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/client/index.d.ts +73 -0
  6. package/dist/client/index.js +927 -0
  7. package/dist/client/index.js.map +1 -0
  8. package/dist/client/signals/index.d.ts +62 -0
  9. package/dist/client/signals/index.js +248 -0
  10. package/dist/client/signals/index.js.map +1 -0
  11. package/dist/client/vdom/index.d.ts +50 -0
  12. package/dist/client/vdom/index.js +540 -0
  13. package/dist/client/vdom/index.js.map +1 -0
  14. package/dist/client/vdom/jsx-runtime.d.ts +9 -0
  15. package/dist/client/vdom/jsx-runtime.js +203 -0
  16. package/dist/client/vdom/jsx-runtime.js.map +1 -0
  17. package/dist/index-CMkhSDh7.d.ts +97 -0
  18. package/dist/index.d.ts +18 -0
  19. package/dist/index.js +6402 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/jsx-DGrnv8QB.d.ts +8 -0
  22. package/dist/response-Ca8KWK5_.d.ts +173 -0
  23. package/dist/rpc/index.d.ts +70 -0
  24. package/dist/rpc/index.js +136 -0
  25. package/dist/rpc/index.js.map +1 -0
  26. package/dist/schema/index.d.ts +231 -0
  27. package/dist/schema/index.js +1160 -0
  28. package/dist/schema/index.js.map +1 -0
  29. package/dist/server/auth/index.d.ts +61 -0
  30. package/dist/server/auth/index.js +462 -0
  31. package/dist/server/auth/index.js.map +1 -0
  32. package/dist/server/cache/index.d.ts +45 -0
  33. package/dist/server/cache/index.js +238 -0
  34. package/dist/server/cache/index.js.map +1 -0
  35. package/dist/server/container/index.d.ts +20 -0
  36. package/dist/server/container/index.js +62 -0
  37. package/dist/server/container/index.js.map +1 -0
  38. package/dist/server/controller/index.d.ts +37 -0
  39. package/dist/server/controller/index.js +139 -0
  40. package/dist/server/controller/index.js.map +1 -0
  41. package/dist/server/database/index.d.ts +461 -0
  42. package/dist/server/database/index.js +1977 -0
  43. package/dist/server/database/index.js.map +1 -0
  44. package/dist/server/events/index.d.ts +29 -0
  45. package/dist/server/events/index.js +159 -0
  46. package/dist/server/events/index.js.map +1 -0
  47. package/dist/server/gate/index.d.ts +36 -0
  48. package/dist/server/gate/index.js +169 -0
  49. package/dist/server/gate/index.js.map +1 -0
  50. package/dist/server/http/index.d.ts +45 -0
  51. package/dist/server/http/index.js +871 -0
  52. package/dist/server/http/index.js.map +1 -0
  53. package/dist/server/index.d.ts +79 -0
  54. package/dist/server/index.js +4185 -0
  55. package/dist/server/index.js.map +1 -0
  56. package/dist/server/middleware/index.d.ts +5 -0
  57. package/dist/server/middleware/index.js +416 -0
  58. package/dist/server/middleware/index.js.map +1 -0
  59. package/dist/server/router/index.d.ts +5 -0
  60. package/dist/server/router/index.js +231 -0
  61. package/dist/server/router/index.js.map +1 -0
  62. package/dist/server/storage/index.d.ts +66 -0
  63. package/dist/server/storage/index.js +244 -0
  64. package/dist/server/storage/index.js.map +1 -0
  65. package/dist/session-guard-CZeN87L9.d.ts +48 -0
  66. package/dist/types-CXH8hPei.d.ts +38 -0
  67. package/package.json +138 -0
@@ -0,0 +1,238 @@
1
+ // src/server/cache/index.ts
2
+ import * as crypto from "crypto";
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ var Cache = class {
6
+ store;
7
+ config;
8
+ hits = 0;
9
+ misses = 0;
10
+ constructor(config) {
11
+ this.config = {
12
+ store: "memory",
13
+ path: path.join(process.cwd(), "cache"),
14
+ ttl: 3600,
15
+ prefix: "",
16
+ ...config
17
+ };
18
+ this.store = /* @__PURE__ */ new Map();
19
+ if (this.config.store === "file") {
20
+ const dir = this.config.path;
21
+ if (!fs.existsSync(dir)) {
22
+ fs.mkdirSync(dir, { recursive: true });
23
+ }
24
+ }
25
+ }
26
+ async get(key) {
27
+ const fullKey = this.config.prefix + key;
28
+ if (this.config.store === "file") {
29
+ return this.fileGet(fullKey);
30
+ }
31
+ const entry = this.store.get(fullKey);
32
+ if (entry === void 0) {
33
+ this.misses++;
34
+ return null;
35
+ }
36
+ if (this.isExpired(entry)) {
37
+ this.store.delete(fullKey);
38
+ this.misses++;
39
+ return null;
40
+ }
41
+ this.hits++;
42
+ return entry.value;
43
+ }
44
+ async remember(key, ttl, callback) {
45
+ const cached = await this.get(key);
46
+ if (cached !== null) {
47
+ return cached;
48
+ }
49
+ const value = await callback();
50
+ await this.set(key, value, ttl);
51
+ return value;
52
+ }
53
+ async set(key, value, ttl) {
54
+ const fullKey = this.config.prefix + key;
55
+ const expiresAt = ttl !== void 0 ? Date.now() + ttl * 1e3 : Date.now() + this.config.ttl * 1e3;
56
+ if (this.config.store === "file") {
57
+ await this.fileSet(fullKey, { value, expiresAt });
58
+ return;
59
+ }
60
+ this.store.set(fullKey, { value, expiresAt });
61
+ }
62
+ async add(key, value, ttl) {
63
+ const exists = await this.has(key);
64
+ if (exists) {
65
+ return false;
66
+ }
67
+ await this.set(key, value, ttl);
68
+ return true;
69
+ }
70
+ async delete(key) {
71
+ const fullKey = this.config.prefix + key;
72
+ if (this.config.store === "file") {
73
+ return this.fileDelete(fullKey);
74
+ }
75
+ return this.store.delete(fullKey);
76
+ }
77
+ async clear() {
78
+ if (this.config.store === "file") {
79
+ const dir = this.config.path;
80
+ if (fs.existsSync(dir)) {
81
+ for (const file of fs.readdirSync(dir)) {
82
+ fs.unlinkSync(path.join(dir, file));
83
+ }
84
+ }
85
+ return;
86
+ }
87
+ this.store.clear();
88
+ }
89
+ async has(key) {
90
+ const value = await this.get(key);
91
+ return value !== null;
92
+ }
93
+ async getMultiple(keys) {
94
+ const result = {};
95
+ for (const key of keys) {
96
+ const value = await this.get(key);
97
+ if (value !== null) {
98
+ result[key] = value;
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ async setMultiple(items, ttl) {
104
+ for (const [key, value] of Object.entries(items)) {
105
+ await this.set(key, value, ttl);
106
+ }
107
+ }
108
+ async increment(key, value = 1) {
109
+ const current = await this.get(key);
110
+ const newValue = (current ?? 0) + value;
111
+ await this.set(key, newValue);
112
+ return newValue;
113
+ }
114
+ async decrement(key, value = 1) {
115
+ const current = await this.get(key);
116
+ const newValue = (current ?? 0) - value;
117
+ await this.set(key, newValue);
118
+ return newValue;
119
+ }
120
+ async forever(key, value) {
121
+ const fullKey = this.config.prefix + key;
122
+ const expiresAt = Number.MAX_SAFE_INTEGER;
123
+ if (this.config.store === "file") {
124
+ await this.fileSet(fullKey, { value, expiresAt });
125
+ return;
126
+ }
127
+ this.store.set(fullKey, { value, expiresAt });
128
+ }
129
+ stats() {
130
+ let keyCount = 0;
131
+ let totalSize = 0;
132
+ if (this.config.store === "file") {
133
+ const dir = this.config.path;
134
+ if (fs.existsSync(dir)) {
135
+ const files = fs.readdirSync(dir);
136
+ keyCount = files.length;
137
+ for (const file of files) {
138
+ try {
139
+ const st = fs.statSync(path.join(dir, file));
140
+ totalSize += st.size;
141
+ } catch {
142
+ }
143
+ }
144
+ }
145
+ } else {
146
+ keyCount = this.store.size;
147
+ for (const [, entry] of this.store) {
148
+ totalSize += JSON.stringify(entry).length;
149
+ }
150
+ }
151
+ const sizeStr = totalSize > 1024 * 1024 ? `${(totalSize / (1024 * 1024)).toFixed(2)} MB` : totalSize > 1024 ? `${(totalSize / 1024).toFixed(2)} KB` : `${totalSize} B`;
152
+ return {
153
+ hits: this.hits,
154
+ misses: this.misses,
155
+ keys: keyCount,
156
+ size: sizeStr
157
+ };
158
+ }
159
+ getFilePath(key) {
160
+ const hashedKey = crypto.createHash("md5").update(key).digest("hex");
161
+ return path.join(this.config.path, `${hashedKey}.json`);
162
+ }
163
+ isExpired(entry) {
164
+ return entry.expiresAt < Date.now();
165
+ }
166
+ fileGet(key) {
167
+ const filePath = this.getFilePath(key);
168
+ if (!fs.existsSync(filePath)) {
169
+ this.misses++;
170
+ return null;
171
+ }
172
+ try {
173
+ const raw = fs.readFileSync(filePath, "utf-8");
174
+ const entry = JSON.parse(raw);
175
+ if (this.isExpired(entry)) {
176
+ fs.unlinkSync(filePath);
177
+ this.misses++;
178
+ return null;
179
+ }
180
+ this.hits++;
181
+ return entry.value;
182
+ } catch {
183
+ this.misses++;
184
+ return null;
185
+ }
186
+ }
187
+ fileSet(key, entry) {
188
+ const filePath = this.getFilePath(key);
189
+ const dir = path.dirname(filePath);
190
+ if (!fs.existsSync(dir)) {
191
+ fs.mkdirSync(dir, { recursive: true });
192
+ }
193
+ fs.writeFileSync(filePath, JSON.stringify(entry), "utf-8");
194
+ }
195
+ fileDelete(key) {
196
+ const filePath = this.getFilePath(key);
197
+ if (!fs.existsSync(filePath)) {
198
+ return false;
199
+ }
200
+ fs.unlinkSync(filePath);
201
+ return true;
202
+ }
203
+ };
204
+ var responseCache = new Cache({ store: "memory" });
205
+ function cacheResponse(ttl) {
206
+ const cache = responseCache;
207
+ return async (ctx, next) => {
208
+ const key = `_cache:${ctx.request.method}:${ctx.request.path}`;
209
+ if (ctx.request.method !== "GET") {
210
+ return next();
211
+ }
212
+ const cached = await cache.get(key);
213
+ if (cached !== null) {
214
+ ctx.response.status(cached.status).type(cached.contentType).send(cached.body);
215
+ return;
216
+ }
217
+ await next();
218
+ const resp = ctx.response;
219
+ const body = resp._body;
220
+ if (body !== null && resp._statusCode >= 200 && resp._statusCode < 300) {
221
+ const contentType = ctx.response.getHeader("content-type") ?? "text/plain";
222
+ await cache.set(
223
+ key,
224
+ {
225
+ body: typeof body === "string" ? body : body.toString(),
226
+ status: resp._statusCode,
227
+ contentType
228
+ },
229
+ ttl
230
+ );
231
+ }
232
+ };
233
+ }
234
+ export {
235
+ Cache,
236
+ cacheResponse
237
+ };
238
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/cache/index.ts"],"sourcesContent":["import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Middleware } from \"../middleware\";\n\nexport interface CacheConfig {\n\tstore?: \"memory\" | \"file\";\n\tpath?: string;\n\tttl?: number;\n\tprefix?: string;\n}\n\ninterface CacheEntry {\n\tvalue: unknown;\n\texpiresAt: number;\n}\n\nexport class Cache {\n\tprivate store: Map<string, CacheEntry>;\n\tprivate config: Required<CacheConfig>;\n\tprivate hits = 0;\n\tprivate misses = 0;\n\n\tconstructor(config?: CacheConfig) {\n\t\tthis.config = {\n\t\t\tstore: \"memory\",\n\t\t\tpath: path.join(process.cwd(), \"cache\"),\n\t\t\tttl: 3600,\n\t\t\tprefix: \"\",\n\t\t\t...config,\n\t\t};\n\t\tthis.store = new Map();\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t}\n\t}\n\n\tasync get<T>(key: string): Promise<T | null> {\n\t\tconst fullKey = this.config.prefix + key;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\treturn this.fileGet<T>(fullKey);\n\t\t}\n\n\t\tconst entry = this.store.get(fullKey);\n\t\tif (entry === undefined) {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.isExpired(entry)) {\n\t\t\tthis.store.delete(fullKey);\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.hits++;\n\t\treturn entry.value as T;\n\t}\n\n\tasync remember<T>(\n\t\tkey: string,\n\t\tttl: number | undefined,\n\t\tcallback: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cached = await this.get<T>(key);\n\t\tif (cached !== null) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst value = await callback();\n\t\tawait this.set(key, value, ttl);\n\t\treturn value;\n\t}\n\n\tasync set(key: string, value: unknown, ttl?: number): Promise<void> {\n\t\tconst fullKey = this.config.prefix + key;\n\t\tconst expiresAt =\n\t\t\tttl !== undefined\n\t\t\t\t? Date.now() + ttl * 1000\n\t\t\t\t: Date.now() + this.config.ttl * 1000;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tawait this.fileSet(fullKey, { value, expiresAt });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.set(fullKey, { value, expiresAt });\n\t}\n\n\tasync add(key: string, value: unknown, ttl?: number): Promise<boolean> {\n\t\tconst exists = await this.has(key);\n\t\tif (exists) {\n\t\t\treturn false;\n\t\t}\n\n\t\tawait this.set(key, value, ttl);\n\t\treturn true;\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\tconst fullKey = this.config.prefix + key;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\treturn this.fileDelete(fullKey);\n\t\t}\n\n\t\treturn this.store.delete(fullKey);\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\tfor (const file of fs.readdirSync(dir)) {\n\t\t\t\t\tfs.unlinkSync(path.join(dir, file));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.clear();\n\t}\n\n\tasync has(key: string): Promise<boolean> {\n\t\tconst value = await this.get(key);\n\t\treturn value !== null;\n\t}\n\n\tasync getMultiple(keys: string[]): Promise<Record<string, unknown>> {\n\t\tconst result: Record<string, unknown> = {};\n\t\tfor (const key of keys) {\n\t\t\tconst value = await this.get(key);\n\t\t\tif (value !== null) {\n\t\t\t\tresult[key] = value;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync setMultiple(\n\t\titems: Record<string, unknown>,\n\t\tttl?: number,\n\t): Promise<void> {\n\t\tfor (const [key, value] of Object.entries(items)) {\n\t\t\tawait this.set(key, value, ttl);\n\t\t}\n\t}\n\n\tasync increment(key: string, value: number = 1): Promise<number> {\n\t\tconst current = await this.get<number>(key);\n\t\tconst newValue = (current ?? 0) + value;\n\t\tawait this.set(key, newValue);\n\t\treturn newValue;\n\t}\n\n\tasync decrement(key: string, value: number = 1): Promise<number> {\n\t\tconst current = await this.get<number>(key);\n\t\tconst newValue = (current ?? 0) - value;\n\t\tawait this.set(key, newValue);\n\t\treturn newValue;\n\t}\n\n\tasync forever(key: string, value: unknown): Promise<void> {\n\t\tconst fullKey = this.config.prefix + key;\n\t\tconst expiresAt = Number.MAX_SAFE_INTEGER;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tawait this.fileSet(fullKey, { value, expiresAt });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.store.set(fullKey, { value, expiresAt });\n\t}\n\n\tstats(): { hits: number; misses: number; keys: number; size: string } {\n\t\tlet keyCount = 0;\n\t\tlet totalSize = 0;\n\n\t\tif (this.config.store === \"file\") {\n\t\t\tconst dir = this.config.path;\n\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\tconst files = fs.readdirSync(dir);\n\t\t\t\tkeyCount = files.length;\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst st = fs.statSync(path.join(dir, file));\n\t\t\t\t\t\ttotalSize += st.size;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tkeyCount = this.store.size;\n\t\t\tfor (const [, entry] of this.store) {\n\t\t\t\ttotalSize += JSON.stringify(entry).length;\n\t\t\t}\n\t\t}\n\n\t\tconst sizeStr =\n\t\t\ttotalSize > 1024 * 1024\n\t\t\t\t? `${(totalSize / (1024 * 1024)).toFixed(2)} MB`\n\t\t\t\t: totalSize > 1024\n\t\t\t\t\t? `${(totalSize / 1024).toFixed(2)} KB`\n\t\t\t\t\t: `${totalSize} B`;\n\n\t\treturn {\n\t\t\thits: this.hits,\n\t\t\tmisses: this.misses,\n\t\t\tkeys: keyCount,\n\t\t\tsize: sizeStr,\n\t\t};\n\t}\n\n\tprivate getFilePath(key: string): string {\n\t\tconst hashedKey = crypto.createHash(\"md5\").update(key).digest(\"hex\");\n\t\treturn path.join(this.config.path, `${hashedKey}.json`);\n\t}\n\n\tprivate isExpired(entry: CacheEntry): boolean {\n\t\treturn entry.expiresAt < Date.now();\n\t}\n\n\tprivate fileGet<T>(key: string): T | null {\n\t\tconst filePath = this.getFilePath(key);\n\t\tif (!fs.existsSync(filePath)) {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst raw = fs.readFileSync(filePath, \"utf-8\");\n\t\t\tconst entry: CacheEntry = JSON.parse(raw);\n\n\t\t\tif (this.isExpired(entry)) {\n\t\t\t\tfs.unlinkSync(filePath);\n\t\t\t\tthis.misses++;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthis.hits++;\n\t\t\treturn entry.value as T;\n\t\t} catch {\n\t\t\tthis.misses++;\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate fileSet(key: string, entry: CacheEntry): void {\n\t\tconst filePath = this.getFilePath(key);\n\t\tconst dir = path.dirname(filePath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(filePath, JSON.stringify(entry), \"utf-8\");\n\t}\n\n\tprivate fileDelete(key: string): boolean {\n\t\tconst filePath = this.getFilePath(key);\n\t\tif (!fs.existsSync(filePath)) {\n\t\t\treturn false;\n\t\t}\n\t\tfs.unlinkSync(filePath);\n\t\treturn true;\n\t}\n}\n\nconst responseCache = new Cache({ store: \"memory\" });\n\nexport function cacheResponse(ttl?: number): Middleware {\n\tconst cache = responseCache;\n\n\treturn async (ctx, next) => {\n\t\tconst key = `_cache:${ctx.request.method}:${ctx.request.path}`;\n\n\t\tif (ctx.request.method !== \"GET\") {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst cached = await cache.get<{\n\t\t\tbody: string;\n\t\t\tstatus: number;\n\t\t\tcontentType: string;\n\t\t}>(key);\n\n\t\tif (cached !== null) {\n\t\t\tctx.response\n\t\t\t\t.status(cached.status)\n\t\t\t\t.type(cached.contentType)\n\t\t\t\t.send(cached.body);\n\t\t\treturn;\n\t\t}\n\n\t\tawait next();\n\n\t\tconst resp = ctx.response as unknown as {\n\t\t\t_body: string | Buffer | null;\n\t\t\t_statusCode: number;\n\t\t};\n\t\tconst body = resp._body;\n\n\t\tif (body !== null && resp._statusCode >= 200 && resp._statusCode < 300) {\n\t\t\tconst contentType =\n\t\t\t\tctx.response.getHeader(\"content-type\") ?? \"text/plain\";\n\t\t\tawait cache.set(\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\tbody: typeof body === \"string\" ? body : body.toString(),\n\t\t\t\t\tstatus: resp._statusCode,\n\t\t\t\t\tcontentType,\n\t\t\t\t},\n\t\t\t\tttl,\n\t\t\t);\n\t\t}\n\t};\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,20 @@
1
+ type Factory<T> = () => T;
2
+ interface Binding<T> {
3
+ factory: Factory<T>;
4
+ singleton: boolean;
5
+ instance?: T;
6
+ }
7
+ declare class Container {
8
+ private bindings;
9
+ private resolving;
10
+ bind<T>(name: string, factory: Factory<T>): this;
11
+ singleton<T>(name: string, factory: Factory<T>): this;
12
+ instance<T>(name: string, instance: T): this;
13
+ resolve<T>(name: string): T;
14
+ has(name: string): boolean;
15
+ remove(name: string): void;
16
+ clear(): void;
17
+ getBindings(): Map<string, Binding<unknown>>;
18
+ }
19
+
20
+ export { Container };
@@ -0,0 +1,62 @@
1
+ // src/server/container/index.ts
2
+ var Container = class {
3
+ bindings = /* @__PURE__ */ new Map();
4
+ resolving = /* @__PURE__ */ new Set();
5
+ bind(name, factory) {
6
+ this.bindings.set(name, { factory, singleton: false });
7
+ return this;
8
+ }
9
+ singleton(name, factory) {
10
+ this.bindings.set(name, { factory, singleton: true });
11
+ return this;
12
+ }
13
+ instance(name, instance) {
14
+ this.bindings.set(name, {
15
+ factory: () => instance,
16
+ singleton: true,
17
+ instance
18
+ });
19
+ return this;
20
+ }
21
+ resolve(name) {
22
+ const binding = this.bindings.get(name);
23
+ if (binding === void 0) {
24
+ throw new Error(`Binding not found: ${name}`);
25
+ }
26
+ if (binding.singleton && binding.instance !== void 0) {
27
+ return binding.instance;
28
+ }
29
+ if (this.resolving.has(name)) {
30
+ throw new Error(
31
+ `Circular dependency detected: ${name} is already being resolved`
32
+ );
33
+ }
34
+ this.resolving.add(name);
35
+ try {
36
+ const instance = binding.factory();
37
+ if (binding.singleton) {
38
+ binding.instance = instance;
39
+ }
40
+ return instance;
41
+ } finally {
42
+ this.resolving.delete(name);
43
+ }
44
+ }
45
+ has(name) {
46
+ return this.bindings.has(name);
47
+ }
48
+ remove(name) {
49
+ this.bindings.delete(name);
50
+ }
51
+ clear() {
52
+ this.bindings.clear();
53
+ this.resolving.clear();
54
+ }
55
+ getBindings() {
56
+ return new Map(this.bindings);
57
+ }
58
+ };
59
+ export {
60
+ Container
61
+ };
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/container/index.ts"],"sourcesContent":["type Factory<T> = () => T\n\ninterface Binding<T> {\n factory: Factory<T>\n singleton: boolean\n instance?: T\n}\n\nexport class Container {\n private bindings = new Map<string, Binding<unknown>>()\n private resolving = new Set<string>()\n\n bind<T>(name: string, factory: Factory<T>): this {\n this.bindings.set(name, { factory, singleton: false })\n return this\n }\n\n singleton<T>(name: string, factory: Factory<T>): this {\n this.bindings.set(name, { factory, singleton: true })\n return this\n }\n\n instance<T>(name: string, instance: T): this {\n this.bindings.set(name, {\n factory: () => instance,\n singleton: true,\n instance,\n })\n return this\n }\n\n resolve<T>(name: string): T {\n const binding = this.bindings.get(name)\n if (binding === undefined) {\n throw new Error(`Binding not found: ${name}`)\n }\n\n if (binding.singleton && binding.instance !== undefined) {\n return binding.instance as T\n }\n\n if (this.resolving.has(name)) {\n throw new Error(\n `Circular dependency detected: ${name} is already being resolved`,\n )\n }\n\n this.resolving.add(name)\n\n try {\n const instance = binding.factory() as T\n if (binding.singleton) {\n binding.instance = instance\n }\n return instance\n } finally {\n this.resolving.delete(name)\n }\n }\n\n has(name: string): boolean {\n return this.bindings.has(name)\n }\n\n remove(name: string): void {\n this.bindings.delete(name)\n }\n\n clear(): void {\n this.bindings.clear()\n this.resolving.clear()\n }\n\n getBindings(): Map<string, Binding<unknown>> {\n return new Map(this.bindings)\n }\n}\n"],"mappings":";AAQO,IAAM,YAAN,MAAgB;AAAA,EACb,WAAW,oBAAI,IAA8B;AAAA,EAC7C,YAAY,oBAAI,IAAY;AAAA,EAEpC,KAAQ,MAAc,SAA2B;AAC/C,SAAK,SAAS,IAAI,MAAM,EAAE,SAAS,WAAW,MAAM,CAAC;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,UAAa,MAAc,SAA2B;AACpD,SAAK,SAAS,IAAI,MAAM,EAAE,SAAS,WAAW,KAAK,CAAC;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,SAAY,MAAc,UAAmB;AAC3C,SAAK,SAAS,IAAI,MAAM;AAAA,MACtB,SAAS,MAAM;AAAA,MACf,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,QAAW,MAAiB;AAC1B,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,YAAY,QAAW;AACzB,YAAM,IAAI,MAAM,sBAAsB,IAAI,EAAE;AAAA,IAC9C;AAEA,QAAI,QAAQ,aAAa,QAAQ,aAAa,QAAW;AACvD,aAAO,QAAQ;AAAA,IACjB;AAEA,QAAI,KAAK,UAAU,IAAI,IAAI,GAAG;AAC5B,YAAM,IAAI;AAAA,QACR,iCAAiC,IAAI;AAAA,MACvC;AAAA,IACF;AAEA,SAAK,UAAU,IAAI,IAAI;AAEvB,QAAI;AACF,YAAM,WAAW,QAAQ,QAAQ;AACjC,UAAI,QAAQ,WAAW;AACrB,gBAAQ,WAAW;AAAA,MACrB;AACA,aAAO;AAAA,IACT,UAAE;AACA,WAAK,UAAU,OAAO,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,IAAI,MAAuB;AACzB,WAAO,KAAK,SAAS,IAAI,IAAI;AAAA,EAC/B;AAAA,EAEA,OAAO,MAAoB;AACzB,SAAK,SAAS,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,MAAM;AACpB,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,cAA6C;AAC3C,WAAO,IAAI,IAAI,KAAK,QAAQ;AAAA,EAC9B;AACF;","names":[]}
@@ -0,0 +1,37 @@
1
+ import { R as RouteContext } from '../../index-CMkhSDh7.js';
2
+ import { Container } from '../container/index.js';
3
+ import { S as SuperRequest, a as SuperResponse, b as Schema } from '../../response-Ca8KWK5_.js';
4
+ import 'node:http';
5
+ import 'node:stream';
6
+
7
+ interface ControllerRouteDefinition {
8
+ method: string;
9
+ path: string;
10
+ handler: string | symbol;
11
+ }
12
+ declare abstract class Controller {
13
+ protected __ctx: RouteContext;
14
+ protected __container: Container;
15
+ protected get request(): SuperRequest;
16
+ protected get response(): SuperResponse;
17
+ protected get container(): Container;
18
+ protected validate<T>(schema: Schema<T>): Promise<T>;
19
+ protected ok<T>(data: T): void;
20
+ protected created<T>(data: T): void;
21
+ protected noContent(): void;
22
+ protected badRequest(message?: string): void;
23
+ protected notFound(message?: string): void;
24
+ protected unauthorized(message?: string): void;
25
+ protected forbidden(message?: string): void;
26
+ protected error(status: number, message?: string): void;
27
+ }
28
+ declare function controller(prefix?: string): ClassDecorator;
29
+ declare const get: (path: string) => (target: unknown, context: ClassMethodDecoratorContext) => void;
30
+ declare const post: (path: string) => (target: unknown, context: ClassMethodDecoratorContext) => void;
31
+ declare const put: (path: string) => (target: unknown, context: ClassMethodDecoratorContext) => void;
32
+ declare const patch: (path: string) => (target: unknown, context: ClassMethodDecoratorContext) => void;
33
+ declare const del: (path: string) => (target: unknown, context: ClassMethodDecoratorContext) => void;
34
+ declare function getControllerPrefix(controllerClass: object): string;
35
+ declare function getControllerRoutes(controllerClass: object): ControllerRouteDefinition[];
36
+
37
+ export { Controller, type ControllerRouteDefinition, controller, del, get, getControllerPrefix, getControllerRoutes, patch, post, put };
@@ -0,0 +1,139 @@
1
+ // src/server/http/status.ts
2
+ var HttpStatus = {
3
+ OK: 200,
4
+ CREATED: 201,
5
+ ACCEPTED: 202,
6
+ NO_CONTENT: 204,
7
+ RESET_CONTENT: 205,
8
+ PARTIAL_CONTENT: 206,
9
+ MOVED_PERMANENTLY: 301,
10
+ FOUND: 302,
11
+ SEE_OTHER: 303,
12
+ NOT_MODIFIED: 304,
13
+ TEMPORARY_REDIRECT: 307,
14
+ PERMANENT_REDIRECT: 308,
15
+ BAD_REQUEST: 400,
16
+ UNAUTHORIZED: 401,
17
+ PAYMENT_REQUIRED: 402,
18
+ FORBIDDEN: 403,
19
+ NOT_FOUND: 404,
20
+ METHOD_NOT_ALLOWED: 405,
21
+ NOT_ACCEPTABLE: 406,
22
+ REQUEST_TIMEOUT: 408,
23
+ CONFLICT: 409,
24
+ GONE: 410,
25
+ LENGTH_REQUIRED: 411,
26
+ PRECONDITION_FAILED: 412,
27
+ PAYLOAD_TOO_LARGE: 413,
28
+ URI_TOO_LONG: 414,
29
+ UNSUPPORTED_MEDIA_TYPE: 415,
30
+ UNPROCESSABLE_ENTITY: 422,
31
+ TOO_MANY_REQUESTS: 429,
32
+ INTERNAL_SERVER_ERROR: 500,
33
+ NOT_IMPLEMENTED: 501,
34
+ BAD_GATEWAY: 502,
35
+ SERVICE_UNAVAILABLE: 503,
36
+ GATEWAY_TIMEOUT: 504,
37
+ HTTP_VERSION_NOT_SUPPORTED: 505
38
+ };
39
+
40
+ // src/server/controller/index.ts
41
+ var controllerPrefixMap = /* @__PURE__ */ new WeakMap();
42
+ var controllerRoutesMap = /* @__PURE__ */ new WeakMap();
43
+ var Controller = class {
44
+ get request() {
45
+ return this.__ctx.request;
46
+ }
47
+ get response() {
48
+ return this.__ctx.response;
49
+ }
50
+ get container() {
51
+ return this.__container;
52
+ }
53
+ async validate(schema) {
54
+ return this.request.validate(schema);
55
+ }
56
+ ok(data) {
57
+ this.response.json(data, HttpStatus.OK);
58
+ }
59
+ created(data) {
60
+ this.response.json(data, HttpStatus.CREATED);
61
+ }
62
+ noContent() {
63
+ this.response.status(HttpStatus.NO_CONTENT);
64
+ }
65
+ badRequest(message) {
66
+ this.response.status(HttpStatus.BAD_REQUEST).json({
67
+ error: "Bad Request",
68
+ message: message ?? "The request could not be processed"
69
+ });
70
+ }
71
+ notFound(message) {
72
+ this.response.status(HttpStatus.NOT_FOUND).json({
73
+ error: "Not Found",
74
+ message: message ?? "The requested resource was not found"
75
+ });
76
+ }
77
+ unauthorized(message) {
78
+ this.response.status(HttpStatus.UNAUTHORIZED).json({
79
+ error: "Unauthorized",
80
+ message: message ?? "Authentication is required"
81
+ });
82
+ }
83
+ forbidden(message) {
84
+ this.response.status(HttpStatus.FORBIDDEN).json({
85
+ error: "Forbidden",
86
+ message: message ?? "You do not have permission to access this resource"
87
+ });
88
+ }
89
+ error(status, message) {
90
+ this.response.status(status).json({
91
+ error: getStatusKey(status),
92
+ message: message ?? "An error occurred"
93
+ });
94
+ }
95
+ };
96
+ function getStatusKey(code) {
97
+ for (const [key, val] of Object.entries(HttpStatus)) {
98
+ if (val === code) return key;
99
+ }
100
+ return "Error";
101
+ }
102
+ function createRouteDecorator(method) {
103
+ return (path) => {
104
+ return (target, context) => {
105
+ const classTarget = context.static ? target : target.constructor;
106
+ const routes = controllerRoutesMap.get(classTarget) ?? [];
107
+ routes.push({ method, path, handler: context.name });
108
+ controllerRoutesMap.set(classTarget, routes);
109
+ };
110
+ };
111
+ }
112
+ function controller(prefix) {
113
+ return (target, _context) => {
114
+ controllerPrefixMap.set(target, prefix ?? "");
115
+ };
116
+ }
117
+ var get = createRouteDecorator("GET");
118
+ var post = createRouteDecorator("POST");
119
+ var put = createRouteDecorator("PUT");
120
+ var patch = createRouteDecorator("PATCH");
121
+ var del = createRouteDecorator("DELETE");
122
+ function getControllerPrefix(controllerClass) {
123
+ return controllerPrefixMap.get(controllerClass) ?? "";
124
+ }
125
+ function getControllerRoutes(controllerClass) {
126
+ return controllerRoutesMap.get(controllerClass) ?? [];
127
+ }
128
+ export {
129
+ Controller,
130
+ controller,
131
+ del,
132
+ get,
133
+ getControllerPrefix,
134
+ getControllerRoutes,
135
+ patch,
136
+ post,
137
+ put
138
+ };
139
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/http/status.ts","../../../src/server/controller/index.ts"],"sourcesContent":["export const HttpStatus = {\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n} as const\n\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus]\n\nconst statusTextMap: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n}\n\nexport function statusText(code: number): string {\n const text = statusTextMap[code]\n if (text !== undefined) return text\n if (code >= 100 && code < 200) return 'Informational'\n if (code >= 200 && code < 300) return 'Success'\n if (code >= 300 && code < 400) return 'Redirection'\n if (code >= 400 && code < 500) return 'Client Error'\n if (code >= 500 && code < 600) return 'Server Error'\n return 'Unknown'\n}\n","import type { RouteContext } from '../router'\nimport type { Container } from '../container'\nimport type { SuperRequest } from '../http/request'\nimport type { SuperResponse } from '../http/response'\nimport type { Schema } from '../http/request'\nimport { HttpStatus } from '../http/status'\n\nexport interface ControllerRouteDefinition {\n method: string\n path: string\n handler: string | symbol\n}\n\nconst controllerPrefixMap = new WeakMap<object, string>()\nconst controllerRoutesMap = new WeakMap<object, ControllerRouteDefinition[]>()\n\nexport abstract class Controller {\n declare protected __ctx: RouteContext\n declare protected __container: Container\n\n protected get request(): SuperRequest {\n return this.__ctx.request\n }\n\n protected get response(): SuperResponse {\n return this.__ctx.response\n }\n\n protected get container(): Container {\n return this.__container\n }\n\n protected async validate<T>(schema: Schema<T>): Promise<T> {\n return this.request.validate(schema)\n }\n\n protected ok<T>(data: T): void {\n this.response.json(data, HttpStatus.OK)\n }\n\n protected created<T>(data: T): void {\n this.response.json(data, HttpStatus.CREATED)\n }\n\n protected noContent(): void {\n this.response.status(HttpStatus.NO_CONTENT)\n }\n\n protected badRequest(message?: string): void {\n this.response.status(HttpStatus.BAD_REQUEST).json({\n error: 'Bad Request',\n message: message ?? 'The request could not be processed',\n })\n }\n\n protected notFound(message?: string): void {\n this.response.status(HttpStatus.NOT_FOUND).json({\n error: 'Not Found',\n message: message ?? 'The requested resource was not found',\n })\n }\n\n protected unauthorized(message?: string): void {\n this.response.status(HttpStatus.UNAUTHORIZED).json({\n error: 'Unauthorized',\n message: message ?? 'Authentication is required',\n })\n }\n\n protected forbidden(message?: string): void {\n this.response.status(HttpStatus.FORBIDDEN).json({\n error: 'Forbidden',\n message: message ?? 'You do not have permission to access this resource',\n })\n }\n\n protected error(status: number, message?: string): void {\n this.response.status(status).json({\n error: getStatusKey(status),\n message: message ?? 'An error occurred',\n })\n }\n}\n\nfunction getStatusKey(code: number): string {\n for (const [key, val] of Object.entries(HttpStatus)) {\n if (val === code) return key\n }\n return 'Error'\n}\n\nfunction createRouteDecorator(method: string) {\n return (path: string) => {\n return (target: unknown, context: ClassMethodDecoratorContext): void => {\n const classTarget = context.static\n ? (target as object)\n : ((target as { constructor: object }).constructor)\n\n const routes = controllerRoutesMap.get(classTarget) ?? []\n routes.push({ method, path, handler: context.name })\n controllerRoutesMap.set(classTarget, routes)\n }\n }\n}\n\nexport function controller(prefix?: string): ClassDecorator {\n return (target: unknown, _context?: ClassDecoratorContext): void => {\n controllerPrefixMap.set(target as object, prefix ?? '')\n }\n}\n\nexport const get = createRouteDecorator('GET')\nexport const post = createRouteDecorator('POST')\nexport const put = createRouteDecorator('PUT')\nexport const patch = createRouteDecorator('PATCH')\nexport const del = createRouteDecorator('DELETE')\n\nexport function getControllerPrefix(controllerClass: object): string {\n return controllerPrefixMap.get(controllerClass) ?? ''\n}\n\nexport function getControllerRoutes(\n controllerClass: object,\n): ControllerRouteDefinition[] {\n return controllerRoutesMap.get(controllerClass) ?? []\n}\n"],"mappings":"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","names":[]}