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.
- package/LICENSE +21 -0
- package/dist/cjs/deno/adapter.js +173 -0
- package/dist/cjs/deno/adapter.js.map +1 -0
- package/dist/cjs/deno/handler.js +78 -0
- package/dist/cjs/deno/handler.js.map +1 -0
- package/dist/cjs/deno/index.js +26 -0
- package/dist/cjs/deno/index.js.map +1 -0
- package/dist/cjs/express/adapter.js +150 -0
- package/dist/cjs/express/adapter.js.map +1 -0
- package/dist/cjs/express/index.js +26 -0
- package/dist/cjs/express/index.js.map +1 -0
- package/dist/cjs/express/middleware.js +63 -0
- package/dist/cjs/express/middleware.js.map +1 -0
- package/dist/cjs/fastify/adapter.js +149 -0
- package/dist/cjs/fastify/adapter.js.map +1 -0
- package/dist/cjs/fastify/handler.js +54 -0
- package/dist/cjs/fastify/handler.js.map +1 -0
- package/dist/cjs/fastify/index.js +26 -0
- package/dist/cjs/fastify/index.js.map +1 -0
- package/dist/cjs/hono/adapter.js +172 -0
- package/dist/cjs/hono/adapter.js.map +1 -0
- package/dist/cjs/hono/index.js +26 -0
- package/dist/cjs/hono/index.js.map +1 -0
- package/dist/cjs/hono/middleware.js +75 -0
- package/dist/cjs/hono/middleware.js.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/koa/adapter.js +153 -0
- package/dist/cjs/koa/adapter.js.map +1 -0
- package/dist/cjs/koa/index.js +26 -0
- package/dist/cjs/koa/index.js.map +1 -0
- package/dist/cjs/koa/middleware.js +58 -0
- package/dist/cjs/koa/middleware.js.map +1 -0
- package/dist/cjs/node/adapter.js +170 -0
- package/dist/cjs/node/adapter.js.map +1 -0
- package/dist/cjs/node/index.js +26 -0
- package/dist/cjs/node/index.js.map +1 -0
- package/dist/cjs/node/listener.js +98 -0
- package/dist/cjs/node/listener.js.map +1 -0
- package/dist/esm/deno/adapter.js +168 -0
- package/dist/esm/deno/adapter.js.map +1 -0
- package/dist/esm/deno/handler.js +75 -0
- package/dist/esm/deno/handler.js.map +1 -0
- package/dist/esm/deno/index.js +10 -0
- package/dist/esm/deno/index.js.map +1 -0
- package/dist/esm/express/adapter.js +145 -0
- package/dist/esm/express/adapter.js.map +1 -0
- package/dist/esm/express/index.js +10 -0
- package/dist/esm/express/index.js.map +1 -0
- package/dist/esm/express/middleware.js +60 -0
- package/dist/esm/express/middleware.js.map +1 -0
- package/dist/esm/fastify/adapter.js +144 -0
- package/dist/esm/fastify/adapter.js.map +1 -0
- package/dist/esm/fastify/handler.js +51 -0
- package/dist/esm/fastify/handler.js.map +1 -0
- package/dist/esm/fastify/index.js +10 -0
- package/dist/esm/fastify/index.js.map +1 -0
- package/dist/esm/hono/adapter.js +167 -0
- package/dist/esm/hono/adapter.js.map +1 -0
- package/dist/esm/hono/index.js +10 -0
- package/dist/esm/hono/index.js.map +1 -0
- package/dist/esm/hono/middleware.js +72 -0
- package/dist/esm/hono/middleware.js.map +1 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/koa/adapter.js +148 -0
- package/dist/esm/koa/adapter.js.map +1 -0
- package/dist/esm/koa/index.js +10 -0
- package/dist/esm/koa/index.js.map +1 -0
- package/dist/esm/koa/middleware.js +55 -0
- package/dist/esm/koa/middleware.js.map +1 -0
- package/dist/esm/node/adapter.js +165 -0
- package/dist/esm/node/adapter.js.map +1 -0
- package/dist/esm/node/index.js +10 -0
- package/dist/esm/node/index.js.map +1 -0
- package/dist/esm/node/listener.js +92 -0
- package/dist/esm/node/listener.js.map +1 -0
- package/dist/types/deno/adapter.d.ts +56 -0
- package/dist/types/deno/adapter.d.ts.map +1 -0
- package/dist/types/deno/handler.d.ts +38 -0
- package/dist/types/deno/handler.d.ts.map +1 -0
- package/dist/types/deno/index.d.ts +10 -0
- package/dist/types/deno/index.d.ts.map +1 -0
- package/dist/types/express/adapter.d.ts +46 -0
- package/dist/types/express/adapter.d.ts.map +1 -0
- package/dist/types/express/index.d.ts +10 -0
- package/dist/types/express/index.d.ts.map +1 -0
- package/dist/types/express/middleware.d.ts +39 -0
- package/dist/types/express/middleware.d.ts.map +1 -0
- package/dist/types/fastify/adapter.d.ts +46 -0
- package/dist/types/fastify/adapter.d.ts.map +1 -0
- package/dist/types/fastify/handler.d.ts +36 -0
- package/dist/types/fastify/handler.d.ts.map +1 -0
- package/dist/types/fastify/index.d.ts +10 -0
- package/dist/types/fastify/index.d.ts.map +1 -0
- package/dist/types/hono/adapter.d.ts +47 -0
- package/dist/types/hono/adapter.d.ts.map +1 -0
- package/dist/types/hono/index.d.ts +10 -0
- package/dist/types/hono/index.d.ts.map +1 -0
- package/dist/types/hono/middleware.d.ts +36 -0
- package/dist/types/hono/middleware.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/koa/adapter.d.ts +46 -0
- package/dist/types/koa/adapter.d.ts.map +1 -0
- package/dist/types/koa/index.d.ts +10 -0
- package/dist/types/koa/index.d.ts.map +1 -0
- package/dist/types/koa/middleware.d.ts +40 -0
- package/dist/types/koa/middleware.d.ts.map +1 -0
- package/dist/types/node/adapter.d.ts +57 -0
- package/dist/types/node/adapter.d.ts.map +1 -0
- package/dist/types/node/index.d.ts +10 -0
- package/dist/types/node/index.d.ts.map +1 -0
- package/dist/types/node/listener.d.ts +51 -0
- package/dist/types/node/listener.d.ts.map +1 -0
- package/package.json +160 -0
- package/readme.md +93 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 AI Matey Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deno HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* Converts Deno Request/Response to GenericRequest/GenericResponse
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DenoResponseAdapter = exports.DenoRequestAdapter = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Adapter that converts Deno Request to GenericRequest
|
|
13
|
+
*/
|
|
14
|
+
class DenoRequestAdapter {
|
|
15
|
+
request;
|
|
16
|
+
connInfo;
|
|
17
|
+
_body = null;
|
|
18
|
+
constructor(request, connInfo) {
|
|
19
|
+
this.request = request;
|
|
20
|
+
this.connInfo = connInfo;
|
|
21
|
+
}
|
|
22
|
+
get method() {
|
|
23
|
+
return this.request.method || 'GET';
|
|
24
|
+
}
|
|
25
|
+
get url() {
|
|
26
|
+
return this.request.url || '/';
|
|
27
|
+
}
|
|
28
|
+
get headers() {
|
|
29
|
+
const headers = {};
|
|
30
|
+
this.request.headers.forEach((value, key) => {
|
|
31
|
+
headers[key.toLowerCase()] = value;
|
|
32
|
+
});
|
|
33
|
+
return headers;
|
|
34
|
+
}
|
|
35
|
+
get body() {
|
|
36
|
+
// Return parsed body (must be set externally via setBody)
|
|
37
|
+
return this._body;
|
|
38
|
+
}
|
|
39
|
+
get params() {
|
|
40
|
+
// Params would need to be provided by routing layer
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
get query() {
|
|
44
|
+
// Parse query string from URL
|
|
45
|
+
const url = new URL(this.request.url);
|
|
46
|
+
const query = {};
|
|
47
|
+
url.searchParams.forEach((value, key) => {
|
|
48
|
+
query[key] = value;
|
|
49
|
+
});
|
|
50
|
+
return Object.keys(query).length > 0 ? query : undefined;
|
|
51
|
+
}
|
|
52
|
+
get ip() {
|
|
53
|
+
// Try to get IP from connection info or headers
|
|
54
|
+
if (this.connInfo?.remoteAddr?.hostname) {
|
|
55
|
+
return this.connInfo.remoteAddr.hostname;
|
|
56
|
+
}
|
|
57
|
+
const forwarded = this.request.headers.get('x-forwarded-for');
|
|
58
|
+
if (forwarded) {
|
|
59
|
+
return forwarded.split(',')[0]?.trim();
|
|
60
|
+
}
|
|
61
|
+
const realIp = this.request.headers.get('x-real-ip');
|
|
62
|
+
if (realIp) {
|
|
63
|
+
return realIp;
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Set the parsed body (must be called before passing to handler)
|
|
69
|
+
*/
|
|
70
|
+
setBody(body) {
|
|
71
|
+
this._body = body;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the underlying Deno request object
|
|
75
|
+
*/
|
|
76
|
+
get raw() {
|
|
77
|
+
return this.request;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.DenoRequestAdapter = DenoRequestAdapter;
|
|
81
|
+
/**
|
|
82
|
+
* Adapter that converts GenericResponse methods to Deno Response
|
|
83
|
+
*/
|
|
84
|
+
class DenoResponseAdapter {
|
|
85
|
+
_statusCode = 200;
|
|
86
|
+
_headers = new Headers();
|
|
87
|
+
_sent = false;
|
|
88
|
+
_response = null;
|
|
89
|
+
constructor() { }
|
|
90
|
+
status(code) {
|
|
91
|
+
if (!this._sent) {
|
|
92
|
+
this._statusCode = code;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
header(name, value) {
|
|
96
|
+
if (!this._sent) {
|
|
97
|
+
this._headers.set(name, value);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
send(data) {
|
|
101
|
+
if (this._sent) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this._sent = true;
|
|
105
|
+
// Clone headers to ensure they're properly set
|
|
106
|
+
const headers = new Headers(this._headers);
|
|
107
|
+
// Handle empty string (e.g., for CORS preflight 204 responses)
|
|
108
|
+
if (data === '') {
|
|
109
|
+
// 204 No Content responses cannot have a body (not even empty string)
|
|
110
|
+
// Use null for 204, empty string for other status codes
|
|
111
|
+
this._response = new Response(this._statusCode === 204 ? null : '', {
|
|
112
|
+
status: this._statusCode,
|
|
113
|
+
headers,
|
|
114
|
+
});
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Create JSON response
|
|
118
|
+
headers.set('Content-Type', 'application/json');
|
|
119
|
+
this._response = new Response(JSON.stringify(data), {
|
|
120
|
+
status: this._statusCode,
|
|
121
|
+
headers,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
stream(generator) {
|
|
125
|
+
if (this._sent) {
|
|
126
|
+
return Promise.resolve();
|
|
127
|
+
}
|
|
128
|
+
this._sent = true;
|
|
129
|
+
// Create SSE stream
|
|
130
|
+
const stream = new ReadableStream({
|
|
131
|
+
async start(controller) {
|
|
132
|
+
try {
|
|
133
|
+
for await (const chunk of generator) {
|
|
134
|
+
const data = `data: ${JSON.stringify(chunk)}\n\n`;
|
|
135
|
+
controller.enqueue(new TextEncoder().encode(data));
|
|
136
|
+
}
|
|
137
|
+
// Send done marker
|
|
138
|
+
const done = 'data: [DONE]\n\n';
|
|
139
|
+
controller.enqueue(new TextEncoder().encode(done));
|
|
140
|
+
controller.close();
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
console.error('Streaming error:', error);
|
|
144
|
+
controller.error(error);
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
// Set SSE headers
|
|
149
|
+
this._headers.set('Content-Type', 'text/event-stream');
|
|
150
|
+
this._headers.set('Cache-Control', 'no-cache');
|
|
151
|
+
this._headers.set('Connection', 'keep-alive');
|
|
152
|
+
this._response = new Response(stream, {
|
|
153
|
+
status: this._statusCode,
|
|
154
|
+
headers: this._headers,
|
|
155
|
+
});
|
|
156
|
+
return Promise.resolve();
|
|
157
|
+
}
|
|
158
|
+
isWritable() {
|
|
159
|
+
return !this._sent;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get the generated Response object
|
|
163
|
+
*/
|
|
164
|
+
getResponse() {
|
|
165
|
+
if (!this._response) {
|
|
166
|
+
// If no response was generated, create an error response
|
|
167
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
168
|
+
}
|
|
169
|
+
return this._response;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.DenoResponseAdapter = DenoResponseAdapter;
|
|
173
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/deno/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deno Handler
|
|
4
|
+
*
|
|
5
|
+
* HTTP request handler for Deno that uses the core handler.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DenoHandler = DenoHandler;
|
|
11
|
+
const ai_matey_http_core_1 = require("ai.matey.http.core");
|
|
12
|
+
const adapter_js_1 = require("./adapter.js");
|
|
13
|
+
/**
|
|
14
|
+
* Create Deno HTTP handler for handling AI chat requests
|
|
15
|
+
*
|
|
16
|
+
* @param bridge - Bridge instance
|
|
17
|
+
* @param options - HTTP listener options
|
|
18
|
+
* @returns Deno HTTP handler function
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { DenoHandler } from 'ai.matey.http/deno';
|
|
23
|
+
*
|
|
24
|
+
* const bridge = new Bridge(frontend, backend);
|
|
25
|
+
*
|
|
26
|
+
* // Create handler
|
|
27
|
+
* const handler = DenoHandler(bridge, {
|
|
28
|
+
* cors: true,
|
|
29
|
+
* streaming: true,
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Use with Deno.serve
|
|
33
|
+
* Deno.serve({ port: 3000 }, handler);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
function DenoHandler(bridge, options = {}) {
|
|
37
|
+
// Create core handler with all business logic
|
|
38
|
+
const { cors, ...restOptions } = options;
|
|
39
|
+
const coreHandler = new ai_matey_http_core_1.CoreHTTPHandler({
|
|
40
|
+
bridge,
|
|
41
|
+
cors: cors === false || cors === undefined ? undefined : cors === true ? {} : cors,
|
|
42
|
+
...restOptions, // HTTPListenerOptions types are compatible with CoreHandlerOptions at runtime
|
|
43
|
+
});
|
|
44
|
+
// Return Deno HTTP handler
|
|
45
|
+
return async (request, connInfo) => {
|
|
46
|
+
try {
|
|
47
|
+
// Parse JSON body if present (but not for OPTIONS requests)
|
|
48
|
+
const contentType = request.headers.get('content-type') || '';
|
|
49
|
+
const method = request.method;
|
|
50
|
+
let body = null;
|
|
51
|
+
if (method !== 'OPTIONS' && contentType.includes('application/json')) {
|
|
52
|
+
try {
|
|
53
|
+
body = await request.json();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// If JSON parsing fails, leave body as null
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Create adapters
|
|
60
|
+
const genericReq = new adapter_js_1.DenoRequestAdapter(request, connInfo);
|
|
61
|
+
genericReq.setBody(body);
|
|
62
|
+
const genericRes = new adapter_js_1.DenoResponseAdapter();
|
|
63
|
+
// Handle request through core handler
|
|
64
|
+
await coreHandler.handle(genericReq, genericRes);
|
|
65
|
+
// Return the response generated by the adapter
|
|
66
|
+
return genericRes.getResponse();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Return error response
|
|
70
|
+
console.error('Deno handler error:', error);
|
|
71
|
+
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
|
|
72
|
+
status: 500,
|
|
73
|
+
headers: { 'Content-Type': 'application/json' },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/deno/handler.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA8BH,kCAoDC;AA9ED,2DAAqD;AACrD,6CAAuE;AAEvE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAgB,WAAW,CACzB,MAAc,EACd,UAA+B,EAAE;IAEjC,8CAA8C;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,oCAAe,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,2BAA2B;IAC3B,OAAO,KAAK,EACV,OAAgB,EAChB,QAAiD,EAC9B,EAAE;QACrB,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,IAAI,GAAG,IAAI,CAAC;YAEhB,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC;oBACH,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC9B,CAAC;gBAAC,MAAM,CAAC;oBACP,4CAA4C;gBAC9C,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,MAAM,UAAU,GAAG,IAAI,+BAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC7D,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEzB,MAAM,UAAU,GAAG,IAAI,gCAAmB,EAAE,CAAC;YAE7C,sCAAsC;YACtC,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAEjD,+CAA+C;YAC/C,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;YACxB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,EAAE;gBACtE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deno HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* HTTP adapter for Deno
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
__exportStar(require("./adapter.js"), exports);
|
|
25
|
+
__exportStar(require("./handler.js"), exports);
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deno/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,+CAA6B"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Express HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* Converts Express Request/Response to GenericRequest/GenericResponse
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ExpressResponseAdapter = exports.ExpressRequestAdapter = void 0;
|
|
11
|
+
const ai_matey_http_core_1 = require("ai.matey.http.core");
|
|
12
|
+
/**
|
|
13
|
+
* Adapter that converts Express Request to GenericRequest
|
|
14
|
+
*/
|
|
15
|
+
class ExpressRequestAdapter {
|
|
16
|
+
req;
|
|
17
|
+
constructor(req) {
|
|
18
|
+
this.req = req;
|
|
19
|
+
}
|
|
20
|
+
get method() {
|
|
21
|
+
return this.req.method || 'GET';
|
|
22
|
+
}
|
|
23
|
+
get url() {
|
|
24
|
+
return this.req.originalUrl || this.req.url || '/';
|
|
25
|
+
}
|
|
26
|
+
get headers() {
|
|
27
|
+
const headers = {};
|
|
28
|
+
for (const [key, value] of Object.entries(this.req.headers)) {
|
|
29
|
+
if (typeof value === 'string') {
|
|
30
|
+
headers[key.toLowerCase()] = value;
|
|
31
|
+
}
|
|
32
|
+
else if (Array.isArray(value)) {
|
|
33
|
+
headers[key.toLowerCase()] = value.join(', ');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return headers;
|
|
37
|
+
}
|
|
38
|
+
get body() {
|
|
39
|
+
// Express body is already parsed if body-parser middleware is used
|
|
40
|
+
return this.req.body ?? null;
|
|
41
|
+
}
|
|
42
|
+
get params() {
|
|
43
|
+
return this.req.params;
|
|
44
|
+
}
|
|
45
|
+
get query() {
|
|
46
|
+
// Express query can have arrays, so we need to stringify them
|
|
47
|
+
const query = {};
|
|
48
|
+
for (const [key, value] of Object.entries(this.req.query)) {
|
|
49
|
+
if (typeof value === 'string') {
|
|
50
|
+
query[key] = value;
|
|
51
|
+
}
|
|
52
|
+
else if (Array.isArray(value)) {
|
|
53
|
+
const primitives = value.filter((v) => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean');
|
|
54
|
+
query[key] = primitives.map((v) => v.toString()).join(',');
|
|
55
|
+
}
|
|
56
|
+
else if (value !== undefined && typeof value !== 'object') {
|
|
57
|
+
query[key] = String(value);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return Object.keys(query).length > 0 ? query : undefined;
|
|
61
|
+
}
|
|
62
|
+
get ip() {
|
|
63
|
+
// Express provides multiple IP sources
|
|
64
|
+
return this.req.ip || this.req.socket?.remoteAddress;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the underlying Express request object
|
|
68
|
+
*/
|
|
69
|
+
get raw() {
|
|
70
|
+
return this.req;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.ExpressRequestAdapter = ExpressRequestAdapter;
|
|
74
|
+
/**
|
|
75
|
+
* Adapter that converts GenericResponse methods to Express Response
|
|
76
|
+
*/
|
|
77
|
+
class ExpressResponseAdapter {
|
|
78
|
+
res;
|
|
79
|
+
_statusCode = 200;
|
|
80
|
+
_headersSent = false;
|
|
81
|
+
constructor(res) {
|
|
82
|
+
this.res = res;
|
|
83
|
+
}
|
|
84
|
+
status(code) {
|
|
85
|
+
this._statusCode = code;
|
|
86
|
+
if (!this._headersSent) {
|
|
87
|
+
this.res.status(code);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
header(name, value) {
|
|
91
|
+
if (!this._headersSent) {
|
|
92
|
+
this.res.setHeader(name, value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
send(data) {
|
|
96
|
+
if (!this.isWritable()) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this._headersSent = true;
|
|
100
|
+
// Handle empty string (e.g., for CORS preflight 204 responses)
|
|
101
|
+
if (data === '') {
|
|
102
|
+
this.res.end();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Express has a built-in json() method
|
|
106
|
+
this.res.status(this._statusCode).json(data);
|
|
107
|
+
}
|
|
108
|
+
async stream(generator) {
|
|
109
|
+
if (!this.isWritable()) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this._headersSent = true;
|
|
113
|
+
// Get the underlying Node.js response for SSE
|
|
114
|
+
const nodeRes = this.res;
|
|
115
|
+
// Set SSE headers
|
|
116
|
+
(0, ai_matey_http_core_1.sendSSEHeaders)(nodeRes, {});
|
|
117
|
+
try {
|
|
118
|
+
// Stream chunks
|
|
119
|
+
for await (const chunk of generator) {
|
|
120
|
+
if (!this.isWritable()) {
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
(0, ai_matey_http_core_1.sendSSEChunk)(nodeRes, chunk);
|
|
124
|
+
}
|
|
125
|
+
// Send done marker
|
|
126
|
+
if (this.isWritable()) {
|
|
127
|
+
(0, ai_matey_http_core_1.sendSSEDone)(nodeRes);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
// If error occurs during streaming, we can't change status code
|
|
132
|
+
// Just log and close
|
|
133
|
+
console.error('Streaming error:', error);
|
|
134
|
+
if (this.isWritable()) {
|
|
135
|
+
nodeRes.end();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
isWritable() {
|
|
140
|
+
return !this.res.headersSent && this.res.writable;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get the underlying Express response object
|
|
144
|
+
*/
|
|
145
|
+
get raw() {
|
|
146
|
+
return this.res;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.ExpressResponseAdapter = ExpressResponseAdapter;
|
|
150
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/express/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Express HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* HTTP adapter for Express.js
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
__exportStar(require("./adapter.js"), exports);
|
|
25
|
+
__exportStar(require("./middleware.js"), exports);
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/express/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,kDAAgC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Express Middleware
|
|
4
|
+
*
|
|
5
|
+
* HTTP request middleware for Express that uses the core handler.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ExpressMiddleware = ExpressMiddleware;
|
|
11
|
+
const ai_matey_http_core_1 = require("ai.matey.http.core");
|
|
12
|
+
const adapter_js_1 = require("./adapter.js");
|
|
13
|
+
/**
|
|
14
|
+
* Create Express middleware for handling AI chat requests
|
|
15
|
+
*
|
|
16
|
+
* @param bridge - Bridge instance
|
|
17
|
+
* @param options - HTTP listener options
|
|
18
|
+
* @returns Express middleware function
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import express from 'express';
|
|
23
|
+
* import { ExpressMiddleware } from 'ai.matey.http/express';
|
|
24
|
+
*
|
|
25
|
+
* const app = express();
|
|
26
|
+
* const bridge = new Bridge(frontend, backend);
|
|
27
|
+
*
|
|
28
|
+
* // Use body parser middleware first
|
|
29
|
+
* app.use(express.json());
|
|
30
|
+
*
|
|
31
|
+
* // Add AI chat middleware
|
|
32
|
+
* app.use('/v1/messages', ExpressMiddleware(bridge, {
|
|
33
|
+
* cors: true,
|
|
34
|
+
* streaming: true,
|
|
35
|
+
* }));
|
|
36
|
+
*
|
|
37
|
+
* app.listen(3000);
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function ExpressMiddleware(bridge, options = {}) {
|
|
41
|
+
// Create core handler with all business logic
|
|
42
|
+
const { cors, ...restOptions } = options;
|
|
43
|
+
const coreHandler = new ai_matey_http_core_1.CoreHTTPHandler({
|
|
44
|
+
bridge,
|
|
45
|
+
cors: cors === false || cors === undefined ? undefined : cors === true ? {} : cors,
|
|
46
|
+
...restOptions, // HTTPListenerOptions types are compatible with CoreHandlerOptions at runtime
|
|
47
|
+
});
|
|
48
|
+
// Return Express middleware
|
|
49
|
+
return async (req, res, next) => {
|
|
50
|
+
try {
|
|
51
|
+
// Create adapters
|
|
52
|
+
const genericReq = new adapter_js_1.ExpressRequestAdapter(req);
|
|
53
|
+
const genericRes = new adapter_js_1.ExpressResponseAdapter(res);
|
|
54
|
+
// Handle request through core handler
|
|
55
|
+
await coreHandler.handle(genericReq, genericRes);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// Pass error to Express error handling middleware
|
|
59
|
+
next(error);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/express/middleware.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAmCH,8CA2BC;AAzDD,2DAAqD;AACrD,6CAA6E;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,iBAAiB,CAC/B,MAAc,EACd,UAA+B,EAAE;IAEjC,8CAA8C;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,oCAAe,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,4BAA4B;IAC5B,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAiB,EAAE;QAC9E,IAAI,CAAC;YACH,kBAAkB;YAClB,MAAM,UAAU,GAAG,IAAI,kCAAqB,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,mCAAsB,CAAC,GAAG,CAAC,CAAC;YAEnD,sCAAsC;YACtC,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kDAAkD;YAClD,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|