@forgebase/database 0.0.1

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +470 -0
  3. package/dist/cjs/adapters/base.d.ts +20 -0
  4. package/dist/cjs/adapters/base.d.ts.map +1 -0
  5. package/dist/cjs/adapters/base.js +13 -0
  6. package/dist/cjs/adapters/base.js.map +1 -0
  7. package/dist/cjs/adapters/index.d.ts +6 -0
  8. package/dist/cjs/adapters/index.d.ts.map +1 -0
  9. package/dist/cjs/adapters/index.js +24 -0
  10. package/dist/cjs/adapters/index.js.map +1 -0
  11. package/dist/cjs/adapters/postgres.d.ts +13 -0
  12. package/dist/cjs/adapters/postgres.d.ts.map +1 -0
  13. package/dist/cjs/adapters/postgres.js +51 -0
  14. package/dist/cjs/adapters/postgres.js.map +1 -0
  15. package/dist/cjs/adapters/sqlite.d.ts +13 -0
  16. package/dist/cjs/adapters/sqlite.d.ts.map +1 -0
  17. package/dist/cjs/adapters/sqlite.js +47 -0
  18. package/dist/cjs/adapters/sqlite.js.map +1 -0
  19. package/dist/cjs/adapters/types.d.ts +8 -0
  20. package/dist/cjs/adapters/types.d.ts.map +1 -0
  21. package/dist/cjs/adapters/types.js +3 -0
  22. package/dist/cjs/adapters/types.js.map +1 -0
  23. package/dist/cjs/database.d.ts +73 -0
  24. package/dist/cjs/database.d.ts.map +1 -0
  25. package/dist/cjs/database.js +673 -0
  26. package/dist/cjs/database.js.map +1 -0
  27. package/dist/cjs/errors.d.ts +37 -0
  28. package/dist/cjs/errors.d.ts.map +1 -0
  29. package/dist/cjs/errors.js +64 -0
  30. package/dist/cjs/errors.js.map +1 -0
  31. package/dist/cjs/index.d.ts +16 -0
  32. package/dist/cjs/index.d.ts.map +1 -0
  33. package/dist/cjs/index.js +31 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/kysely-hooks.d.ts +45 -0
  36. package/dist/cjs/kysely-hooks.d.ts.map +1 -0
  37. package/dist/cjs/kysely-hooks.js +93 -0
  38. package/dist/cjs/kysely-hooks.js.map +1 -0
  39. package/dist/cjs/libsql/example.d.ts +2 -0
  40. package/dist/cjs/libsql/example.d.ts.map +1 -0
  41. package/dist/cjs/libsql/example.js +44 -0
  42. package/dist/cjs/libsql/example.js.map +1 -0
  43. package/dist/cjs/libsql/index.d.ts +36 -0
  44. package/dist/cjs/libsql/index.d.ts.map +1 -0
  45. package/dist/cjs/libsql/index.js +155 -0
  46. package/dist/cjs/libsql/index.js.map +1 -0
  47. package/dist/cjs/permissionService.d.ts +20 -0
  48. package/dist/cjs/permissionService.d.ts.map +1 -0
  49. package/dist/cjs/permissionService.js +107 -0
  50. package/dist/cjs/permissionService.js.map +1 -0
  51. package/dist/cjs/rlsFunctionRegistry.d.ts +43 -0
  52. package/dist/cjs/rlsFunctionRegistry.d.ts.map +1 -0
  53. package/dist/cjs/rlsFunctionRegistry.js +63 -0
  54. package/dist/cjs/rlsFunctionRegistry.js.map +1 -0
  55. package/dist/cjs/rlsManager.d.ts +23 -0
  56. package/dist/cjs/rlsManager.d.ts.map +1 -0
  57. package/dist/cjs/rlsManager.js +371 -0
  58. package/dist/cjs/rlsManager.js.map +1 -0
  59. package/dist/cjs/schema.d.ts +15 -0
  60. package/dist/cjs/schema.d.ts.map +1 -0
  61. package/dist/cjs/schema.js +119 -0
  62. package/dist/cjs/schema.js.map +1 -0
  63. package/dist/cjs/sdk/client.d.ts +324 -0
  64. package/dist/cjs/sdk/client.d.ts.map +1 -0
  65. package/dist/cjs/sdk/client.js +554 -0
  66. package/dist/cjs/sdk/client.js.map +1 -0
  67. package/dist/cjs/sdk/examples.d.ts +68 -0
  68. package/dist/cjs/sdk/examples.d.ts.map +1 -0
  69. package/dist/cjs/sdk/examples.js +232 -0
  70. package/dist/cjs/sdk/examples.js.map +1 -0
  71. package/dist/cjs/sdk/server.d.ts +115 -0
  72. package/dist/cjs/sdk/server.d.ts.map +1 -0
  73. package/dist/cjs/sdk/server.js +140 -0
  74. package/dist/cjs/sdk/server.js.map +1 -0
  75. package/dist/cjs/types.d.ts +217 -0
  76. package/dist/cjs/types.d.ts.map +1 -0
  77. package/dist/cjs/types.js +5 -0
  78. package/dist/cjs/types.js.map +1 -0
  79. package/dist/cjs/utils/column-utils.d.ts +8 -0
  80. package/dist/cjs/utils/column-utils.d.ts.map +1 -0
  81. package/dist/cjs/utils/column-utils.js +131 -0
  82. package/dist/cjs/utils/column-utils.js.map +1 -0
  83. package/dist/cjs/utils/db.d.ts +2 -0
  84. package/dist/cjs/utils/db.d.ts.map +1 -0
  85. package/dist/cjs/utils/db.js +6 -0
  86. package/dist/cjs/utils/db.js.map +1 -0
  87. package/dist/cjs/utils/inspector.d.ts +39 -0
  88. package/dist/cjs/utils/inspector.d.ts.map +1 -0
  89. package/dist/cjs/utils/inspector.js +164 -0
  90. package/dist/cjs/utils/inspector.js.map +1 -0
  91. package/dist/cjs/utils/permission-initializer.d.ts +15 -0
  92. package/dist/cjs/utils/permission-initializer.d.ts.map +1 -0
  93. package/dist/cjs/utils/permission-initializer.js +173 -0
  94. package/dist/cjs/utils/permission-initializer.js.map +1 -0
  95. package/dist/cjs/websocket/RealtimeAdapter.d.ts +22 -0
  96. package/dist/cjs/websocket/RealtimeAdapter.d.ts.map +1 -0
  97. package/dist/cjs/websocket/RealtimeAdapter.js +3 -0
  98. package/dist/cjs/websocket/RealtimeAdapter.js.map +1 -0
  99. package/dist/cjs/websocket/SSEManager.d.ts +40 -0
  100. package/dist/cjs/websocket/SSEManager.d.ts.map +1 -0
  101. package/dist/cjs/websocket/SSEManager.js +268 -0
  102. package/dist/cjs/websocket/SSEManager.js.map +1 -0
  103. package/dist/cjs/websocket/WebSocketManager.d.ts +28 -0
  104. package/dist/cjs/websocket/WebSocketManager.d.ts.map +1 -0
  105. package/dist/cjs/websocket/WebSocketManager.js +156 -0
  106. package/dist/cjs/websocket/WebSocketManager.js.map +1 -0
  107. package/dist/cjs/websocket/index.d.ts +4 -0
  108. package/dist/cjs/websocket/index.d.ts.map +1 -0
  109. package/dist/cjs/websocket/index.js +20 -0
  110. package/dist/cjs/websocket/index.js.map +1 -0
  111. package/dist/esm/adapters/base.d.ts +20 -0
  112. package/dist/esm/adapters/base.d.ts.map +1 -0
  113. package/dist/esm/adapters/base.js +10 -0
  114. package/dist/esm/adapters/base.js.map +1 -0
  115. package/dist/esm/adapters/index.d.ts +6 -0
  116. package/dist/esm/adapters/index.d.ts.map +1 -0
  117. package/dist/esm/adapters/index.js +19 -0
  118. package/dist/esm/adapters/index.js.map +1 -0
  119. package/dist/esm/adapters/postgres.d.ts +13 -0
  120. package/dist/esm/adapters/postgres.d.ts.map +1 -0
  121. package/dist/esm/adapters/postgres.js +47 -0
  122. package/dist/esm/adapters/postgres.js.map +1 -0
  123. package/dist/esm/adapters/sqlite.d.ts +13 -0
  124. package/dist/esm/adapters/sqlite.d.ts.map +1 -0
  125. package/dist/esm/adapters/sqlite.js +43 -0
  126. package/dist/esm/adapters/sqlite.js.map +1 -0
  127. package/dist/esm/adapters/types.d.ts +8 -0
  128. package/dist/esm/adapters/types.d.ts.map +1 -0
  129. package/dist/esm/adapters/types.js +2 -0
  130. package/dist/esm/adapters/types.js.map +1 -0
  131. package/dist/esm/database.d.ts +73 -0
  132. package/dist/esm/database.d.ts.map +1 -0
  133. package/dist/esm/database.js +668 -0
  134. package/dist/esm/database.js.map +1 -0
  135. package/dist/esm/errors.d.ts +37 -0
  136. package/dist/esm/errors.d.ts.map +1 -0
  137. package/dist/esm/errors.js +55 -0
  138. package/dist/esm/errors.js.map +1 -0
  139. package/dist/esm/index.d.ts +16 -0
  140. package/dist/esm/index.d.ts.map +1 -0
  141. package/dist/esm/index.js +15 -0
  142. package/dist/esm/index.js.map +1 -0
  143. package/dist/esm/kysely-hooks.d.ts +45 -0
  144. package/dist/esm/kysely-hooks.d.ts.map +1 -0
  145. package/dist/esm/kysely-hooks.js +86 -0
  146. package/dist/esm/kysely-hooks.js.map +1 -0
  147. package/dist/esm/libsql/example.d.ts +2 -0
  148. package/dist/esm/libsql/example.d.ts.map +1 -0
  149. package/dist/esm/libsql/example.js +42 -0
  150. package/dist/esm/libsql/example.js.map +1 -0
  151. package/dist/esm/libsql/index.d.ts +36 -0
  152. package/dist/esm/libsql/index.d.ts.map +1 -0
  153. package/dist/esm/libsql/index.js +116 -0
  154. package/dist/esm/libsql/index.js.map +1 -0
  155. package/dist/esm/permissionService.d.ts +20 -0
  156. package/dist/esm/permissionService.d.ts.map +1 -0
  157. package/dist/esm/permissionService.js +103 -0
  158. package/dist/esm/permissionService.js.map +1 -0
  159. package/dist/esm/rlsFunctionRegistry.d.ts +43 -0
  160. package/dist/esm/rlsFunctionRegistry.d.ts.map +1 -0
  161. package/dist/esm/rlsFunctionRegistry.js +60 -0
  162. package/dist/esm/rlsFunctionRegistry.js.map +1 -0
  163. package/dist/esm/rlsManager.d.ts +23 -0
  164. package/dist/esm/rlsManager.d.ts.map +1 -0
  165. package/dist/esm/rlsManager.js +366 -0
  166. package/dist/esm/rlsManager.js.map +1 -0
  167. package/dist/esm/schema.d.ts +15 -0
  168. package/dist/esm/schema.d.ts.map +1 -0
  169. package/dist/esm/schema.js +113 -0
  170. package/dist/esm/schema.js.map +1 -0
  171. package/dist/esm/sdk/client.d.ts +324 -0
  172. package/dist/esm/sdk/client.d.ts.map +1 -0
  173. package/dist/esm/sdk/client.js +550 -0
  174. package/dist/esm/sdk/client.js.map +1 -0
  175. package/dist/esm/sdk/examples.d.ts +68 -0
  176. package/dist/esm/sdk/examples.d.ts.map +1 -0
  177. package/dist/esm/sdk/examples.js +229 -0
  178. package/dist/esm/sdk/examples.js.map +1 -0
  179. package/dist/esm/sdk/server.d.ts +115 -0
  180. package/dist/esm/sdk/server.d.ts.map +1 -0
  181. package/dist/esm/sdk/server.js +136 -0
  182. package/dist/esm/sdk/server.js.map +1 -0
  183. package/dist/esm/types.d.ts +217 -0
  184. package/dist/esm/types.d.ts.map +1 -0
  185. package/dist/esm/types.js +2 -0
  186. package/dist/esm/types.js.map +1 -0
  187. package/dist/esm/utils/column-utils.d.ts +8 -0
  188. package/dist/esm/utils/column-utils.d.ts.map +1 -0
  189. package/dist/esm/utils/column-utils.js +127 -0
  190. package/dist/esm/utils/column-utils.js.map +1 -0
  191. package/dist/esm/utils/db.d.ts +2 -0
  192. package/dist/esm/utils/db.d.ts.map +1 -0
  193. package/dist/esm/utils/db.js +3 -0
  194. package/dist/esm/utils/db.js.map +1 -0
  195. package/dist/esm/utils/inspector.d.ts +39 -0
  196. package/dist/esm/utils/inspector.d.ts.map +1 -0
  197. package/dist/esm/utils/inspector.js +160 -0
  198. package/dist/esm/utils/inspector.js.map +1 -0
  199. package/dist/esm/utils/permission-initializer.d.ts +15 -0
  200. package/dist/esm/utils/permission-initializer.d.ts.map +1 -0
  201. package/dist/esm/utils/permission-initializer.js +137 -0
  202. package/dist/esm/utils/permission-initializer.js.map +1 -0
  203. package/dist/esm/websocket/RealtimeAdapter.d.ts +22 -0
  204. package/dist/esm/websocket/RealtimeAdapter.d.ts.map +1 -0
  205. package/dist/esm/websocket/RealtimeAdapter.js +2 -0
  206. package/dist/esm/websocket/RealtimeAdapter.js.map +1 -0
  207. package/dist/esm/websocket/SSEManager.d.ts +40 -0
  208. package/dist/esm/websocket/SSEManager.d.ts.map +1 -0
  209. package/dist/esm/websocket/SSEManager.js +231 -0
  210. package/dist/esm/websocket/SSEManager.js.map +1 -0
  211. package/dist/esm/websocket/WebSocketManager.d.ts +28 -0
  212. package/dist/esm/websocket/WebSocketManager.d.ts.map +1 -0
  213. package/dist/esm/websocket/WebSocketManager.js +152 -0
  214. package/dist/esm/websocket/WebSocketManager.js.map +1 -0
  215. package/dist/esm/websocket/index.d.ts +4 -0
  216. package/dist/esm/websocket/index.d.ts.map +1 -0
  217. package/dist/esm/websocket/index.js +4 -0
  218. package/dist/esm/websocket/index.js.map +1 -0
  219. package/package.json +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-initializer.d.ts","sourceRoot":"","sources":["../../../src/utils/permission-initializer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,8BAA8B,EAC9B,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,MAAM,EAAE,EACxB,kBAAkB,EAAE,gBAAgB,EACpC,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,IAAI,GAC5D,OAAO,CAAC,IAAI,CAAC,CAqFf"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.initializePermissions = initializePermissions;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ async function initializePermissions(db, permissionService, dbInspector, excludedTables, defaultPermissions, reportPath, onComplete) {
