@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.
Files changed (59) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +69 -0
  3. package/dist/channels.d.ts +9 -0
  4. package/dist/channels.d.ts.map +1 -0
  5. package/dist/channels.js +413 -0
  6. package/dist/channels.js.map +1 -0
  7. package/dist/documents.d.ts +9 -0
  8. package/dist/documents.d.ts.map +1 -0
  9. package/dist/documents.js +1205 -0
  10. package/dist/documents.js.map +1 -0
  11. package/dist/elements.d.ts +9 -0
  12. package/dist/elements.d.ts.map +1 -0
  13. package/dist/elements.js +87 -0
  14. package/dist/elements.js.map +1 -0
  15. package/dist/entities.d.ts +9 -0
  16. package/dist/entities.d.ts.map +1 -0
  17. package/dist/entities.js +92 -0
  18. package/dist/entities.js.map +1 -0
  19. package/dist/inbox.d.ts +10 -0
  20. package/dist/inbox.d.ts.map +1 -0
  21. package/dist/inbox.js +538 -0
  22. package/dist/inbox.js.map +1 -0
  23. package/dist/index.d.ts +16 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +17 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/libraries.d.ts +9 -0
  28. package/dist/libraries.d.ts.map +1 -0
  29. package/dist/libraries.js +467 -0
  30. package/dist/libraries.js.map +1 -0
  31. package/dist/messages.d.ts +9 -0
  32. package/dist/messages.d.ts.map +1 -0
  33. package/dist/messages.js +338 -0
  34. package/dist/messages.js.map +1 -0
  35. package/dist/plans.d.ts +10 -0
  36. package/dist/plans.d.ts.map +1 -0
  37. package/dist/plans.js +495 -0
  38. package/dist/plans.js.map +1 -0
  39. package/dist/types.d.ts +128 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +8 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/ws/broadcaster.d.ts +62 -0
  44. package/dist/ws/broadcaster.d.ts.map +1 -0
  45. package/dist/ws/broadcaster.js +146 -0
  46. package/dist/ws/broadcaster.js.map +1 -0
  47. package/dist/ws/handler.d.ts +11 -0
  48. package/dist/ws/handler.d.ts.map +1 -0
  49. package/dist/ws/handler.js +38 -0
  50. package/dist/ws/handler.js.map +1 -0
  51. package/dist/ws/index.d.ts +11 -0
  52. package/dist/ws/index.d.ts.map +1 -0
  53. package/dist/ws/index.js +11 -0
  54. package/dist/ws/index.js.map +1 -0
  55. package/dist/ws/types.d.ts +85 -0
  56. package/dist/ws/types.d.ts.map +1 -0
  57. package/dist/ws/types.js +63 -0
  58. package/dist/ws/types.js.map +1 -0
  59. 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"}
@@ -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"}
@@ -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
+ }