@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.
- package/LICENSE +21 -0
- package/README.md +470 -0
- package/dist/cjs/adapters/base.d.ts +20 -0
- package/dist/cjs/adapters/base.d.ts.map +1 -0
- package/dist/cjs/adapters/base.js +13 -0
- package/dist/cjs/adapters/base.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +6 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/index.js +24 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/postgres.d.ts +13 -0
- package/dist/cjs/adapters/postgres.d.ts.map +1 -0
- package/dist/cjs/adapters/postgres.js +51 -0
- package/dist/cjs/adapters/postgres.js.map +1 -0
- package/dist/cjs/adapters/sqlite.d.ts +13 -0
- package/dist/cjs/adapters/sqlite.d.ts.map +1 -0
- package/dist/cjs/adapters/sqlite.js +47 -0
- package/dist/cjs/adapters/sqlite.js.map +1 -0
- package/dist/cjs/adapters/types.d.ts +8 -0
- package/dist/cjs/adapters/types.d.ts.map +1 -0
- package/dist/cjs/adapters/types.js +3 -0
- package/dist/cjs/adapters/types.js.map +1 -0
- package/dist/cjs/database.d.ts +73 -0
- package/dist/cjs/database.d.ts.map +1 -0
- package/dist/cjs/database.js +673 -0
- package/dist/cjs/database.js.map +1 -0
- package/dist/cjs/errors.d.ts +37 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +64 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +16 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/kysely-hooks.d.ts +45 -0
- package/dist/cjs/kysely-hooks.d.ts.map +1 -0
- package/dist/cjs/kysely-hooks.js +93 -0
- package/dist/cjs/kysely-hooks.js.map +1 -0
- package/dist/cjs/libsql/example.d.ts +2 -0
- package/dist/cjs/libsql/example.d.ts.map +1 -0
- package/dist/cjs/libsql/example.js +44 -0
- package/dist/cjs/libsql/example.js.map +1 -0
- package/dist/cjs/libsql/index.d.ts +36 -0
- package/dist/cjs/libsql/index.d.ts.map +1 -0
- package/dist/cjs/libsql/index.js +155 -0
- package/dist/cjs/libsql/index.js.map +1 -0
- package/dist/cjs/permissionService.d.ts +20 -0
- package/dist/cjs/permissionService.d.ts.map +1 -0
- package/dist/cjs/permissionService.js +107 -0
- package/dist/cjs/permissionService.js.map +1 -0
- package/dist/cjs/rlsFunctionRegistry.d.ts +43 -0
- package/dist/cjs/rlsFunctionRegistry.d.ts.map +1 -0
- package/dist/cjs/rlsFunctionRegistry.js +63 -0
- package/dist/cjs/rlsFunctionRegistry.js.map +1 -0
- package/dist/cjs/rlsManager.d.ts +23 -0
- package/dist/cjs/rlsManager.d.ts.map +1 -0
- package/dist/cjs/rlsManager.js +371 -0
- package/dist/cjs/rlsManager.js.map +1 -0
- package/dist/cjs/schema.d.ts +15 -0
- package/dist/cjs/schema.d.ts.map +1 -0
- package/dist/cjs/schema.js +119 -0
- package/dist/cjs/schema.js.map +1 -0
- package/dist/cjs/sdk/client.d.ts +324 -0
- package/dist/cjs/sdk/client.d.ts.map +1 -0
- package/dist/cjs/sdk/client.js +554 -0
- package/dist/cjs/sdk/client.js.map +1 -0
- package/dist/cjs/sdk/examples.d.ts +68 -0
- package/dist/cjs/sdk/examples.d.ts.map +1 -0
- package/dist/cjs/sdk/examples.js +232 -0
- package/dist/cjs/sdk/examples.js.map +1 -0
- package/dist/cjs/sdk/server.d.ts +115 -0
- package/dist/cjs/sdk/server.d.ts.map +1 -0
- package/dist/cjs/sdk/server.js +140 -0
- package/dist/cjs/sdk/server.js.map +1 -0
- package/dist/cjs/types.d.ts +217 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/column-utils.d.ts +8 -0
- package/dist/cjs/utils/column-utils.d.ts.map +1 -0
- package/dist/cjs/utils/column-utils.js +131 -0
- package/dist/cjs/utils/column-utils.js.map +1 -0
- package/dist/cjs/utils/db.d.ts +2 -0
- package/dist/cjs/utils/db.d.ts.map +1 -0
- package/dist/cjs/utils/db.js +6 -0
- package/dist/cjs/utils/db.js.map +1 -0
- package/dist/cjs/utils/inspector.d.ts +39 -0
- package/dist/cjs/utils/inspector.d.ts.map +1 -0
- package/dist/cjs/utils/inspector.js +164 -0
- package/dist/cjs/utils/inspector.js.map +1 -0
- package/dist/cjs/utils/permission-initializer.d.ts +15 -0
- package/dist/cjs/utils/permission-initializer.d.ts.map +1 -0
- package/dist/cjs/utils/permission-initializer.js +173 -0
- package/dist/cjs/utils/permission-initializer.js.map +1 -0
- package/dist/cjs/websocket/RealtimeAdapter.d.ts +22 -0
- package/dist/cjs/websocket/RealtimeAdapter.d.ts.map +1 -0
- package/dist/cjs/websocket/RealtimeAdapter.js +3 -0
- package/dist/cjs/websocket/RealtimeAdapter.js.map +1 -0
- package/dist/cjs/websocket/SSEManager.d.ts +40 -0
- package/dist/cjs/websocket/SSEManager.d.ts.map +1 -0
- package/dist/cjs/websocket/SSEManager.js +268 -0
- package/dist/cjs/websocket/SSEManager.js.map +1 -0
- package/dist/cjs/websocket/WebSocketManager.d.ts +28 -0
- package/dist/cjs/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/cjs/websocket/WebSocketManager.js +156 -0
- package/dist/cjs/websocket/WebSocketManager.js.map +1 -0
- package/dist/cjs/websocket/index.d.ts +4 -0
- package/dist/cjs/websocket/index.d.ts.map +1 -0
- package/dist/cjs/websocket/index.js +20 -0
- package/dist/cjs/websocket/index.js.map +1 -0
- package/dist/esm/adapters/base.d.ts +20 -0
- package/dist/esm/adapters/base.d.ts.map +1 -0
- package/dist/esm/adapters/base.js +10 -0
- package/dist/esm/adapters/base.js.map +1 -0
- package/dist/esm/adapters/index.d.ts +6 -0
- package/dist/esm/adapters/index.d.ts.map +1 -0
- package/dist/esm/adapters/index.js +19 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/postgres.d.ts +13 -0
- package/dist/esm/adapters/postgres.d.ts.map +1 -0
- package/dist/esm/adapters/postgres.js +47 -0
- package/dist/esm/adapters/postgres.js.map +1 -0
- package/dist/esm/adapters/sqlite.d.ts +13 -0
- package/dist/esm/adapters/sqlite.d.ts.map +1 -0
- package/dist/esm/adapters/sqlite.js +43 -0
- package/dist/esm/adapters/sqlite.js.map +1 -0
- package/dist/esm/adapters/types.d.ts +8 -0
- package/dist/esm/adapters/types.d.ts.map +1 -0
- package/dist/esm/adapters/types.js +2 -0
- package/dist/esm/adapters/types.js.map +1 -0
- package/dist/esm/database.d.ts +73 -0
- package/dist/esm/database.d.ts.map +1 -0
- package/dist/esm/database.js +668 -0
- package/dist/esm/database.js.map +1 -0
- package/dist/esm/errors.d.ts +37 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +55 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/kysely-hooks.d.ts +45 -0
- package/dist/esm/kysely-hooks.d.ts.map +1 -0
- package/dist/esm/kysely-hooks.js +86 -0
- package/dist/esm/kysely-hooks.js.map +1 -0
- package/dist/esm/libsql/example.d.ts +2 -0
- package/dist/esm/libsql/example.d.ts.map +1 -0
- package/dist/esm/libsql/example.js +42 -0
- package/dist/esm/libsql/example.js.map +1 -0
- package/dist/esm/libsql/index.d.ts +36 -0
- package/dist/esm/libsql/index.d.ts.map +1 -0
- package/dist/esm/libsql/index.js +116 -0
- package/dist/esm/libsql/index.js.map +1 -0
- package/dist/esm/permissionService.d.ts +20 -0
- package/dist/esm/permissionService.d.ts.map +1 -0
- package/dist/esm/permissionService.js +103 -0
- package/dist/esm/permissionService.js.map +1 -0
- package/dist/esm/rlsFunctionRegistry.d.ts +43 -0
- package/dist/esm/rlsFunctionRegistry.d.ts.map +1 -0
- package/dist/esm/rlsFunctionRegistry.js +60 -0
- package/dist/esm/rlsFunctionRegistry.js.map +1 -0
- package/dist/esm/rlsManager.d.ts +23 -0
- package/dist/esm/rlsManager.d.ts.map +1 -0
- package/dist/esm/rlsManager.js +366 -0
- package/dist/esm/rlsManager.js.map +1 -0
- package/dist/esm/schema.d.ts +15 -0
- package/dist/esm/schema.d.ts.map +1 -0
- package/dist/esm/schema.js +113 -0
- package/dist/esm/schema.js.map +1 -0
- package/dist/esm/sdk/client.d.ts +324 -0
- package/dist/esm/sdk/client.d.ts.map +1 -0
- package/dist/esm/sdk/client.js +550 -0
- package/dist/esm/sdk/client.js.map +1 -0
- package/dist/esm/sdk/examples.d.ts +68 -0
- package/dist/esm/sdk/examples.d.ts.map +1 -0
- package/dist/esm/sdk/examples.js +229 -0
- package/dist/esm/sdk/examples.js.map +1 -0
- package/dist/esm/sdk/server.d.ts +115 -0
- package/dist/esm/sdk/server.d.ts.map +1 -0
- package/dist/esm/sdk/server.js +136 -0
- package/dist/esm/sdk/server.js.map +1 -0
- package/dist/esm/types.d.ts +217 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/column-utils.d.ts +8 -0
- package/dist/esm/utils/column-utils.d.ts.map +1 -0
- package/dist/esm/utils/column-utils.js +127 -0
- package/dist/esm/utils/column-utils.js.map +1 -0
- package/dist/esm/utils/db.d.ts +2 -0
- package/dist/esm/utils/db.d.ts.map +1 -0
- package/dist/esm/utils/db.js +3 -0
- package/dist/esm/utils/db.js.map +1 -0
- package/dist/esm/utils/inspector.d.ts +39 -0
- package/dist/esm/utils/inspector.d.ts.map +1 -0
- package/dist/esm/utils/inspector.js +160 -0
- package/dist/esm/utils/inspector.js.map +1 -0
- package/dist/esm/utils/permission-initializer.d.ts +15 -0
- package/dist/esm/utils/permission-initializer.d.ts.map +1 -0
- package/dist/esm/utils/permission-initializer.js +137 -0
- package/dist/esm/utils/permission-initializer.js.map +1 -0
- package/dist/esm/websocket/RealtimeAdapter.d.ts +22 -0
- package/dist/esm/websocket/RealtimeAdapter.d.ts.map +1 -0
- package/dist/esm/websocket/RealtimeAdapter.js +2 -0
- package/dist/esm/websocket/RealtimeAdapter.js.map +1 -0
- package/dist/esm/websocket/SSEManager.d.ts +40 -0
- package/dist/esm/websocket/SSEManager.d.ts.map +1 -0
- package/dist/esm/websocket/SSEManager.js +231 -0
- package/dist/esm/websocket/SSEManager.js.map +1 -0
- package/dist/esm/websocket/WebSocketManager.d.ts +28 -0
- package/dist/esm/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/esm/websocket/WebSocketManager.js +152 -0
- package/dist/esm/websocket/WebSocketManager.js.map +1 -0
- package/dist/esm/websocket/index.d.ts +4 -0
- package/dist/esm/websocket/index.d.ts.map +1 -0
- package/dist/esm/websocket/index.js +4 -0
- package/dist/esm/websocket/index.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|