40
+ // Start the initialization process in the background
41
+ setTimeout(async () => {
42
+ const report = {
43
+ startTime: new Date(),
44
+ endTime: new Date(),
45
+ totalTables: 0,
46
+ tablesWithPermissions: 0,
47
+ tablesInitialized: 0,
48
+ tablesExcluded: 0,
49
+ initializedTables: [],
50
+ existingPermissionTables: [],
51
+ excludedTables: [],
52
+ errors: [],
53
+ };
54
+ try {
55
+ // Get all tables
56
+ const allTables = await dbInspector.getTables();
57
+ // Filter out excluded tables
58
+ const tablesToProcess = allTables.filter((table) => !excludedTables.includes(table));
59
+ report.totalTables = allTables.length;
60
+ report.tablesExcluded = allTables.length - tablesToProcess.length;
61
+ report.excludedTables = excludedTables;
62
+ // Process each table
63
+ for (const table of tablesToProcess) {
64
+ try {
65
+ // Check if the table already has permissions
66
+ const existingPermissions = await permissionService.getPermissionsForTable(table);
67
+ if (existingPermissions &&
68
+ Object.keys(existingPermissions).length > 0) {
69
+ // Table already has permissions
70
+ report.tablesWithPermissions++;
71
+ report.existingPermissionTables.push(table);
72
+ }
73
+ else {
74
+ // Table doesn't have permissions, set default permissions
75
+ await permissionService.setPermissionsForTable(table, defaultPermissions);
76
+ report.tablesInitialized++;
77
+ report.initializedTables.push(table);
78
+ }
79
+ }
80
+ catch (error) {
81
+ // Log the error and continue with the next table
82
+ const errorMessage = error instanceof Error ? error.message : String(error);
83
+ report.errors.push({ table, error: errorMessage });
84
+ console.error(`Error initializing permissions for table ${table}:`, error);
85
+ }
86
+ }
87
+ }
88
+ catch (error) {
89
+ const errorMessage = error instanceof Error ? error.message : String(error);
90
+ report.errors.push({ table: 'global', error: errorMessage });
91
+ console.error('Error during permission initialization:', error);
92
+ }
93
+ finally {
94
+ // Update the end time
95
+ report.endTime = new Date();
96
+ // Generate the report file if a path is provided
97
+ if (reportPath) {
98
+ generateReportFile(report, reportPath);
99
+ }
100
+ // Call the callback if provided
101
+ if (onComplete) {
102
+ onComplete(report);
103
+ }
104
+ console.log('Permission initialization completed');
105
+ }
106
+ }, 0);
107
+ }
108
+ /**
109
+ * Generates a report file with the initialization results
110
+ * @param report The initialization report
111
+ * @param reportPath Path where to save the report
112
+ */
113
+ function generateReportFile(report, reportPath) {
114
+ try {
115
+ // Ensure the directory exists
116
+ const dir = path.dirname(reportPath);
117
+ if (!fs.existsSync(dir)) {
118
+ fs.mkdirSync(dir, { recursive: true });
119
+ }
120
+ // Format the report as a readable string
121
+ const formattedReport = formatReportAsMarkdown(report);
122
+ // Write the report to the file
123
+ fs.writeFileSync(reportPath, formattedReport);
124
+ console.log(`Permission initialization report saved to ${reportPath}`);
125
+ }
126
+ catch (error) {
127
+ console.error('Error generating report file:', error);
128
+ }
129
+ }
130
+ /**
131
+ * Formats the report as a markdown string
132
+ * @param report The initialization report
133
+ * @returns Formatted report as markdown
134
+ */
135
+ function formatReportAsMarkdown(report) {
136
+ const duration = (report.endTime.getTime() - report.startTime.getTime()) / 1000;
137
+ return `# ForgeBase Permission Initialization Report
138
+
139
+ ## Summary
140
+ - **Start Time**: ${report.startTime.toISOString()}
141
+ - **End Time**: ${report.endTime.toISOString()}
142
+ - **Duration**: ${duration.toFixed(2)} seconds
143
+ - **Total Tables**: ${report.totalTables}
144
+ - **Tables with Existing Permissions**: ${report.tablesWithPermissions}
145
+ - **Tables Initialized**: ${report.tablesInitialized}
146
+ - **Tables Excluded**: ${report.tablesExcluded}
147
+
148
+ ## Details
149
+
150
+ ### Tables Initialized (${report.initializedTables.length})
151
+ ${report.initializedTables.length > 0
152
+ ? report.initializedTables.map((table) => `- \`${table}\``).join('\n')
153
+ : '- None'}
154
+
155
+ ### Tables with Existing Permissions (${report.existingPermissionTables.length})
156
+ ${report.existingPermissionTables.length > 0
157
+ ? report.existingPermissionTables
158
+ .map((table) => `- \`${table}\``)
159
+ .join('\n')
160
+ : '- None'}
161
+
162
+ ### Excluded Tables (${report.excludedTables.length})
163
+ ${report.excludedTables.length > 0
164
+ ? report.excludedTables.map((table) => `- \`${table}\``).join('\n')
165
+ : '- None'}
166
+
167
+ ### Errors (${report.errors.length})
168
+ ${report.errors.length > 0
169
+ ? report.errors.map((err) => `- \`${err.table}\`: ${err.error}`).join('\n')
170
+ : '- None'}
171
+ `;
172
+ }
173
+ //# sourceMappingURL=permission-initializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-initializer.js","sourceRoot":"","sources":["../../../src/utils/permission-initializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Interface for realtime adapters that can be used for database table broadcasts
3
+ */
4
+ export interface RealtimeAdapter {
5
+ /**
6
+ * Initialize the adapter
7
+ */
8
+ initialize(): void;
9
+ /**
10
+ * Broadcast a message to all clients subscribed to a table
11
+ * @param tableName The name of the table
12
+ * @param event The event type (create, update, delete)
13
+ * @param data The data to broadcast
14
+ */
15
+ broadcast(tableName: string, event: string, data: any): Promise<void>;
16
+ /**
17
+ * Get the port the adapter is listening on
18
+ */
19
+ getPort(): number;
20
+ handleRequest?(request: Request): Promise<Response>;
21
+ }
22
+ //# sourceMappingURL=RealtimeAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealtimeAdapter.d.ts","sourceRoot":"","sources":["../../../src/websocket/RealtimeAdapter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,UAAU,IAAI,IAAI,CAAC;IAEnB;;;;;OAKG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;OAEG;IACH,OAAO,IAAI,MAAM,CAAC;IAElB,aAAa,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACrD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=RealtimeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealtimeAdapter.js","sourceRoot":"","sources":["../../../src/websocket/RealtimeAdapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { PermissionService } from '../permissionService';
2
+ import { RealtimeAdapter } from './RealtimeAdapter';
3
+ export declare class SSEManager implements RealtimeAdapter {
4
+ private port;
5
+ private permissionService;
6
+ private sseAdapter;
7
+ constructor(port: number, permissionService: PermissionService);
8
+ /**
9
+ * Initialize the SSE server
10
+ */
11
+ initialize(): Promise<void>;
12
+ private setupSSEServer;
13
+ private canSubscribe;
14
+ /**
15
+ * Broadcast a message to all clients subscribed to a table
16
+ * @param tableName The name of the table
17
+ * @param event The event type (create, update, delete)
18
+ * @param data The data to broadcast
19
+ */
20
+ broadcast(tableName: string, event: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<void>;
21
+ /**
22
+ * Get the port the SSE server is listening on
23
+ * @returns The port number
24
+ */
25
+ getPort(): number;
26
+ /**
27
+ * Get the SSE adapter instance
28
+ * This can be used to integrate with an HTTP server
29
+ * @returns The SSE adapter instance
30
+ */
31
+ getSSEAdapter(): Promise<any>;
32
+ /**
33
+ * Handle an incoming HTTP request
34
+ * This method can be used to integrate with any HTTP server framework
35
+ * @param request The HTTP request object (must be compatible with the Fetch API Request)
36
+ * @returns A Response object
37
+ */
38
+ handleRequest(request: Request): Promise<Response>;
39
+ }
40
+ //# sourceMappingURL=SSEManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSEManager.d.ts","sourceRoot":"","sources":["../../../src/websocket/SSEManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA0BpD,qBAAa,UAAW,YAAW,eAAe;IAI9C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,iBAAiB;IAJ3B,OAAO,CAAC,UAAU,CAAkB;gBAG1B,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,iBAAiB;IAS9C;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAI1B,cAAc;YA6Jd,YAAY;IAmB1B;;;;;OAKG;IACU,SAAS,CACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACxD,OAAO,CAAC,IAAI,CAAC;IAiChB;;;OAGG;IACI,OAAO,IAAI,MAAM;IAIxB;;;;OAIG;IACU,aAAa;IAW1B;;;;;OAKG;IACU,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CAoBhE"}
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SSEManager = void 0;
37
+ const rlsManager_1 = require("../rlsManager");
38
+ class SSEManager {
39
+ constructor(port, permissionService) {
40
+ this.port = port;
41
+ this.permissionService = permissionService;
42
+ // Call initialize but don't await it here
43
+ // This allows the constructor to return synchronously
44
+ this.initialize().catch((error) => {
45
+ console.error('Failed to initialize SSE adapter:', error);
46
+ });
47
+ }
48
+ /**
49
+ * Initialize the SSE server
50
+ */
51
+ async initialize() {
52
+ await this.setupSSEServer();
53
+ }
54
+ async setupSSEServer() {
55
+ // Dynamically import the SSE adapter
56
+ const { default: sseAdapter } = await Promise.resolve().then(() => __importStar(require('crossws/adapters/sse')));
57
+ this.sseAdapter = sseAdapter({
58
+ bidir: true, // Enable bidirectional messaging support
59
+ hooks: {
60
+ upgrade: (request) => {
61
+ // Extract user context from request headers
62
+ let userContext;
63
+ try {
64
+ const userContextHeader = request.headers.get('userContext');
65
+ // console.log('sse request context', request.context);
66
+ // console.log('sse request header', request.headers);
67
+ if (userContextHeader) {
68
+ console.log('userContextHeader', userContextHeader);
69
+ userContext = JSON.parse(userContextHeader);
70
+ }
71
+ if (!userContext) {
72
+ // return new Response('Authentication required', { status: 401 });
73
+ userContext = {
74
+ userId: '1',
75
+ role: 'user',
76
+ labels: [],
77
+ teams: [],
78
+ permissions: [],
79
+ };
80
+ }
81
+ }
82
+ catch (error) {
83
+ console.error('Error parsing user context:', error);
84
+ return new Response('Invalid user context', { status: 400 });
85
+ }
86
+ request.context.userContext = userContext;
87
+ // In case of bidirectional mode, extra auth is recommended based on request
88
+ // return {
89
+ // headers: {},
90
+ // };
91
+ },
92
+ open: (peer) => {
93
+ // Send welcome message
94
+ peer.send(JSON.stringify({
95
+ type: 'welcome',
96
+ message: `Welcome ${peer.id}`,
97
+ }));
98
+ },
99
+ message: async (peer, message) => {
100
+ try {
101
+ // Handle both string and ReadableStream message types
102
+ let messageData;
103
+ console.log('message', typeof message);
104
+ console.log('message event', message.event);
105
+ console.log('message peer', message.peer);
106
+ console.log('message data', message.data);
107
+ console.log('message text', message.text());
108
+ // console.log('message json', message.json());
109
+ console.log('message blob', message.blob);
110
+ console.log('message array', message.uint8Array().toString());
111
+ console.log('message array buffer', message.arrayBuffer());
112
+ if (message instanceof ReadableStream) {
113
+ const reader = message.getReader();
114
+ const { value } = await reader.read();
115
+ messageData = new TextDecoder().decode(value);
116
+ }
117
+ else {
118
+ messageData = message.toString();
119
+ }
120
+ console.log('Received message:', messageData);
121
+ const msg = JSON.parse(messageData);
122
+ if (msg.type === 'subscribe' && msg.tableName) {
123
+ // Get user context from peer data
124
+ const userContext = peer.context.userContext;
125
+ if (!userContext) {
126
+ peer.send(JSON.stringify({
127
+ type: 'error',
128
+ message: 'Authentication required',
129
+ }));
130
+ return;
131
+ }
132
+ // Check table permissions
133
+ const permissions = await this.permissionService.getPermissionsForTable(msg.tableName);
134
+ if (!permissions) {
135
+ peer.send(JSON.stringify({
136
+ type: 'error',
137
+ message: 'Table not found',
138
+ }));
139
+ return;
140
+ }
141
+ // Check if user can subscribe
142
+ const canSubscribe = await this.canSubscribe(userContext, permissions);
143
+ if (!canSubscribe) {
144
+ peer.send(JSON.stringify({
145
+ type: 'error',
146
+ message: 'Permission denied',
147
+ }));
148
+ return;
149
+ }
150
+ // Subscribe the peer to the table channel
151
+ peer.subscribe(`table:${msg.tableName}`);
152
+ peer.send(JSON.stringify({
153
+ type: 'subscribed',
154
+ tableName: msg.tableName,
155
+ }));
156
+ }
157
+ else if (msg.type === 'unsubscribe' && msg.tableName) {
158
+ // Unsubscribe from the table channel
159
+ peer.unsubscribe(`table:${msg.tableName}`);
160
+ peer.send(JSON.stringify({
161
+ type: 'unsubscribed',
162
+ tableName: msg.tableName,
163
+ }));
164
+ }
165
+ }
166
+ catch (error) {
167
+ console.error('Error handling message:', error);
168
+ peer.send(JSON.stringify({
169
+ type: 'error',
170
+ message: 'Invalid message format',
171
+ }));
172
+ }
173
+ },
174
+ close: (peer) => {
175
+ // No need to manually clean up subscriptions
176
+ // crossws handles this automatically
177
+ console.log(`Client ${peer.id} disconnected`);
178
+ },
179
+ },
180
+ });
181
+ }
182
+ async canSubscribe(userContext, permissions) {
183
+ if (!permissions.operations.SELECT)
184
+ return false;
185
+ // Create a copy of the rules without fieldCheck
186
+ const selectRules = permissions.operations.SELECT;
187
+ const rulesWithoutFieldCheck = selectRules.map((rule) => {
188
+ // Using destructuring to remove fieldCheck from the rule
189
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
190
+ const { fieldCheck, ...ruleWithoutFieldCheck } = rule;
191
+ return ruleWithoutFieldCheck;
192
+ });
193
+ // Check if the user has the required permissions to subscribe
194
+ return (0, rlsManager_1.evaluatePermission)(rulesWithoutFieldCheck, userContext);
195
+ }
196
+ /**
197
+ * Broadcast a message to all clients subscribed to a table
198
+ * @param tableName The name of the table
199
+ * @param event The event type (create, update, delete)
200
+ * @param data The data to broadcast
201
+ */
202
+ async broadcast(tableName, event, data) {
203
+ // Check if the SSE adapter is initialized
204
+ if (!this.sseAdapter) {
205
+ console.warn('SSE adapter not initialized yet. Waiting for initialization...');
206
+ await this.initialize();
207
+ }
208
+ // Get permissions for the table
209
+ const permissions = await this.permissionService.getPermissionsForTable(tableName);
210
+ if (!permissions || !permissions.operations.SELECT)
211
+ return;
212
+ // Prepare the data to broadcast
213
+ const dataArray = Array.isArray(data) ? data : [data];
214
+ // Publish to the table channel
215
+ // Note: In a real implementation, we would filter data based on user permissions
216
+ // But since we're using pub/sub, all subscribers will receive the same message
217
+ // FIXME: Assess the permissions for each row
218
+ const message = JSON.stringify({
219
+ event,
220
+ tableName,
221
+ data: dataArray,
222
+ });
223
+ // Use the SSE adapter to publish to all subscribers of this table
224
+ this.sseAdapter.publish(`table:${tableName}`, message);
225
+ }
226
+ /**
227
+ * Get the port the SSE server is listening on
228
+ * @returns The port number
229
+ */
230
+ getPort() {
231
+ return this.port;
232
+ }
233
+ /**
234
+ * Get the SSE adapter instance
235
+ * This can be used to integrate with an HTTP server
236
+ * @returns The SSE adapter instance
237
+ */
238
+ async getSSEAdapter() {
239
+ // Check if the SSE adapter is initialized
240
+ if (!this.sseAdapter) {
241
+ console.warn('SSE adapter not initialized yet. Waiting for initialization...');
242
+ await this.initialize();
243
+ }
244
+ return this.sseAdapter;
245
+ }
246
+ /**
247
+ * Handle an incoming HTTP request
248
+ * This method can be used to integrate with any HTTP server framework
249
+ * @param request The HTTP request object (must be compatible with the Fetch API Request)
250
+ * @returns A Response object
251
+ */
252
+ async handleRequest(request) {
253
+ // Check if the SSE adapter is initialized
254
+ if (!this.sseAdapter) {
255
+ console.warn('SSE adapter not initialized yet. Waiting for initialization...');
256
+ await this.initialize();
257
+ }
258
+ // Check if this is an SSE request
259
+ if (request.headers.get('accept') === 'text/event-stream' ||
260
+ request.headers.has('x-crossws-id')) {
261
+ return this.sseAdapter.fetch(request);
262
+ }
263
+ // Return 404 for non-SSE requests
264
+ return new Response('Not found', { status: 404 });
265
+ }
266
+ }
267
+ exports.SSEManager = SSEManager;
268
+ //# sourceMappingURL=SSEManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSEManager.js","sourceRoot":"","sources":["../../../src/websocket/SSEManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,8CAAmD;AA4BnD,MAAa,UAAU;IAGrB,YACU,IAAY,EACZ,iBAAoC;QADpC,SAAI,GAAJ,IAAI,CAAQ;QACZ,sBAAiB,GAAjB,iBAAiB,CAAmB;QAE5C,0CAA0C;QAC1C,sDAAsD;QACtD,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU;QACrB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,qCAAqC;QACrC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;QAErE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC3B,KAAK,EAAE,IAAI,EAAE,yCAAyC;YACtD,KAAK,EAAE;gBACL,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;oBACnB,4CAA4C;oBAC5C,IAAI,WAAoC,CAAC;oBACzC,IAAI,CAAC;wBACH,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBAC7D,uDAAuD;wBACvD,sDAAsD;wBACtD,IAAI,iBAAiB,EAAE,CAAC;4BACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;4BACpD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;wBAC9C,CAAC;wBAED,IAAI,CAAC,WAAW,EAAE,CAAC;4BACjB,mEAAmE;4BACnE,WAAW,GAAG;gCACZ,MAAM,EAAE,GAAG;gCACX,IAAI,EAAE,MAAM;gCACZ,MAAM,EAAE,EAAE;gCACV,KAAK,EAAE,EAAE;gCACT,WAAW,EAAE,EAAE;6BAChB,CAAC;wBACJ,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;wBACpD,OAAO,IAAI,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;oBAC/D,CAAC;oBACD,OAAO,CAAC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;oBAC1C,4EAA4E;oBAC5E,WAAW;oBACX,iBAAiB;oBACjB,KAAK;gBACP,CAAC;gBACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;oBACb,uBAAuB;oBACvB,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,WAAW,IAAI,CAAC,EAAE,EAAE;qBAC9B,CAAC,CACH,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;oBAC/B,IAAI,CAAC;wBACH,sDAAsD;wBACtD,IAAI,WAAmB,CAAC;wBACxB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,OAAO,CAAC,CAAC;wBACvC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;wBAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;wBAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;wBAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC5C,+CAA+C;wBAC/C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;wBAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAC9D,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;wBAC3D,IAAI,OAAO,YAAY,cAAc,EAAE,CAAC;4BACtC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;4BACnC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;4BACtC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAChD,CAAC;6BAAM,CAAC;4BACN,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;wBACnC,CAAC;wBACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;wBAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAkB,CAAC;wBAErD,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;4BAC9C,kCAAkC;4BAClC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAEpB,CAAC;4BAEd,IAAI,CAAC,WAAW,EAAE,CAAC;gCACjB,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;oCACb,IAAI,EAAE,OAAO;oCACb,OAAO,EAAE,yBAAyB;iCACnC,CAAC,CACH,CAAC;gCACF,OAAO;4BACT,CAAC;4BAED,0BAA0B;4BAC1B,MAAM,WAAW,GACf,MAAM,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CACjD,GAAG,CAAC,SAAS,CACd,CAAC;4BAEJ,IAAI,CAAC,WAAW,EAAE,CAAC;gCACjB,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;oCACb,IAAI,EAAE,OAAO;oCACb,OAAO,EAAE,iBAAiB;iCAC3B,CAAC,CACH,CAAC;gCACF,OAAO;4BACT,CAAC;4BAED,8BAA8B;4BAC9B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAC1C,WAAW,EACX,WAAW,CACZ,CAAC;4BACF,IAAI,CAAC,YAAY,EAAE,CAAC;gCAClB,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;oCACb,IAAI,EAAE,OAAO;oCACb,OAAO,EAAE,mBAAmB;iCAC7B,CAAC,CACH,CAAC;gCACF,OAAO;4BACT,CAAC;4BAED,0CAA0C;4BAC1C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;4BAEzC,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;gCACb,IAAI,EAAE,YAAY;gCAClB,SAAS,EAAE,GAAG,CAAC,SAAS;6BACzB,CAAC,CACH,CAAC;wBACJ,CAAC;6BAAM,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;4BACvD,qCAAqC;4BACrC,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;4BAE3C,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;gCACb,IAAI,EAAE,cAAc;gCACpB,SAAS,EAAE,GAAG,CAAC,SAAS;6BACzB,CAAC,CACH,CAAC;wBACJ,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;wBAChD,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;4BACb,IAAI,EAAE,OAAO;4BACb,OAAO,EAAE,wBAAwB;yBAClC,CAAC,CACH,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;oBACd,6CAA6C;oBAC7C,qCAAqC;oBACrC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;gBAChD,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,WAAwB,EACxB,WAA6B;QAE7B,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAEjD,gDAAgD;QAChD,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;QAClD,MAAM,sBAAsB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACtD,yDAAyD;YACzD,6DAA6D;YAC7D,MAAM,EAAE,UAAU,EAAE,GAAG,qBAAqB,EAAE,GAAG,IAAI,CAAC;YACtD,OAAO,qBAAqB,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,8DAA8D;QAC9D,OAAO,IAAA,+BAAkB,EAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,SAAS,CACpB,SAAiB,EACjB,KAAa,EACb,IAAyD;QAEzD,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,gEAAgE,CACjE,CAAC;YACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAED,gCAAgC;QAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CACrE,SAAS,CACV,CAAC;QAEF,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM;YAAE,OAAO;QAE3D,gCAAgC;QAChC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEtD,+BAA+B;QAC/B,iFAAiF;QACjF,+EAA+E;QAC/E,6CAA6C;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,KAAK;YACL,SAAS;YACT,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,kEAAkE;QAClE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,aAAa;QACxB,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,gEAAgE,CACjE,CAAC;YACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,aAAa,CAAC,OAAgB;QACzC,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,gEAAgE,CACjE,CAAC;YACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAED,kCAAkC;QAClC,IACE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,mBAAmB;YACrD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EACnC,CAAC;YACD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,kCAAkC;QAClC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;CACF;AAlSD,gCAkSC"}
@@ -0,0 +1,28 @@
1
+ import { PermissionService } from '../permissionService';
2
+ import { RealtimeAdapter } from './RealtimeAdapter';
3
+ export declare class WebSocketManager implements RealtimeAdapter {
4
+ private port;
5
+ private permissionService;
6
+ private app;
7
+ private clients;
8
+ private tableSubscriptions;
9
+ constructor(port: number, permissionService: PermissionService);
10
+ /**
11
+ * Initialize the WebSocket server
12
+ */
13
+ initialize(): void;
14
+ private setupWebSocketServer;
15
+ private handleSubscribe;
16
+ private handleUnsubscribe;
17
+ private removeClient;
18
+ private canSubscribe;
19
+ private processBatch;
20
+ broadcast(tableName: string, event: string, data: any): Promise<void>;
21
+ private sendError;
22
+ /**
23
+ * Get the port the WebSocket server is listening on
24
+ * @returns The port number
25
+ */
26
+ getPort(): number;
27
+ }
28
+ //# sourceMappingURL=WebSocketManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketManager.d.ts","sourceRoot":"","sources":["../../../src/websocket/WebSocketManager.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD,qBAAa,gBAAiB,YAAW,eAAe;IAMpD,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,iBAAiB;IAN3B,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,kBAAkB,CAAuC;gBAGvD,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,iBAAiB;IAM9C;;OAEG;IACI,UAAU,IAAI,IAAI;IAIzB,OAAO,CAAC,oBAAoB;YAyDd,eAAe;IAuB7B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,YAAY;YAON,YAAY;YAoBZ,YAAY;IAsCb,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IA2BlE,OAAO,CAAC,SAAS;IAIjB;;;OAGG;IACI,OAAO,IAAI,MAAM;CAGzB"}