@ag-ui/encoder 0.0.45-alpha.0 → 0.0.45
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/dist/index.d.mts +15 -13
- package/dist/index.d.mts.map +1 -0
- package/dist/index.d.ts +15 -13
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +224 -212
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +200 -183
- package/dist/index.mjs.map +1 -1
- package/package.json +22 -11
package/dist/index.d.mts
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { AGUI_MEDIA_TYPE } from "@ag-ui/proto";
|
|
2
|
+
import { BaseEvent } from "@ag-ui/core";
|
|
3
3
|
|
|
4
|
+
//#region src/encoder.d.ts
|
|
4
5
|
interface EventEncoderParams {
|
|
5
|
-
|
|
6
|
+
accept?: string;
|
|
6
7
|
}
|
|
7
8
|
declare class EventEncoder {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
private acceptsProtobuf;
|
|
10
|
+
constructor(params?: EventEncoderParams);
|
|
11
|
+
getContentType(): string;
|
|
12
|
+
encode(event: BaseEvent): string;
|
|
13
|
+
encodeSSE(event: BaseEvent): string;
|
|
14
|
+
encodeBinary(event: BaseEvent): Uint8Array;
|
|
15
|
+
encodeProtobuf(event: BaseEvent): Uint8Array;
|
|
16
|
+
private isProtobufAccepted;
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
-
export { EventEncoder,
|
|
18
|
+
//#endregion
|
|
19
|
+
export { AGUI_MEDIA_TYPE, EventEncoder, EventEncoderParams };
|
|
20
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/encoder.ts"],"mappings":";;;;UAIiB,kBAAA;EACf,MAAA;AAAA;AAAA,cAGW,YAAA;EAAA,QACH,eAAA;cAEI,MAAA,GAAS,kBAAA;EAIrB,cAAA,CAAA;EAQA,MAAA,CAAO,KAAA,EAAO,SAAA;EAId,SAAA,CAAU,KAAA,EAAO,SAAA;EAIjB,YAAA,CAAa,KAAA,EAAO,SAAA,GAAY,UAAA;EAWhC,cAAA,CAAe,KAAA,EAAO,SAAA,GAAY,UAAA;EAAA,QAmB1B,kBAAA;AAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import { BaseEvent } from
|
|
2
|
-
|
|
1
|
+
import { BaseEvent } from "@ag-ui/core";
|
|
2
|
+
import { AGUI_MEDIA_TYPE } from "@ag-ui/proto";
|
|
3
3
|
|
|
4
|
+
//#region src/encoder.d.ts
|
|
4
5
|
interface EventEncoderParams {
|
|
5
|
-
|
|
6
|
+
accept?: string;
|
|
6
7
|
}
|
|
7
8
|
declare class EventEncoder {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
private acceptsProtobuf;
|
|
10
|
+
constructor(params?: EventEncoderParams);
|
|
11
|
+
getContentType(): string;
|
|
12
|
+
encode(event: BaseEvent): string;
|
|
13
|
+
encodeSSE(event: BaseEvent): string;
|
|
14
|
+
encodeBinary(event: BaseEvent): Uint8Array;
|
|
15
|
+
encodeProtobuf(event: BaseEvent): Uint8Array;
|
|
16
|
+
private isProtobufAccepted;
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
-
export { EventEncoder,
|
|
18
|
+
//#endregion
|
|
19
|
+
export { AGUI_MEDIA_TYPE, EventEncoder, EventEncoderParams };
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/encoder.ts"],"mappings":";;;;UAIiB,kBAAA;EACf,MAAA;AAAA;AAAA,cAGW,YAAA;EAAA,QACH,eAAA;cAEI,MAAA,GAAS,kBAAA;EAIrB,cAAA,CAAA;EAQA,MAAA,CAAO,KAAA,EAAO,SAAA;EAId,SAAA,CAAU,KAAA,EAAO,SAAA;EAIjB,YAAA,CAAa,KAAA,EAAO,SAAA,GAAY,UAAA;EAWhC,cAAA,CAAe,KAAA,EAAO,SAAA,GAAY,UAAA;EAAA,QAmB1B,kBAAA;AAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,250 +1,262 @@
|
|
|
1
|
-
|
|
1
|
+
//#region rolldown:runtime
|
|
2
2
|
var __create = Object.create;
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
8
|
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
19
21
|
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
|
|
30
|
-
// src/index.ts
|
|
31
|
-
var index_exports = {};
|
|
32
|
-
__export(index_exports, {
|
|
33
|
-
AGUI_MEDIA_TYPE: () => import_proto.AGUI_MEDIA_TYPE,
|
|
34
|
-
EventEncoder: () => EventEncoder
|
|
35
|
-
});
|
|
36
|
-
module.exports = __toCommonJS(index_exports);
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
37
26
|
|
|
38
|
-
|
|
39
|
-
|
|
27
|
+
//#endregion
|
|
28
|
+
let _ag_ui_proto = require("@ag-ui/proto");
|
|
29
|
+
_ag_ui_proto = __toESM(_ag_ui_proto);
|
|
40
30
|
|
|
41
|
-
|
|
31
|
+
//#region src/media-type.ts
|
|
32
|
+
/**
|
|
33
|
+
* negotiator
|
|
34
|
+
* Copyright(c) 2012 Isaac Z. Schlueter
|
|
35
|
+
* Copyright(c) 2014 Federico Romero
|
|
36
|
+
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
37
|
+
* MIT Licensed
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* Module exports.
|
|
41
|
+
* @public
|
|
42
|
+
*/
|
|
42
43
|
function preferredMediaTypes(accept, provided) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return provided[priorities.indexOf(priority)];
|
|
54
|
-
});
|
|
44
|
+
const accepts = parseAccept(accept === void 0 ? "*/*" : accept || "");
|
|
45
|
+
if (!provided) return accepts.filter((spec) => spec.q > 0).sort((a, b) => {
|
|
46
|
+
return b.q - a.q || b.i - a.i || 0;
|
|
47
|
+
}).map(getFullType);
|
|
48
|
+
const priorities = provided.map(function getPriority(type, index) {
|
|
49
|
+
return getMediaTypePriority(type, accepts, index);
|
|
50
|
+
});
|
|
51
|
+
return priorities.filter((spec) => spec.q > 0).sort(compareSpecs).map(function getType(priority) {
|
|
52
|
+
return provided[priorities.indexOf(priority)];
|
|
53
|
+
});
|
|
55
54
|
}
|
|
56
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Module variables.
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
const simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
|
|
60
|
+
/**
|
|
61
|
+
* Parse the Accept header.
|
|
62
|
+
* @private
|
|
63
|
+
*/
|
|
57
64
|
function parseAccept(accept) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
return result;
|
|
65
|
+
const accepts = splitMediaTypes(accept);
|
|
66
|
+
const result = [];
|
|
67
|
+
for (let i = 0, j = 0; i < accepts.length; i++) {
|
|
68
|
+
const mediaType = parseMediaType(accepts[i].trim(), i);
|
|
69
|
+
if (mediaType) result[j++] = mediaType;
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
67
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Parse a media type from the Accept header.
|
|
75
|
+
* @private
|
|
76
|
+
*/
|
|
68
77
|
function parseMediaType(str, i) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
78
|
+
const match = simpleMediaTypeRegExp.exec(str);
|
|
79
|
+
if (!match) return null;
|
|
80
|
+
const params = Object.create(null);
|
|
81
|
+
let q = 1;
|
|
82
|
+
const subtype = match[2];
|
|
83
|
+
const type = match[1];
|
|
84
|
+
if (match[3]) {
|
|
85
|
+
const kvps = splitParameters(match[3]).map(splitKeyValuePair);
|
|
86
|
+
for (let j = 0; j < kvps.length; j++) {
|
|
87
|
+
const pair = kvps[j];
|
|
88
|
+
const key = pair[0].toLowerCase();
|
|
89
|
+
const val = pair[1];
|
|
90
|
+
const value = val && val[0] === "\"" && val[val.length - 1] === "\"" ? val.slice(1, -1) : val;
|
|
91
|
+
if (key === "q") {
|
|
92
|
+
q = parseFloat(value);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
params[key] = value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
type,
|
|
100
|
+
subtype,
|
|
101
|
+
params,
|
|
102
|
+
q,
|
|
103
|
+
i
|
|
104
|
+
};
|
|
96
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the priority of a media type.
|
|
108
|
+
* @private
|
|
109
|
+
*/
|
|
97
110
|
function getMediaTypePriority(type, accepted, index) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
111
|
+
const priority = {
|
|
112
|
+
o: -1,
|
|
113
|
+
q: 0,
|
|
114
|
+
s: 0
|
|
115
|
+
};
|
|
116
|
+
for (let i = 0; i < accepted.length; i++) {
|
|
117
|
+
const spec = specify(type, accepted[i], index);
|
|
118
|
+
if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
|
|
119
|
+
priority.o = spec.o;
|
|
120
|
+
priority.q = spec.q;
|
|
121
|
+
priority.s = spec.s;
|
|
122
|
+
priority.i = spec.i;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return priority;
|
|
109
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the specificity of the media type.
|
|
129
|
+
* @private
|
|
130
|
+
*/
|
|
110
131
|
function specify(type, spec, index) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return spec.params[k] == "*" || (spec.params[k] || "").toLowerCase() == (p.params[k] || "").toLowerCase();
|
|
130
|
-
})) {
|
|
131
|
-
s |= 1;
|
|
132
|
-
} else {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
i: index,
|
|
138
|
-
o: spec.i,
|
|
139
|
-
q: spec.q,
|
|
140
|
-
s
|
|
141
|
-
};
|
|
132
|
+
const p = parseMediaType(type, 0);
|
|
133
|
+
let s = 0;
|
|
134
|
+
if (!p) return null;
|
|
135
|
+
if (spec.type.toLowerCase() == p.type.toLowerCase()) s |= 4;
|
|
136
|
+
else if (spec.type != "*") return null;
|
|
137
|
+
if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) s |= 2;
|
|
138
|
+
else if (spec.subtype != "*") return null;
|
|
139
|
+
const keys = Object.keys(spec.params);
|
|
140
|
+
if (keys.length > 0) if (keys.every(function(k) {
|
|
141
|
+
return spec.params[k] == "*" || (spec.params[k] || "").toLowerCase() == (p.params[k] || "").toLowerCase();
|
|
142
|
+
})) s |= 1;
|
|
143
|
+
else return null;
|
|
144
|
+
return {
|
|
145
|
+
i: index,
|
|
146
|
+
o: spec.i,
|
|
147
|
+
q: spec.q,
|
|
148
|
+
s
|
|
149
|
+
};
|
|
142
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Compare two specs.
|
|
153
|
+
* @private
|
|
154
|
+
*/
|
|
143
155
|
function compareSpecs(a, b) {
|
|
144
|
-
|
|
156
|
+
return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;
|
|
145
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Get full type string.
|
|
160
|
+
* @private
|
|
161
|
+
*/
|
|
146
162
|
function getFullType(spec) {
|
|
147
|
-
|
|
163
|
+
return spec.type + "/" + spec.subtype;
|
|
148
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Count the number of quotes in a string.
|
|
167
|
+
* @private
|
|
168
|
+
*/
|
|
149
169
|
function quoteCount(string) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
170
|
+
let count = 0;
|
|
171
|
+
let index = 0;
|
|
172
|
+
while ((index = string.indexOf("\"", index)) !== -1) {
|
|
173
|
+
count++;
|
|
174
|
+
index++;
|
|
175
|
+
}
|
|
176
|
+
return count;
|
|
157
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Split a key value pair.
|
|
180
|
+
* @private
|
|
181
|
+
*/
|
|
158
182
|
function splitKeyValuePair(str) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return [key, val];
|
|
183
|
+
const index = str.indexOf("=");
|
|
184
|
+
let key;
|
|
185
|
+
let val = "";
|
|
186
|
+
if (index === -1) key = str;
|
|
187
|
+
else {
|
|
188
|
+
key = str.slice(0, index);
|
|
189
|
+
val = str.slice(index + 1);
|
|
190
|
+
}
|
|
191
|
+
return [key, val];
|
|
169
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* Split an Accept header into media types.
|
|
195
|
+
* @private
|
|
196
|
+
*/
|
|
170
197
|
function splitMediaTypes(accept) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
} else {
|
|
177
|
-
result[j] += "," + accepts[i];
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return result;
|
|
198
|
+
const accepts = accept.split(",");
|
|
199
|
+
const result = [accepts[0]];
|
|
200
|
+
for (let i = 1, j = 0; i < accepts.length; i++) if (quoteCount(result[j]) % 2 == 0) result[++j] = accepts[i];
|
|
201
|
+
else result[j] += "," + accepts[i];
|
|
202
|
+
return result;
|
|
181
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Split a string of parameters.
|
|
206
|
+
* @private
|
|
207
|
+
*/
|
|
182
208
|
function splitParameters(str) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
result[j] += ";" + parameters[i];
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
for (let i = 0; i < result.length; i++) {
|
|
193
|
-
result[i] = result[i].trim();
|
|
194
|
-
}
|
|
195
|
-
return result;
|
|
209
|
+
const parameters = str.split(";");
|
|
210
|
+
const result = [parameters[0]];
|
|
211
|
+
for (let i = 1, j = 0; i < parameters.length; i++) if (quoteCount(result[j]) % 2 == 0) result[++j] = parameters[i];
|
|
212
|
+
else result[j] += ";" + parameters[i];
|
|
213
|
+
for (let i = 0; i < result.length; i++) result[i] = result[i].trim();
|
|
214
|
+
return result;
|
|
196
215
|
}
|
|
197
216
|
|
|
198
|
-
|
|
217
|
+
//#endregion
|
|
218
|
+
//#region src/encoder.ts
|
|
199
219
|
var EventEncoder = class {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
dataView.setUint32(0, length, false);
|
|
233
|
-
const result = new Uint8Array(buffer);
|
|
234
|
-
result.set(messageBytes, 4);
|
|
235
|
-
return result;
|
|
236
|
-
}
|
|
237
|
-
isProtobufAccepted(acceptHeader) {
|
|
238
|
-
const preferred = preferredMediaTypes(acceptHeader, [proto.AGUI_MEDIA_TYPE]);
|
|
239
|
-
return preferred.includes(proto.AGUI_MEDIA_TYPE);
|
|
240
|
-
}
|
|
220
|
+
constructor(params) {
|
|
221
|
+
this.acceptsProtobuf = params?.accept ? this.isProtobufAccepted(params.accept) : false;
|
|
222
|
+
}
|
|
223
|
+
getContentType() {
|
|
224
|
+
if (this.acceptsProtobuf) return _ag_ui_proto.AGUI_MEDIA_TYPE;
|
|
225
|
+
else return "text/event-stream";
|
|
226
|
+
}
|
|
227
|
+
encode(event) {
|
|
228
|
+
return this.encodeSSE(event);
|
|
229
|
+
}
|
|
230
|
+
encodeSSE(event) {
|
|
231
|
+
return `data: ${JSON.stringify(event)}\n\n`;
|
|
232
|
+
}
|
|
233
|
+
encodeBinary(event) {
|
|
234
|
+
if (this.acceptsProtobuf) return this.encodeProtobuf(event);
|
|
235
|
+
else {
|
|
236
|
+
const sseString = this.encodeSSE(event);
|
|
237
|
+
return new TextEncoder().encode(sseString);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
encodeProtobuf(event) {
|
|
241
|
+
const messageBytes = _ag_ui_proto.encode(event);
|
|
242
|
+
const length = messageBytes.length;
|
|
243
|
+
const buffer = new ArrayBuffer(4 + length);
|
|
244
|
+
new DataView(buffer).setUint32(0, length, false);
|
|
245
|
+
const result = new Uint8Array(buffer);
|
|
246
|
+
result.set(messageBytes, 4);
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
isProtobufAccepted(acceptHeader) {
|
|
250
|
+
return preferredMediaTypes(acceptHeader, [_ag_ui_proto.AGUI_MEDIA_TYPE]).includes(_ag_ui_proto.AGUI_MEDIA_TYPE);
|
|
251
|
+
}
|
|
241
252
|
};
|
|
242
253
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
254
|
+
//#endregion
|
|
255
|
+
Object.defineProperty(exports, 'AGUI_MEDIA_TYPE', {
|
|
256
|
+
enumerable: true,
|
|
257
|
+
get: function () {
|
|
258
|
+
return _ag_ui_proto.AGUI_MEDIA_TYPE;
|
|
259
|
+
}
|
|
249
260
|
});
|
|
261
|
+
exports.EventEncoder = EventEncoder;
|
|
250
262
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/encoder.ts","../src/media-type.ts"],"sourcesContent":["export * from \"./encoder\";\nexport { AGUI_MEDIA_TYPE } from \"@ag-ui/proto\";\n","import { BaseEvent } from \"@ag-ui/core\";\nimport * as proto from \"@ag-ui/proto\";\nimport { preferredMediaTypes } from \"./media-type\";\n\nexport interface EventEncoderParams {\n accept?: string;\n}\n\nexport class EventEncoder {\n private acceptsProtobuf: boolean;\n\n constructor(params?: EventEncoderParams) {\n this.acceptsProtobuf = params?.accept ? this.isProtobufAccepted(params.accept) : false;\n }\n\n getContentType(): string {\n if (this.acceptsProtobuf) {\n return proto.AGUI_MEDIA_TYPE;\n } else {\n return \"text/event-stream\";\n }\n }\n\n encode(event: BaseEvent): string {\n return this.encodeSSE(event);\n }\n\n encodeSSE(event: BaseEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n }\n\n encodeBinary(event: BaseEvent): Uint8Array {\n if (this.acceptsProtobuf) {\n return this.encodeProtobuf(event);\n } else {\n const sseString = this.encodeSSE(event);\n // Convert string to Uint8Array using TextEncoder\n const encoder = new TextEncoder();\n return encoder.encode(sseString);\n }\n }\n\n encodeProtobuf(event: BaseEvent): Uint8Array {\n const messageBytes = proto.encode(event);\n const length = messageBytes.length;\n\n // Create a buffer for 4 bytes (for the uint32 length) plus the message bytes\n const buffer = new ArrayBuffer(4 + length);\n const dataView = new DataView(buffer);\n\n // Write the length as a uint32\n // Set the third parameter to `false` for big-endian or `true` for little-endian\n dataView.setUint32(0, length, false);\n\n // Create a Uint8Array view and copy in the message bytes after the 4-byte header\n const result = new Uint8Array(buffer);\n result.set(messageBytes, 4);\n\n return result;\n }\n\n private isProtobufAccepted(acceptHeader: string): boolean {\n // Pass the Accept header and an array with your media type\n const preferred = preferredMediaTypes(acceptHeader, [proto.AGUI_MEDIA_TYPE]);\n\n // If the returned array includes your media type, it's acceptable\n return preferred.includes(proto.AGUI_MEDIA_TYPE);\n }\n}\n","/**\n * negotiator\n * Copyright(c) 2012 Isaac Z. Schlueter\n * Copyright(c) 2014 Federico Romero\n * Copyright(c) 2014-2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n// modified from https://github.com/jshttp/negotiator/blob/master/lib/mediaType.js\n\n/**\n * Module exports.\n * @public\n */\n\nexport function preferredMediaTypes(accept?: string, provided?: string[]): string[] {\n // RFC 2616 sec 14.2: no header = */*\n const accepts = parseAccept(accept === undefined ? \"*/*\" : accept || \"\");\n\n if (!provided) {\n // sorted list of all types\n return accepts\n .filter((spec): spec is MediaType => spec.q > 0)\n .sort((a, b) => {\n return b.q - a.q || b.i - a.i || 0;\n })\n .map(getFullType);\n }\n\n const priorities = provided.map(function getPriority(type: string, index: number) {\n return getMediaTypePriority(type, accepts, index);\n });\n\n // sorted list of accepted types\n return priorities\n .filter((spec): spec is Priority => spec.q > 0)\n .sort(compareSpecs)\n .map(function getType(priority: Priority) {\n return provided[priorities.indexOf(priority)];\n });\n}\n\n/**\n * Module variables.\n * @private\n */\n\nconst simpleMediaTypeRegExp = /^\\s*([^\\s\\/;]+)\\/([^;\\s]+)\\s*(?:;(.*))?$/;\n\n/**\n * Media type interface\n * @private\n */\ninterface MediaType {\n type: string;\n subtype: string;\n params: Record<string, string>;\n q: number;\n i: number;\n}\n\n/**\n * Priority interface\n * @private\n */\ninterface Priority {\n o: number;\n q: number;\n s: number;\n i?: number;\n}\n\n/**\n * Parse the Accept header.\n * @private\n */\nfunction parseAccept(accept: string): MediaType[] {\n const accepts = splitMediaTypes(accept);\n const result: MediaType[] = [];\n\n for (let i = 0, j = 0; i < accepts.length; i++) {\n const mediaType = parseMediaType(accepts[i].trim(), i);\n\n if (mediaType) {\n result[j++] = mediaType;\n }\n }\n\n return result;\n}\n\n/**\n * Parse a media type from the Accept header.\n * @private\n */\nfunction parseMediaType(str: string, i: number): MediaType | null {\n const match = simpleMediaTypeRegExp.exec(str);\n if (!match) return null;\n\n const params: Record<string, string> = Object.create(null);\n let q = 1;\n const subtype = match[2];\n const type = match[1];\n\n if (match[3]) {\n const kvps = splitParameters(match[3]).map(splitKeyValuePair);\n\n for (let j = 0; j < kvps.length; j++) {\n const pair = kvps[j];\n const key = pair[0].toLowerCase();\n const val = pair[1];\n\n // get the value, unwrapping quotes\n const value = val && val[0] === '\"' && val[val.length - 1] === '\"' ? val.slice(1, -1) : val;\n\n if (key === \"q\") {\n q = parseFloat(value);\n break;\n }\n\n // store parameter\n params[key] = value;\n }\n }\n\n return {\n type: type,\n subtype: subtype,\n params: params,\n q: q,\n i: i,\n };\n}\n\n/**\n * Get the priority of a media type.\n * @private\n */\nfunction getMediaTypePriority(type: string, accepted: MediaType[], index: number): Priority {\n const priority: Priority = { o: -1, q: 0, s: 0 };\n\n for (let i = 0; i < accepted.length; i++) {\n const spec = specify(type, accepted[i], index);\n\n if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {\n priority.o = spec.o;\n priority.q = spec.q;\n priority.s = spec.s;\n priority.i = spec.i;\n }\n }\n\n return priority;\n}\n\n/**\n * Get the specificity of the media type.\n * @private\n */\nfunction specify(type: string, spec: MediaType, index: number): Priority | null {\n const p = parseMediaType(type, 0);\n let s = 0;\n\n if (!p) {\n return null;\n }\n\n if (spec.type.toLowerCase() == p.type.toLowerCase()) {\n s |= 4;\n } else if (spec.type != \"*\") {\n return null;\n }\n\n if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {\n s |= 2;\n } else if (spec.subtype != \"*\") {\n return null;\n }\n\n const keys = Object.keys(spec.params);\n if (keys.length > 0) {\n if (\n keys.every(function (k) {\n return (\n spec.params[k] == \"*\" ||\n (spec.params[k] || \"\").toLowerCase() == (p.params[k] || \"\").toLowerCase()\n );\n })\n ) {\n s |= 1;\n } else {\n return null;\n }\n }\n\n return {\n i: index,\n o: spec.i,\n q: spec.q,\n s: s,\n };\n}\n\n/**\n * Compare two specs.\n * @private\n */\nfunction compareSpecs(a: Priority, b: Priority): number {\n return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;\n}\n\n/**\n * Get full type string.\n * @private\n */\nfunction getFullType(spec: MediaType): string {\n return spec.type + \"/\" + spec.subtype;\n}\n\n/**\n * Check if a spec has any quality.\n * @private\n */\nfunction isQuality(spec: Priority | MediaType): boolean {\n return spec.q > 0;\n}\n\n/**\n * Count the number of quotes in a string.\n * @private\n */\nfunction quoteCount(string: string): number {\n let count = 0;\n let index = 0;\n\n while ((index = string.indexOf('\"', index)) !== -1) {\n count++;\n index++;\n }\n\n return count;\n}\n\n/**\n * Split a key value pair.\n * @private\n */\nfunction splitKeyValuePair(str: string): [string, string] {\n const index = str.indexOf(\"=\");\n let key: string;\n let val: string = \"\";\n\n if (index === -1) {\n key = str;\n } else {\n key = str.slice(0, index);\n val = str.slice(index + 1);\n }\n\n return [key, val];\n}\n\n/**\n * Split an Accept header into media types.\n * @private\n */\nfunction splitMediaTypes(accept: string): string[] {\n const accepts = accept.split(\",\");\n const result: string[] = [accepts[0]];\n\n for (let i = 1, j = 0; i < accepts.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = accepts[i];\n } else {\n result[j] += \",\" + accepts[i];\n }\n }\n\n // trim result\n return result;\n}\n\n/**\n * Split a string of parameters.\n * @private\n */\nfunction splitParameters(str: string): string[] {\n const parameters = str.split(\";\");\n const result: string[] = [parameters[0]];\n\n for (let i = 1, j = 0; i < parameters.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = parameters[i];\n } else {\n result[j] += \";\" + parameters[i];\n }\n }\n\n // trim parameters\n for (let i = 0; i < result.length; i++) {\n result[i] = result[i].trim();\n }\n\n return result;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["proto"],"sources":["../src/media-type.ts","../src/encoder.ts"],"sourcesContent":["/**\n * negotiator\n * Copyright(c) 2012 Isaac Z. Schlueter\n * Copyright(c) 2014 Federico Romero\n * Copyright(c) 2014-2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n// modified from https://github.com/jshttp/negotiator/blob/master/lib/mediaType.js\n\n/**\n * Module exports.\n * @public\n */\n\nexport function preferredMediaTypes(accept?: string, provided?: string[]): string[] {\n // RFC 2616 sec 14.2: no header = */*\n const accepts = parseAccept(accept === undefined ? \"*/*\" : accept || \"\");\n\n if (!provided) {\n // sorted list of all types\n return accepts\n .filter((spec): spec is MediaType => spec.q > 0)\n .sort((a, b) => {\n return b.q - a.q || b.i - a.i || 0;\n })\n .map(getFullType);\n }\n\n const priorities = provided.map(function getPriority(type: string, index: number) {\n return getMediaTypePriority(type, accepts, index);\n });\n\n // sorted list of accepted types\n return priorities\n .filter((spec): spec is Priority => spec.q > 0)\n .sort(compareSpecs)\n .map(function getType(priority: Priority) {\n return provided[priorities.indexOf(priority)];\n });\n}\n\n/**\n * Module variables.\n * @private\n */\n\nconst simpleMediaTypeRegExp = /^\\s*([^\\s\\/;]+)\\/([^;\\s]+)\\s*(?:;(.*))?$/;\n\n/**\n * Media type interface\n * @private\n */\ninterface MediaType {\n type: string;\n subtype: string;\n params: Record<string, string>;\n q: number;\n i: number;\n}\n\n/**\n * Priority interface\n * @private\n */\ninterface Priority {\n o: number;\n q: number;\n s: number;\n i?: number;\n}\n\n/**\n * Parse the Accept header.\n * @private\n */\nfunction parseAccept(accept: string): MediaType[] {\n const accepts = splitMediaTypes(accept);\n const result: MediaType[] = [];\n\n for (let i = 0, j = 0; i < accepts.length; i++) {\n const mediaType = parseMediaType(accepts[i].trim(), i);\n\n if (mediaType) {\n result[j++] = mediaType;\n }\n }\n\n return result;\n}\n\n/**\n * Parse a media type from the Accept header.\n * @private\n */\nfunction parseMediaType(str: string, i: number): MediaType | null {\n const match = simpleMediaTypeRegExp.exec(str);\n if (!match) return null;\n\n const params: Record<string, string> = Object.create(null);\n let q = 1;\n const subtype = match[2];\n const type = match[1];\n\n if (match[3]) {\n const kvps = splitParameters(match[3]).map(splitKeyValuePair);\n\n for (let j = 0; j < kvps.length; j++) {\n const pair = kvps[j];\n const key = pair[0].toLowerCase();\n const val = pair[1];\n\n // get the value, unwrapping quotes\n const value = val && val[0] === '\"' && val[val.length - 1] === '\"' ? val.slice(1, -1) : val;\n\n if (key === \"q\") {\n q = parseFloat(value);\n break;\n }\n\n // store parameter\n params[key] = value;\n }\n }\n\n return {\n type: type,\n subtype: subtype,\n params: params,\n q: q,\n i: i,\n };\n}\n\n/**\n * Get the priority of a media type.\n * @private\n */\nfunction getMediaTypePriority(type: string, accepted: MediaType[], index: number): Priority {\n const priority: Priority = { o: -1, q: 0, s: 0 };\n\n for (let i = 0; i < accepted.length; i++) {\n const spec = specify(type, accepted[i], index);\n\n if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {\n priority.o = spec.o;\n priority.q = spec.q;\n priority.s = spec.s;\n priority.i = spec.i;\n }\n }\n\n return priority;\n}\n\n/**\n * Get the specificity of the media type.\n * @private\n */\nfunction specify(type: string, spec: MediaType, index: number): Priority | null {\n const p = parseMediaType(type, 0);\n let s = 0;\n\n if (!p) {\n return null;\n }\n\n if (spec.type.toLowerCase() == p.type.toLowerCase()) {\n s |= 4;\n } else if (spec.type != \"*\") {\n return null;\n }\n\n if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {\n s |= 2;\n } else if (spec.subtype != \"*\") {\n return null;\n }\n\n const keys = Object.keys(spec.params);\n if (keys.length > 0) {\n if (\n keys.every(function (k) {\n return (\n spec.params[k] == \"*\" ||\n (spec.params[k] || \"\").toLowerCase() == (p.params[k] || \"\").toLowerCase()\n );\n })\n ) {\n s |= 1;\n } else {\n return null;\n }\n }\n\n return {\n i: index,\n o: spec.i,\n q: spec.q,\n s: s,\n };\n}\n\n/**\n * Compare two specs.\n * @private\n */\nfunction compareSpecs(a: Priority, b: Priority): number {\n return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;\n}\n\n/**\n * Get full type string.\n * @private\n */\nfunction getFullType(spec: MediaType): string {\n return spec.type + \"/\" + spec.subtype;\n}\n\n/**\n * Check if a spec has any quality.\n * @private\n */\nfunction isQuality(spec: Priority | MediaType): boolean {\n return spec.q > 0;\n}\n\n/**\n * Count the number of quotes in a string.\n * @private\n */\nfunction quoteCount(string: string): number {\n let count = 0;\n let index = 0;\n\n while ((index = string.indexOf('\"', index)) !== -1) {\n count++;\n index++;\n }\n\n return count;\n}\n\n/**\n * Split a key value pair.\n * @private\n */\nfunction splitKeyValuePair(str: string): [string, string] {\n const index = str.indexOf(\"=\");\n let key: string;\n let val: string = \"\";\n\n if (index === -1) {\n key = str;\n } else {\n key = str.slice(0, index);\n val = str.slice(index + 1);\n }\n\n return [key, val];\n}\n\n/**\n * Split an Accept header into media types.\n * @private\n */\nfunction splitMediaTypes(accept: string): string[] {\n const accepts = accept.split(\",\");\n const result: string[] = [accepts[0]];\n\n for (let i = 1, j = 0; i < accepts.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = accepts[i];\n } else {\n result[j] += \",\" + accepts[i];\n }\n }\n\n // trim result\n return result;\n}\n\n/**\n * Split a string of parameters.\n * @private\n */\nfunction splitParameters(str: string): string[] {\n const parameters = str.split(\";\");\n const result: string[] = [parameters[0]];\n\n for (let i = 1, j = 0; i < parameters.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = parameters[i];\n } else {\n result[j] += \";\" + parameters[i];\n }\n }\n\n // trim parameters\n for (let i = 0; i < result.length; i++) {\n result[i] = result[i].trim();\n }\n\n return result;\n}\n","import { BaseEvent } from \"@ag-ui/core\";\nimport * as proto from \"@ag-ui/proto\";\nimport { preferredMediaTypes } from \"./media-type\";\n\nexport interface EventEncoderParams {\n accept?: string;\n}\n\nexport class EventEncoder {\n private acceptsProtobuf: boolean;\n\n constructor(params?: EventEncoderParams) {\n this.acceptsProtobuf = params?.accept ? this.isProtobufAccepted(params.accept) : false;\n }\n\n getContentType(): string {\n if (this.acceptsProtobuf) {\n return proto.AGUI_MEDIA_TYPE;\n } else {\n return \"text/event-stream\";\n }\n }\n\n encode(event: BaseEvent): string {\n return this.encodeSSE(event);\n }\n\n encodeSSE(event: BaseEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n }\n\n encodeBinary(event: BaseEvent): Uint8Array {\n if (this.acceptsProtobuf) {\n return this.encodeProtobuf(event);\n } else {\n const sseString = this.encodeSSE(event);\n // Convert string to Uint8Array using TextEncoder\n const encoder = new TextEncoder();\n return encoder.encode(sseString);\n }\n }\n\n encodeProtobuf(event: BaseEvent): Uint8Array {\n const messageBytes = proto.encode(event);\n const length = messageBytes.length;\n\n // Create a buffer for 4 bytes (for the uint32 length) plus the message bytes\n const buffer = new ArrayBuffer(4 + length);\n const dataView = new DataView(buffer);\n\n // Write the length as a uint32\n // Set the third parameter to `false` for big-endian or `true` for little-endian\n dataView.setUint32(0, length, false);\n\n // Create a Uint8Array view and copy in the message bytes after the 4-byte header\n const result = new Uint8Array(buffer);\n result.set(messageBytes, 4);\n\n return result;\n }\n\n private isProtobufAccepted(acceptHeader: string): boolean {\n // Pass the Accept header and an array with your media type\n const preferred = preferredMediaTypes(acceptHeader, [proto.AGUI_MEDIA_TYPE]);\n\n // If the returned array includes your media type, it's acceptable\n return preferred.includes(proto.AGUI_MEDIA_TYPE);\n }\n}\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,212 +1,229 @@
|
|
|
1
|
-
// src/encoder.ts
|
|
2
1
|
import * as proto from "@ag-ui/proto";
|
|
2
|
+
import { AGUI_MEDIA_TYPE } from "@ag-ui/proto";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
//#region src/media-type.ts
|
|
5
|
+
/**
|
|
6
|
+
* negotiator
|
|
7
|
+
* Copyright(c) 2012 Isaac Z. Schlueter
|
|
8
|
+
* Copyright(c) 2014 Federico Romero
|
|
9
|
+
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
10
|
+
* MIT Licensed
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Module exports.
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
5
16
|
function preferredMediaTypes(accept, provided) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return provided[priorities.indexOf(priority)];
|
|
17
|
-
});
|
|
17
|
+
const accepts = parseAccept(accept === void 0 ? "*/*" : accept || "");
|
|
18
|
+
if (!provided) return accepts.filter((spec) => spec.q > 0).sort((a, b) => {
|
|
19
|
+
return b.q - a.q || b.i - a.i || 0;
|
|
20
|
+
}).map(getFullType);
|
|
21
|
+
const priorities = provided.map(function getPriority(type, index) {
|
|
22
|
+
return getMediaTypePriority(type, accepts, index);
|
|
23
|
+
});
|
|
24
|
+
return priorities.filter((spec) => spec.q > 0).sort(compareSpecs).map(function getType(priority) {
|
|
25
|
+
return provided[priorities.indexOf(priority)];
|
|
26
|
+
});
|
|
18
27
|
}
|
|
19
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Module variables.
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
const simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
|
|
33
|
+
/**
|
|
34
|
+
* Parse the Accept header.
|
|
35
|
+
* @private
|
|
36
|
+
*/
|
|
20
37
|
function parseAccept(accept) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
return result;
|
|
38
|
+
const accepts = splitMediaTypes(accept);
|
|
39
|
+
const result = [];
|
|
40
|
+
for (let i = 0, j = 0; i < accepts.length; i++) {
|
|
41
|
+
const mediaType = parseMediaType(accepts[i].trim(), i);
|
|
42
|
+
if (mediaType) result[j++] = mediaType;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
30
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a media type from the Accept header.
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
31
50
|
function parseMediaType(str, i) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
const match = simpleMediaTypeRegExp.exec(str);
|
|
52
|
+
if (!match) return null;
|
|
53
|
+
const params = Object.create(null);
|
|
54
|
+
let q = 1;
|
|
55
|
+
const subtype = match[2];
|
|
56
|
+
const type = match[1];
|
|
57
|
+
if (match[3]) {
|
|
58
|
+
const kvps = splitParameters(match[3]).map(splitKeyValuePair);
|
|
59
|
+
for (let j = 0; j < kvps.length; j++) {
|
|
60
|
+
const pair = kvps[j];
|
|
61
|
+
const key = pair[0].toLowerCase();
|
|
62
|
+
const val = pair[1];
|
|
63
|
+
const value = val && val[0] === "\"" && val[val.length - 1] === "\"" ? val.slice(1, -1) : val;
|
|
64
|
+
if (key === "q") {
|
|
65
|
+
q = parseFloat(value);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
params[key] = value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
type,
|
|
73
|
+
subtype,
|
|
74
|
+
params,
|
|
75
|
+
q,
|
|
76
|
+
i
|
|
77
|
+
};
|
|
59
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the priority of a media type.
|
|
81
|
+
* @private
|
|
82
|
+
*/
|
|
60
83
|
function getMediaTypePriority(type, accepted, index) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
84
|
+
const priority = {
|
|
85
|
+
o: -1,
|
|
86
|
+
q: 0,
|
|
87
|
+
s: 0
|
|
88
|
+
};
|
|
89
|
+
for (let i = 0; i < accepted.length; i++) {
|
|
90
|
+
const spec = specify(type, accepted[i], index);
|
|
91
|
+
if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
|
|
92
|
+
priority.o = spec.o;
|
|
93
|
+
priority.q = spec.q;
|
|
94
|
+
priority.s = spec.s;
|
|
95
|
+
priority.i = spec.i;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return priority;
|
|
72
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the specificity of the media type.
|
|
102
|
+
* @private
|
|
103
|
+
*/
|
|
73
104
|
function specify(type, spec, index) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return spec.params[k] == "*" || (spec.params[k] || "").toLowerCase() == (p.params[k] || "").toLowerCase();
|
|
93
|
-
})) {
|
|
94
|
-
s |= 1;
|
|
95
|
-
} else {
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return {
|
|
100
|
-
i: index,
|
|
101
|
-
o: spec.i,
|
|
102
|
-
q: spec.q,
|
|
103
|
-
s
|
|
104
|
-
};
|
|
105
|
+
const p = parseMediaType(type, 0);
|
|
106
|
+
let s = 0;
|
|
107
|
+
if (!p) return null;
|
|
108
|
+
if (spec.type.toLowerCase() == p.type.toLowerCase()) s |= 4;
|
|
109
|
+
else if (spec.type != "*") return null;
|
|
110
|
+
if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) s |= 2;
|
|
111
|
+
else if (spec.subtype != "*") return null;
|
|
112
|
+
const keys = Object.keys(spec.params);
|
|
113
|
+
if (keys.length > 0) if (keys.every(function(k) {
|
|
114
|
+
return spec.params[k] == "*" || (spec.params[k] || "").toLowerCase() == (p.params[k] || "").toLowerCase();
|
|
115
|
+
})) s |= 1;
|
|
116
|
+
else return null;
|
|
117
|
+
return {
|
|
118
|
+
i: index,
|
|
119
|
+
o: spec.i,
|
|
120
|
+
q: spec.q,
|
|
121
|
+
s
|
|
122
|
+
};
|
|
105
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Compare two specs.
|
|
126
|
+
* @private
|
|
127
|
+
*/
|
|
106
128
|
function compareSpecs(a, b) {
|
|
107
|
-
|
|
129
|
+
return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;
|
|
108
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Get full type string.
|
|
133
|
+
* @private
|
|
134
|
+
*/
|
|
109
135
|
function getFullType(spec) {
|
|
110
|
-
|
|
136
|
+
return spec.type + "/" + spec.subtype;
|
|
111
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Count the number of quotes in a string.
|
|
140
|
+
* @private
|
|
141
|
+
*/
|
|
112
142
|
function quoteCount(string) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
143
|
+
let count = 0;
|
|
144
|
+
let index = 0;
|
|
145
|
+
while ((index = string.indexOf("\"", index)) !== -1) {
|
|
146
|
+
count++;
|
|
147
|
+
index++;
|
|
148
|
+
}
|
|
149
|
+
return count;
|
|
120
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Split a key value pair.
|
|
153
|
+
* @private
|
|
154
|
+
*/
|
|
121
155
|
function splitKeyValuePair(str) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
return [key, val];
|
|
156
|
+
const index = str.indexOf("=");
|
|
157
|
+
let key;
|
|
158
|
+
let val = "";
|
|
159
|
+
if (index === -1) key = str;
|
|
160
|
+
else {
|
|
161
|
+
key = str.slice(0, index);
|
|
162
|
+
val = str.slice(index + 1);
|
|
163
|
+
}
|
|
164
|
+
return [key, val];
|
|
132
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Split an Accept header into media types.
|
|
168
|
+
* @private
|
|
169
|
+
*/
|
|
133
170
|
function splitMediaTypes(accept) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
} else {
|
|
140
|
-
result[j] += "," + accepts[i];
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return result;
|
|
171
|
+
const accepts = accept.split(",");
|
|
172
|
+
const result = [accepts[0]];
|
|
173
|
+
for (let i = 1, j = 0; i < accepts.length; i++) if (quoteCount(result[j]) % 2 == 0) result[++j] = accepts[i];
|
|
174
|
+
else result[j] += "," + accepts[i];
|
|
175
|
+
return result;
|
|
144
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Split a string of parameters.
|
|
179
|
+
* @private
|
|
180
|
+
*/
|
|
145
181
|
function splitParameters(str) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
result[j] += ";" + parameters[i];
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
for (let i = 0; i < result.length; i++) {
|
|
156
|
-
result[i] = result[i].trim();
|
|
157
|
-
}
|
|
158
|
-
return result;
|
|
182
|
+
const parameters = str.split(";");
|
|
183
|
+
const result = [parameters[0]];
|
|
184
|
+
for (let i = 1, j = 0; i < parameters.length; i++) if (quoteCount(result[j]) % 2 == 0) result[++j] = parameters[i];
|
|
185
|
+
else result[j] += ";" + parameters[i];
|
|
186
|
+
for (let i = 0; i < result.length; i++) result[i] = result[i].trim();
|
|
187
|
+
return result;
|
|
159
188
|
}
|
|
160
189
|
|
|
161
|
-
|
|
190
|
+
//#endregion
|
|
191
|
+
//#region src/encoder.ts
|
|
162
192
|
var EventEncoder = class {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
dataView.setUint32(0, length, false);
|
|
196
|
-
const result = new Uint8Array(buffer);
|
|
197
|
-
result.set(messageBytes, 4);
|
|
198
|
-
return result;
|
|
199
|
-
}
|
|
200
|
-
isProtobufAccepted(acceptHeader) {
|
|
201
|
-
const preferred = preferredMediaTypes(acceptHeader, [proto.AGUI_MEDIA_TYPE]);
|
|
202
|
-
return preferred.includes(proto.AGUI_MEDIA_TYPE);
|
|
203
|
-
}
|
|
193
|
+
constructor(params) {
|
|
194
|
+
this.acceptsProtobuf = params?.accept ? this.isProtobufAccepted(params.accept) : false;
|
|
195
|
+
}
|
|
196
|
+
getContentType() {
|
|
197
|
+
if (this.acceptsProtobuf) return proto.AGUI_MEDIA_TYPE;
|
|
198
|
+
else return "text/event-stream";
|
|
199
|
+
}
|
|
200
|
+
encode(event) {
|
|
201
|
+
return this.encodeSSE(event);
|
|
202
|
+
}
|
|
203
|
+
encodeSSE(event) {
|
|
204
|
+
return `data: ${JSON.stringify(event)}\n\n`;
|
|
205
|
+
}
|
|
206
|
+
encodeBinary(event) {
|
|
207
|
+
if (this.acceptsProtobuf) return this.encodeProtobuf(event);
|
|
208
|
+
else {
|
|
209
|
+
const sseString = this.encodeSSE(event);
|
|
210
|
+
return new TextEncoder().encode(sseString);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
encodeProtobuf(event) {
|
|
214
|
+
const messageBytes = proto.encode(event);
|
|
215
|
+
const length = messageBytes.length;
|
|
216
|
+
const buffer = new ArrayBuffer(4 + length);
|
|
217
|
+
new DataView(buffer).setUint32(0, length, false);
|
|
218
|
+
const result = new Uint8Array(buffer);
|
|
219
|
+
result.set(messageBytes, 4);
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
isProtobufAccepted(acceptHeader) {
|
|
223
|
+
return preferredMediaTypes(acceptHeader, [proto.AGUI_MEDIA_TYPE]).includes(proto.AGUI_MEDIA_TYPE);
|
|
224
|
+
}
|
|
204
225
|
};
|
|
205
226
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
export {
|
|
209
|
-
AGUI_MEDIA_TYPE2 as AGUI_MEDIA_TYPE,
|
|
210
|
-
EventEncoder
|
|
211
|
-
};
|
|
227
|
+
//#endregion
|
|
228
|
+
export { AGUI_MEDIA_TYPE, EventEncoder };
|
|
212
229
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/encoder.ts","../src/media-type.ts","../src/index.ts"],"sourcesContent":["import { BaseEvent } from \"@ag-ui/core\";\nimport * as proto from \"@ag-ui/proto\";\nimport { preferredMediaTypes } from \"./media-type\";\n\nexport interface EventEncoderParams {\n accept?: string;\n}\n\nexport class EventEncoder {\n private acceptsProtobuf: boolean;\n\n constructor(params?: EventEncoderParams) {\n this.acceptsProtobuf = params?.accept ? this.isProtobufAccepted(params.accept) : false;\n }\n\n getContentType(): string {\n if (this.acceptsProtobuf) {\n return proto.AGUI_MEDIA_TYPE;\n } else {\n return \"text/event-stream\";\n }\n }\n\n encode(event: BaseEvent): string {\n return this.encodeSSE(event);\n }\n\n encodeSSE(event: BaseEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n }\n\n encodeBinary(event: BaseEvent): Uint8Array {\n if (this.acceptsProtobuf) {\n return this.encodeProtobuf(event);\n } else {\n const sseString = this.encodeSSE(event);\n // Convert string to Uint8Array using TextEncoder\n const encoder = new TextEncoder();\n return encoder.encode(sseString);\n }\n }\n\n encodeProtobuf(event: BaseEvent): Uint8Array {\n const messageBytes = proto.encode(event);\n const length = messageBytes.length;\n\n // Create a buffer for 4 bytes (for the uint32 length) plus the message bytes\n const buffer = new ArrayBuffer(4 + length);\n const dataView = new DataView(buffer);\n\n // Write the length as a uint32\n // Set the third parameter to `false` for big-endian or `true` for little-endian\n dataView.setUint32(0, length, false);\n\n // Create a Uint8Array view and copy in the message bytes after the 4-byte header\n const result = new Uint8Array(buffer);\n result.set(messageBytes, 4);\n\n return result;\n }\n\n private isProtobufAccepted(acceptHeader: string): boolean {\n // Pass the Accept header and an array with your media type\n const preferred = preferredMediaTypes(acceptHeader, [proto.AGUI_MEDIA_TYPE]);\n\n // If the returned array includes your media type, it's acceptable\n return preferred.includes(proto.AGUI_MEDIA_TYPE);\n }\n}\n","/**\n * negotiator\n * Copyright(c) 2012 Isaac Z. Schlueter\n * Copyright(c) 2014 Federico Romero\n * Copyright(c) 2014-2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n// modified from https://github.com/jshttp/negotiator/blob/master/lib/mediaType.js\n\n/**\n * Module exports.\n * @public\n */\n\nexport function preferredMediaTypes(accept?: string, provided?: string[]): string[] {\n // RFC 2616 sec 14.2: no header = */*\n const accepts = parseAccept(accept === undefined ? \"*/*\" : accept || \"\");\n\n if (!provided) {\n // sorted list of all types\n return accepts\n .filter((spec): spec is MediaType => spec.q > 0)\n .sort((a, b) => {\n return b.q - a.q || b.i - a.i || 0;\n })\n .map(getFullType);\n }\n\n const priorities = provided.map(function getPriority(type: string, index: number) {\n return getMediaTypePriority(type, accepts, index);\n });\n\n // sorted list of accepted types\n return priorities\n .filter((spec): spec is Priority => spec.q > 0)\n .sort(compareSpecs)\n .map(function getType(priority: Priority) {\n return provided[priorities.indexOf(priority)];\n });\n}\n\n/**\n * Module variables.\n * @private\n */\n\nconst simpleMediaTypeRegExp = /^\\s*([^\\s\\/;]+)\\/([^;\\s]+)\\s*(?:;(.*))?$/;\n\n/**\n * Media type interface\n * @private\n */\ninterface MediaType {\n type: string;\n subtype: string;\n params: Record<string, string>;\n q: number;\n i: number;\n}\n\n/**\n * Priority interface\n * @private\n */\ninterface Priority {\n o: number;\n q: number;\n s: number;\n i?: number;\n}\n\n/**\n * Parse the Accept header.\n * @private\n */\nfunction parseAccept(accept: string): MediaType[] {\n const accepts = splitMediaTypes(accept);\n const result: MediaType[] = [];\n\n for (let i = 0, j = 0; i < accepts.length; i++) {\n const mediaType = parseMediaType(accepts[i].trim(), i);\n\n if (mediaType) {\n result[j++] = mediaType;\n }\n }\n\n return result;\n}\n\n/**\n * Parse a media type from the Accept header.\n * @private\n */\nfunction parseMediaType(str: string, i: number): MediaType | null {\n const match = simpleMediaTypeRegExp.exec(str);\n if (!match) return null;\n\n const params: Record<string, string> = Object.create(null);\n let q = 1;\n const subtype = match[2];\n const type = match[1];\n\n if (match[3]) {\n const kvps = splitParameters(match[3]).map(splitKeyValuePair);\n\n for (let j = 0; j < kvps.length; j++) {\n const pair = kvps[j];\n const key = pair[0].toLowerCase();\n const val = pair[1];\n\n // get the value, unwrapping quotes\n const value = val && val[0] === '\"' && val[val.length - 1] === '\"' ? val.slice(1, -1) : val;\n\n if (key === \"q\") {\n q = parseFloat(value);\n break;\n }\n\n // store parameter\n params[key] = value;\n }\n }\n\n return {\n type: type,\n subtype: subtype,\n params: params,\n q: q,\n i: i,\n };\n}\n\n/**\n * Get the priority of a media type.\n * @private\n */\nfunction getMediaTypePriority(type: string, accepted: MediaType[], index: number): Priority {\n const priority: Priority = { o: -1, q: 0, s: 0 };\n\n for (let i = 0; i < accepted.length; i++) {\n const spec = specify(type, accepted[i], index);\n\n if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {\n priority.o = spec.o;\n priority.q = spec.q;\n priority.s = spec.s;\n priority.i = spec.i;\n }\n }\n\n return priority;\n}\n\n/**\n * Get the specificity of the media type.\n * @private\n */\nfunction specify(type: string, spec: MediaType, index: number): Priority | null {\n const p = parseMediaType(type, 0);\n let s = 0;\n\n if (!p) {\n return null;\n }\n\n if (spec.type.toLowerCase() == p.type.toLowerCase()) {\n s |= 4;\n } else if (spec.type != \"*\") {\n return null;\n }\n\n if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {\n s |= 2;\n } else if (spec.subtype != \"*\") {\n return null;\n }\n\n const keys = Object.keys(spec.params);\n if (keys.length > 0) {\n if (\n keys.every(function (k) {\n return (\n spec.params[k] == \"*\" ||\n (spec.params[k] || \"\").toLowerCase() == (p.params[k] || \"\").toLowerCase()\n );\n })\n ) {\n s |= 1;\n } else {\n return null;\n }\n }\n\n return {\n i: index,\n o: spec.i,\n q: spec.q,\n s: s,\n };\n}\n\n/**\n * Compare two specs.\n * @private\n */\nfunction compareSpecs(a: Priority, b: Priority): number {\n return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;\n}\n\n/**\n * Get full type string.\n * @private\n */\nfunction getFullType(spec: MediaType): string {\n return spec.type + \"/\" + spec.subtype;\n}\n\n/**\n * Check if a spec has any quality.\n * @private\n */\nfunction isQuality(spec: Priority | MediaType): boolean {\n return spec.q > 0;\n}\n\n/**\n * Count the number of quotes in a string.\n * @private\n */\nfunction quoteCount(string: string): number {\n let count = 0;\n let index = 0;\n\n while ((index = string.indexOf('\"', index)) !== -1) {\n count++;\n index++;\n }\n\n return count;\n}\n\n/**\n * Split a key value pair.\n * @private\n */\nfunction splitKeyValuePair(str: string): [string, string] {\n const index = str.indexOf(\"=\");\n let key: string;\n let val: string = \"\";\n\n if (index === -1) {\n key = str;\n } else {\n key = str.slice(0, index);\n val = str.slice(index + 1);\n }\n\n return [key, val];\n}\n\n/**\n * Split an Accept header into media types.\n * @private\n */\nfunction splitMediaTypes(accept: string): string[] {\n const accepts = accept.split(\",\");\n const result: string[] = [accepts[0]];\n\n for (let i = 1, j = 0; i < accepts.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = accepts[i];\n } else {\n result[j] += \",\" + accepts[i];\n }\n }\n\n // trim result\n return result;\n}\n\n/**\n * Split a string of parameters.\n * @private\n */\nfunction splitParameters(str: string): string[] {\n const parameters = str.split(\";\");\n const result: string[] = [parameters[0]];\n\n for (let i = 1, j = 0; i < parameters.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = parameters[i];\n } else {\n result[j] += \";\" + parameters[i];\n }\n }\n\n // trim parameters\n for (let i = 0; i < result.length; i++) {\n result[i] = result[i].trim();\n }\n\n return result;\n}\n","export * from \"./encoder\";\nexport { AGUI_MEDIA_TYPE } from \"@ag-ui/proto\";\n"],"mappings":"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","names":["AGUI_MEDIA_TYPE"]}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/media-type.ts","../src/encoder.ts"],"sourcesContent":["/**\n * negotiator\n * Copyright(c) 2012 Isaac Z. Schlueter\n * Copyright(c) 2014 Federico Romero\n * Copyright(c) 2014-2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n// modified from https://github.com/jshttp/negotiator/blob/master/lib/mediaType.js\n\n/**\n * Module exports.\n * @public\n */\n\nexport function preferredMediaTypes(accept?: string, provided?: string[]): string[] {\n // RFC 2616 sec 14.2: no header = */*\n const accepts = parseAccept(accept === undefined ? \"*/*\" : accept || \"\");\n\n if (!provided) {\n // sorted list of all types\n return accepts\n .filter((spec): spec is MediaType => spec.q > 0)\n .sort((a, b) => {\n return b.q - a.q || b.i - a.i || 0;\n })\n .map(getFullType);\n }\n\n const priorities = provided.map(function getPriority(type: string, index: number) {\n return getMediaTypePriority(type, accepts, index);\n });\n\n // sorted list of accepted types\n return priorities\n .filter((spec): spec is Priority => spec.q > 0)\n .sort(compareSpecs)\n .map(function getType(priority: Priority) {\n return provided[priorities.indexOf(priority)];\n });\n}\n\n/**\n * Module variables.\n * @private\n */\n\nconst simpleMediaTypeRegExp = /^\\s*([^\\s\\/;]+)\\/([^;\\s]+)\\s*(?:;(.*))?$/;\n\n/**\n * Media type interface\n * @private\n */\ninterface MediaType {\n type: string;\n subtype: string;\n params: Record<string, string>;\n q: number;\n i: number;\n}\n\n/**\n * Priority interface\n * @private\n */\ninterface Priority {\n o: number;\n q: number;\n s: number;\n i?: number;\n}\n\n/**\n * Parse the Accept header.\n * @private\n */\nfunction parseAccept(accept: string): MediaType[] {\n const accepts = splitMediaTypes(accept);\n const result: MediaType[] = [];\n\n for (let i = 0, j = 0; i < accepts.length; i++) {\n const mediaType = parseMediaType(accepts[i].trim(), i);\n\n if (mediaType) {\n result[j++] = mediaType;\n }\n }\n\n return result;\n}\n\n/**\n * Parse a media type from the Accept header.\n * @private\n */\nfunction parseMediaType(str: string, i: number): MediaType | null {\n const match = simpleMediaTypeRegExp.exec(str);\n if (!match) return null;\n\n const params: Record<string, string> = Object.create(null);\n let q = 1;\n const subtype = match[2];\n const type = match[1];\n\n if (match[3]) {\n const kvps = splitParameters(match[3]).map(splitKeyValuePair);\n\n for (let j = 0; j < kvps.length; j++) {\n const pair = kvps[j];\n const key = pair[0].toLowerCase();\n const val = pair[1];\n\n // get the value, unwrapping quotes\n const value = val && val[0] === '\"' && val[val.length - 1] === '\"' ? val.slice(1, -1) : val;\n\n if (key === \"q\") {\n q = parseFloat(value);\n break;\n }\n\n // store parameter\n params[key] = value;\n }\n }\n\n return {\n type: type,\n subtype: subtype,\n params: params,\n q: q,\n i: i,\n };\n}\n\n/**\n * Get the priority of a media type.\n * @private\n */\nfunction getMediaTypePriority(type: string, accepted: MediaType[], index: number): Priority {\n const priority: Priority = { o: -1, q: 0, s: 0 };\n\n for (let i = 0; i < accepted.length; i++) {\n const spec = specify(type, accepted[i], index);\n\n if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {\n priority.o = spec.o;\n priority.q = spec.q;\n priority.s = spec.s;\n priority.i = spec.i;\n }\n }\n\n return priority;\n}\n\n/**\n * Get the specificity of the media type.\n * @private\n */\nfunction specify(type: string, spec: MediaType, index: number): Priority | null {\n const p = parseMediaType(type, 0);\n let s = 0;\n\n if (!p) {\n return null;\n }\n\n if (spec.type.toLowerCase() == p.type.toLowerCase()) {\n s |= 4;\n } else if (spec.type != \"*\") {\n return null;\n }\n\n if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {\n s |= 2;\n } else if (spec.subtype != \"*\") {\n return null;\n }\n\n const keys = Object.keys(spec.params);\n if (keys.length > 0) {\n if (\n keys.every(function (k) {\n return (\n spec.params[k] == \"*\" ||\n (spec.params[k] || \"\").toLowerCase() == (p.params[k] || \"\").toLowerCase()\n );\n })\n ) {\n s |= 1;\n } else {\n return null;\n }\n }\n\n return {\n i: index,\n o: spec.i,\n q: spec.q,\n s: s,\n };\n}\n\n/**\n * Compare two specs.\n * @private\n */\nfunction compareSpecs(a: Priority, b: Priority): number {\n return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;\n}\n\n/**\n * Get full type string.\n * @private\n */\nfunction getFullType(spec: MediaType): string {\n return spec.type + \"/\" + spec.subtype;\n}\n\n/**\n * Check if a spec has any quality.\n * @private\n */\nfunction isQuality(spec: Priority | MediaType): boolean {\n return spec.q > 0;\n}\n\n/**\n * Count the number of quotes in a string.\n * @private\n */\nfunction quoteCount(string: string): number {\n let count = 0;\n let index = 0;\n\n while ((index = string.indexOf('\"', index)) !== -1) {\n count++;\n index++;\n }\n\n return count;\n}\n\n/**\n * Split a key value pair.\n * @private\n */\nfunction splitKeyValuePair(str: string): [string, string] {\n const index = str.indexOf(\"=\");\n let key: string;\n let val: string = \"\";\n\n if (index === -1) {\n key = str;\n } else {\n key = str.slice(0, index);\n val = str.slice(index + 1);\n }\n\n return [key, val];\n}\n\n/**\n * Split an Accept header into media types.\n * @private\n */\nfunction splitMediaTypes(accept: string): string[] {\n const accepts = accept.split(\",\");\n const result: string[] = [accepts[0]];\n\n for (let i = 1, j = 0; i < accepts.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = accepts[i];\n } else {\n result[j] += \",\" + accepts[i];\n }\n }\n\n // trim result\n return result;\n}\n\n/**\n * Split a string of parameters.\n * @private\n */\nfunction splitParameters(str: string): string[] {\n const parameters = str.split(\";\");\n const result: string[] = [parameters[0]];\n\n for (let i = 1, j = 0; i < parameters.length; i++) {\n if (quoteCount(result[j]) % 2 == 0) {\n result[++j] = parameters[i];\n } else {\n result[j] += \";\" + parameters[i];\n }\n }\n\n // trim parameters\n for (let i = 0; i < result.length; i++) {\n result[i] = result[i].trim();\n }\n\n return result;\n}\n","import { BaseEvent } from \"@ag-ui/core\";\nimport * as proto from \"@ag-ui/proto\";\nimport { preferredMediaTypes } from \"./media-type\";\n\nexport interface EventEncoderParams {\n accept?: string;\n}\n\nexport class EventEncoder {\n private acceptsProtobuf: boolean;\n\n constructor(params?: EventEncoderParams) {\n this.acceptsProtobuf = params?.accept ? this.isProtobufAccepted(params.accept) : false;\n }\n\n getContentType(): string {\n if (this.acceptsProtobuf) {\n return proto.AGUI_MEDIA_TYPE;\n } else {\n return \"text/event-stream\";\n }\n }\n\n encode(event: BaseEvent): string {\n return this.encodeSSE(event);\n }\n\n encodeSSE(event: BaseEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n }\n\n encodeBinary(event: BaseEvent): Uint8Array {\n if (this.acceptsProtobuf) {\n return this.encodeProtobuf(event);\n } else {\n const sseString = this.encodeSSE(event);\n // Convert string to Uint8Array using TextEncoder\n const encoder = new TextEncoder();\n return encoder.encode(sseString);\n }\n }\n\n encodeProtobuf(event: BaseEvent): Uint8Array {\n const messageBytes = proto.encode(event);\n const length = messageBytes.length;\n\n // Create a buffer for 4 bytes (for the uint32 length) plus the message bytes\n const buffer = new ArrayBuffer(4 + length);\n const dataView = new DataView(buffer);\n\n // Write the length as a uint32\n // Set the third parameter to `false` for big-endian or `true` for little-endian\n dataView.setUint32(0, length, false);\n\n // Create a Uint8Array view and copy in the message bytes after the 4-byte header\n const result = new Uint8Array(buffer);\n result.set(messageBytes, 4);\n\n return result;\n }\n\n private isProtobufAccepted(acceptHeader: string): boolean {\n // Pass the Accept header and an array with your media type\n const preferred = preferredMediaTypes(acceptHeader, [proto.AGUI_MEDIA_TYPE]);\n\n // If the returned array includes your media type, it's acceptable\n return preferred.includes(proto.AGUI_MEDIA_TYPE);\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ag-ui/encoder",
|
|
3
3
|
"author": "Markus Ecker <markus.ecker@gmail.com>",
|
|
4
|
-
"version": "0.0.45
|
|
4
|
+
"version": "0.0.45",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -10,22 +10,33 @@
|
|
|
10
10
|
"module": "./dist/index.mjs",
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@ag-ui/
|
|
14
|
-
"@ag-ui/
|
|
13
|
+
"@ag-ui/proto": "0.0.45",
|
|
14
|
+
"@ag-ui/core": "0.0.45"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
17
|
+
"@vitest/coverage-istanbul": "^4.0.18",
|
|
18
|
+
"publint": "^0.3.12",
|
|
19
|
+
"@arethetypeswrong/cli": "^0.17.4",
|
|
20
|
+
"vitest": "^4.0.18",
|
|
21
|
+
"tsdown": "^0.20.1",
|
|
21
22
|
"typescript": "^5.8.2"
|
|
22
23
|
},
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"require": "./dist/index.js",
|
|
27
|
+
"import": "./dist/index.mjs"
|
|
28
|
+
},
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
23
31
|
"scripts": {
|
|
24
|
-
"build": "
|
|
25
|
-
"dev": "
|
|
32
|
+
"build": "tsdown",
|
|
33
|
+
"dev": "tsdown --watch",
|
|
26
34
|
"lint": "eslint \"src/**/*.ts*\"",
|
|
27
|
-
"clean": "
|
|
28
|
-
"test": "
|
|
35
|
+
"clean": "git clean -fdX --exclude=\"!.env\"",
|
|
36
|
+
"test": "vitest run",
|
|
37
|
+
"test:coverage": "vitest run --coverage",
|
|
38
|
+
"test:watch": "vitest",
|
|
39
|
+
"test:exports": "publint --strict && attw --pack",
|
|
29
40
|
"link:global": "pnpm link --global",
|
|
30
41
|
"unlink:global": "pnpm unlink --global"
|
|
31
42
|
}
|