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
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fastify HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* Converts Fastify Request/Reply to GenericRequest/GenericResponse
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.FastifyResponseAdapter = exports.FastifyRequestAdapter = void 0;
|
|
11
|
+
const ai_matey_http_core_1 = require("ai.matey.http.core");
|
|
12
|
+
/**
|
|
13
|
+
* Adapter that converts Fastify Request to GenericRequest
|
|
14
|
+
*/
|
|
15
|
+
class FastifyRequestAdapter {
|
|
16
|
+
request;
|
|
17
|
+
constructor(request) {
|
|
18
|
+
this.request = request;
|
|
19
|
+
}
|
|
20
|
+
get method() {
|
|
21
|
+
return this.request.method || 'GET';
|
|
22
|
+
}
|
|
23
|
+
get url() {
|
|
24
|
+
return this.request.url || '/';
|
|
25
|
+
}
|
|
26
|
+
get headers() {
|
|
27
|
+
const headers = {};
|
|
28
|
+
for (const [key, value] of Object.entries(this.request.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
|
+
// Fastify automatically parses JSON body
|
|
40
|
+
return this.request.body ?? null;
|
|
41
|
+
}
|
|
42
|
+
get params() {
|
|
43
|
+
return this.request.params;
|
|
44
|
+
}
|
|
45
|
+
get query() {
|
|
46
|
+
// Fastify query can have arrays, so we need to stringify them
|
|
47
|
+
const query = {};
|
|
48
|
+
for (const [key, value] of Object.entries(this.request.query || {})) {
|
|
49
|
+
if (typeof value === 'string') {
|
|
50
|
+
query[key] = value;
|
|
51
|
+
}
|
|
52
|
+
else if (Array.isArray(value)) {
|
|
53
|
+
query[key] = value.join(',');
|
|
54
|
+
}
|
|
55
|
+
else if (value !== undefined) {
|
|
56
|
+
query[key] = String(value);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return Object.keys(query).length > 0 ? query : undefined;
|
|
60
|
+
}
|
|
61
|
+
get ip() {
|
|
62
|
+
// Fastify provides IP through request.ip
|
|
63
|
+
return this.request.ip || this.request.socket?.remoteAddress;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get the underlying Fastify request object
|
|
67
|
+
*/
|
|
68
|
+
get raw() {
|
|
69
|
+
return this.request;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.FastifyRequestAdapter = FastifyRequestAdapter;
|
|
73
|
+
/**
|
|
74
|
+
* Adapter that converts GenericResponse methods to Fastify Reply
|
|
75
|
+
*/
|
|
76
|
+
class FastifyResponseAdapter {
|
|
77
|
+
reply;
|
|
78
|
+
_statusCode = 200;
|
|
79
|
+
_headersSent = false;
|
|
80
|
+
constructor(reply) {
|
|
81
|
+
this.reply = reply;
|
|
82
|
+
}
|
|
83
|
+
status(code) {
|
|
84
|
+
this._statusCode = code;
|
|
85
|
+
if (!this._headersSent) {
|
|
86
|
+
this.reply.code(code);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
header(name, value) {
|
|
90
|
+
if (!this._headersSent) {
|
|
91
|
+
this.reply.header(name, value);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
send(data) {
|
|
95
|
+
if (!this.isWritable()) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this._headersSent = true;
|
|
99
|
+
// Handle empty string (e.g., for CORS preflight 204 responses)
|
|
100
|
+
if (data === '') {
|
|
101
|
+
this.reply.code(this._statusCode).send('');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Fastify automatically JSON-stringifies objects
|
|
105
|
+
this.reply.code(this._statusCode).send(data);
|
|
106
|
+
}
|
|
107
|
+
async stream(generator) {
|
|
108
|
+
if (!this.isWritable()) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
this._headersSent = true;
|
|
112
|
+
// Get the underlying Node.js response for SSE
|
|
113
|
+
const nodeRes = this.reply.raw;
|
|
114
|
+
// Set SSE headers
|
|
115
|
+
(0, ai_matey_http_core_1.sendSSEHeaders)(nodeRes, {});
|
|
116
|
+
try {
|
|
117
|
+
// Stream chunks
|
|
118
|
+
for await (const chunk of generator) {
|
|
119
|
+
if (!this.isWritable()) {
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
(0, ai_matey_http_core_1.sendSSEChunk)(nodeRes, chunk);
|
|
123
|
+
}
|
|
124
|
+
// Send done marker
|
|
125
|
+
if (this.isWritable()) {
|
|
126
|
+
(0, ai_matey_http_core_1.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.reply.sent && !this._headersSent;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the underlying Fastify reply object
|
|
143
|
+
*/
|
|
144
|
+
get raw() {
|
|
145
|
+
return this.reply;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.FastifyResponseAdapter = FastifyResponseAdapter;
|
|
149
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/fastify/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fastify Handler
|
|
4
|
+
*
|
|
5
|
+
* HTTP request handler for Fastify that uses the core handler.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.FastifyHandler = FastifyHandler;
|
|
11
|
+
const ai_matey_http_core_1 = require("ai.matey.http.core");
|
|
12
|
+
const adapter_js_1 = require("./adapter.js");
|
|
13
|
+
/**
|
|
14
|
+
* Create Fastify route handler for handling AI chat requests
|
|
15
|
+
*
|
|
16
|
+
* @param bridge - Bridge instance
|
|
17
|
+
* @param options - HTTP listener options
|
|
18
|
+
* @returns Fastify route handler function
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import Fastify from 'fastify';
|
|
23
|
+
* import { FastifyHandler } from 'ai.matey.http/fastify';
|
|
24
|
+
*
|
|
25
|
+
* const fastify = Fastify();
|
|
26
|
+
* const bridge = new Bridge(frontend, backend);
|
|
27
|
+
*
|
|
28
|
+
* // Add AI chat route
|
|
29
|
+
* fastify.post('/v1/messages', FastifyHandler(bridge, {
|
|
30
|
+
* cors: true,
|
|
31
|
+
* streaming: true,
|
|
32
|
+
* }));
|
|
33
|
+
*
|
|
34
|
+
* fastify.listen({ port: 3000 });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
function FastifyHandler(bridge, options = {}) {
|
|
38
|
+
// Create core handler with all business logic
|
|
39
|
+
const { cors, ...restOptions } = options;
|
|
40
|
+
const coreHandler = new ai_matey_http_core_1.CoreHTTPHandler({
|
|
41
|
+
bridge,
|
|
42
|
+
cors: cors === false || cors === undefined ? undefined : cors === true ? {} : cors,
|
|
43
|
+
...restOptions, // HTTPListenerOptions types are compatible with CoreHandlerOptions at runtime
|
|
44
|
+
});
|
|
45
|
+
// Return Fastify route handler
|
|
46
|
+
return async (request, reply) => {
|
|
47
|
+
// Create adapters
|
|
48
|
+
const genericReq = new adapter_js_1.FastifyRequestAdapter(request);
|
|
49
|
+
const genericRes = new adapter_js_1.FastifyResponseAdapter(reply);
|
|
50
|
+
// Handle request through core handler
|
|
51
|
+
await coreHandler.handle(genericReq, genericRes);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/fastify/handler.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAgCH,wCAsBC;AAjDD,2DAAqD;AACrD,6CAA6E;AAE7E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,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,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,+BAA+B;IAC/B,OAAO,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAiB,EAAE;QAC3E,kBAAkB;QAClB,MAAM,UAAU,GAAG,IAAI,kCAAqB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,mCAAsB,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,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fastify HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* HTTP adapter for Fastify
|
|
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/fastify/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,+CAA6B"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hono HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* Converts Hono Context to GenericRequest/GenericResponse
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.HonoResponseAdapter = exports.HonoRequestAdapter = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Adapter that converts Hono Context to GenericRequest
|
|
13
|
+
*/
|
|
14
|
+
class HonoRequestAdapter {
|
|
15
|
+
c;
|
|
16
|
+
constructor(c) {
|
|
17
|
+
this.c = c;
|
|
18
|
+
}
|
|
19
|
+
get method() {
|
|
20
|
+
return this.c.req.method || 'GET';
|
|
21
|
+
}
|
|
22
|
+
get url() {
|
|
23
|
+
return this.c.req.url || '/';
|
|
24
|
+
}
|
|
25
|
+
get headers() {
|
|
26
|
+
const headers = {};
|
|
27
|
+
// Hono headers is a Headers object
|
|
28
|
+
this.c.req.raw.headers.forEach((value, key) => {
|
|
29
|
+
headers[key.toLowerCase()] = value;
|
|
30
|
+
});
|
|
31
|
+
return headers;
|
|
32
|
+
}
|
|
33
|
+
get body() {
|
|
34
|
+
// Hono doesn't automatically parse body - it must be done with middleware
|
|
35
|
+
// Access the parsed body from context if available
|
|
36
|
+
return this.c.body ?? null;
|
|
37
|
+
}
|
|
38
|
+
get params() {
|
|
39
|
+
// Hono params are available via c.req.param()
|
|
40
|
+
const params = this.c.req.param();
|
|
41
|
+
return Object.keys(params).length > 0 ? params : undefined;
|
|
42
|
+
}
|
|
43
|
+
get query() {
|
|
44
|
+
// Hono query is available via c.req.query()
|
|
45
|
+
const query = {};
|
|
46
|
+
const queryParams = this.c.req.query();
|
|
47
|
+
for (const [key, value] of Object.entries(queryParams)) {
|
|
48
|
+
if (value !== undefined) {
|
|
49
|
+
query[key] = String(value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return Object.keys(query).length > 0 ? query : undefined;
|
|
53
|
+
}
|
|
54
|
+
get ip() {
|
|
55
|
+
// Try to get IP from various headers
|
|
56
|
+
const forwarded = this.c.req.header('x-forwarded-for');
|
|
57
|
+
if (forwarded) {
|
|
58
|
+
return forwarded.split(',')[0]?.trim();
|
|
59
|
+
}
|
|
60
|
+
const realIp = this.c.req.header('x-real-ip');
|
|
61
|
+
if (realIp) {
|
|
62
|
+
return realIp;
|
|
63
|
+
}
|
|
64
|
+
// Fallback to undefined as we can't access socket in all Hono runtimes
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the underlying Hono context object
|
|
69
|
+
*/
|
|
70
|
+
get raw() {
|
|
71
|
+
return this.c;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.HonoRequestAdapter = HonoRequestAdapter;
|
|
75
|
+
/**
|
|
76
|
+
* Adapter that converts GenericResponse methods to Hono Context
|
|
77
|
+
*/
|
|
78
|
+
class HonoResponseAdapter {
|
|
79
|
+
c;
|
|
80
|
+
_statusCode = 200;
|
|
81
|
+
_headers = new Map();
|
|
82
|
+
_sent = false;
|
|
83
|
+
constructor(c) {
|
|
84
|
+
this.c = c;
|
|
85
|
+
}
|
|
86
|
+
status(code) {
|
|
87
|
+
if (!this._sent) {
|
|
88
|
+
this._statusCode = code;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
header(name, value) {
|
|
92
|
+
if (!this._sent) {
|
|
93
|
+
this._headers.set(name, value);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
send(data) {
|
|
97
|
+
if (this._sent) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this._sent = true;
|
|
101
|
+
// Collect headers for response
|
|
102
|
+
const headers = new Headers();
|
|
103
|
+
for (const [name, value] of this._headers.entries()) {
|
|
104
|
+
headers.set(name, value);
|
|
105
|
+
}
|
|
106
|
+
// Handle empty string (e.g., for CORS preflight 204 responses)
|
|
107
|
+
if (data === '') {
|
|
108
|
+
// 204 No Content responses cannot have a body (not even empty string)
|
|
109
|
+
// Use null for 204, empty string for other status codes
|
|
110
|
+
this.c.res = new Response(this._statusCode === 204 ? null : '', {
|
|
111
|
+
status: this._statusCode,
|
|
112
|
+
headers,
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Send JSON response
|
|
117
|
+
headers.set('Content-Type', 'application/json');
|
|
118
|
+
this.c.res = new Response(JSON.stringify(data), {
|
|
119
|
+
status: this._statusCode,
|
|
120
|
+
headers,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
stream(generator) {
|
|
124
|
+
if (this._sent) {
|
|
125
|
+
return Promise.resolve();
|
|
126
|
+
}
|
|
127
|
+
this._sent = true;
|
|
128
|
+
// Set all headers
|
|
129
|
+
for (const [name, value] of this._headers.entries()) {
|
|
130
|
+
this.c.header(name, value);
|
|
131
|
+
}
|
|
132
|
+
// Create SSE stream
|
|
133
|
+
const stream = new ReadableStream({
|
|
134
|
+
async start(controller) {
|
|
135
|
+
try {
|
|
136
|
+
for await (const chunk of generator) {
|
|
137
|
+
const data = `data: ${JSON.stringify(chunk)}\n\n`;
|
|
138
|
+
controller.enqueue(new TextEncoder().encode(data));
|
|
139
|
+
}
|
|
140
|
+
// Send done marker
|
|
141
|
+
const done = 'data: [DONE]\n\n';
|
|
142
|
+
controller.enqueue(new TextEncoder().encode(done));
|
|
143
|
+
controller.close();
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('Streaming error:', error);
|
|
147
|
+
controller.error(error);
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
// Set SSE headers and return stream
|
|
152
|
+
this.c.header('Content-Type', 'text/event-stream');
|
|
153
|
+
this.c.header('Cache-Control', 'no-cache');
|
|
154
|
+
this.c.header('Connection', 'keep-alive');
|
|
155
|
+
this.c.res = new Response(stream, {
|
|
156
|
+
status: this._statusCode,
|
|
157
|
+
headers: this.c.res?.headers,
|
|
158
|
+
});
|
|
159
|
+
return Promise.resolve();
|
|
160
|
+
}
|
|
161
|
+
isWritable() {
|
|
162
|
+
return !this._sent;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get the underlying Hono context object
|
|
166
|
+
*/
|
|
167
|
+
get raw() {
|
|
168
|
+
return this.c;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.HonoResponseAdapter = HonoResponseAdapter;
|
|
172
|
+
//# 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,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hono HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* HTTP adapter for Hono
|
|
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/hono/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,kDAAgC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hono Middleware
|
|
4
|
+
*
|
|
5
|
+
* HTTP request middleware for Hono that uses the core handler.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.HonoMiddleware = HonoMiddleware;
|
|
11
|
+
const ai_matey_http_core_1 = require("ai.matey.http.core");
|
|
12
|
+
const adapter_js_1 = require("./adapter.js");
|
|
13
|
+
/**
|
|
14
|
+
* Create Hono middleware for handling AI chat requests
|
|
15
|
+
*
|
|
16
|
+
* @param bridge - Bridge instance
|
|
17
|
+
* @param options - HTTP listener options
|
|
18
|
+
* @returns Hono middleware function
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { Hono } from 'hono';
|
|
23
|
+
* import { HonoMiddleware } from 'ai.matey.http/hono';
|
|
24
|
+
*
|
|
25
|
+
* const app = new Hono();
|
|
26
|
+
* const bridge = new Bridge(frontend, backend);
|
|
27
|
+
*
|
|
28
|
+
* // Add AI chat middleware
|
|
29
|
+
* app.post('/v1/messages', HonoMiddleware(bridge, {
|
|
30
|
+
* cors: true,
|
|
31
|
+
* streaming: true,
|
|
32
|
+
* }));
|
|
33
|
+
*
|
|
34
|
+
* export default app;
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
function HonoMiddleware(bridge, options = {}) {
|
|
38
|
+
// Create core handler with all business logic
|
|
39
|
+
const { cors, ...restOptions } = options;
|
|
40
|
+
const coreHandler = new ai_matey_http_core_1.CoreHTTPHandler({
|
|
41
|
+
bridge,
|
|
42
|
+
cors: cors === false || cors === undefined ? undefined : cors === true ? {} : cors,
|
|
43
|
+
...restOptions, // HTTPListenerOptions types are compatible with CoreHandlerOptions at runtime
|
|
44
|
+
});
|
|
45
|
+
// Return Hono middleware
|
|
46
|
+
return async (c) => {
|
|
47
|
+
try {
|
|
48
|
+
// Parse JSON body if present (but not for OPTIONS requests)
|
|
49
|
+
const contentType = c.req.header('content-type') || '';
|
|
50
|
+
const method = c.req.method;
|
|
51
|
+
if (method !== 'OPTIONS' && contentType.includes('application/json')) {
|
|
52
|
+
try {
|
|
53
|
+
c.body = await c.req.json();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// If JSON parsing fails, leave body as null
|
|
57
|
+
c.body = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Create adapters
|
|
61
|
+
const genericReq = new adapter_js_1.HonoRequestAdapter(c);
|
|
62
|
+
const genericRes = new adapter_js_1.HonoResponseAdapter(c);
|
|
63
|
+
// Handle request through core handler
|
|
64
|
+
await coreHandler.handle(genericReq, genericRes);
|
|
65
|
+
// Return the response set by the adapter
|
|
66
|
+
return c.res || new Response('Internal Server Error', { status: 500 });
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Return error response
|
|
70
|
+
console.error('Hono middleware error:', error);
|
|
71
|
+
return c.json({ error: 'Internal Server Error' }, 500);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/hono/middleware.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAgCH,wCA4CC;AAvED,2DAAqD;AACrD,6CAAuE;AAEvE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,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,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,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,+BAAkB,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,gCAAmB,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,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AI Matey HTTP Adapters
|
|
4
|
+
*
|
|
5
|
+
* Consolidated package containing HTTP framework adapters.
|
|
6
|
+
* Each adapter provides integration with a specific HTTP framework.
|
|
7
|
+
*
|
|
8
|
+
* @module ai.matey.http
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
22
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
// Express adapter
|
|
26
|
+
__exportStar(require("./express/index.js"), exports);
|
|
27
|
+
// Fastify adapter
|
|
28
|
+
__exportStar(require("./fastify/index.js"), exports);
|
|
29
|
+
// Hono adapter
|
|
30
|
+
__exportStar(require("./hono/index.js"), exports);
|
|
31
|
+
// Koa adapter
|
|
32
|
+
__exportStar(require("./koa/index.js"), exports);
|
|
33
|
+
// Node.js native HTTP adapter
|
|
34
|
+
__exportStar(require("./node/index.js"), exports);
|
|
35
|
+
// Deno adapter
|
|
36
|
+
__exportStar(require("./deno/index.js"), exports);
|
|
37
|
+
//# 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,qDAAmC;AAEnC,kBAAkB;AAClB,qDAAmC;AAEnC,eAAe;AACf,kDAAgC;AAEhC,cAAc;AACd,iDAA+B;AAE/B,8BAA8B;AAC9B,kDAAgC;AAEhC,eAAe;AACf,kDAAgC"}
|