@agentuity/frontend 0.0.100
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/AGENTS.md +80 -0
- package/README.md +65 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/eventstream-manager.d.ts +85 -0
- package/dist/eventstream-manager.d.ts.map +1 -0
- package/dist/eventstream-manager.js +137 -0
- package/dist/eventstream-manager.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/memo.d.ts +6 -0
- package/dist/memo.d.ts.map +1 -0
- package/dist/memo.js +20 -0
- package/dist/memo.js.map +1 -0
- package/dist/reconnect.d.ts +22 -0
- package/dist/reconnect.d.ts.map +1 -0
- package/dist/reconnect.js +47 -0
- package/dist/reconnect.js.map +1 -0
- package/dist/serialization.d.ts +6 -0
- package/dist/serialization.d.ts.map +1 -0
- package/dist/serialization.js +16 -0
- package/dist/serialization.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/url.d.ts +3 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +24 -0
- package/dist/url.js.map +1 -0
- package/dist/websocket-manager.d.ts +90 -0
- package/dist/websocket-manager.d.ts.map +1 -0
- package/dist/websocket-manager.js +163 -0
- package/dist/websocket-manager.js.map +1 -0
- package/package.json +39 -0
- package/src/env.ts +9 -0
- package/src/eventstream-manager.ts +203 -0
- package/src/index.ts +20 -0
- package/src/memo.ts +16 -0
- package/src/reconnect.ts +73 -0
- package/src/serialization.ts +14 -0
- package/src/types.ts +29 -0
- package/src/url.ts +32 -0
- package/src/websocket-manager.ts +234 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Agent Guidelines for @agentuity/web
|
|
2
|
+
|
|
3
|
+
## Package Overview
|
|
4
|
+
|
|
5
|
+
Generic web utilities for building Agentuity frontend applications. Provides framework-agnostic utilities that can be used across React, Svelte, Vue, and other frontend frameworks.
|
|
6
|
+
|
|
7
|
+
## Commands
|
|
8
|
+
|
|
9
|
+
- **Build**: `bun run build` (compiles for browser target)
|
|
10
|
+
- **Typecheck**: `bun run typecheck` (runs TypeScript type checking)
|
|
11
|
+
- **Clean**: `bun run clean` (removes dist/)
|
|
12
|
+
|
|
13
|
+
## Architecture
|
|
14
|
+
|
|
15
|
+
- **Runtime**: Browser only (uses browser APIs like fetch, WebSocket, EventSource)
|
|
16
|
+
- **Build target**: Browser with ESNext
|
|
17
|
+
- **Dependencies**: Requires `@agentuity/core` (workspace dependency)
|
|
18
|
+
- **No framework dependencies**: Pure JavaScript/TypeScript with no React/Svelte/Vue dependencies
|
|
19
|
+
|
|
20
|
+
## Structure
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
src/
|
|
24
|
+
├── index.ts # Main entry point
|
|
25
|
+
├── env.ts # Environment variable helpers
|
|
26
|
+
├── url.ts # URL building utilities
|
|
27
|
+
├── serialization.ts # JSON serialization helpers
|
|
28
|
+
├── reconnect.ts # Exponential backoff reconnection logic
|
|
29
|
+
├── types.ts # Type definitions for route registries
|
|
30
|
+
└── memo.ts # JSON equality utilities
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Code Style
|
|
34
|
+
|
|
35
|
+
- **Framework-agnostic** - No framework-specific dependencies (React, Svelte, etc.)
|
|
36
|
+
- **TypeScript generics** - Heavy use of generics for type safety
|
|
37
|
+
- **Pure functions** - All utilities are pure functions where possible
|
|
38
|
+
- **Browser APIs** - Uses standard browser APIs (fetch, WebSocket, EventSource)
|
|
39
|
+
|
|
40
|
+
## Important Conventions
|
|
41
|
+
|
|
42
|
+
- **No framework dependencies** - This package must remain framework-agnostic
|
|
43
|
+
- **Type inference** - Route types are inferred from generated types (RouteRegistry)
|
|
44
|
+
- **Base URL** - Defaults to current origin if not provided
|
|
45
|
+
- **WebSocket protocol** - Auto-converts http:// to ws:// and https:// to wss://
|
|
46
|
+
- **Serialization** - Automatically handles JSON serialization/deserialization
|
|
47
|
+
|
|
48
|
+
## Utilities
|
|
49
|
+
|
|
50
|
+
### URL Building
|
|
51
|
+
|
|
52
|
+
- `buildUrl()` - Construct URLs with paths, subpaths, and query parameters
|
|
53
|
+
- `defaultBaseUrl` - Default base URL from environment or window.location.origin
|
|
54
|
+
|
|
55
|
+
### Reconnection Manager
|
|
56
|
+
|
|
57
|
+
- `createReconnectManager()` - Exponential backoff reconnection logic with jitter
|
|
58
|
+
- Configurable threshold, delays, and retry strategies
|
|
59
|
+
|
|
60
|
+
### Environment
|
|
61
|
+
|
|
62
|
+
- `getProcessEnv()` - Cross-platform environment variable access (process.env, import.meta.env)
|
|
63
|
+
|
|
64
|
+
### Serialization
|
|
65
|
+
|
|
66
|
+
- `deserializeData()` - Safe JSON deserialization with fallback
|
|
67
|
+
- `jsonEqual()` - JSON-based equality check for memoization
|
|
68
|
+
|
|
69
|
+
## Testing
|
|
70
|
+
|
|
71
|
+
- Test with Bun test runner
|
|
72
|
+
- Mock browser APIs where needed (fetch, WebSocket, EventSource)
|
|
73
|
+
- Ensure all utilities work without framework dependencies
|
|
74
|
+
|
|
75
|
+
## Publishing Checklist
|
|
76
|
+
|
|
77
|
+
1. Run `bun run build` to compile for browser
|
|
78
|
+
2. Verify `dist/` contains browser-compatible code (no Node.js APIs)
|
|
79
|
+
3. Ensure no framework-specific dependencies are added
|
|
80
|
+
4. Must publish **after** @agentuity/core
|
package/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# @agentuity/web
|
|
2
|
+
|
|
3
|
+
Generic web utilities for building Agentuity frontend applications. Provides framework-agnostic utilities for URL building, serialization, reconnection logic, and type definitions.
|
|
4
|
+
|
|
5
|
+
This package contains reusable JavaScript logic that can be shared across different frontend frameworks (React, Svelte, Vue, etc.).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @agentuity/web
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **URL Building**: Utilities for constructing URLs with query parameters
|
|
16
|
+
- **Environment Helpers**: Cross-platform environment variable access
|
|
17
|
+
- **Serialization**: JSON serialization/deserialization utilities
|
|
18
|
+
- **Reconnection Logic**: Exponential backoff reconnection manager for WebSockets and SSE
|
|
19
|
+
- **Type Definitions**: Shared TypeScript types for route registries
|
|
20
|
+
- **Memoization**: JSON-based equality checking
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
### URL Building
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { buildUrl, defaultBaseUrl } from '@agentuity/web';
|
|
28
|
+
|
|
29
|
+
const url = buildUrl(
|
|
30
|
+
'https://api.example.com',
|
|
31
|
+
'/users',
|
|
32
|
+
undefined,
|
|
33
|
+
new URLSearchParams({ page: '1' })
|
|
34
|
+
);
|
|
35
|
+
// => 'https://api.example.com/users?page=1'
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Reconnection Manager
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { createReconnectManager } from '@agentuity/web';
|
|
42
|
+
|
|
43
|
+
const reconnect = createReconnectManager({
|
|
44
|
+
onReconnect: () => console.log('Reconnecting...'),
|
|
45
|
+
threshold: 3,
|
|
46
|
+
baseDelay: 500,
|
|
47
|
+
factor: 2,
|
|
48
|
+
maxDelay: 30000,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Record failures to trigger exponential backoff
|
|
52
|
+
reconnect.recordFailure();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Serialization
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { deserializeData } from '@agentuity/web';
|
|
59
|
+
|
|
60
|
+
const data = deserializeData<MyType>('{"key":"value"}');
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## License
|
|
64
|
+
|
|
65
|
+
Apache-2.0
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAQpD,CAAC"}
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const getProcessEnv = (key) => {
|
|
2
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
3
|
+
return process.env[key];
|
|
4
|
+
}
|
|
5
|
+
if (typeof import.meta.env !== 'undefined') {
|
|
6
|
+
return import.meta.env[key];
|
|
7
|
+
}
|
|
8
|
+
return undefined;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAsB,EAAE;IAChE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACnD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message handler callback type
|
|
3
|
+
*/
|
|
4
|
+
export type MessageHandler<T = unknown> = (data: T) => void;
|
|
5
|
+
/**
|
|
6
|
+
* EventStream state change callback types
|
|
7
|
+
*/
|
|
8
|
+
export interface EventStreamCallbacks<TOutput = unknown> {
|
|
9
|
+
/** Called when connection is established */
|
|
10
|
+
onConnect?: () => void;
|
|
11
|
+
/** Called when connection is closed */
|
|
12
|
+
onDisconnect?: () => void;
|
|
13
|
+
/** Called when an error occurs */
|
|
14
|
+
onError?: (error: Error) => void;
|
|
15
|
+
/** Called when a message is received */
|
|
16
|
+
onMessage?: MessageHandler<TOutput>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Options for EventStreamManager
|
|
20
|
+
*/
|
|
21
|
+
export interface EventStreamManagerOptions<TOutput = unknown> {
|
|
22
|
+
/** EventStream URL */
|
|
23
|
+
url: string;
|
|
24
|
+
/** Callbacks for state changes */
|
|
25
|
+
callbacks?: EventStreamCallbacks<TOutput>;
|
|
26
|
+
/** Reconnection configuration */
|
|
27
|
+
reconnect?: {
|
|
28
|
+
threshold?: number;
|
|
29
|
+
baseDelay?: number;
|
|
30
|
+
factor?: number;
|
|
31
|
+
maxDelay?: number;
|
|
32
|
+
jitter?: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* EventStream manager state
|
|
37
|
+
*/
|
|
38
|
+
export interface EventStreamManagerState {
|
|
39
|
+
/** Whether EventStream is currently connected */
|
|
40
|
+
isConnected: boolean;
|
|
41
|
+
/** Current error, if any */
|
|
42
|
+
error: Error | null;
|
|
43
|
+
/** EventStream ready state */
|
|
44
|
+
readyState: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generic EventStream (SSE) connection manager with automatic reconnection
|
|
48
|
+
* and handler management.
|
|
49
|
+
*
|
|
50
|
+
* Framework-agnostic - can be used with React, Svelte, Vue, or vanilla JS.
|
|
51
|
+
*/
|
|
52
|
+
export declare class EventStreamManager<TOutput = unknown> {
|
|
53
|
+
private es;
|
|
54
|
+
private manualClose;
|
|
55
|
+
private pendingMessages;
|
|
56
|
+
private messageHandler;
|
|
57
|
+
private reconnectManager;
|
|
58
|
+
private callbacks;
|
|
59
|
+
private url;
|
|
60
|
+
private reconnectConfig;
|
|
61
|
+
private firstMessageReceived;
|
|
62
|
+
constructor(options: EventStreamManagerOptions<TOutput>);
|
|
63
|
+
/**
|
|
64
|
+
* Connect to the EventStream server
|
|
65
|
+
*/
|
|
66
|
+
connect(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Set the message handler.
|
|
69
|
+
* Any buffered messages will be delivered immediately.
|
|
70
|
+
*/
|
|
71
|
+
setMessageHandler(handler: MessageHandler<TOutput>): void;
|
|
72
|
+
/**
|
|
73
|
+
* Get current state
|
|
74
|
+
*/
|
|
75
|
+
getState(): EventStreamManagerState;
|
|
76
|
+
/**
|
|
77
|
+
* Close the EventStream connection and cleanup
|
|
78
|
+
*/
|
|
79
|
+
close(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Dispose of the manager (alias for close)
|
|
82
|
+
*/
|
|
83
|
+
dispose(): void;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=eventstream-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventstream-manager.d.ts","sourceRoot":"","sources":["../src/eventstream-manager.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,OAAO,GAAG,OAAO;IACtD,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,wCAAwC;IACxC,SAAS,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,OAAO,GAAG,OAAO;IAC3D,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,SAAS,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC1C,iCAAiC;IACjC,SAAS,CAAC,EAAE;QACX,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,iDAAiD;IACjD,WAAW,EAAE,OAAO,CAAC;IACrB,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,qBAAa,kBAAkB,CAAC,OAAO,GAAG,OAAO;IAChD,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,eAAe,CAAyE;IAChG,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,OAAO,EAAE,yBAAyB,CAAC,OAAO,CAAC;IAYvD;;OAEG;IACH,OAAO,IAAI,IAAI;IAoEf;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI;IAOzD;;OAEG;IACH,QAAQ,IAAI,uBAAuB;IAQnC;;OAEG;IACH,KAAK,IAAI,IAAI;IAmBb;;OAEG;IACH,OAAO,IAAI,IAAI;CAGf"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { createReconnectManager } from './reconnect';
|
|
2
|
+
import { deserializeData } from './serialization';
|
|
3
|
+
/**
|
|
4
|
+
* Generic EventStream (SSE) connection manager with automatic reconnection
|
|
5
|
+
* and handler management.
|
|
6
|
+
*
|
|
7
|
+
* Framework-agnostic - can be used with React, Svelte, Vue, or vanilla JS.
|
|
8
|
+
*/
|
|
9
|
+
export class EventStreamManager {
|
|
10
|
+
es;
|
|
11
|
+
manualClose = false;
|
|
12
|
+
pendingMessages = [];
|
|
13
|
+
messageHandler;
|
|
14
|
+
reconnectManager;
|
|
15
|
+
callbacks;
|
|
16
|
+
url;
|
|
17
|
+
reconnectConfig;
|
|
18
|
+
firstMessageReceived = false;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.url = options.url;
|
|
21
|
+
this.callbacks = options.callbacks || {};
|
|
22
|
+
this.reconnectConfig = {
|
|
23
|
+
threshold: options.reconnect?.threshold ?? 3,
|
|
24
|
+
baseDelay: options.reconnect?.baseDelay ?? 500,
|
|
25
|
+
factor: options.reconnect?.factor ?? 2,
|
|
26
|
+
maxDelay: options.reconnect?.maxDelay ?? 30000,
|
|
27
|
+
jitter: options.reconnect?.jitter ?? 250,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Connect to the EventStream server
|
|
32
|
+
*/
|
|
33
|
+
connect() {
|
|
34
|
+
if (this.manualClose)
|
|
35
|
+
return;
|
|
36
|
+
this.es = new EventSource(this.url);
|
|
37
|
+
this.firstMessageReceived = false;
|
|
38
|
+
this.es.onopen = () => {
|
|
39
|
+
this.reconnectManager?.recordSuccess();
|
|
40
|
+
this.callbacks.onConnect?.();
|
|
41
|
+
};
|
|
42
|
+
this.es.onerror = () => {
|
|
43
|
+
const error = new Error('EventStream error');
|
|
44
|
+
this.callbacks.onError?.(error);
|
|
45
|
+
this.callbacks.onDisconnect?.();
|
|
46
|
+
if (this.manualClose) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const result = this.reconnectManager?.recordFailure();
|
|
50
|
+
if (result?.scheduled) {
|
|
51
|
+
// Close current connection before reconnecting
|
|
52
|
+
if (this.es) {
|
|
53
|
+
this.es.onopen = null;
|
|
54
|
+
this.es.onerror = null;
|
|
55
|
+
this.es.onmessage = null;
|
|
56
|
+
this.es.close();
|
|
57
|
+
}
|
|
58
|
+
this.es = undefined;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
this.es.onmessage = (event) => {
|
|
62
|
+
// Record success on first message (not just on open)
|
|
63
|
+
if (!this.firstMessageReceived) {
|
|
64
|
+
this.reconnectManager?.recordSuccess();
|
|
65
|
+
this.firstMessageReceived = true;
|
|
66
|
+
}
|
|
67
|
+
const payload = deserializeData(event.data);
|
|
68
|
+
// Call the registered message handler
|
|
69
|
+
if (this.messageHandler) {
|
|
70
|
+
this.messageHandler(payload);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Buffer messages until a handler is set
|
|
74
|
+
this.pendingMessages.push(payload);
|
|
75
|
+
}
|
|
76
|
+
// Also call the callback if provided
|
|
77
|
+
this.callbacks.onMessage?.(payload);
|
|
78
|
+
};
|
|
79
|
+
// Setup reconnect manager
|
|
80
|
+
if (!this.reconnectManager) {
|
|
81
|
+
this.reconnectManager = createReconnectManager({
|
|
82
|
+
onReconnect: () => this.connect(),
|
|
83
|
+
threshold: this.reconnectConfig.threshold,
|
|
84
|
+
baseDelay: this.reconnectConfig.baseDelay,
|
|
85
|
+
factor: this.reconnectConfig.factor,
|
|
86
|
+
maxDelay: this.reconnectConfig.maxDelay,
|
|
87
|
+
jitter: this.reconnectConfig.jitter,
|
|
88
|
+
enabled: () => !this.manualClose,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Set the message handler.
|
|
94
|
+
* Any buffered messages will be delivered immediately.
|
|
95
|
+
*/
|
|
96
|
+
setMessageHandler(handler) {
|
|
97
|
+
this.messageHandler = handler;
|
|
98
|
+
// Flush pending messages
|
|
99
|
+
this.pendingMessages.forEach(handler);
|
|
100
|
+
this.pendingMessages = [];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get current state
|
|
104
|
+
*/
|
|
105
|
+
getState() {
|
|
106
|
+
return {
|
|
107
|
+
isConnected: this.es?.readyState === EventSource.OPEN,
|
|
108
|
+
error: null, // Error state managed externally via callbacks
|
|
109
|
+
readyState: this.es?.readyState ?? EventSource.CLOSED,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Close the EventStream connection and cleanup
|
|
114
|
+
*/
|
|
115
|
+
close() {
|
|
116
|
+
this.manualClose = true;
|
|
117
|
+
this.reconnectManager?.dispose();
|
|
118
|
+
if (this.es) {
|
|
119
|
+
this.es.onopen = null;
|
|
120
|
+
this.es.onerror = null;
|
|
121
|
+
this.es.onmessage = null;
|
|
122
|
+
this.es.close();
|
|
123
|
+
}
|
|
124
|
+
this.es = undefined;
|
|
125
|
+
this.messageHandler = undefined;
|
|
126
|
+
this.pendingMessages = [];
|
|
127
|
+
// Notify disconnect callback
|
|
128
|
+
this.callbacks.onDisconnect?.();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Dispose of the manager (alias for close)
|
|
132
|
+
*/
|
|
133
|
+
dispose() {
|
|
134
|
+
this.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=eventstream-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventstream-manager.js","sourceRoot":"","sources":["../src/eventstream-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { getProcessEnv } from './env';
|
|
2
|
+
export { buildUrl, defaultBaseUrl } from './url';
|
|
3
|
+
export { deserializeData } from './serialization';
|
|
4
|
+
export { createReconnectManager, type ReconnectOptions, type ReconnectManager } from './reconnect';
|
|
5
|
+
export { type RouteRegistry, type WebSocketRouteRegistry, type SSERouteRegistry } from './types';
|
|
6
|
+
export { jsonEqual } from './memo';
|
|
7
|
+
export { WebSocketManager, type MessageHandler as WebSocketMessageHandler, type WebSocketCallbacks, type WebSocketManagerOptions, type WebSocketManagerState, } from './websocket-manager';
|
|
8
|
+
export { EventStreamManager, type MessageHandler as EventStreamMessageHandler, type EventStreamCallbacks, type EventStreamManagerOptions, type EventStreamManagerState, } from './eventstream-manager';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,EAChB,KAAK,cAAc,IAAI,uBAAuB,EAC9C,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,EAClB,KAAK,cAAc,IAAI,yBAAyB,EAChD,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,GAC5B,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { getProcessEnv } from './env';
|
|
2
|
+
export { buildUrl, defaultBaseUrl } from './url';
|
|
3
|
+
export { deserializeData } from './serialization';
|
|
4
|
+
export { createReconnectManager } from './reconnect';
|
|
5
|
+
export { jsonEqual } from './memo';
|
|
6
|
+
export { WebSocketManager, } from './websocket-manager';
|
|
7
|
+
export { EventStreamManager, } from './eventstream-manager';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAgD,MAAM,aAAa,CAAC;AAEnG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,GAKhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,GAKlB,MAAM,uBAAuB,CAAC"}
|
package/dist/memo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../src/memo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,CAWhD"}
|
package/dist/memo.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple JSON-based equality check for memoization.
|
|
3
|
+
* Compares stringified JSON to avoid deep equality overhead.
|
|
4
|
+
*/
|
|
5
|
+
export function jsonEqual(a, b) {
|
|
6
|
+
if (a === b)
|
|
7
|
+
return true;
|
|
8
|
+
if (a === undefined || b === undefined)
|
|
9
|
+
return false;
|
|
10
|
+
if (a === null || b === null)
|
|
11
|
+
return a === b;
|
|
12
|
+
try {
|
|
13
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Fallback for non-serializable values
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=memo.js.map
|
package/dist/memo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memo.js","sourceRoot":"","sources":["../src/memo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAI,CAAI,EAAE,CAAI;IACtC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;QACvC,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ReconnectOptions {
|
|
2
|
+
onReconnect: () => void;
|
|
3
|
+
threshold?: number;
|
|
4
|
+
baseDelay?: number;
|
|
5
|
+
factor?: number;
|
|
6
|
+
maxDelay?: number;
|
|
7
|
+
jitter?: number;
|
|
8
|
+
enabled?: () => boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ReconnectManager {
|
|
11
|
+
recordFailure: () => {
|
|
12
|
+
scheduled: boolean;
|
|
13
|
+
delay: number | null;
|
|
14
|
+
};
|
|
15
|
+
recordSuccess: () => void;
|
|
16
|
+
cancel: () => void;
|
|
17
|
+
reset: () => void;
|
|
18
|
+
dispose: () => void;
|
|
19
|
+
getAttempts: () => number;
|
|
20
|
+
}
|
|
21
|
+
export declare function createReconnectManager(opts: ReconnectOptions): ReconnectManager;
|
|
22
|
+
//# sourceMappingURL=reconnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnect.d.ts","sourceRoot":"","sources":["../src/reconnect.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAChC,aAAa,EAAE,MAAM;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAClE,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAqD/E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function createReconnectManager(opts) {
|
|
2
|
+
let attempts = 0;
|
|
3
|
+
let timer = null;
|
|
4
|
+
const cancel = () => {
|
|
5
|
+
if (timer) {
|
|
6
|
+
clearTimeout(timer);
|
|
7
|
+
timer = null;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
const reset = () => {
|
|
11
|
+
attempts = 0;
|
|
12
|
+
cancel();
|
|
13
|
+
};
|
|
14
|
+
const recordSuccess = () => reset();
|
|
15
|
+
const computeDelay = (attemptAfterThreshold) => {
|
|
16
|
+
const base = opts.baseDelay ?? 500;
|
|
17
|
+
const factor = opts.factor ?? 2;
|
|
18
|
+
const max = opts.maxDelay ?? 30000;
|
|
19
|
+
const jitterMax = opts.jitter ?? 250;
|
|
20
|
+
const backoff = Math.min(base * Math.pow(factor, attemptAfterThreshold), max);
|
|
21
|
+
const jitter = jitterMax > 0 ? Math.random() * jitterMax : 0;
|
|
22
|
+
return backoff + jitter;
|
|
23
|
+
};
|
|
24
|
+
const recordFailure = () => {
|
|
25
|
+
attempts += 1;
|
|
26
|
+
const threshold = opts.threshold ?? 0;
|
|
27
|
+
if (opts.enabled && !opts.enabled()) {
|
|
28
|
+
return { scheduled: false, delay: null };
|
|
29
|
+
}
|
|
30
|
+
if (attempts - threshold >= 0) {
|
|
31
|
+
const after = Math.max(0, attempts - threshold);
|
|
32
|
+
const delay = computeDelay(after);
|
|
33
|
+
cancel();
|
|
34
|
+
timer = setTimeout(() => {
|
|
35
|
+
if (opts.enabled && !opts.enabled())
|
|
36
|
+
return;
|
|
37
|
+
opts.onReconnect();
|
|
38
|
+
}, delay);
|
|
39
|
+
return { scheduled: true, delay };
|
|
40
|
+
}
|
|
41
|
+
return { scheduled: false, delay: null };
|
|
42
|
+
};
|
|
43
|
+
const dispose = () => cancel();
|
|
44
|
+
const getAttempts = () => attempts;
|
|
45
|
+
return { recordFailure, recordSuccess, cancel, reset, dispose, getAttempts };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=reconnect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnect.js","sourceRoot":"","sources":["../src/reconnect.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,sBAAsB,CAAC,IAAsB;IAC5D,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,KAAK,GAAyC,IAAI,CAAC;IAEvD,MAAM,MAAM,GAAG,GAAG,EAAE;QACnB,IAAI,KAAK,EAAE,CAAC;YACX,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC;QACd,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QAClB,QAAQ,GAAG,CAAC,CAAC;QACb,MAAM,EAAE,CAAC;IACV,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IAEpC,MAAM,YAAY,GAAG,CAAC,qBAA6B,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,OAAO,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QAC1B,QAAQ,IAAI,CAAC,CAAC;QACd,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACrC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,QAAQ,GAAG,SAAS,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,EAAE,CAAC;YACT,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACvB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;oBAAE,OAAO;gBAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;IAE/B,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC;IAEnC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,MAAM,MAAM,KAAG,CASjD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deserialize data received from WebSocket or EventStream.
|
|
3
|
+
* Attempts to parse as JSON if the data looks like JSON, otherwise returns as-is.
|
|
4
|
+
*/
|
|
5
|
+
export const deserializeData = (data) => {
|
|
6
|
+
if (data) {
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(data);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
/* */
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return data;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=serialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAI,IAAY,EAAK,EAAE;IACrD,IAAI,IAAI,EAAE,CAAC;QACV,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACR,KAAK;QACN,CAAC;IACF,CAAC;IACD,OAAO,IAAS,CAAC;AAClB,CAAC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route registry containing all typed API routes in the application.
|
|
3
|
+
* Auto-generated by the build tool from routes that use validator() middleware.
|
|
4
|
+
*/
|
|
5
|
+
export interface RouteRegistry {
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* WebSocket route registry containing all typed WebSocket routes in the application.
|
|
9
|
+
* Auto-generated by the build tool from routes that use validator() middleware.
|
|
10
|
+
*/
|
|
11
|
+
export interface WebSocketRouteRegistry {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* SSE route registry containing all typed SSE routes in the application.
|
|
15
|
+
* Auto-generated by the build tool from routes that use validator() middleware.
|
|
16
|
+
*/
|
|
17
|
+
export interface SSERouteRegistry {
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;CAG7B;AAED;;;GAGG;AAEH,MAAM,WAAW,sBAAsB;CAGtC;AAED;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;CAGhC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/url.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,UAAU,MAAM,EAChB,QAAQ,eAAe,KACrB,MAWF,CAAC;AAQF,eAAO,MAAM,cAAc,EAAE,MAKL,CAAC"}
|
package/dist/url.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getProcessEnv } from './env';
|
|
2
|
+
export const buildUrl = (base, path, subpath, query) => {
|
|
3
|
+
path = path.startsWith('/') ? path : `/${path}`;
|
|
4
|
+
let url = base.replace(/\/$/, '') + path;
|
|
5
|
+
if (subpath) {
|
|
6
|
+
subpath = subpath.startsWith('/') ? subpath : `/${subpath}`;
|
|
7
|
+
url += `/${subpath}`;
|
|
8
|
+
}
|
|
9
|
+
if (query) {
|
|
10
|
+
url += `?${query.toString()}`;
|
|
11
|
+
}
|
|
12
|
+
return url;
|
|
13
|
+
};
|
|
14
|
+
const tryOrigin = () => {
|
|
15
|
+
if (typeof window !== 'undefined') {
|
|
16
|
+
return window.location.origin;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const defaultBaseUrl = getProcessEnv('NEXT_PUBLIC_AGENTUITY_URL') ||
|
|
20
|
+
getProcessEnv('VITE_AGENTUITY_URL') ||
|
|
21
|
+
getProcessEnv('AGENTUITY_URL') ||
|
|
22
|
+
tryOrigin() ||
|
|
23
|
+
'http://localhost:3500';
|
|
24
|
+
//# sourceMappingURL=url.js.map
|
package/dist/url.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,QAAQ,GAAG,CACvB,IAAY,EACZ,IAAY,EACZ,OAAgB,EAChB,KAAuB,EACd,EAAE;IACX,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAChD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAC5D,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACX,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,GAAG,EAAE;IACtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC/B,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAC1B,aAAa,CAAC,2BAA2B,CAAC;IAC1C,aAAa,CAAC,oBAAoB,CAAC;IACnC,aAAa,CAAC,eAAe,CAAC;IAC9B,SAAS,EAAE;IACX,uBAAuB,CAAC"}
|