@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 CHANGED
@@ -1,18 +1,20 @@
1
- import { BaseEvent } from '@ag-ui/core';
2
- export { AGUI_MEDIA_TYPE } from '@ag-ui/proto';
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
- accept?: string;
6
+ accept?: string;
6
7
  }
7
8
  declare class EventEncoder {
8
- private acceptsProtobuf;
9
- constructor(params?: EventEncoderParams);
10
- getContentType(): string;
11
- encode(event: BaseEvent): string;
12
- encodeSSE(event: BaseEvent): string;
13
- encodeBinary(event: BaseEvent): Uint8Array;
14
- encodeProtobuf(event: BaseEvent): Uint8Array;
15
- private isProtobufAccepted;
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, type EventEncoderParams };
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 '@ag-ui/core';
2
- export { AGUI_MEDIA_TYPE } from '@ag-ui/proto';
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
- accept?: string;
6
+ accept?: string;
6
7
  }
7
8
  declare class EventEncoder {
8
- private acceptsProtobuf;
9
- constructor(params?: EventEncoderParams);
10
- getContentType(): string;
11
- encode(event: BaseEvent): string;
12
- encodeSSE(event: BaseEvent): string;
13
- encodeBinary(event: BaseEvent): Uint8Array;
14
- encodeProtobuf(event: BaseEvent): Uint8Array;
15
- private isProtobufAccepted;
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, type EventEncoderParams };
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
- "use strict";
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
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
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
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
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
- // src/encoder.ts
39
- var proto = __toESM(require("@ag-ui/proto"));
27
+ //#endregion
28
+ let _ag_ui_proto = require("@ag-ui/proto");
29
+ _ag_ui_proto = __toESM(_ag_ui_proto);
40
30
 
