ai.matey.http 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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/deno/adapter.js +173 -0
  3. package/dist/cjs/deno/adapter.js.map +1 -0
  4. package/dist/cjs/deno/handler.js +78 -0
  5. package/dist/cjs/deno/handler.js.map +1 -0
  6. package/dist/cjs/deno/index.js +26 -0
  7. package/dist/cjs/deno/index.js.map +1 -0
  8. package/dist/cjs/express/adapter.js +150 -0
  9. package/dist/cjs/express/adapter.js.map +1 -0
  10. package/dist/cjs/express/index.js +26 -0
  11. package/dist/cjs/express/index.js.map +1 -0
  12. package/dist/cjs/express/middleware.js +63 -0
  13. package/dist/cjs/express/middleware.js.map +1 -0
  14. package/dist/cjs/fastify/adapter.js +149 -0
  15. package/dist/cjs/fastify/adapter.js.map +1 -0
  16. package/dist/cjs/fastify/handler.js +54 -0
  17. package/dist/cjs/fastify/handler.js.map +1 -0
  18. package/dist/cjs/fastify/index.js +26 -0
  19. package/dist/cjs/fastify/index.js.map +1 -0
  20. package/dist/cjs/hono/adapter.js +172 -0
  21. package/dist/cjs/hono/adapter.js.map +1 -0
  22. package/dist/cjs/hono/index.js +26 -0
  23. package/dist/cjs/hono/index.js.map +1 -0
  24. package/dist/cjs/hono/middleware.js +75 -0
  25. package/dist/cjs/hono/middleware.js.map +1 -0
  26. package/dist/cjs/index.js +37 -0
  27. package/dist/cjs/index.js.map +1 -0
  28. package/dist/cjs/koa/adapter.js +153 -0
  29. package/dist/cjs/koa/adapter.js.map +1 -0
  30. package/dist/cjs/koa/index.js +26 -0
  31. package/dist/cjs/koa/index.js.map +1 -0
  32. package/dist/cjs/koa/middleware.js +58 -0
  33. package/dist/cjs/koa/middleware.js.map +1 -0
  34. package/dist/cjs/node/adapter.js +170 -0
  35. package/dist/cjs/node/adapter.js.map +1 -0
  36. package/dist/cjs/node/index.js +26 -0
  37. package/dist/cjs/node/index.js.map +1 -0
  38. package/dist/cjs/node/listener.js +98 -0
  39. package/dist/cjs/node/listener.js.map +1 -0
  40. package/dist/esm/deno/adapter.js +168 -0
  41. package/dist/esm/deno/adapter.js.map +1 -0
  42. package/dist/esm/deno/handler.js +75 -0
  43. package/dist/esm/deno/handler.js.map +1 -0
  44. package/dist/esm/deno/index.js +10 -0
  45. package/dist/esm/deno/index.js.map +1 -0
  46. package/dist/esm/express/adapter.js +145 -0
  47. package/dist/esm/express/adapter.js.map +1 -0
  48. package/dist/esm/express/index.js +10 -0
  49. package/dist/esm/express/index.js.map +1 -0
  50. package/dist/esm/express/middleware.js +60 -0
  51. package/dist/esm/express/middleware.js.map +1 -0
  52. package/dist/esm/fastify/adapter.js +144 -0
  53. package/dist/esm/fastify/adapter.js.map +1 -0
  54. package/dist/esm/fastify/handler.js +51 -0
  55. package/dist/esm/fastify/handler.js.map +1 -0
  56. package/dist/esm/fastify/index.js +10 -0
  57. package/dist/esm/fastify/index.js.map +1 -0
  58. package/dist/esm/hono/adapter.js +167 -0
  59. package/dist/esm/hono/adapter.js.map +1 -0
  60. package/dist/esm/hono/index.js +10 -0
  61. package/dist/esm/hono/index.js.map +1 -0
  62. package/dist/esm/hono/middleware.js +72 -0
  63. package/dist/esm/hono/middleware.js.map +1 -0
  64. package/dist/esm/index.js +21 -0
  65. package/dist/esm/index.js.map +1 -0
  66. package/dist/esm/koa/adapter.js +148 -0
  67. package/dist/esm/koa/adapter.js.map +1 -0
  68. package/dist/esm/koa/index.js +10 -0
  69. package/dist/esm/koa/index.js.map +1 -0
  70. package/dist/esm/koa/middleware.js +55 -0
  71. package/dist/esm/koa/middleware.js.map +1 -0
  72. package/dist/esm/node/adapter.js +165 -0
  73. package/dist/esm/node/adapter.js.map +1 -0
  74. package/dist/esm/node/index.js +10 -0
  75. package/dist/esm/node/index.js.map +1 -0
  76. package/dist/esm/node/listener.js +92 -0
  77. package/dist/esm/node/listener.js.map +1 -0
  78. package/dist/types/deno/adapter.d.ts +56 -0
  79. package/dist/types/deno/adapter.d.ts.map +1 -0
  80. package/dist/types/deno/handler.d.ts +38 -0
  81. package/dist/types/deno/handler.d.ts.map +1 -0
  82. package/dist/types/deno/index.d.ts +10 -0
  83. package/dist/types/deno/index.d.ts.map +1 -0
  84. package/dist/types/express/adapter.d.ts +46 -0
  85. package/dist/types/express/adapter.d.ts.map +1 -0
  86. package/dist/types/express/index.d.ts +10 -0
  87. package/dist/types/express/index.d.ts.map +1 -0
  88. package/dist/types/express/middleware.d.ts +39 -0
  89. package/dist/types/express/middleware.d.ts.map +1 -0
  90. package/dist/types/fastify/adapter.d.ts +46 -0
  91. package/dist/types/fastify/adapter.d.ts.map +1 -0
  92. package/dist/types/fastify/handler.d.ts +36 -0
  93. package/dist/types/fastify/handler.d.ts.map +1 -0
  94. package/dist/types/fastify/index.d.ts +10 -0
  95. package/dist/types/fastify/index.d.ts.map +1 -0
  96. package/dist/types/hono/adapter.d.ts +47 -0
  97. package/dist/types/hono/adapter.d.ts.map +1 -0
  98. package/dist/types/hono/index.d.ts +10 -0
  99. package/dist/types/hono/index.d.ts.map +1 -0
  100. package/dist/types/hono/middleware.d.ts +36 -0
  101. package/dist/types/hono/middleware.d.ts.map +1 -0
  102. package/dist/types/index.d.ts +15 -0
  103. package/dist/types/index.d.ts.map +1 -0
  104. package/dist/types/koa/adapter.d.ts +46 -0
  105. package/dist/types/koa/adapter.d.ts.map +1 -0
  106. package/dist/types/koa/index.d.ts +10 -0
  107. package/dist/types/koa/index.d.ts.map +1 -0
  108. package/dist/types/koa/middleware.d.ts +40 -0
  109. package/dist/types/koa/middleware.d.ts.map +1 -0
  110. package/dist/types/node/adapter.d.ts +57 -0
  111. package/dist/types/node/adapter.d.ts.map +1 -0
  112. package/dist/types/node/index.d.ts +10 -0
  113. package/dist/types/node/index.d.ts.map +1 -0
  114. package/dist/types/node/listener.d.ts +51 -0
  115. package/dist/types/node/listener.d.ts.map +1 -0
  116. package/package.json +160 -0
  117. package/readme.md +93 -0
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Fastify Handler
3
+ *
4
+ * HTTP request handler for Fastify that uses the core handler.
5
+ *
6
+ * @module
7
+ */
8
+ import { CoreHTTPHandler } from 'ai.matey.http.core';
9
+ import { FastifyRequestAdapter, FastifyResponseAdapter } from './adapter.js';
10
+ /**
11
+ * Create Fastify route handler for handling AI chat requests
12
+ *
13
+ * @param bridge - Bridge instance
14
+ * @param options - HTTP listener options
15
+ * @returns Fastify route handler function
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import Fastify from 'fastify';
20
+ * import { FastifyHandler } from 'ai.matey.http/fastify';
21
+ *
22
+ * const fastify = Fastify();
23
+ * const bridge = new Bridge(frontend, backend);
24
+ *
25
+ * // Add AI chat route
26
+ * fastify.post('/v1/messages', FastifyHandler(bridge, {
27
+ * cors: true,
28
+ * streaming: true,
29
+ * }));
30
+ *
31
+ * fastify.listen({ port: 3000 });
32
+ * ```
33
+ */
34
+ export function FastifyHandler(bridge, options = {}) {
35
+ // Create core handler with all business logic
36
+ const { cors, ...restOptions } = options;
37
+ const coreHandler = new CoreHTTPHandler({
38
+ bridge,
39
+ cors: cors === false || cors === undefined ? undefined : cors === true ? {} : cors,
40
+ ...restOptions, // HTTPListenerOptions types are compatible with CoreHandlerOptions at runtime
41
+ });
42
+ // Return Fastify route handler
43
+ return async (request, reply) => {
44
+ // Create adapters
45
+ const genericReq = new FastifyRequestAdapter(request);
46
+ const genericRes = new FastifyResponseAdapter(reply);
47
+ // Handle request through core handler
48
+ await coreHandler.handle(genericReq, genericRes);
49
+ };
50
+ }
51
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/fastify/handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,UAA+B,EAAE;IAEjC,8CAA8C;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,MAAM;QACN,IAAI,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QAClF,GAAI,WAAmB,EAAE,8EAA8E;KACxG,CAAC,CAAC;IAEH,+BAA+B;IAC/B,OAAO,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAiB,EAAE;QAC3E,kBAAkB;QAClB,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAErD,sCAAsC;QACtC,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Fastify HTTP Adapter
3
+ *
4
+ * HTTP adapter for Fastify
5
+ *
6
+ * @module
7
+ */
8
+ export * from './adapter.js';
9
+ export * from './handler.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fastify/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Hono HTTP Adapter
3
+ *
4
+ * Converts Hono Context to GenericRequest/GenericResponse
5
+ *
6
+ * @module
7
+ */
8
+ /**
9
+ * Adapter that converts Hono Context to GenericRequest
10
+ */
11
+ export class HonoRequestAdapter {
12
+ c;
13
+ constructor(c) {
14
+ this.c = c;
15
+ }
16
+ get method() {
17
+ return this.c.req.method || 'GET';
18
+ }
19
+ get url() {
20
+ return this.c.req.url || '/';
21
+ }
22
+ get headers() {
23
+ const headers = {};
24
+ // Hono headers is a Headers object
25
+ this.c.req.raw.headers.forEach((value, key) => {
26
+ headers[key.toLowerCase()] = value;
27
+ });
28
+ return headers;
29
+ }
30
+ get body() {
31
+ // Hono doesn't automatically parse body - it must be done with middleware
32
+ // Access the parsed body from context if available
33
+ return this.c.body ?? null;
34
+ }
35
+ get params() {
36
+ // Hono params are available via c.req.param()
37
+ const params = this.c.req.param();
38
+ return Object.keys(params).length > 0 ? params : undefined;
39
+ }
40
+ get query() {
41
+ // Hono query is available via c.req.query()
42
+ const query = {};
43
+ const queryParams = this.c.req.query();
44
+ for (const [key, value] of Object.entries(queryParams)) {
45
+ if (value !== undefined) {
46
+ query[key] = String(value);
47
+ }
48
+ }
49
+ return Object.keys(query).length > 0 ? query : undefined;
50
+ }
51
+ get ip() {
52
+ // Try to get IP from various headers
53
+ const forwarded = this.c.req.header('x-forwarded-for');
54
+ if (forwarded) {
55
+ return forwarded.split(',')[0]?.trim();
56
+ }
57
+ const realIp = this.c.req.header('x-real-ip');
58
+ if (realIp) {
59
+ return realIp;
60
+ }
61
+ // Fallback to undefined as we can't access socket in all Hono runtimes
62
+ return undefined;
63
+ }
64
+ /**
65
+ * Get the underlying Hono context object
66
+ */
67
+ get raw() {
68
+ return this.c;
69
+ }
70
+ }
71
+ /**
72
+ * Adapter that converts GenericResponse methods to Hono Context
73
+ */
74
+ export class HonoResponseAdapter {
75
+ c;
76
+ _statusCode = 200;
77
+ _headers = new Map();
78
+ _sent = false;
79
+ constructor(c) {
80
+ this.c = c;
81
+ }
82
+ status(code) {
83
+ if (!this._sent) {
84
+ this._statusCode = code;
85
+ }
86
+ }
87
+ header(name, value) {
88
+ if (!this._sent) {
89
+ this._headers.set(name, value);
90
+ }
91
+ }
92
+ send(data) {
93
+ if (this._sent) {
94
+ return;
95
+ }
96
+ this._sent = true;
97
+ // Collect headers for response
98
+ const headers = new Headers();
99
+ for (const [name, value] of this._headers.entries()) {
100
+ headers.set(name, value);
101
+ }
102
+ // Handle empty string (e.g., for CORS preflight 204 responses)
103
+ if (data === '') {
104
+ // 204 No Content responses cannot have a body (not even empty string)
105
+ // Use null for 204, empty string for other status codes
106
+ this.c.res = new Response(this._statusCode === 204 ? null : '', {
107
+ status: this._statusCode,
108
+ headers,
109
+ });
110
+ return;
111
+ }
112
+ // Send JSON response
113
+ headers.set('Content-Type', 'application/json');
114
+ this.c.res = new Response(JSON.stringify(data), {
115
+ status: this._statusCode,
116
+ headers,
117
+ });
118
+ }
119
+ stream(generator) {
120
+ if (this._sent) {
121
+ return Promise.resolve();
122
+ }
123
+ this._sent = true;
124
+ // Set all headers
125
+ for (const [name, value] of this._headers.entries()) {
126
+ this.c.header(name, value);
127
+ }
128
+ // Create SSE stream
129
+ const stream = new ReadableStream({
130
+ async start(controller) {
131
+ try {
132
+ for await (const chunk of generator) {
133
+ const data = `data: ${JSON.stringify(chunk)}\n\n`;
134
+ controller.enqueue(new TextEncoder().encode(data));
135
+ }
136
+ // Send done marker
137
+ const done = 'data: [DONE]\n\n';
138
+ controller.enqueue(new TextEncoder().encode(done));
139
+ controller.close();
140
+ }
141
+ catch (error) {
142
+ console.error('Streaming error:', error);
143
+ controller.error(error);
144
+ }
145
+ },
146
+ });
147
+ // Set SSE headers and return stream
148
+ this.c.header('Content-Type', 'text/event-stream');
149
+ this.c.header('Cache-Control', 'no-cache');
150
+ this.c.header('Connection', 'keep-alive');
151
+ this.c.res = new Response(stream, {
152
+ status: this._statusCode,
153
+ headers: this.c.res?.headers,
154
+ });
155
+ return Promise.resolve();
156
+ }
157
+ isWritable() {
158
+ return !this._sent;
159
+ }
160
+ /**
161
+ * Get the underlying Hono context object
162
+ */
163
+ get raw() {
164
+ return this.c;
165
+ }
166
+ }
167
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/hono/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Hono HTTP Adapter
3
+ *
4
+ * HTTP adapter for Hono
5
+ *
6
+ * @module
7
+ */
8
+ export * from './adapter.js';
9
+ export * from './middleware.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hono/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Hono Middleware
3
+ *
4
+ * HTTP request middleware for Hono that uses the core handler.
5
+ *
6
+ * @module
7
+ */
8
+ import { CoreHTTPHandler } from 'ai.matey.http.core';
9
+ import { HonoRequestAdapter, HonoResponseAdapter } from './adapter.js';
10
+ /**
11
+ * Create Hono middleware for handling AI chat requests
12
+ *
13
+ * @param bridge - Bridge instance
14
+ * @param options - HTTP listener options
15
+ * @returns Hono middleware function
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import { Hono } from 'hono';
20
+ * import { HonoMiddleware } from 'ai.matey.http/hono';
21
+ *
22
+ * const app = new Hono();
23
+ * const bridge = new Bridge(frontend, backend);
24
+ *
25
+ * // Add AI chat middleware
26
+ * app.post('/v1/messages', HonoMiddleware(bridge, {
27
+ * cors: true,
28
+ * streaming: true,
29
+ * }));
30
+ *
31
+ * export default app;
32
+ * ```
33
+ */
34
+ export function HonoMiddleware(bridge, options = {}) {
35
+ // Create core handler with all business logic
36
+ const { cors, ...restOptions } = options;
37
+ const coreHandler = new CoreHTTPHandler({
38
+ bridge,
39
+ cors: cors === false || cors === undefined ? undefined : cors === true ? {} : cors,
40
+ ...restOptions, // HTTPListenerOptions types are compatible with CoreHandlerOptions at runtime
41
+ });
42
+ // Return Hono middleware
43
+ return async (c) => {
44
+ try {
45
+ // Parse JSON body if present (but not for OPTIONS requests)
46
+ const contentType = c.req.header('content-type') || '';
47
+ const method = c.req.method;
48
+ if (method !== 'OPTIONS' && contentType.includes('application/json')) {
49
+ try {
50
+ c.body = await c.req.json();
51
+ }
52
+ catch {
53
+ // If JSON parsing fails, leave body as null
54
+ c.body = null;
55
+ }
56
+ }
57
+ // Create adapters
58
+ const genericReq = new HonoRequestAdapter(c);
59
+ const genericRes = new HonoResponseAdapter(c);
60
+ // Handle request through core handler
61
+ await coreHandler.handle(genericReq, genericRes);
62
+ // Return the response set by the adapter
63
+ return c.res || new Response('Internal Server Error', { status: 500 });
64
+ }
65
+ catch (error) {
66
+ // Return error response
67
+ console.error('Hono middleware error:', error);
68
+ return c.json({ error: 'Internal Server Error' }, 500);
69
+ }
70
+ };
71
+ }
72
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/hono/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,UAA+B,EAAE;IAEjC,8CAA8C;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,MAAM;QACN,IAAI,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QAClF,GAAI,WAAmB,EAAE,8EAA8E;KACxG,CAAC,CAAC;IAEH,yBAAyB;IACzB,OAAO,KAAK,EAAE,CAAU,EAAqB,EAAE;QAC7C,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAE5B,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC;oBACF,CAAS,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACvC,CAAC;gBAAC,MAAM,CAAC;oBACP,4CAA4C;oBAC3C,CAAS,CAAC,IAAI,GAAG,IAAI,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAE9C,sCAAsC;YACtC,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAEjD,yCAAyC;YACzC,OAAO,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;YACxB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * AI Matey HTTP Adapters
3
+ *
4
+ * Consolidated package containing HTTP framework adapters.
5
+ * Each adapter provides integration with a specific HTTP framework.
6
+ *
7
+ * @module ai.matey.http
8
+ */
9
+ // Express adapter
10
+ export * from './express/index.js';
11
+ // Fastify adapter
12
+ export * from './fastify/index.js';
13
+ // Hono adapter
14
+ export * from './hono/index.js';
15
+ // Koa adapter
16
+ export * from './koa/index.js';
17
+ // Node.js native HTTP adapter
18
+ export * from './node/index.js';
19
+ // Deno adapter
20
+ export * from './deno/index.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kBAAkB;AAClB,cAAc,oBAAoB,CAAC;AAEnC,kBAAkB;AAClB,cAAc,oBAAoB,CAAC;AAEnC,eAAe;AACf,cAAc,iBAAiB,CAAC;AAEhC,cAAc;AACd,cAAc,gBAAgB,CAAC;AAE/B,8BAA8B;AAC9B,cAAc,iBAAiB,CAAC;AAEhC,eAAe;AACf,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Koa HTTP Adapter
3
+ *
4
+ * Converts Koa Context to GenericRequest/GenericResponse
5
+ *
6
+ * @module
7
+ */
8
+ import { sendSSEHeaders, sendSSEChunk, sendSSEDone } from 'ai.matey.http.core';
9
+ /**
10
+ * Adapter that converts Koa Context to GenericRequest
11
+ */
12
+ export class KoaRequestAdapter {
13
+ ctx;
14
+ constructor(ctx) {
15
+ this.ctx = ctx;
16
+ }
17
+ get method() {
18
+ return this.ctx.method || 'GET';
19
+ }
20
+ get url() {
21
+ return this.ctx.originalUrl || this.ctx.url || '/';
22
+ }
23
+ get headers() {
24
+ const headers = {};
25
+ for (const [key, value] of Object.entries(this.ctx.headers)) {
26
+ if (typeof value === 'string') {
27
+ headers[key.toLowerCase()] = value;
28
+ }
29
+ else if (Array.isArray(value)) {
30
+ headers[key.toLowerCase()] = value.join(', ');
31
+ }
32
+ }
33
+ return headers;
34
+ }
35
+ get body() {
36
+ // Koa body is already parsed if koa-bodyparser middleware is used
37
+ return this.ctx.request.body ?? null;
38
+ }
39
+ get params() {
40
+ // Koa router stores params in ctx.params
41
+ return this.ctx.params;
42
+ }
43
+ get query() {
44
+ // Koa query is available as ctx.query
45
+ const query = {};
46
+ for (const [key, value] of Object.entries(this.ctx.query)) {
47
+ if (typeof value === 'string') {
48
+ query[key] = value;
49
+ }
50
+ else if (Array.isArray(value)) {
51
+ query[key] = value.join(',');
52
+ }
53
+ else if (value !== undefined) {
54
+ query[key] = String(value);
55
+ }
56
+ }
57
+ return Object.keys(query).length > 0 ? query : undefined;
58
+ }
59
+ get ip() {
60
+ // Koa provides IP through ctx.ip
61
+ return this.ctx.ip || this.ctx.request.socket?.remoteAddress;
62
+ }
63
+ /**
64
+ * Get the underlying Koa context object
65
+ */
66
+ get raw() {
67
+ return this.ctx;
68
+ }
69
+ }
70
+ /**
71
+ * Adapter that converts GenericResponse methods to Koa Context
72
+ */
73
+ export class KoaResponseAdapter {
74
+ ctx;
75
+ _statusCode = 200;
76
+ _headersSent = false;
77
+ constructor(ctx) {
78
+ this.ctx = ctx;
79
+ }
80
+ status(code) {
81
+ this._statusCode = code;
82
+ if (!this._headersSent) {
83
+ this.ctx.status = code;
84
+ }
85
+ }
86
+ header(name, value) {
87
+ if (!this._headersSent) {
88
+ this.ctx.set(name, value);
89
+ }
90
+ }
91
+ send(data) {
92
+ if (!this.isWritable()) {
93
+ return;
94
+ }
95
+ this._headersSent = true;
96
+ // Handle empty string (e.g., for CORS preflight 204 responses)
97
+ if (data === '') {
98
+ this.ctx.body = '';
99
+ return;
100
+ }
101
+ // Koa automatically JSON-stringifies objects
102
+ this.ctx.status = this._statusCode;
103
+ this.ctx.body = data;
104
+ }
105
+ async stream(generator) {
106
+ if (!this.isWritable()) {
107
+ return;
108
+ }
109
+ this._headersSent = true;
110
+ // Get the underlying Node.js response for SSE
111
+ const nodeRes = this.ctx.res;
112
+ // Set SSE headers
113
+ sendSSEHeaders(nodeRes, {});
114
+ // Set Koa to not handle the response
115
+ this.ctx.respond = false;
116
+ try {
117
+ // Stream chunks
118
+ for await (const chunk of generator) {
119
+ if (!this.isWritable()) {
120
+ break;
121
+ }
122
+ sendSSEChunk(nodeRes, chunk);
123
+ }
124
+ // Send done marker
125
+ if (this.isWritable()) {
126
+ sendSSEDone(nodeRes);
127
+ }
128
+ }
129
+ catch (error) {
130
+ // If error occurs during streaming, we can't change status code
131
+ // Just log and close
132
+ console.error('Streaming error:', error);
133
+ if (this.isWritable()) {
134
+ nodeRes.end();
135
+ }
136
+ }
137
+ }
138
+ isWritable() {
139
+ return !this.ctx.response.headerSent && this.ctx.writable;
140
+ }
141
+ /**
142
+ * Get the underlying Koa context object
143
+ */
144
+ get raw() {
145
+ return this.ctx;
146
+ }
147
+ }
148
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/koa/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Koa HTTP Adapter
3
+ *
4
+ * HTTP adapter for Koa
5
+ *
6
+ * @module
7
+ */
8
+ export * from './adapter.js';
9
+ export * from './middleware.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/koa/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Koa Middleware
3
+ *
4
+ * HTTP request middleware for Koa that uses the core handler.
5
+ *
6
+ * @module
7
+ */
8
+ import { CoreHTTPHandler } from 'ai.matey.http.core';
9
+ import { KoaRequestAdapter, KoaResponseAdapter } from './adapter.js';
10
+ /**
11
+ * Create Koa middleware for handling AI chat requests
12
+ *
13
+ * @param bridge - Bridge instance
14
+ * @param options - HTTP listener options
15
+ * @returns Koa middleware function
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import Koa from 'koa';
20
+ * import bodyParser from 'koa-bodyparser';
21
+ * import { KoaMiddleware } from 'ai.matey.http/koa';
22
+ *
23
+ * const app = new Koa();
24
+ * const bridge = new Bridge(frontend, backend);
25
+ *
26
+ * // Use body parser middleware first
27
+ * app.use(bodyParser());
28
+ *
29
+ * // Add AI chat middleware
30
+ * app.use(KoaMiddleware(bridge, {
31
+ * cors: true,
32
+ * streaming: true,
33
+ * }));
34
+ *
35
+ * app.listen(3000);
36
+ * ```
37
+ */
38
+ export function KoaMiddleware(bridge, options = {}) {
39
+ // Create core handler with all business logic
40
+ const { cors, ...restOptions } = options;
41
+ const coreHandler = new CoreHTTPHandler({
42
+ bridge,
43
+ cors: cors === false || cors === undefined ? undefined : cors === true ? {} : cors,
44
+ ...restOptions, // HTTPListenerOptions types are compatible with CoreHandlerOptions at runtime
45
+ });
46
+ // Return Koa middleware
47
+ return async (ctx, _next) => {
48
+ // Create adapters
49
+ const genericReq = new KoaRequestAdapter(ctx);
50
+ const genericRes = new KoaResponseAdapter(ctx);
51
+ // Handle request through core handler
52
+ await coreHandler.handle(genericReq, genericRes);
53
+ };
54
+ }
55
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/koa/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,UAA+B,EAAE;IAEjC,8CAA8C;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,MAAM;QACN,IAAI,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QAClF,GAAI,WAAmB,EAAE,8EAA8E;KACxG,CAAC,CAAC;IAEH,wBAAwB;IACxB,OAAO,KAAK,EAAE,GAAY,EAAE,KAAW,EAAiB,EAAE;QACxD,kBAAkB;QAClB,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAE/C,sCAAsC;QACtC,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC"}