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,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 @@
|
|
|
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 @@
|
|
|
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":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACR;IAApB,YAAoB,GAAY;QAAZ,QAAG,GAAH,GAAG,CAAS;IAAG,CAAC;IAEpC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IAClC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IACrD,CAAC;IAED,IAAI,OAAO;QACT,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;YACrC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,IAAI;QACN,kEAAkE;QAClE,OAAQ,IAAI,CAAC,GAAG,CAAC,OAAe,CAAC,IAAI,IAAI,IAAI,CAAC;IAChD,CAAC;IAED,IAAI,MAAM;QACR,yCAAyC;QACzC,OAAQ,IAAI,CAAC,GAAW,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,KAAK;QACP,sCAAsC;QACtC,MAAM,KAAK,GAA2B,EAAE,CAAC;QAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC;IAED,IAAI,EAAE;QACJ,iCAAiC;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAIT;IAHZ,WAAW,GAAW,GAAG,CAAC;IAC1B,YAAY,GAAY,KAAK,CAAC;IAEtC,YAAoB,GAAY;QAAZ,QAAG,GAAH,GAAG,CAAS;IAAG,CAAC;IAEpC,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,KAAa;QAChC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAS;QACZ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,+DAA+D;QAC/D,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAA+C;QAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAE7B,kBAAkB;QAClB,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE5B,qCAAqC;QACrC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;QAEzB,IAAI,CAAC;YACH,gBAAgB;YAChB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;oBACvB,MAAM;gBACR,CAAC;gBACD,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;gBACtB,WAAW,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gEAAgE;YAChE,qBAAqB;YACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;QACR,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -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"}
|