41
- // src/media-type.ts
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
- const accepts = parseAccept(accept === void 0 ? "*/*" : accept || "");
44
- if (!provided) {
45
- 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
- }
49
- const priorities = provided.map(function getPriority(type, index) {
50
- return getMediaTypePriority(type, accepts, index);
51
- });
52
- return priorities.filter((spec) => spec.q > 0).sort(compareSpecs).map(function getType(priority) {
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
- var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
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
- const accepts = splitMediaTypes(accept);
59
- const result = [];
60
- for (let i = 0, j = 0; i < accepts.length; i++) {
61
- const mediaType = parseMediaType(accepts[i].trim(), i);
62
- if (mediaType) {
63
- result[j++] = mediaType;
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
- const match = simpleMediaTypeRegExp.exec(str);
70
- if (!match) return null;
71
- const params = /* @__PURE__ */ Object.create(null);
72
- let q = 1;
73
- const subtype = match[2];
74
- const type = match[1];
75
- if (match[3]) {
76
- const kvps = splitParameters(match[3]).map(splitKeyValuePair);
77
- for (let j = 0; j < kvps.length; j++) {
78
- const pair = kvps[j];
79
- const key = pair[0].toLowerCase();
80
- const val = pair[1];
81
- const value = val && val[0] === '"' && val[val.length - 1] === '"' ? val.slice(1, -1) : val;
82
- if (key === "q") {
83
- q = parseFloat(value);
84
- break;
85
- }
86
- params[key] = value;
87
- }
88
- }
89
- return {
90
- type,
91
- subtype,
92
- params,
93
- q,
94
- i
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
- const priority = { o: -1, q: 0, s: 0 };
99
- for (let i = 0; i < accepted.length; i++) {
100
- const spec = specify(type, accepted[i], index);
101
- if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
102
- priority.o = spec.o;
103
- priority.q = spec.q;
104
- priority.s = spec.s;
105
- priority.i = spec.i;
106
- }
107
- }
108
- return priority;
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
- const p = parseMediaType(type, 0);
112
- let s = 0;
113
- if (!p) {
114
- return null;
115
- }
116
- if (spec.type.toLowerCase() == p.type.toLowerCase()) {
117
- s |= 4;
118
- } else if (spec.type != "*") {
119
- return null;
120
- }
121
- if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {
122
- s |= 2;
123
- } else if (spec.subtype != "*") {
124
- return null;
125
- }
126
- const keys = Object.keys(spec.params);
127
- if (keys.length > 0) {
128
- if (keys.every(function(k) {
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
- return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;
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
- return spec.type + "/" + spec.subtype;
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
- let count = 0;
151
- let index = 0;
152
- while ((index = string.indexOf('"', index)) !== -1) {
153
- count++;
154
- index++;
155
- }
156
- return count;
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
- const index = str.indexOf("=");
160
- let key;
161
- let val = "";
162
- if (index === -1) {
163
- key = str;
164
- } else {
165
- key = str.slice(0, index);
166
- val = str.slice(index + 1);
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
- const accepts = accept.split(",");
172
- const result = [accepts[0]];
173
- for (let i = 1, j = 0; i < accepts.length; i++) {
174
- if (quoteCount(result[j]) % 2 == 0) {
175
- result[++j] = accepts[i];
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
- const parameters = str.split(";");
184
- const result = [parameters[0]];
185
- for (let i = 1, j = 0; i < parameters.length; i++) {
186
- if (quoteCount(result[j]) % 2 == 0) {
187
- result[++j] = parameters[i];
188
- } else {
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
- // src/encoder.ts
217
+ //#endregion
218
+ //#region src/encoder.ts
199
219
  var EventEncoder = class {
200
- constructor(params) {
201
- this.acceptsProtobuf = (params == null ? void 0 : params.accept) ? this.isProtobufAccepted(params.accept) : false;
202
- }
203
- getContentType() {
204
- if (this.acceptsProtobuf) {
205
- return proto.AGUI_MEDIA_TYPE;
206
- } else {
207
- return "text/event-stream";
208
- }
209
- }
210
- encode(event) {
211
- return this.encodeSSE(event);
212
- }
213
- encodeSSE(event) {
214
- return `data: ${JSON.stringify(event)}
215
-
216
- `;
217
- }
218
- encodeBinary(event) {
219
- if (this.acceptsProtobuf) {
220
- return this.encodeProtobuf(event);
221
- } else {
222
- const sseString = this.encodeSSE(event);
223
- const encoder = new TextEncoder();
224
- return encoder.encode(sseString);
225
- }
226
- }
227
- encodeProtobuf(event) {
228
- const messageBytes = proto.encode(event);
229
- const length = messageBytes.length;
230
- const buffer = new ArrayBuffer(4 + length);
231
- const dataView = new DataView(buffer);
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
- // src/index.ts
244
- var import_proto = require("@ag-ui/proto");
245
- // Annotate the CommonJS export names for ESM import in node:
246
- 0 && (module.exports = {
247
- AGUI_MEDIA_TYPE,
248
- EventEncoder
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
- // src/media-type.ts
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
- const accepts = parseAccept(accept === void 0 ? "*/*" : accept || "");
7
- if (!provided) {
8
- return accepts.filter((spec) => spec.q > 0).sort((a, b) => {
9
- return b.q - a.q || b.i - a.i || 0;
10
- }).map(getFullType);
11
- }
12
- const priorities = provided.map(function getPriority(type, index) {
13
- return getMediaTypePriority(type, accepts, index);
14
- });
15
- return priorities.filter((spec) => spec.q > 0).sort(compareSpecs).map(function getType(priority) {
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
- var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
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
- const accepts = splitMediaTypes(accept);
22
- const result = [];
23
- for (let i = 0, j = 0; i < accepts.length; i++) {
24
- const mediaType = parseMediaType(accepts[i].trim(), i);
25
- if (mediaType) {
26
- result[j++] = mediaType;
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
- const match = simpleMediaTypeRegExp.exec(str);
33
- if (!match) return null;
34
- const params = /* @__PURE__ */ Object.create(null);
35
- let q = 1;
36
- const subtype = match[2];
37
- const type = match[1];
38
- if (match[3]) {
39
- const kvps = splitParameters(match[3]).map(splitKeyValuePair);
40
- for (let j = 0; j < kvps.length; j++) {
41
- const pair = kvps[j];
42
- const key = pair[0].toLowerCase();
43
- const val = pair[1];
44
- const value = val && val[0] === '"' && val[val.length - 1] === '"' ? val.slice(1, -1) : val;
45
- if (key === "q") {
46
- q = parseFloat(value);
47
- break;
48
- }
49
- params[key] = value;
50
- }
51
- }
52
- return {
53
- type,
54
- subtype,
55
- params,
56
- q,
57
- i
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
- const priority = { o: -1, q: 0, s: 0 };
62
- for (let i = 0; i < accepted.length; i++) {
63
- const spec = specify(type, accepted[i], index);
64
- if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
65
- priority.o = spec.o;
66
- priority.q = spec.q;
67
- priority.s = spec.s;
68
- priority.i = spec.i;
69
- }
70
- }
71
- return priority;
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
- const p = parseMediaType(type, 0);
75
- let s = 0;
76
- if (!p) {
77
- return null;
78
- }
79
- if (spec.type.toLowerCase() == p.type.toLowerCase()) {
80
- s |= 4;
81
- } else if (spec.type != "*") {
82
- return null;
83
- }
84
- if (spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {
85
- s |= 2;
86
- } else if (spec.subtype != "*") {
87
- return null;
88
- }
89
- const keys = Object.keys(spec.params);
90
- if (keys.length > 0) {
91
- if (keys.every(function(k) {
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
- return b.q - a.q || b.s - a.s || (a.o || 0) - (b.o || 0) || (a.i || 0) - (b.i || 0) || 0;
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
- return spec.type + "/" + spec.subtype;
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
- let count = 0;
114
- let index = 0;
115
- while ((index = string.indexOf('"', index)) !== -1) {
116
- count++;
117
- index++;
118
- }
119
- return count;
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
- const index = str.indexOf("=");
123
- let key;
124
- let val = "";
125
- if (index === -1) {
126
- key = str;
127
- } else {
128
- key = str.slice(0, index);
129
- val = str.slice(index + 1);
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
- const accepts = accept.split(",");
135
- const result = [accepts[0]];
136
- for (let i = 1, j = 0; i < accepts.length; i++) {
137
- if (quoteCount(result[j]) % 2 == 0) {
138
- result[++j] = accepts[i];
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
- const parameters = str.split(";");
147
- const result = [parameters[0]];
148
- for (let i = 1, j = 0; i < parameters.length; i++) {
149
- if (quoteCount(result[j]) % 2 == 0) {
150
- result[++j] = parameters[i];
151
- } else {
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
- // src/encoder.ts
190
+ //#endregion
191
+ //#region src/encoder.ts
162
192
  var EventEncoder = class {
163
- constructor(params) {
164
- this.acceptsProtobuf = (params == null ? void 0 : params.accept) ? this.isProtobufAccepted(params.accept) : false;
165
- }
166
- getContentType() {
167
- if (this.acceptsProtobuf) {
168
- return proto.AGUI_MEDIA_TYPE;
169
- } else {
170
- return "text/event-stream";
171
- }
172
- }
173
- encode(event) {
174
- return this.encodeSSE(event);
175
- }
176
- encodeSSE(event) {
177
- return `data: ${JSON.stringify(event)}
178
-
179
- `;
180
- }
181
- encodeBinary(event) {
182
- if (this.acceptsProtobuf) {
183
- return this.encodeProtobuf(event);
184
- } else {
185
- const sseString = this.encodeSSE(event);
186
- const encoder = new TextEncoder();
187
- return encoder.encode(sseString);
188
- }
189
- }
190
- encodeProtobuf(event) {
191
- const messageBytes = proto.encode(event);
192
- const length = messageBytes.length;
193
- const buffer = new ArrayBuffer(4 + length);
194
- const dataView = new DataView(buffer);
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
- // src/index.ts
207
- import { AGUI_MEDIA_TYPE as AGUI_MEDIA_TYPE2 } from "@ag-ui/proto";
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
@@ -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":";AACA,YAAY,WAAW;;;ACchB,SAAS,oBAAoB,QAAiB,UAA+B;AAElF,QAAM,UAAU,YAAY,WAAW,SAAY,QAAQ,UAAU,EAAE;AAEvE,MAAI,CAAC,UAAU;AAEb,WAAO,QACJ,OAAO,CAAC,SAA4B,KAAK,IAAI,CAAC,EAC9C,KAAK,CAAC,GAAG,MAAM;AACd,aAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,IACnC,CAAC,EACA,IAAI,WAAW;AAAA,EACpB;AAEA,QAAM,aAAa,SAAS,IAAI,SAAS,YAAY,MAAc,OAAe;AAChF,WAAO,qBAAqB,MAAM,SAAS,KAAK;AAAA,EAClD,CAAC;AAGD,SAAO,WACJ,OAAO,CAAC,SAA2B,KAAK,IAAI,CAAC,EAC7C,KAAK,YAAY,EACjB,IAAI,SAAS,QAAQ,UAAoB;AACxC,WAAO,SAAS,WAAW,QAAQ,QAAQ,CAAC;AAAA,EAC9C,CAAC;AACL;AAOA,IAAM,wBAAwB;AA6B9B,SAAS,YAAY,QAA6B;AAChD,QAAM,UAAU,gBAAgB,MAAM;AACtC,QAAM,SAAsB,CAAC;AAE7B,WAAS,IAAI,GAAG,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAC9C,UAAM,YAAY,eAAe,QAAQ,CAAC,EAAE,KAAK,GAAG,CAAC;AAErD,QAAI,WAAW;AACb,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,eAAe,KAAa,GAA6B;AAChE,QAAM,QAAQ,sBAAsB,KAAK,GAAG;AAC5C,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAiC,uBAAO,OAAO,IAAI;AACzD,MAAI,IAAI;AACR,QAAM,UAAU,MAAM,CAAC;AACvB,QAAM,OAAO,MAAM,CAAC;AAEpB,MAAI,MAAM,CAAC,GAAG;AACZ,UAAM,OAAO,gBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,iBAAiB;AAE5D,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AACnB,YAAM,MAAM,KAAK,CAAC,EAAE,YAAY;AAChC,YAAM,MAAM,KAAK,CAAC;AAGlB,YAAM,QAAQ,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,IAAI,SAAS,CAAC,MAAM,MAAM,IAAI,MAAM,GAAG,EAAE,IAAI;AAExF,UAAI,QAAQ,KAAK;AACf,YAAI,WAAW,KAAK;AACpB;AAAA,MACF;AAGA,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMA,SAAS,qBAAqB,MAAc,UAAuB,OAAyB;AAC1F,QAAM,WAAqB,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAE/C,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,OAAO,QAAQ,MAAM,SAAS,CAAC,GAAG,KAAK;AAE7C,QAAI,SAAS,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,GAAG;AACnF,eAAS,IAAI,KAAK;AAClB,eAAS,IAAI,KAAK;AAClB,eAAS,IAAI,KAAK;AAClB,eAAS,IAAI,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,QAAQ,MAAc,MAAiB,OAAgC;AAC9E,QAAM,IAAI,eAAe,MAAM,CAAC;AAChC,MAAI,IAAI;AAER,MAAI,CAAC,GAAG;AACN,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,KAAK,YAAY,KAAK,EAAE,KAAK,YAAY,GAAG;AACnD,SAAK;AAAA,EACP,WAAW,KAAK,QAAQ,KAAK;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,QAAQ,YAAY,KAAK,EAAE,QAAQ,YAAY,GAAG;AACzD,SAAK;AAAA,EACP,WAAW,KAAK,WAAW,KAAK;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO,KAAK,KAAK,MAAM;AACpC,MAAI,KAAK,SAAS,GAAG;AACnB,QACE,KAAK,MAAM,SAAU,GAAG;AACtB,aACE,KAAK,OAAO,CAAC,KAAK,QACjB,KAAK,OAAO,CAAC,KAAK,IAAI,YAAY,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,YAAY;AAAA,IAE5E,CAAC,GACD;AACA,WAAK;AAAA,IACP,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,IACR;AAAA,EACF;AACF;AAMA,SAAS,aAAa,GAAa,GAAqB;AACtD,SAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM;AACzF;AAMA,SAAS,YAAY,MAAyB;AAC5C,SAAO,KAAK,OAAO,MAAM,KAAK;AAChC;AAcA,SAAS,WAAW,QAAwB;AAC1C,MAAI,QAAQ;AACZ,MAAI,QAAQ;AAEZ,UAAQ,QAAQ,OAAO,QAAQ,KAAK,KAAK,OAAO,IAAI;AAClD;AACA;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,kBAAkB,KAA+B;AACxD,QAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,MAAI;AACJ,MAAI,MAAc;AAElB,MAAI,UAAU,IAAI;AAChB,UAAM;AAAA,EACR,OAAO;AACL,UAAM,IAAI,MAAM,GAAG,KAAK;AACxB,UAAM,IAAI,MAAM,QAAQ,CAAC;AAAA,EAC3B;AAEA,SAAO,CAAC,KAAK,GAAG;AAClB;AAMA,SAAS,gBAAgB,QAA0B;AACjD,QAAM,UAAU,OAAO,MAAM,GAAG;AAChC,QAAM,SAAmB,CAAC,QAAQ,CAAC,CAAC;AAEpC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAC9C,QAAI,WAAW,OAAO,CAAC,CAAC,IAAI,KAAK,GAAG;AAClC,aAAO,EAAE,CAAC,IAAI,QAAQ,CAAC;AAAA,IACzB,OAAO;AACL,aAAO,CAAC,KAAK,MAAM,QAAQ,CAAC;AAAA,IAC9B;AAAA,EACF;AAGA,SAAO;AACT;AAMA,SAAS,gBAAgB,KAAuB;AAC9C,QAAM,aAAa,IAAI,MAAM,GAAG;AAChC,QAAM,SAAmB,CAAC,WAAW,CAAC,CAAC;AAEvC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACjD,QAAI,WAAW,OAAO,CAAC,CAAC,IAAI,KAAK,GAAG;AAClC,aAAO,EAAE,CAAC,IAAI,WAAW,CAAC;AAAA,IAC5B,OAAO;AACL,aAAO,CAAC,KAAK,MAAM,WAAW,CAAC;AAAA,IACjC;AAAA,EACF;AAGA,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,WAAO,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK;AAAA,EAC7B;AAEA,SAAO;AACT;;;ADxSO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YAAY,QAA6B;AACvC,SAAK,mBAAkB,iCAAQ,UAAS,KAAK,mBAAmB,OAAO,MAAM,IAAI;AAAA,EACnF;AAAA,EAEA,iBAAyB;AACvB,QAAI,KAAK,iBAAiB;AACxB,aAAa;AAAA,IACf,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,OAA0B;AAC/B,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EAEA,UAAU,OAA0B;AAClC,WAAO,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA;AAAA,EACvC;AAAA,EAEA,aAAa,OAA8B;AACzC,QAAI,KAAK,iBAAiB;AACxB,aAAO,KAAK,eAAe,KAAK;AAAA,IAClC,OAAO;AACL,YAAM,YAAY,KAAK,UAAU,KAAK;AAEtC,YAAM,UAAU,IAAI,YAAY;AAChC,aAAO,QAAQ,OAAO,SAAS;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,eAAe,OAA8B;AAC3C,UAAM,eAAqB,aAAO,KAAK;AACvC,UAAM,SAAS,aAAa;AAG5B,UAAM,SAAS,IAAI,YAAY,IAAI,MAAM;AACzC,UAAM,WAAW,IAAI,SAAS,MAAM;AAIpC,aAAS,UAAU,GAAG,QAAQ,KAAK;AAGnC,UAAM,SAAS,IAAI,WAAW,MAAM;AACpC,WAAO,IAAI,cAAc,CAAC;AAE1B,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,cAA+B;AAExD,UAAM,YAAY,oBAAoB,cAAc,CAAO,qBAAe,CAAC;AAG3E,WAAO,UAAU,SAAe,qBAAe;AAAA,EACjD;AACF;;;AEnEA,SAAS,mBAAAA,wBAAuB;","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-alpha.0",
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/core": "0.0.45-alpha.0",
14
- "@ag-ui/proto": "0.0.45-alpha.0"
13
+ "@ag-ui/proto": "0.0.45",
14
+ "@ag-ui/core": "0.0.45"
15
15
  },
16
16
  "devDependencies": {
17
- "@types/jest": "^29.5.12",
18
- "jest": "^29.7.0",
19
- "ts-jest": "^29.1.2",
20
- "tsup": "^8.0.2",
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": "tsup",
25
- "dev": "tsup --watch",
32
+ "build": "tsdown",
33
+ "dev": "tsdown --watch",
26
34
  "lint": "eslint \"src/**/*.ts*\"",
27
- "clean": "rm -rf dist .turbo node_modules",
28
- "test": "jest",
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
  }