@mohanscodex/spectra-ai 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +189 -0
- package/dist/__tests__/e2e.test.d.ts +2 -0
- package/dist/__tests__/e2e.test.d.ts.map +1 -0
- package/dist/__tests__/e2e.test.js +364 -0
- package/dist/__tests__/e2e.test.js.map +1 -0
- package/dist/__tests__/event-stream.test.d.ts +2 -0
- package/dist/__tests__/event-stream.test.d.ts.map +1 -0
- package/dist/__tests__/event-stream.test.js +87 -0
- package/dist/__tests__/event-stream.test.js.map +1 -0
- package/dist/__tests__/provider.test.d.ts +2 -0
- package/dist/__tests__/provider.test.d.ts.map +1 -0
- package/dist/__tests__/provider.test.js +40 -0
- package/dist/__tests__/provider.test.js.map +1 -0
- package/dist/event-stream.d.ts +19 -0
- package/dist/event-stream.d.ts.map +1 -0
- package/dist/event-stream.js +74 -0
- package/dist/event-stream.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +6 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +16480 -0
- package/dist/models.js.map +1 -0
- package/dist/providers/anthropic.d.ts +8 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +279 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/groq.d.ts +16 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +196 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/openai-completions.d.ts +17 -0
- package/dist/providers/openai-completions.d.ts.map +1 -0
- package/dist/providers/openai-completions.js +319 -0
- package/dist/providers/openai-completions.js.map +1 -0
- package/dist/providers/openai-responses.d.ts +12 -0
- package/dist/providers/openai-responses.d.ts.map +1 -0
- package/dist/providers/openai-responses.js +335 -0
- package/dist/providers/openai-responses.js.map +1 -0
- package/dist/providers/openrouter.d.ts +12 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +42 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/register-builtins.d.ts +2 -0
- package/dist/providers/register-builtins.d.ts.map +1 -0
- package/dist/providers/register-builtins.js +41 -0
- package/dist/providers/register-builtins.js.map +1 -0
- package/dist/providers/shared.d.ts +3 -0
- package/dist/providers/shared.d.ts.map +1 -0
- package/dist/providers/shared.js +12 -0
- package/dist/providers/shared.js.map +1 -0
- package/dist/registry.d.ts +19 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +28 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# @singularity-ai/spectra-ai
|
|
2
|
+
|
|
3
|
+
**LLM provider abstraction layer with real-time streaming.**
|
|
4
|
+
|
|
5
|
+
A registry-based system for interacting with multiple LLM providers through a unified streaming interface. Built-in providers for Anthropic, OpenAI (Chat Completions + Responses API), Groq, and OpenRouter — all streaming SSE by default.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Streaming-first** — Every provider streams SSE events. No polling, no buffering.
|
|
10
|
+
- **Provider registry** — Register, resolve, and swap providers at runtime. Extensible for custom implementations.
|
|
11
|
+
- **Typed events** — Fine-grained delta events (`text_delta`, `thinking_delta`, `toolcall_delta`) for real-time UI updates.
|
|
12
|
+
- **Abort support** — Pass an `AbortSignal` to cancel in-flight requests.
|
|
13
|
+
- **Zero SD KB at rest** — SDK is size-zero until streamed; no pre-bundled provider payloads.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
bun add @singularity-ai/spectra-ai
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { stream, complete, initProviders } from "@singularity-ai/spectra-ai";
|
|
25
|
+
|
|
26
|
+
// Registers anthropic, openai-completions, openai-responses, groq, openrouter
|
|
27
|
+
initProviders();
|
|
28
|
+
|
|
29
|
+
const model = {
|
|
30
|
+
id: "claude-sonnet-4-20250514",
|
|
31
|
+
name: "Claude Sonnet 4",
|
|
32
|
+
provider: "anthropic",
|
|
33
|
+
api: "anthropic-messages",
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Stream events as they arrive
|
|
37
|
+
const eventStream = stream(model, {
|
|
38
|
+
systemPrompt: "You are a helpful assistant.",
|
|
39
|
+
messages: [{ role: "user", content: "Hello!", timestamp: Date.now() }],
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
for await (const event of eventStream) {
|
|
43
|
+
if (event.type === "text_delta") process.stdout.write(event.delta);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Or accumulate into a complete message
|
|
47
|
+
const msg = await complete(model, {
|
|
48
|
+
systemPrompt: "You are a helpful assistant.",
|
|
49
|
+
messages: [{ role: "user", content: "Tell me a joke.", timestamp: Date.now() }],
|
|
50
|
+
});
|
|
51
|
+
console.log(msg.content);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Architecture
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
┌─────────────────────────┐
|
|
58
|
+
│ Provider Registry │
|
|
59
|
+
│ (Map<string, Provider>) │
|
|
60
|
+
└──────┬──────────────────┘
|
|
61
|
+
│ resolve by model.provider
|
|
62
|
+
┌────────────┼────────────┬───────────────┐
|
|
63
|
+
▼ ▼ ▼ ▼
|
|
64
|
+
┌──────────┐ ┌────────────┐ ┌──────────┐ ┌──────────┐
|
|
65
|
+
│anthropic │ │openai- │ │openai- │ │ groq / │
|
|
66
|
+
│ │ │completions │ │responses │ │openrouter│
|
|
67
|
+
└──────────┘ └────────────┘ └──────────┘ └──────────┘
|
|
68
|
+
│ │ │ │
|
|
69
|
+
▼ ▼ ▼ ▼
|
|
70
|
+
┌──────────────────────────────────────────────────┐
|
|
71
|
+
│ AssistantMessageEventStream │
|
|
72
|
+
│ (AsyncIterable<AssistantMessageEvent>) │
|
|
73
|
+
└──────────────────────────────────────────────────┘
|
|
74
|
+
│
|
|
75
|
+
consume via
|
|
76
|
+
for await...of
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Built-in Providers
|
|
80
|
+
|
|
81
|
+
| Provider name | API | Environment variable |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `anthropic` | Anthropic Messages API | `ANTHROPIC_API_KEY` |
|
|
84
|
+
| `openai-completions` | OpenAI Chat Completions | `OPENAI_API_KEY` |
|
|
85
|
+
| `openai-responses` | OpenAI Responses API | `OPENAI_API_KEY` |
|
|
86
|
+
| `groq` | Groq (OpenAI-compatible) | `GROQ_API_KEY` |
|
|
87
|
+
| `openrouter` | OpenRouter (OpenAI-compatible) | `OPENROUTER_API_KEY` |
|
|
88
|
+
|
|
89
|
+
## API
|
|
90
|
+
|
|
91
|
+
### `stream(model, context, options?)`
|
|
92
|
+
|
|
93
|
+
Returns an `AssistantMessageEventStream` — an `AsyncIterable` that yields `AssistantMessageEvent` deltas.
|
|
94
|
+
|
|
95
|
+
### `complete(model, context, options?)`
|
|
96
|
+
|
|
97
|
+
Convenience wrapper. Returns a `Promise<AssistantMessage>` — accumulates the stream into the final message.
|
|
98
|
+
|
|
99
|
+
### `registerProvider(provider)`
|
|
100
|
+
|
|
101
|
+
Register a custom provider:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
import { registerProvider } from "@singularity-ai/spectra-ai";
|
|
105
|
+
|
|
106
|
+
registerProvider({
|
|
107
|
+
name: "my-provider",
|
|
108
|
+
stream: (model, context, options) => {
|
|
109
|
+
// Return an AssistantMessageEventStream
|
|
110
|
+
const stream = new AssistantMessageEventStream();
|
|
111
|
+
// ... push events ...
|
|
112
|
+
return stream;
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### `initProviders()`
|
|
118
|
+
|
|
119
|
+
Registers all built-in providers. Called automatically on import — safe to call multiple times (idempotent).
|
|
120
|
+
|
|
121
|
+
## Event Types
|
|
122
|
+
|
|
123
|
+
Each `AssistantMessageEvent` is a discriminated union:
|
|
124
|
+
|
|
125
|
+
| Event | Payload |
|
|
126
|
+
|---|---|
|
|
127
|
+
| `start` | Initial `partial: AssistantMessage` |
|
|
128
|
+
| `text_start` / `text_delta` / `text_end` | Text content delta |
|
|
129
|
+
| `thinking_start` / `thinking_delta` / `thinking_end` | Reasoning/thinking content delta |
|
|
130
|
+
| `toolcall_start` / `toolcall_delta` / `toolcall_end` | Tool call argument delta |
|
|
131
|
+
| `done` | Final `message: AssistantMessage` with `stopReason` |
|
|
132
|
+
| `error` | Error with `error: AssistantMessage` containing `errorMessage` |
|
|
133
|
+
|
|
134
|
+
## Key Types
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
interface Model {
|
|
138
|
+
id: string; // e.g. "gpt-4o"
|
|
139
|
+
name: string; // display name
|
|
140
|
+
provider: string; // registered provider name
|
|
141
|
+
api: string; // API variant
|
|
142
|
+
baseUrl?: string; // custom base URL
|
|
143
|
+
reasoning?: boolean; // enable reasoning features
|
|
144
|
+
maxTokens?: number;
|
|
145
|
+
headers?: Record<string, string>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
interface Context {
|
|
149
|
+
systemPrompt?: string;
|
|
150
|
+
messages: Message[];
|
|
151
|
+
tools?: Tool[];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
interface StreamOptions {
|
|
155
|
+
signal?: AbortSignal;
|
|
156
|
+
apiKey?: string;
|
|
157
|
+
headers?: Record<string, string>;
|
|
158
|
+
maxTokens?: number;
|
|
159
|
+
temperature?: number;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Message Types
|
|
164
|
+
|
|
165
|
+
- `UserMessage` — role `"user"`, content is a string or array of `TextContent | ImageContent` blocks
|
|
166
|
+
- `AssistantMessage` — role `"assistant"`, content is `(TextContent | ThinkingContent | ToolCall)[]`, includes `usage`, `stopReason`, `provider`, `model`, `responseId`, `errorMessage`
|
|
167
|
+
- `ToolResultMessage` — role `"toolResult"`, maps tool call results back to the model
|
|
168
|
+
|
|
169
|
+
## Usage
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
import { complete } from "@singularity-ai/spectra-ai";
|
|
173
|
+
|
|
174
|
+
const msg = await complete(
|
|
175
|
+
{ id: "gpt-4o", name: "GPT-4o", provider: "openai-completions", api: "openai" },
|
|
176
|
+
{
|
|
177
|
+
systemPrompt: "You are a mathematician.",
|
|
178
|
+
messages: [
|
|
179
|
+
{ role: "user", content: "What is 2+2?", timestamp: Date.now() },
|
|
180
|
+
],
|
|
181
|
+
tools: [{ name: "calculate", description: "Calculate", parameters: { type: "object", properties: { expr: { type: "string" } }, required: ["expr"] } }],
|
|
182
|
+
},
|
|
183
|
+
{ apiKey: process.env.OPENAI_API_KEY }
|
|
184
|
+
);
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## License
|
|
188
|
+
|
|
189
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/e2e.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { EventStream, AssistantMessageEventStream } from "../event-stream.js";
|
|
3
|
+
import { registerProvider, getProvider, stream, complete } from "../registry.js";
|
|
4
|
+
// Mock provider for testing (following pi-mono's provider pattern)
|
|
5
|
+
function createMockProvider(name, responseEvents) {
|
|
6
|
+
return {
|
|
7
|
+
name,
|
|
8
|
+
stream(model, context) {
|
|
9
|
+
const stream = new AssistantMessageEventStream();
|
|
10
|
+
// Simulate async streaming (pi-mono pattern: push events, then end)
|
|
11
|
+
setTimeout(() => {
|
|
12
|
+
for (const event of responseEvents) {
|
|
13
|
+
stream.push(event);
|
|
14
|
+
}
|
|
15
|
+
stream.end();
|
|
16
|
+
}, 10);
|
|
17
|
+
return stream;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Helper to create a complete assistant message
|
|
22
|
+
function createAssistantMessage(text, stopReason = "stop") {
|
|
23
|
+
return {
|
|
24
|
+
role: "assistant",
|
|
25
|
+
content: [{ type: "text", text }],
|
|
26
|
+
provider: "test",
|
|
27
|
+
model: "test-model",
|
|
28
|
+
usage: { input: 10, output: 20, cacheRead: 0, cacheWrite: 0, totalTokens: 30 },
|
|
29
|
+
stopReason,
|
|
30
|
+
timestamp: Date.now(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
describe("EventStream (pi-mono pattern)", () => {
|
|
34
|
+
it("should implement AsyncIterable interface", async () => {
|
|
35
|
+
const stream = new EventStream((e) => e === "end", (e) => e);
|
|
36
|
+
// Verify it's async iterable (pi-mono core pattern)
|
|
37
|
+
expect(typeof stream[Symbol.asyncIterator]).toBe("function");
|
|
38
|
+
});
|
|
39
|
+
it("should stream events in order (pi-mono push pattern)", async () => {
|
|
40
|
+
const stream = new EventStream((e) => e === "end", (e) => e);
|
|
41
|
+
stream.push("first");
|
|
42
|
+
stream.push("second");
|
|
43
|
+
stream.push("third");
|
|
44
|
+
stream.push("end");
|
|
45
|
+
const events = [];
|
|
46
|
+
for await (const event of stream) {
|
|
47
|
+
events.push(event);
|
|
48
|
+
}
|
|
49
|
+
expect(events).toEqual(["first", "second", "third", "end"]);
|
|
50
|
+
});
|
|
51
|
+
it("should resolve result after completion", async () => {
|
|
52
|
+
const stream = new EventStream((e) => e === "done", (e) => e === "done" ? 42 : 0);
|
|
53
|
+
stream.push("working");
|
|
54
|
+
stream.push("done");
|
|
55
|
+
stream.end();
|
|
56
|
+
const result = await stream.result();
|
|
57
|
+
expect(result).toBe(42);
|
|
58
|
+
});
|
|
59
|
+
it("should handle single consumer pattern (pi-mono design)", async () => {
|
|
60
|
+
const stream = new EventStream((e) => e === "end", (e) => e);
|
|
61
|
+
stream.push("event1");
|
|
62
|
+
stream.push("event2");
|
|
63
|
+
stream.push("end");
|
|
64
|
+
const events = [];
|
|
65
|
+
for await (const e of stream) {
|
|
66
|
+
events.push(e);
|
|
67
|
+
}
|
|
68
|
+
expect(events).toEqual(["event1", "event2", "end"]);
|
|
69
|
+
// Note: EventStream is single-consumer by design (pi-mono pattern)
|
|
70
|
+
// Multiple consumers would require a broadcast mechanism
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("AssistantMessageEventStream (pi-mono pattern)", () => {
|
|
74
|
+
it("should emit start, delta, and done events", async () => {
|
|
75
|
+
const stream = new AssistantMessageEventStream();
|
|
76
|
+
const partial = createAssistantMessage("");
|
|
77
|
+
stream.push({ type: "start", partial });
|
|
78
|
+
stream.push({ type: "text_start", contentIndex: 0, partial });
|
|
79
|
+
stream.push({ type: "text_delta", contentIndex: 0, delta: "Hello", partial });
|
|
80
|
+
stream.push({ type: "text_delta", contentIndex: 0, delta: " World", partial });
|
|
81
|
+
stream.push({ type: "text_end", contentIndex: 0, content: "Hello World", partial });
|
|
82
|
+
stream.push({
|
|
83
|
+
type: "done",
|
|
84
|
+
reason: "stop",
|
|
85
|
+
message: createAssistantMessage("Hello World"),
|
|
86
|
+
});
|
|
87
|
+
stream.end();
|
|
88
|
+
const events = [];
|
|
89
|
+
for await (const event of stream) {
|
|
90
|
+
events.push(event);
|
|
91
|
+
}
|
|
92
|
+
expect(events).toHaveLength(6);
|
|
93
|
+
expect(events[0].type).toBe("start");
|
|
94
|
+
expect(events[1].type).toBe("text_start");
|
|
95
|
+
expect(events[2].type).toBe("text_delta");
|
|
96
|
+
expect(events[5].type).toBe("done");
|
|
97
|
+
});
|
|
98
|
+
it("should resolve to final AssistantMessage", async () => {
|
|
99
|
+
const stream = new AssistantMessageEventStream();
|
|
100
|
+
const finalMessage = createAssistantMessage("Final result");
|
|
101
|
+
stream.push({ type: "start", partial: createAssistantMessage("") });
|
|
102
|
+
stream.push({ type: "done", reason: "stop", message: finalMessage });
|
|
103
|
+
stream.end();
|
|
104
|
+
const result = await stream.result();
|
|
105
|
+
expect(result.content[0]).toEqual({ type: "text", text: "Final result" });
|
|
106
|
+
expect(result.stopReason).toBe("stop");
|
|
107
|
+
});
|
|
108
|
+
it("should handle error events", async () => {
|
|
109
|
+
const stream = new AssistantMessageEventStream();
|
|
110
|
+
const errorMessage = createAssistantMessage("");
|
|
111
|
+
errorMessage.stopReason = "error";
|
|
112
|
+
errorMessage.errorMessage = "Something went wrong";
|
|
113
|
+
stream.push({ type: "error", reason: "error", error: errorMessage });
|
|
114
|
+
stream.end();
|
|
115
|
+
const result = await stream.result();
|
|
116
|
+
expect(result.stopReason).toBe("error");
|
|
117
|
+
expect(result.errorMessage).toBe("Something went wrong");
|
|
118
|
+
});
|
|
119
|
+
it("should handle tool call streaming (pi-mono tool pattern)", async () => {
|
|
120
|
+
const stream = new AssistantMessageEventStream();
|
|
121
|
+
const partial = createAssistantMessage("");
|
|
122
|
+
stream.push({ type: "start", partial });
|
|
123
|
+
stream.push({ type: "toolcall_start", contentIndex: 0, partial });
|
|
124
|
+
stream.push({ type: "toolcall_delta", contentIndex: 0, delta: '{"lo', partial });
|
|
125
|
+
stream.push({ type: "toolcall_delta", contentIndex: 0, delta: 'cation":', partial });
|
|
126
|
+
stream.push({ type: "toolcall_delta", contentIndex: 0, delta: '"NYC"}', partial });
|
|
127
|
+
stream.push({
|
|
128
|
+
type: "toolcall_end",
|
|
129
|
+
contentIndex: 0,
|
|
130
|
+
toolCall: {
|
|
131
|
+
type: "toolCall",
|
|
132
|
+
id: "call_1",
|
|
133
|
+
name: "get_weather",
|
|
134
|
+
arguments: { location: "NYC" },
|
|
135
|
+
},
|
|
136
|
+
partial,
|
|
137
|
+
});
|
|
138
|
+
stream.push({
|
|
139
|
+
type: "done",
|
|
140
|
+
reason: "toolUse",
|
|
141
|
+
message: createAssistantMessage("", "toolUse"),
|
|
142
|
+
});
|
|
143
|
+
stream.end();
|
|
144
|
+
const events = [];
|
|
145
|
+
for await (const event of stream) {
|
|
146
|
+
events.push(event);
|
|
147
|
+
}
|
|
148
|
+
const toolCallEnd = events.find((e) => e.type === "toolcall_end");
|
|
149
|
+
expect(toolCallEnd).toBeDefined();
|
|
150
|
+
if (toolCallEnd?.type === "toolcall_end") {
|
|
151
|
+
expect(toolCallEnd.toolCall.name).toBe("get_weather");
|
|
152
|
+
expect(toolCallEnd.toolCall.arguments).toEqual({ location: "NYC" });
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe("Provider Registry (pi-mono provider pattern)", () => {
|
|
157
|
+
beforeEach(() => {
|
|
158
|
+
// Clear registry
|
|
159
|
+
const providers = ["test-provider", "anthropic", "openai"];
|
|
160
|
+
for (const name of providers) {
|
|
161
|
+
try {
|
|
162
|
+
// Re-register to ensure clean state
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// ignore
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
it("should register and retrieve providers", () => {
|
|
170
|
+
const provider = createMockProvider("test-provider", []);
|
|
171
|
+
registerProvider(provider);
|
|
172
|
+
const retrieved = getProvider("test-provider");
|
|
173
|
+
expect(retrieved).toBeDefined();
|
|
174
|
+
expect(retrieved?.name).toBe("test-provider");
|
|
175
|
+
});
|
|
176
|
+
it("should stream through registered provider", async () => {
|
|
177
|
+
const mockMessage = createAssistantMessage("Hello from mock");
|
|
178
|
+
const provider = createMockProvider("mock-ai", [
|
|
179
|
+
{ type: "start", partial: createAssistantMessage("") },
|
|
180
|
+
{ type: "done", reason: "stop", message: mockMessage },
|
|
181
|
+
]);
|
|
182
|
+
registerProvider(provider);
|
|
183
|
+
const model = {
|
|
184
|
+
id: "mock-model",
|
|
185
|
+
name: "Mock Model",
|
|
186
|
+
provider: "mock-ai",
|
|
187
|
+
api: "mock",
|
|
188
|
+
};
|
|
189
|
+
const context = {
|
|
190
|
+
messages: [{ role: "user", content: "Hi", timestamp: Date.now() }],
|
|
191
|
+
};
|
|
192
|
+
const eventStream = stream(model, context);
|
|
193
|
+
const events = [];
|
|
194
|
+
for await (const event of eventStream) {
|
|
195
|
+
events.push(event);
|
|
196
|
+
}
|
|
197
|
+
expect(events.length).toBeGreaterThan(0);
|
|
198
|
+
const doneEvent = events.find((e) => e.type === "done");
|
|
199
|
+
expect(doneEvent).toBeDefined();
|
|
200
|
+
});
|
|
201
|
+
it("should complete through registered provider", async () => {
|
|
202
|
+
const mockMessage = createAssistantMessage("Completed");
|
|
203
|
+
const provider = createMockProvider("complete-ai", [
|
|
204
|
+
{ type: "start", partial: createAssistantMessage("") },
|
|
205
|
+
{ type: "done", reason: "stop", message: mockMessage },
|
|
206
|
+
]);
|
|
207
|
+
registerProvider(provider);
|
|
208
|
+
const model = {
|
|
209
|
+
id: "complete-model",
|
|
210
|
+
name: "Complete Model",
|
|
211
|
+
provider: "complete-ai",
|
|
212
|
+
api: "complete",
|
|
213
|
+
};
|
|
214
|
+
const context = {
|
|
215
|
+
messages: [{ role: "user", content: "Test", timestamp: Date.now() }],
|
|
216
|
+
};
|
|
217
|
+
const result = await complete(model, context);
|
|
218
|
+
expect(result.content[0]).toEqual({ type: "text", text: "Completed" });
|
|
219
|
+
});
|
|
220
|
+
it("should throw for unregistered provider", () => {
|
|
221
|
+
const model = {
|
|
222
|
+
id: "unknown",
|
|
223
|
+
name: "Unknown",
|
|
224
|
+
provider: "nonexistent",
|
|
225
|
+
api: "unknown",
|
|
226
|
+
};
|
|
227
|
+
const context = { messages: [] };
|
|
228
|
+
expect(() => stream(model, context)).toThrow("No provider registered");
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
describe("Provider Error Handling", () => {
|
|
232
|
+
it("should emit error event on provider failure", async () => {
|
|
233
|
+
const errorProvider = {
|
|
234
|
+
name: "error-provider",
|
|
235
|
+
stream() {
|
|
236
|
+
const stream = new AssistantMessageEventStream();
|
|
237
|
+
setTimeout(() => {
|
|
238
|
+
const errorMsg = {
|
|
239
|
+
role: "assistant",
|
|
240
|
+
content: [],
|
|
241
|
+
provider: "error-provider",
|
|
242
|
+
model: "error-model",
|
|
243
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 },
|
|
244
|
+
stopReason: "error",
|
|
245
|
+
errorMessage: "API Error",
|
|
246
|
+
timestamp: Date.now(),
|
|
247
|
+
};
|
|
248
|
+
stream.push({ type: "error", reason: "error", error: errorMsg });
|
|
249
|
+
stream.end();
|
|
250
|
+
}, 10);
|
|
251
|
+
return stream;
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
registerProvider(errorProvider);
|
|
255
|
+
const model = {
|
|
256
|
+
id: "error-model",
|
|
257
|
+
name: "Error Model",
|
|
258
|
+
provider: "error-provider",
|
|
259
|
+
api: "error",
|
|
260
|
+
};
|
|
261
|
+
const context = { messages: [] };
|
|
262
|
+
const result = await complete(model, context);
|
|
263
|
+
expect(result.stopReason).toBe("error");
|
|
264
|
+
expect(result.errorMessage).toBe("API Error");
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
describe("Streaming with AbortSignal", () => {
|
|
268
|
+
it("should respect abort signal", async () => {
|
|
269
|
+
const controller = new AbortController();
|
|
270
|
+
const slowProvider = {
|
|
271
|
+
name: "slow-provider",
|
|
272
|
+
stream(model, context, options) {
|
|
273
|
+
const stream = new AssistantMessageEventStream();
|
|
274
|
+
// Simulate slow stream
|
|
275
|
+
const interval = setInterval(() => {
|
|
276
|
+
if (options?.signal?.aborted) {
|
|
277
|
+
clearInterval(interval);
|
|
278
|
+
const abortedMsg = {
|
|
279
|
+
role: "assistant",
|
|
280
|
+
content: [],
|
|
281
|
+
provider: "slow-provider",
|
|
282
|
+
model: "slow-model",
|
|
283
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 },
|
|
284
|
+
stopReason: "aborted",
|
|
285
|
+
timestamp: Date.now(),
|
|
286
|
+
};
|
|
287
|
+
stream.push({ type: "error", reason: "aborted", error: abortedMsg });
|
|
288
|
+
stream.end();
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
stream.push({
|
|
292
|
+
type: "text_delta",
|
|
293
|
+
contentIndex: 0,
|
|
294
|
+
delta: "chunk ",
|
|
295
|
+
partial: createAssistantMessage(""),
|
|
296
|
+
});
|
|
297
|
+
}, 50);
|
|
298
|
+
// Auto-abort after 100ms
|
|
299
|
+
setTimeout(() => controller.abort(), 100);
|
|
300
|
+
return stream;
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
registerProvider(slowProvider);
|
|
304
|
+
const model = {
|
|
305
|
+
id: "slow-model",
|
|
306
|
+
name: "Slow Model",
|
|
307
|
+
provider: "slow-provider",
|
|
308
|
+
api: "slow",
|
|
309
|
+
};
|
|
310
|
+
const context = { messages: [] };
|
|
311
|
+
const eventStream = stream(model, context, { signal: controller.signal });
|
|
312
|
+
const events = [];
|
|
313
|
+
for await (const event of eventStream) {
|
|
314
|
+
events.push(event);
|
|
315
|
+
if (event.type === "error" || event.type === "done")
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
// Should have received at least one event before abort
|
|
319
|
+
expect(events.length).toBeGreaterThan(0);
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
describe("Message Content Types", () => {
|
|
323
|
+
it("should handle text content", async () => {
|
|
324
|
+
const message = createAssistantMessage("Plain text");
|
|
325
|
+
expect(message.content[0]).toEqual({ type: "text", text: "Plain text" });
|
|
326
|
+
});
|
|
327
|
+
it("should handle thinking content", async () => {
|
|
328
|
+
const message = {
|
|
329
|
+
role: "assistant",
|
|
330
|
+
content: [
|
|
331
|
+
{ type: "thinking", thinking: "Let me think...", thinkingSignature: "sig1" },
|
|
332
|
+
{ type: "text", text: "Answer" },
|
|
333
|
+
],
|
|
334
|
+
provider: "test",
|
|
335
|
+
model: "test",
|
|
336
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 },
|
|
337
|
+
stopReason: "stop",
|
|
338
|
+
timestamp: Date.now(),
|
|
339
|
+
};
|
|
340
|
+
expect(message.content).toHaveLength(2);
|
|
341
|
+
expect(message.content[0].type).toBe("thinking");
|
|
342
|
+
});
|
|
343
|
+
it("should handle tool call content", async () => {
|
|
344
|
+
const message = {
|
|
345
|
+
role: "assistant",
|
|
346
|
+
content: [
|
|
347
|
+
{
|
|
348
|
+
type: "toolCall",
|
|
349
|
+
id: "call_1",
|
|
350
|
+
name: "get_weather",
|
|
351
|
+
arguments: { location: "NYC" },
|
|
352
|
+
},
|
|
353
|
+
],
|
|
354
|
+
provider: "test",
|
|
355
|
+
model: "test",
|
|
356
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 },
|
|
357
|
+
stopReason: "toolUse",
|
|
358
|
+
timestamp: Date.now(),
|
|
359
|
+
};
|
|
360
|
+
expect(message.content[0].type).toBe("toolCall");
|
|
361
|
+
expect(message.content[0].name).toBe("get_weather");
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
//# sourceMappingURL=e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAM,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGjF,mEAAmE;AACnE,SAAS,kBAAkB,CAAC,IAAY,EAAE,cAAuC;IAC/E,OAAO;QACL,IAAI;QACJ,MAAM,CAAC,KAAY,EAAE,OAAgB;YACnC,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;YAEjD,oEAAoE;YACpE,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;gBACD,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,CAAC,EAAE,EAAE,CAAC,CAAC;YAEP,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,SAAS,sBAAsB,CAAC,IAAY,EAAE,aAAiC,MAAM;IACnF,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;QAC9E,UAAU;QACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,WAAW,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,EAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACT,CAAC;QAEF,oDAAoD;QACpD,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,IAAI,WAAW,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,EAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACT,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,WAAW,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,EACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAC7B,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,CAAC;QAEb,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,GAAG,IAAI,WAAW,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,EAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACT,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAEpD,mEAAmE;QACnE,yDAAyD;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,sBAAsB,CAAC,aAAa,CAAC;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC;QAEb,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,EAAE,CAAC;QAEb,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAChD,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC;QAClC,YAAY,CAAC,YAAY,GAAG,sBAAsB,CAAC;QAEnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,EAAE,CAAC;QAEb,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACR,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;aAC/B;YACD,OAAO;SACR,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,sBAAsB,CAAC,EAAE,EAAE,SAAS,CAAC;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC;QAEb,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,WAAW,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,UAAU,CAAC,GAAG,EAAE;QACd,iBAAiB;QACjB,MAAM,SAAS,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,oCAAoC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACzD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE3B,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,WAAW,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,EAAE;YAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC,EAAE;YACtD,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;SACvD,CAAC,CAAC;QAEH,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAU;YACnB,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,SAAS;YACnB,GAAG,EAAE,MAAM;SACZ,CAAC;QAEF,MAAM,OAAO,GAAY;YACvB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;SACnE,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,WAAW,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,EAAE;YACjD,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC,EAAE;YACtD,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;SACvD,CAAC,CAAC;QAEH,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAU;YACnB,EAAE,EAAE,gBAAgB;YACpB,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,aAAa;YACvB,GAAG,EAAE,UAAU;SAChB,CAAC;QAEF,MAAM,OAAO,GAAY;YACvB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;SACrE,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAU;YACnB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,aAAa;YACvB,GAAG,EAAE,SAAS;SACf,CAAC;QAEF,MAAM,OAAO,GAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAE1C,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,gBAAgB;YACtB,MAAM;gBACJ,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;gBACjD,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,QAAQ,GAAqB;wBACjC,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,EAAE;wBACX,QAAQ,EAAE,gBAAgB;wBAC1B,KAAK,EAAE,aAAa;wBACpB,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;wBAC3E,UAAU,EAAE,OAAO;wBACnB,YAAY,EAAE,WAAW;wBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACjE,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,CAAC,EAAE,EAAE,CAAC,CAAC;gBACP,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;QAEF,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAU;YACnB,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,gBAAgB;YAC1B,GAAG,EAAE,OAAO;SACb,CAAC;QAEF,MAAM,OAAO,GAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,eAAe;YACrB,MAAM,CAAC,KAAY,EAAE,OAAgB,EAAE,OAAkC;gBACvE,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;gBAEjD,uBAAuB;gBACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;oBAChC,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;wBAC7B,aAAa,CAAC,QAAQ,CAAC,CAAC;wBACxB,MAAM,UAAU,GAAqB;4BACnC,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,EAAE;4BACX,QAAQ,EAAE,eAAe;4BACzB,KAAK,EAAE,YAAY;4BACnB,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;4BAC3E,UAAU,EAAE,SAAS;4BACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;yBACtB,CAAC;wBACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;wBACrE,MAAM,CAAC,GAAG,EAAE,CAAC;wBACb,OAAO;oBACT,CAAC;oBAED,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,YAAY;wBAClB,YAAY,EAAE,CAAC;wBACf,KAAK,EAAE,QAAQ;wBACf,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC;qBACpC,CAAC,CAAC;gBACL,CAAC,EAAE,EAAE,CAAC,CAAC;gBAEP,yBAAyB;gBACzB,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;gBAE1C,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;QAEF,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAU;YACnB,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,eAAe;YACzB,GAAG,EAAE,MAAM;SACZ,CAAC;QAEF,MAAM,OAAO,GAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1E,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM;QAC7D,CAAC;QAED,uDAAuD;QACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAqB;YAChC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,EAAE;gBAC5E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;aACjC;YACD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;YAC3E,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,OAAO,GAAqB;YAChC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;iBAC/B;aACF;YACD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;YAC3E,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,CAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-stream.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/event-stream.test.ts"],"names":[],"mappings":""}
|