@stoneforge/shared-routes 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +69 -0
- package/dist/channels.d.ts +9 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +413 -0
- package/dist/channels.js.map +1 -0
- package/dist/documents.d.ts +9 -0
- package/dist/documents.d.ts.map +1 -0
- package/dist/documents.js +1205 -0
- package/dist/documents.js.map +1 -0
- package/dist/elements.d.ts +9 -0
- package/dist/elements.d.ts.map +1 -0
- package/dist/elements.js +87 -0
- package/dist/elements.js.map +1 -0
- package/dist/entities.d.ts +9 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +92 -0
- package/dist/entities.js.map +1 -0
- package/dist/inbox.d.ts +10 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +538 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/libraries.d.ts +9 -0
- package/dist/libraries.d.ts.map +1 -0
- package/dist/libraries.js +467 -0
- package/dist/libraries.js.map +1 -0
- package/dist/messages.d.ts +9 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +338 -0
- package/dist/messages.js.map +1 -0
- package/dist/plans.d.ts +10 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +495 -0
- package/dist/plans.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/ws/broadcaster.d.ts +62 -0
- package/dist/ws/broadcaster.d.ts.map +1 -0
- package/dist/ws/broadcaster.js +146 -0
- package/dist/ws/broadcaster.js.map +1 -0
- package/dist/ws/handler.d.ts +11 -0
- package/dist/ws/handler.d.ts.map +1 -0
- package/dist/ws/handler.js +38 -0
- package/dist/ws/handler.js.map +1 -0
- package/dist/ws/index.d.ts +11 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +11 -0
- package/dist/ws/index.js.map +1 -0
- package/dist/ws/types.d.ts +85 -0
- package/dist/ws/types.d.ts.map +1 -0
- package/dist/ws/types.js +63 -0
- package/dist/ws/types.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Types for Collaborate Routes
|
|
3
|
+
*
|
|
4
|
+
* Defines the services interface that both main server and orchestrator-server satisfy.
|
|
5
|
+
* Uses duck-typed interfaces to avoid circular dependency on @stoneforge/quarry.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Broadcaster
|
|
3
|
+
*
|
|
4
|
+
* Singleton service for broadcasting events to connected WebSocket clients.
|
|
5
|
+
* Uses a polling mechanism to check for new events in the database.
|
|
6
|
+
*/
|
|
7
|
+
import type { QuarryLikeAPI } from '../types.js';
|
|
8
|
+
import type { WebSocketEvent } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Listener callback for events
|
|
11
|
+
*/
|
|
12
|
+
export type EventListener = (event: WebSocketEvent) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Event Broadcaster Service
|
|
15
|
+
*
|
|
16
|
+
* Polls the database for new events and broadcasts them to listeners.
|
|
17
|
+
*/
|
|
18
|
+
export declare class EventBroadcaster {
|
|
19
|
+
private api;
|
|
20
|
+
private listeners;
|
|
21
|
+
private lastEventId;
|
|
22
|
+
private pollInterval;
|
|
23
|
+
private pollIntervalMs;
|
|
24
|
+
constructor(api: QuarryLikeAPI, pollIntervalMs?: number);
|
|
25
|
+
/**
|
|
26
|
+
* Add a listener for events
|
|
27
|
+
*/
|
|
28
|
+
addListener(listener: EventListener): void;
|
|
29
|
+
/**
|
|
30
|
+
* Remove a listener
|
|
31
|
+
*/
|
|
32
|
+
removeListener(listener: EventListener): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get the number of active listeners
|
|
35
|
+
*/
|
|
36
|
+
get listenerCount(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Start polling for events
|
|
39
|
+
*/
|
|
40
|
+
start(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Stop polling for events
|
|
43
|
+
*/
|
|
44
|
+
stop(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Initialize the last event ID from the database
|
|
47
|
+
*/
|
|
48
|
+
private initializeLastEventId;
|
|
49
|
+
/**
|
|
50
|
+
* Poll for new events and broadcast them
|
|
51
|
+
*/
|
|
52
|
+
private pollForEvents;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Initialize the event broadcaster with an API instance
|
|
56
|
+
*/
|
|
57
|
+
export declare function initializeBroadcaster(api: QuarryLikeAPI, pollIntervalMs?: number): EventBroadcaster;
|
|
58
|
+
/**
|
|
59
|
+
* Get the broadcaster instance
|
|
60
|
+
*/
|
|
61
|
+
export declare function getBroadcaster(): EventBroadcaster | null;
|
|
62
|
+
//# sourceMappingURL=broadcaster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcaster.d.ts","sourceRoot":"","sources":["../../src/ws/broadcaster.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAejD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAE5D;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,cAAc,CAAS;gBAEnB,GAAG,EAAE,aAAa,EAAE,cAAc,GAAE,MAAY;IAK5D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI7C;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;YACW,qBAAqB;IAcnC;;OAEG;YACW,aAAa;CA6C5B;AAOD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAKnG;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,GAAG,IAAI,CAExD"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Broadcaster
|
|
3
|
+
*
|
|
4
|
+
* Singleton service for broadcasting events to connected WebSocket clients.
|
|
5
|
+
* Uses a polling mechanism to check for new events in the database.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Event Broadcaster Service
|
|
9
|
+
*
|
|
10
|
+
* Polls the database for new events and broadcasts them to listeners.
|
|
11
|
+
*/
|
|
12
|
+
export class EventBroadcaster {
|
|
13
|
+
api;
|
|
14
|
+
listeners = new Set();
|
|
15
|
+
lastEventId = 0;
|
|
16
|
+
pollInterval = null;
|
|
17
|
+
pollIntervalMs;
|
|
18
|
+
constructor(api, pollIntervalMs = 500) {
|
|
19
|
+
this.api = api;
|
|
20
|
+
this.pollIntervalMs = pollIntervalMs;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Add a listener for events
|
|
24
|
+
*/
|
|
25
|
+
addListener(listener) {
|
|
26
|
+
this.listeners.add(listener);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Remove a listener
|
|
30
|
+
*/
|
|
31
|
+
removeListener(listener) {
|
|
32
|
+
this.listeners.delete(listener);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the number of active listeners
|
|
36
|
+
*/
|
|
37
|
+
get listenerCount() {
|
|
38
|
+
return this.listeners.size;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Start polling for events
|
|
42
|
+
*/
|
|
43
|
+
async start() {
|
|
44
|
+
if (this.pollInterval) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Initialize last event ID from database
|
|
48
|
+
await this.initializeLastEventId();
|
|
49
|
+
// Start polling
|
|
50
|
+
this.pollInterval = setInterval(() => {
|
|
51
|
+
this.pollForEvents().catch((err) => {
|
|
52
|
+
console.error('[ws] Error polling for events:', err);
|
|
53
|
+
});
|
|
54
|
+
}, this.pollIntervalMs);
|
|
55
|
+
console.log(`[ws] Event broadcaster started (polling every ${this.pollIntervalMs}ms)`);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Stop polling for events
|
|
59
|
+
*/
|
|
60
|
+
stop() {
|
|
61
|
+
if (this.pollInterval) {
|
|
62
|
+
clearInterval(this.pollInterval);
|
|
63
|
+
this.pollInterval = null;
|
|
64
|
+
console.log('[ws] Event broadcaster stopped');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Initialize the last event ID from the database
|
|
69
|
+
*/
|
|
70
|
+
async initializeLastEventId() {
|
|
71
|
+
try {
|
|
72
|
+
// Access the backend through the API's internal structure
|
|
73
|
+
// The API stores the backend, but we need to get it indirectly
|
|
74
|
+
const backend = this.api.backend;
|
|
75
|
+
const rows = backend.query('SELECT MAX(id) as id FROM events');
|
|
76
|
+
if (rows.length > 0 && rows[0].id) {
|
|
77
|
+
this.lastEventId = rows[0].id;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.error('[ws] Error initializing last event ID:', err);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Poll for new events and broadcast them
|
|
86
|
+
*/
|
|
87
|
+
async pollForEvents() {
|
|
88
|
+
if (this.listeners.size === 0) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
// Access the backend through the API
|
|
93
|
+
const backend = this.api.backend;
|
|
94
|
+
// Query for events newer than our last known event
|
|
95
|
+
const events = backend.query('SELECT e.*, el.type as element_type FROM events e LEFT JOIN elements el ON e.element_id = el.id WHERE e.id > ? ORDER BY e.id ASC LIMIT 100', [this.lastEventId]);
|
|
96
|
+
for (const event of events) {
|
|
97
|
+
const wsEvent = {
|
|
98
|
+
id: event.id,
|
|
99
|
+
elementId: event.element_id,
|
|
100
|
+
eventType: event.event_type,
|
|
101
|
+
actor: event.actor,
|
|
102
|
+
oldValue: event.old_value ? JSON.parse(event.old_value) : null,
|
|
103
|
+
newValue: event.new_value ? JSON.parse(event.new_value) : null,
|
|
104
|
+
createdAt: event.created_at,
|
|
105
|
+
elementType: event.element_type ?? 'unknown',
|
|
106
|
+
};
|
|
107
|
+
// Broadcast to all listeners
|
|
108
|
+
for (const listener of this.listeners) {
|
|
109
|
+
try {
|
|
110
|
+
listener(wsEvent);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
console.error('[ws] Error in event listener:', err);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Update last event ID
|
|
117
|
+
if (event.id > this.lastEventId) {
|
|
118
|
+
this.lastEventId = event.id;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
console.error('[ws] Error polling for events:', err);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Singleton broadcaster instance
|
|
129
|
+
*/
|
|
130
|
+
let broadcaster = null;
|
|
131
|
+
/**
|
|
132
|
+
* Initialize the event broadcaster with an API instance
|
|
133
|
+
*/
|
|
134
|
+
export function initializeBroadcaster(api, pollIntervalMs) {
|
|
135
|
+
if (!broadcaster) {
|
|
136
|
+
broadcaster = new EventBroadcaster(api, pollIntervalMs);
|
|
137
|
+
}
|
|
138
|
+
return broadcaster;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get the broadcaster instance
|
|
142
|
+
*/
|
|
143
|
+
export function getBroadcaster() {
|
|
144
|
+
return broadcaster;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=broadcaster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcaster.js","sourceRoot":"","sources":["../../src/ws/broadcaster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Handler Utilities
|
|
3
|
+
*
|
|
4
|
+
* Pure functions for event subscription filtering.
|
|
5
|
+
*/
|
|
6
|
+
import type { WebSocketEvent, SubscriptionChannel } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check if a client should receive an event based on their subscriptions
|
|
9
|
+
*/
|
|
10
|
+
export declare function shouldReceiveEvent(subscriptions: Set<SubscriptionChannel>, event: WebSocketEvent): boolean;
|
|
11
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/ws/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtE;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,GAAG,CAAC,mBAAmB,CAAC,EACvC,KAAK,EAAE,cAAc,GACpB,OAAO,CA+BT"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Handler Utilities
|
|
3
|
+
*
|
|
4
|
+
* Pure functions for event subscription filtering.
|
|
5
|
+
*/
|
|
6
|
+
import { getChannelForElementType } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check if a client should receive an event based on their subscriptions
|
|
9
|
+
*/
|
|
10
|
+
export function shouldReceiveEvent(subscriptions, event) {
|
|
11
|
+
// Wildcard subscription receives all events
|
|
12
|
+
if (subscriptions.has('*')) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
// Check for element type channel
|
|
16
|
+
const channel = getChannelForElementType(event.elementType);
|
|
17
|
+
if (channel && subscriptions.has(channel)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
// Check for channel-specific message subscription
|
|
21
|
+
// For messages, also check messages:${channelId} subscriptions
|
|
22
|
+
if (event.elementType === 'message' && event.newValue) {
|
|
23
|
+
const channelId = event.newValue.channel;
|
|
24
|
+
if (channelId && subscriptions.has(`messages:${channelId}`)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Check for entity-specific inbox subscription
|
|
29
|
+
// For inbox items, also check inbox:${recipientId} subscriptions
|
|
30
|
+
if (event.elementType === 'inbox-item' && event.newValue) {
|
|
31
|
+
const recipientId = event.newValue.recipientId;
|
|
32
|
+
if (recipientId && subscriptions.has(`inbox:${recipientId}`)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/ws/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAAuC,EACvC,KAAqB;IAErB,4CAA4C;IAC5C,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,+DAA+D;IAC/D,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,SAAS,GAAI,KAAK,CAAC,QAAoC,CAAC,OAA6B,CAAC;QAC5F,IAAI,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,YAAY,SAAS,EAAyB,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,iEAAiE;IACjE,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzD,MAAM,WAAW,GAAI,KAAK,CAAC,QAAoC,CAAC,WAAiC,CAAC;QAClG,IAAI,WAAW,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,WAAW,EAAyB,CAAC,EAAE,CAAC;YACpF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Module
|
|
3
|
+
*
|
|
4
|
+
* Shared types, broadcaster, and handler utilities for the event-subscription WebSocket protocol.
|
|
5
|
+
*/
|
|
6
|
+
export type { SubscriptionChannel, ClientMessageType, SubscribeMessage, UnsubscribeMessage, PingMessage, ClientMessage, ServerMessageType, WebSocketEvent, EventMessage, PongMessage, ErrorMessage, SubscribedMessage, UnsubscribedMessage, ServerMessage, } from './types.js';
|
|
7
|
+
export { getChannelForElementType, parseClientMessage } from './types.js';
|
|
8
|
+
export { EventBroadcaster, initializeBroadcaster, getBroadcaster } from './broadcaster.js';
|
|
9
|
+
export type { EventListener } from './broadcaster.js';
|
|
10
|
+
export { shouldReceiveEvent } from './handler.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3F,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/ws/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Module
|
|
3
|
+
*
|
|
4
|
+
* Shared types, broadcaster, and handler utilities for the event-subscription WebSocket protocol.
|
|
5
|
+
*/
|
|
6
|
+
export { getChannelForElementType, parseClientMessage } from './types.js';
|
|
7
|
+
// Broadcaster
|
|
8
|
+
export { EventBroadcaster, initializeBroadcaster, getBroadcaster } from './broadcaster.js';
|
|
9
|
+
// Handler utilities
|
|
10
|
+
export { shouldReceiveEvent } from './handler.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE1E,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG3F,oBAAoB;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Types
|
|
3
|
+
*
|
|
4
|
+
* Message types and interfaces for the WebSocket event-subscription protocol.
|
|
5
|
+
*/
|
|
6
|
+
import type { Event } from '@stoneforge/core';
|
|
7
|
+
/**
|
|
8
|
+
* Valid subscription channels
|
|
9
|
+
*/
|
|
10
|
+
export type SubscriptionChannel = 'tasks' | 'plans' | 'workflows' | 'entities' | 'documents' | 'channels' | 'messages' | 'teams' | 'inbox' | '*' | `messages:${string}` | `inbox:${string}`;
|
|
11
|
+
/**
|
|
12
|
+
* Client -> Server message types
|
|
13
|
+
*/
|
|
14
|
+
export type ClientMessageType = 'subscribe' | 'unsubscribe' | 'ping';
|
|
15
|
+
/**
|
|
16
|
+
* Client -> Server messages
|
|
17
|
+
*/
|
|
18
|
+
export interface SubscribeMessage {
|
|
19
|
+
type: 'subscribe';
|
|
20
|
+
channels: SubscriptionChannel[];
|
|
21
|
+
}
|
|
22
|
+
export interface UnsubscribeMessage {
|
|
23
|
+
type: 'unsubscribe';
|
|
24
|
+
channels: SubscriptionChannel[];
|
|
25
|
+
}
|
|
26
|
+
export interface PingMessage {
|
|
27
|
+
type: 'ping';
|
|
28
|
+
}
|
|
29
|
+
export type ClientMessage = SubscribeMessage | UnsubscribeMessage | PingMessage;
|
|
30
|
+
/**
|
|
31
|
+
* Server -> Client message types
|
|
32
|
+
*/
|
|
33
|
+
export type ServerMessageType = 'event' | 'pong' | 'error' | 'subscribed' | 'unsubscribed';
|
|
34
|
+
/**
|
|
35
|
+
* Extended event with element type information
|
|
36
|
+
*/
|
|
37
|
+
export interface WebSocketEvent extends Omit<Event, 'id'> {
|
|
38
|
+
id: number;
|
|
39
|
+
elementType: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Event broadcast message
|
|
43
|
+
*/
|
|
44
|
+
export interface EventMessage {
|
|
45
|
+
type: 'event';
|
|
46
|
+
event: WebSocketEvent;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Pong response
|
|
50
|
+
*/
|
|
51
|
+
export interface PongMessage {
|
|
52
|
+
type: 'pong';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Error message
|
|
56
|
+
*/
|
|
57
|
+
export interface ErrorMessage {
|
|
58
|
+
type: 'error';
|
|
59
|
+
code: string;
|
|
60
|
+
message: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Subscription confirmation
|
|
64
|
+
*/
|
|
65
|
+
export interface SubscribedMessage {
|
|
66
|
+
type: 'subscribed';
|
|
67
|
+
channels: SubscriptionChannel[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Unsubscription confirmation
|
|
71
|
+
*/
|
|
72
|
+
export interface UnsubscribedMessage {
|
|
73
|
+
type: 'unsubscribed';
|
|
74
|
+
channels: SubscriptionChannel[];
|
|
75
|
+
}
|
|
76
|
+
export type ServerMessage = EventMessage | PongMessage | ErrorMessage | SubscribedMessage | UnsubscribedMessage;
|
|
77
|
+
/**
|
|
78
|
+
* Map element types to subscription channels
|
|
79
|
+
*/
|
|
80
|
+
export declare function getChannelForElementType(elementType: string): SubscriptionChannel | null;
|
|
81
|
+
/**
|
|
82
|
+
* Parse a client message from JSON
|
|
83
|
+
*/
|
|
84
|
+
export declare function parseClientMessage(data: string): ClientMessage | null;
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ws/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,OAAO,GACP,WAAW,GACX,UAAU,GACV,WAAW,GACX,UAAU,GACV,UAAU,GACV,OAAO,GACP,OAAO,GACP,GAAG,GACH,YAAY,MAAM,EAAE,GACpB,SAAS,MAAM,EAAE,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,WAAW,CAAC;AAEhF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,cAAc,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,CAAC;AAExB;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAuBxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA6BrE"}
|
package/dist/ws/types.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Types
|
|
3
|
+
*
|
|
4
|
+
* Message types and interfaces for the WebSocket event-subscription protocol.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Map element types to subscription channels
|
|
8
|
+
*/
|
|
9
|
+
export function getChannelForElementType(elementType) {
|
|
10
|
+
switch (elementType) {
|
|
11
|
+
case 'task':
|
|
12
|
+
return 'tasks';
|
|
13
|
+
case 'plan':
|
|
14
|
+
return 'plans';
|
|
15
|
+
case 'workflow':
|
|
16
|
+
return 'workflows';
|
|
17
|
+
case 'entity':
|
|
18
|
+
return 'entities';
|
|
19
|
+
case 'document':
|
|
20
|
+
return 'documents';
|
|
21
|
+
case 'channel':
|
|
22
|
+
return 'channels';
|
|
23
|
+
case 'message':
|
|
24
|
+
return 'messages';
|
|
25
|
+
case 'team':
|
|
26
|
+
return 'teams';
|
|
27
|
+
case 'inbox-item':
|
|
28
|
+
return 'inbox';
|
|
29
|
+
default:
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse a client message from JSON
|
|
35
|
+
*/
|
|
36
|
+
export function parseClientMessage(data) {
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(data);
|
|
39
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (parsed.type === 'ping') {
|
|
43
|
+
return { type: 'ping' };
|
|
44
|
+
}
|
|
45
|
+
if (parsed.type === 'subscribe' && Array.isArray(parsed.channels)) {
|
|
46
|
+
return {
|
|
47
|
+
type: 'subscribe',
|
|
48
|
+
channels: parsed.channels.filter((c) => typeof c === 'string'),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (parsed.type === 'unsubscribe' && Array.isArray(parsed.channels)) {
|
|
52
|
+
return {
|
|
53
|
+
type: 'unsubscribe',
|
|
54
|
+
channels: parsed.channels.filter((c) => typeof c === 'string'),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ws/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyGH;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,UAAU,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;aACxE,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpE,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;aACxE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stoneforge/shared-routes",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Shared route factories for Stoneforge servers",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./src/index.ts",
|
|
11
|
+
"bun": "./src/index.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"lint": "tsc --noEmit",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"clean": "rm -rf dist"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"README.md"
|
|
26
|
+
],
|
|
27
|
+
"license": "Apache-2.0",
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@stoneforge/core": "^0.1.0",
|
|
33
|
+
"@stoneforge/storage": "^0.1.0",
|
|
34
|
+
"hono": "^4.7.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/bun": "latest",
|
|
38
|
+
"typescript": "^5.0.0"
|
|
39
|
+
}
|
|
40
|
+
}
|