prostgles-server 4.2.183 → 4.2.185
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/.github/workflows/main.yml +15 -15
- package/.prettierignore +2 -0
- package/README.md +1 -1
- package/dist/Auth/AuthHandler.d.ts +1 -1
- package/dist/Auth/AuthHandler.d.ts.map +1 -1
- package/dist/Auth/AuthHandler.js +64 -32
- package/dist/Auth/AuthHandler.js.map +1 -1
- package/dist/Auth/AuthTypes.d.ts +15 -1
- package/dist/Auth/AuthTypes.d.ts.map +1 -1
- package/dist/Auth/getSafeReturnURL.d.ts.map +1 -1
- package/dist/Auth/getSafeReturnURL.js.map +1 -1
- package/dist/Auth/sendEmail.d.ts.map +1 -1
- package/dist/Auth/sendEmail.js +6 -6
- package/dist/Auth/sendEmail.js.map +1 -1
- package/dist/Auth/setAuthProviders.d.ts +1 -1
- package/dist/Auth/setAuthProviders.d.ts.map +1 -1
- package/dist/Auth/setAuthProviders.js +15 -8
- package/dist/Auth/setAuthProviders.js.map +1 -1
- package/dist/Auth/setEmailProvider.d.ts.map +1 -1
- package/dist/Auth/setEmailProvider.js +23 -4
- package/dist/Auth/setEmailProvider.js.map +1 -1
- package/dist/Auth/setupAuthRoutes.d.ts.map +1 -1
- package/dist/Auth/setupAuthRoutes.js +27 -9
- package/dist/Auth/setupAuthRoutes.js.map +1 -1
- package/dist/DBEventsManager.d.ts.map +1 -1
- package/dist/DBEventsManager.js +24 -19
- package/dist/DBEventsManager.js.map +1 -1
- package/dist/DBSchemaBuilder.d.ts.map +1 -1
- package/dist/DBSchemaBuilder.js +18 -5
- package/dist/DBSchemaBuilder.js.map +1 -1
- package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +7 -2
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.d.ts +4 -4
- package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions.d.ts +2 -2
- package/dist/DboBuilder/QueryBuilder/Functions.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions.js +293 -173
- package/dist/DboBuilder/QueryBuilder/Functions.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts +2 -2
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js +52 -29
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.js +51 -32
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getNewQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getNewQuery.js +48 -25
- package/dist/DboBuilder/QueryBuilder/getNewQuery.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.d.ts +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.js +32 -23
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.js.map +1 -1
- package/dist/DboBuilder/QueryStreamer.d.ts +2 -2
- package/dist/DboBuilder/QueryStreamer.d.ts.map +1 -1
- package/dist/DboBuilder/QueryStreamer.js +68 -23
- package/dist/DboBuilder/QueryStreamer.js.map +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.js +79 -43
- package/dist/DboBuilder/TableHandler/DataValidator.js.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.js +39 -15
- package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
- package/dist/DboBuilder/TableHandler/delete.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/delete.js +44 -13
- package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insert.js +81 -22
- package/dist/DboBuilder/TableHandler/insert.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insertTest.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insertTest.js.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js +7 -4
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js +24 -5
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js.map +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/update.js +16 -4
- package/dist/DboBuilder/TableHandler/update.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateBatch.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateBatch.js +33 -10
- package/dist/DboBuilder/TableHandler/updateBatch.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.js +24 -6
- package/dist/DboBuilder/TableHandler/updateFile.js.map +1 -1
- package/dist/DboBuilder/TableHandler/upsert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/upsert.js +22 -6
- package/dist/DboBuilder/TableHandler/upsert.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +5 -5
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.js +64 -36
- package/dist/DboBuilder/ViewHandler/ViewHandler.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/count.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/count.js +21 -7
- package/dist/DboBuilder/ViewHandler/count.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/find.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/find.js +76 -22
- package/dist/DboBuilder/ViewHandler/find.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js +19 -10
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsFilters.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsFilters.js +12 -5
- package/dist/DboBuilder/ViewHandler/getExistsFilters.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.js +27 -9
- package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.d.ts +2 -2
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.js +42 -23
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js +22 -9
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.d.ts +4 -4
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.js +13 -11
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.d.ts +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js +44 -29
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareSortItems.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareSortItems.js +36 -27
- package/dist/DboBuilder/ViewHandler/prepareSortItems.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.js +16 -12
- package/dist/DboBuilder/ViewHandler/prepareWhere.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/size.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/size.js +24 -7
- package/dist/DboBuilder/ViewHandler/size.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.js +40 -12
- package/dist/DboBuilder/ViewHandler/subscribe.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/validateViewRules.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/validateViewRules.js +20 -5
- package/dist/DboBuilder/ViewHandler/validateViewRules.js.map +1 -1
- package/dist/DboBuilder/dboBuilderUtils.d.ts.map +1 -1
- package/dist/DboBuilder/dboBuilderUtils.js +18 -7
- package/dist/DboBuilder/dboBuilderUtils.js.map +1 -1
- package/dist/DboBuilder/getColumns.d.ts.map +1 -1
- package/dist/DboBuilder/getColumns.js +22 -7
- package/dist/DboBuilder/getColumns.js.map +1 -1
- package/dist/DboBuilder/getCondition.d.ts.map +1 -1
- package/dist/DboBuilder/getCondition.js +43 -30
- package/dist/DboBuilder/getCondition.js.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.js +38 -27
- package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js +9 -9
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js.map +1 -1
- package/dist/DboBuilder/insertNestedRecords.d.ts +3 -3
- package/dist/DboBuilder/insertNestedRecords.d.ts.map +1 -1
- package/dist/DboBuilder/insertNestedRecords.js +79 -44
- package/dist/DboBuilder/insertNestedRecords.js.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.d.ts.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.js +38 -14
- package/dist/DboBuilder/parseUpdateRules.js.map +1 -1
- package/dist/DboBuilder/prepareShortestJoinPaths.d.ts.map +1 -1
- package/dist/DboBuilder/prepareShortestJoinPaths.js +56 -31
- package/dist/DboBuilder/prepareShortestJoinPaths.js.map +1 -1
- package/dist/DboBuilder/runSQL.d.ts.map +1 -1
- package/dist/DboBuilder/runSQL.js +41 -21
- package/dist/DboBuilder/runSQL.js.map +1 -1
- package/dist/DboBuilder/runTransaction.d.ts +1 -1
- package/dist/DboBuilder/runTransaction.d.ts.map +1 -1
- package/dist/DboBuilder/runTransaction.js +2 -2
- package/dist/DboBuilder/runTransaction.js.map +1 -1
- package/dist/DboBuilder/sqlErrCodeToMsg.d.ts.map +1 -1
- package/dist/DboBuilder/sqlErrCodeToMsg.js +297 -38
- package/dist/DboBuilder/sqlErrCodeToMsg.js.map +1 -1
- package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
- package/dist/DboBuilder/uploadFile.js +33 -9
- package/dist/DboBuilder/uploadFile.js.map +1 -1
- package/dist/Event_Trigger_Tags.d.ts +1 -1
- package/dist/Event_Trigger_Tags.d.ts.map +1 -1
- package/dist/Event_Trigger_Tags.js +1 -1
- package/dist/Event_Trigger_Tags.js.map +1 -1
- package/dist/FileManager/FileManager.d.ts.map +1 -1
- package/dist/FileManager/FileManager.js +6 -3
- package/dist/FileManager/FileManager.js.map +1 -1
- package/dist/FileManager/getValidatedFileType.d.ts.map +1 -1
- package/dist/FileManager/getValidatedFileType.js +18 -16
- package/dist/FileManager/getValidatedFileType.js.map +1 -1
- package/dist/FileManager/initFileManager.d.ts.map +1 -1
- package/dist/FileManager/initFileManager.js +7 -1
- package/dist/FileManager/initFileManager.js.map +1 -1
- package/dist/FileManager/upload.d.ts +1 -1
- package/dist/FileManager/upload.d.ts.map +1 -1
- package/dist/FileManager/upload.js +3 -3
- package/dist/FileManager/upload.js.map +1 -1
- package/dist/FileManager/uploadStream.d.ts +1 -1
- package/dist/FileManager/uploadStream.d.ts.map +1 -1
- package/dist/FileManager/uploadStream.js +6 -7
- package/dist/FileManager/uploadStream.js.map +1 -1
- package/dist/Filtering.d.ts +3 -3
- package/dist/Filtering.d.ts.map +1 -1
- package/dist/Filtering.js +70 -37
- package/dist/Filtering.js.map +1 -1
- package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -1
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js +1 -4
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js.map +1 -1
- package/dist/JSONBValidation/validation.d.ts.map +1 -1
- package/dist/JSONBValidation/validation.js +46 -24
- package/dist/JSONBValidation/validation.js.map +1 -1
- package/dist/Logging.d.ts +2 -2
- package/dist/Logging.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.js +20 -22
- package/dist/PostgresNotifListenManager.js.map +1 -1
- package/dist/Prostgles.d.ts +1 -1
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +37 -11
- package/dist/Prostgles.js.map +1 -1
- package/dist/ProstglesTypes.d.ts.map +1 -1
- package/dist/ProstglesTypes.js +6 -1
- package/dist/ProstglesTypes.js.map +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +10 -5
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/dist/PubSubManager/addSub.d.ts.map +1 -1
- package/dist/PubSubManager/addSub.js +4 -6
- package/dist/PubSubManager/addSub.js.map +1 -1
- package/dist/PubSubManager/addSync.d.ts.map +1 -1
- package/dist/PubSubManager/addSync.js +10 -6
- package/dist/PubSubManager/addSync.js.map +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.d.ts.map +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js +3 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js.map +1 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.d.ts.map +1 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.js +8 -8
- package/dist/PubSubManager/getPubSubManagerInitQuery.js.map +1 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +7 -9
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/dist/PubSubManager/notifListener.d.ts.map +1 -1
- package/dist/PubSubManager/notifListener.js +23 -12
- package/dist/PubSubManager/notifListener.js.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.d.ts.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.js.map +1 -1
- package/dist/PubSubManager/pushSubData.d.ts.map +1 -1
- package/dist/PubSubManager/pushSubData.js +1 -1
- package/dist/PubSubManager/pushSubData.js.map +1 -1
- package/dist/PublishParser/PublishParser.d.ts +1 -1
- package/dist/PublishParser/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser/PublishParser.js +25 -14
- package/dist/PublishParser/PublishParser.js.map +1 -1
- package/dist/PublishParser/getFileTableRules.d.ts.map +1 -1
- package/dist/PublishParser/getFileTableRules.js +23 -16
- package/dist/PublishParser/getFileTableRules.js.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.d.ts.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.js +39 -16
- package/dist/PublishParser/getSchemaFromPublish.js.map +1 -1
- package/dist/PublishParser/getTableRulesWithoutFileTable.d.ts.map +1 -1
- package/dist/PublishParser/getTableRulesWithoutFileTable.js +42 -22
- package/dist/PublishParser/getTableRulesWithoutFileTable.js.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.js +5 -1
- package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
- package/dist/RestApi.d.ts +1 -1
- package/dist/RestApi.d.ts.map +1 -1
- package/dist/RestApi.js +1 -1
- package/dist/RestApi.js.map +1 -1
- package/dist/SchemaWatch/SchemaWatch.d.ts +2 -2
- package/dist/SchemaWatch/SchemaWatch.d.ts.map +1 -1
- package/dist/SchemaWatch/SchemaWatch.js +11 -9
- package/dist/SchemaWatch/SchemaWatch.js.map +1 -1
- package/dist/SchemaWatch/getValidatedWatchSchemaType.d.ts.map +1 -1
- package/dist/SchemaWatch/getValidatedWatchSchemaType.js +3 -3
- package/dist/SchemaWatch/getValidatedWatchSchemaType.js.map +1 -1
- package/dist/SchemaWatch/getWatchSchemaTagList.d.ts.map +1 -1
- package/dist/SchemaWatch/getWatchSchemaTagList.js +12 -6
- package/dist/SchemaWatch/getWatchSchemaTagList.js.map +1 -1
- package/dist/SyncReplication.d.ts.map +1 -1
- package/dist/SyncReplication.js +84 -42
- package/dist/SyncReplication.js.map +1 -1
- package/dist/TableConfig/TableConfig.d.ts +5 -5
- package/dist/TableConfig/TableConfig.d.ts.map +1 -1
- package/dist/TableConfig/TableConfig.js +18 -5
- package/dist/TableConfig/TableConfig.js.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts +2 -2
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.js +20 -9
- package/dist/TableConfig/getColumnDefinitionQuery.js.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +3 -3
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.js +12 -7
- package/dist/TableConfig/getConstraintDefinitionQueries.js.map +1 -1
- package/dist/TableConfig/getFutureTableSchema.d.ts +1 -1
- package/dist/TableConfig/getFutureTableSchema.d.ts.map +1 -1
- package/dist/TableConfig/getFutureTableSchema.js +6 -4
- package/dist/TableConfig/getFutureTableSchema.js.map +1 -1
- package/dist/TableConfig/getPGIndexes.d.ts.map +1 -1
- package/dist/TableConfig/getPGIndexes.js.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.d.ts +1 -1
- package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.js +38 -19
- package/dist/TableConfig/getTableColumnQueries.js.map +1 -1
- package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.js +91 -43
- package/dist/TableConfig/initTableConfig.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/initProstgles.d.ts.map +1 -1
- package/dist/initProstgles.js +14 -10
- package/dist/initProstgles.js.map +1 -1
- package/dist/onSocketConnected.d.ts.map +1 -1
- package/dist/onSocketConnected.js +38 -16
- package/dist/onSocketConnected.js.map +1 -1
- package/dist/runClientRequest.d.ts.map +1 -1
- package/dist/runClientRequest.js +33 -14
- package/dist/runClientRequest.js.map +1 -1
- package/dist/shortestPath.d.ts.map +1 -1
- package/dist/shortestPath.js +1 -1
- package/dist/shortestPath.js.map +1 -1
- package/dist/typeTests/dboTypeCheck.js.map +1 -1
- package/examples/full-example-typescript/DBoGenerated.d.ts +112 -54
- package/examples/full-example-typescript/DBoGenerated.js +3 -3
- package/examples/full-example-typescript/home.html +28 -26
- package/examples/full-example-typescript/index.d.ts +1 -1
- package/examples/full-example-typescript/index.js +80 -53
- package/examples/full-example-vanilla/home.html +151 -125
- package/examples/server/javascript/index.js +17 -19
- package/lib/Auth/AuthHandler.ts +234 -155
- package/lib/Auth/AuthTypes.ts +27 -4
- package/lib/Auth/getSafeReturnURL.ts +35 -21
- package/lib/Auth/sendEmail.ts +34 -31
- package/lib/Auth/setAuthProviders.ts +94 -71
- package/lib/Auth/setEmailProvider.ts +45 -27
- package/lib/Auth/setupAuthRoutes.ts +164 -100
- package/lib/DBEventsManager.ts +87 -65
- package/lib/DBSchemaBuilder.ts +62 -28
- package/lib/DboBuilder/DboBuilder.ts +45 -21
- package/lib/DboBuilder/DboBuilderTypes.ts +99 -95
- package/lib/DboBuilder/QueryBuilder/Functions.ts +862 -580
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.ts +202 -141
- package/lib/DboBuilder/QueryBuilder/getJoinQuery.ts +199 -124
- package/lib/DboBuilder/QueryBuilder/getNewQuery.ts +209 -148
- package/lib/DboBuilder/QueryBuilder/getSelectQuery.ts +101 -75
- package/lib/DboBuilder/QueryBuilder/prepareHaving.ts +10 -5
- package/lib/DboBuilder/QueryStreamer.ts +207 -100
- package/lib/DboBuilder/TableHandler/DataValidator.ts +253 -148
- package/lib/DboBuilder/TableHandler/TableHandler.ts +155 -60
- package/lib/DboBuilder/TableHandler/delete.ts +82 -29
- package/lib/DboBuilder/TableHandler/insert.ts +177 -81
- package/lib/DboBuilder/TableHandler/insertTest.ts +13 -7
- package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +35 -21
- package/lib/DboBuilder/TableHandler/runInsertUpdateQuery.ts +95 -45
- package/lib/DboBuilder/TableHandler/update.ts +54 -14
- package/lib/DboBuilder/TableHandler/updateBatch.ts +59 -21
- package/lib/DboBuilder/TableHandler/updateFile.ts +57 -26
- package/lib/DboBuilder/TableHandler/upsert.ts +58 -13
- package/lib/DboBuilder/ViewHandler/ViewHandler.ts +264 -121
- package/lib/DboBuilder/ViewHandler/count.ts +56 -25
- package/lib/DboBuilder/ViewHandler/find.ts +153 -68
- package/lib/DboBuilder/ViewHandler/getExistsCondition.ts +59 -32
- package/lib/DboBuilder/ViewHandler/getExistsFilters.ts +31 -19
- package/lib/DboBuilder/ViewHandler/getInfo.ts +47 -16
- package/lib/DboBuilder/ViewHandler/getTableJoinQuery.ts +91 -57
- package/lib/DboBuilder/ViewHandler/parseComplexFilter.ts +51 -29
- package/lib/DboBuilder/ViewHandler/parseFieldFilter.ts +35 -29
- package/lib/DboBuilder/ViewHandler/parseJoinPath.ts +130 -76
- package/lib/DboBuilder/ViewHandler/prepareSortItems.ts +140 -92
- package/lib/DboBuilder/ViewHandler/prepareWhere.ts +66 -26
- package/lib/DboBuilder/ViewHandler/size.ts +56 -22
- package/lib/DboBuilder/ViewHandler/subscribe.ts +122 -46
- package/lib/DboBuilder/ViewHandler/validateViewRules.ts +39 -14
- package/lib/DboBuilder/dboBuilderUtils.ts +41 -18
- package/lib/DboBuilder/getColumns.ts +44 -12
- package/lib/DboBuilder/getCondition.ts +120 -79
- package/lib/DboBuilder/getSubscribeRelatedTables.ts +144 -83
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.ts +61 -44
- package/lib/DboBuilder/insertNestedRecords.ts +370 -235
- package/lib/DboBuilder/parseUpdateRules.ts +117 -61
- package/lib/DboBuilder/prepareShortestJoinPaths.ts +115 -56
- package/lib/DboBuilder/runSQL.ts +135 -74
- package/lib/DboBuilder/runTransaction.ts +27 -16
- package/lib/DboBuilder/sqlErrCodeToMsg.ts +502 -244
- package/lib/DboBuilder/uploadFile.ts +67 -31
- package/lib/Event_Trigger_Tags.ts +6 -4
- package/lib/FileManager/FileManager.ts +53 -21
- package/lib/FileManager/getValidatedFileType.ts +79 -35
- package/lib/FileManager/initFileManager.ts +21 -9
- package/lib/FileManager/upload.ts +21 -19
- package/lib/FileManager/uploadStream.ts +33 -34
- package/lib/Filtering.ts +249 -197
- package/lib/JSONBValidation/validate_jsonb_schema_sql.ts +2 -7
- package/lib/JSONBValidation/validation.ts +147 -82
- package/lib/Logging.ts +107 -97
- package/lib/PostgresNotifListenManager.ts +96 -63
- package/lib/Prostgles.ts +106 -35
- package/lib/ProstglesTypes.ts +31 -9
- package/lib/PubSubManager/PubSubManager.ts +62 -27
- package/lib/PubSubManager/addSub.ts +56 -37
- package/lib/PubSubManager/addSync.ts +50 -33
- package/lib/PubSubManager/getCreatePubSubManagerError.ts +29 -21
- package/lib/PubSubManager/getPubSubManagerInitQuery.ts +45 -27
- package/lib/PubSubManager/initPubSubManager.ts +27 -18
- package/lib/PubSubManager/notifListener.ts +77 -59
- package/lib/PubSubManager/orphanTriggerCheck.ts +5 -4
- package/lib/PubSubManager/pushSubData.ts +11 -9
- package/lib/PublishParser/PublishParser.ts +102 -44
- package/lib/PublishParser/getFileTableRules.ts +97 -54
- package/lib/PublishParser/getSchemaFromPublish.ts +146 -74
- package/lib/PublishParser/getTableRulesWithoutFileTable.ts +101 -51
- package/lib/PublishParser/publishTypesAndUtils.ts +74 -23
- package/lib/RestApi.ts +10 -2
- package/lib/SchemaWatch/SchemaWatch.ts +52 -34
- package/lib/SchemaWatch/createSchemaWatchEventTrigger.ts +1 -1
- package/lib/SchemaWatch/getValidatedWatchSchemaType.ts +32 -22
- package/lib/SchemaWatch/getWatchSchemaTagList.ts +24 -16
- package/lib/SyncReplication.ts +376 -190
- package/lib/TableConfig/TableConfig.ts +200 -136
- package/lib/TableConfig/getColumnDefinitionQuery.ts +65 -44
- package/lib/TableConfig/getConstraintDefinitionQueries.ts +41 -25
- package/lib/TableConfig/getFutureTableSchema.ts +31 -21
- package/lib/TableConfig/getPGIndexes.ts +7 -4
- package/lib/TableConfig/getTableColumnQueries.ts +101 -54
- package/lib/TableConfig/initTableConfig.ts +192 -101
- package/lib/index.ts +6 -5
- package/lib/initProstgles.ts +57 -51
- package/lib/onSocketConnected.ts +75 -40
- package/lib/runClientRequest.ts +148 -79
- package/lib/shortestPath.ts +80 -76
- package/lib/typeTests/DBoGenerated.d.ts +5 -1
- package/lib/typeTests/dboTypeCheck.ts +8 -8
- package/package.json +1 -1
package/lib/SyncReplication.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
PubSubManager,
|
|
3
|
+
SyncParams,
|
|
4
|
+
pickKeys,
|
|
5
|
+
omitKeys,
|
|
6
|
+
log,
|
|
7
|
+
} from "./PubSubManager/PubSubManager";
|
|
3
8
|
import { OrderBy, WAL, AnyObject, SyncBatchParams } from "prostgles-types";
|
|
4
9
|
import { TableHandler } from "./DboBuilder/TableHandler/TableHandler";
|
|
5
10
|
|
|
@@ -19,7 +24,7 @@ export type ServerSyncInfo = Partial<{
|
|
|
19
24
|
* PG count is ussually string due to bigint
|
|
20
25
|
*/
|
|
21
26
|
s_count: number | string;
|
|
22
|
-
}
|
|
27
|
+
}>;
|
|
23
28
|
|
|
24
29
|
export type SyncBatchInfo = Partial<{
|
|
25
30
|
from_synced: number | null;
|
|
@@ -27,44 +32,65 @@ export type SyncBatchInfo = Partial<{
|
|
|
27
32
|
end_offset: number | null;
|
|
28
33
|
}>;
|
|
29
34
|
|
|
30
|
-
export type onSyncRequestResponse =
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
export type onSyncRequestResponse =
|
|
36
|
+
| {
|
|
37
|
+
onSyncRequest?: ClientSyncInfo;
|
|
38
|
+
}
|
|
39
|
+
| {
|
|
40
|
+
err: AnyObject | string;
|
|
41
|
+
};
|
|
35
42
|
|
|
36
43
|
export type ClientExpressData = ClientSyncInfo & {
|
|
37
44
|
data?: AnyObject[];
|
|
38
45
|
deleted?: AnyObject[];
|
|
39
|
-
}
|
|
46
|
+
};
|
|
40
47
|
|
|
41
|
-
function getNumbers(
|
|
42
|
-
|
|
48
|
+
function getNumbers(
|
|
49
|
+
numberArr: (null | undefined | string | number)[],
|
|
50
|
+
): number[] {
|
|
51
|
+
return numberArr.filter(
|
|
52
|
+
(v) => v !== null && v !== undefined && Number.isFinite(+v),
|
|
53
|
+
) as any;
|
|
43
54
|
}
|
|
44
55
|
|
|
45
56
|
/**
|
|
46
57
|
* Server or client requested data sync
|
|
47
58
|
*/
|
|
48
|
-
export async function syncData
|
|
49
|
-
|
|
59
|
+
export async function syncData(
|
|
60
|
+
this: PubSubManager,
|
|
61
|
+
sync: SyncParams,
|
|
62
|
+
clientData: ClientExpressData | undefined,
|
|
63
|
+
source: "trigger" | "client",
|
|
64
|
+
) {
|
|
65
|
+
await this._log({
|
|
50
66
|
type: "sync",
|
|
51
|
-
command: "syncData",
|
|
67
|
+
command: "syncData",
|
|
52
68
|
tableName: sync.table_name,
|
|
53
69
|
sid: sync.sid,
|
|
54
70
|
source,
|
|
55
71
|
...pickKeys(sync, ["socket_id", "condition", "last_synced", "is_syncing"]),
|
|
56
72
|
lr: JSON.stringify(sync.lr),
|
|
57
|
-
connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map(
|
|
73
|
+
connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map(
|
|
74
|
+
(s) => s.id,
|
|
75
|
+
),
|
|
58
76
|
localParams: undefined,
|
|
59
77
|
duration: -1,
|
|
60
|
-
socketId: sync.socket_id
|
|
78
|
+
socketId: sync.socket_id,
|
|
61
79
|
});
|
|
62
80
|
|
|
63
81
|
const {
|
|
64
|
-
socket_id,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
82
|
+
socket_id,
|
|
83
|
+
channel_name,
|
|
84
|
+
table_name,
|
|
85
|
+
filter,
|
|
86
|
+
table_rules,
|
|
87
|
+
allow_delete = false,
|
|
88
|
+
params,
|
|
89
|
+
synced_field,
|
|
90
|
+
id_fields = [],
|
|
91
|
+
batch_size,
|
|
92
|
+
wal,
|
|
93
|
+
throttle = 0,
|
|
68
94
|
} = sync;
|
|
69
95
|
|
|
70
96
|
const socket = this.sockets[socket_id];
|
|
@@ -73,93 +99,149 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
73
99
|
}
|
|
74
100
|
|
|
75
101
|
const sync_fields = [synced_field, ...id_fields.sort()],
|
|
76
|
-
orderByAsc: OrderBy = sync_fields.reduce(
|
|
102
|
+
orderByAsc: OrderBy = sync_fields.reduce(
|
|
103
|
+
(a, v) => ({ ...a, [v]: true }),
|
|
104
|
+
{},
|
|
105
|
+
),
|
|
77
106
|
rowsIdsMatch = (a?: AnyObject, b?: AnyObject) => {
|
|
78
|
-
return
|
|
107
|
+
return (
|
|
108
|
+
a &&
|
|
109
|
+
b &&
|
|
110
|
+
!id_fields.find((key) => a[key].toString() !== b[key].toString())
|
|
111
|
+
);
|
|
79
112
|
},
|
|
80
113
|
rowsFullyMatch = (a?: AnyObject, b?: AnyObject) => {
|
|
81
|
-
return
|
|
114
|
+
return (
|
|
115
|
+
rowsIdsMatch(a, b) &&
|
|
116
|
+
a?.[synced_field].toString() === b?.[synced_field].toString()
|
|
117
|
+
);
|
|
82
118
|
},
|
|
83
|
-
getServerRowInfo = async (
|
|
119
|
+
getServerRowInfo = async (
|
|
120
|
+
args: SyncBatchParams = {},
|
|
121
|
+
): Promise<ServerSyncInfo> => {
|
|
84
122
|
const { from_synced = null, to_synced = null, offset = 0, limit } = args;
|
|
85
123
|
const _filter: AnyObject = { ...filter };
|
|
86
124
|
|
|
87
125
|
if (from_synced || to_synced) {
|
|
88
126
|
_filter[synced_field] = {
|
|
89
127
|
...(from_synced ? { $gte: from_synced } : {}),
|
|
90
|
-
...(to_synced ? { $lte: to_synced } : {})
|
|
91
|
-
}
|
|
128
|
+
...(to_synced ? { $lte: to_synced } : {}),
|
|
129
|
+
};
|
|
92
130
|
}
|
|
93
|
-
if (
|
|
131
|
+
if (
|
|
132
|
+
this.dbo?.[table_name]?.find === undefined ||
|
|
133
|
+
this?.dbo?.[table_name]?.count === undefined
|
|
134
|
+
) {
|
|
94
135
|
throw `dbo.${table_name}.find or .count are missing or not allowed`;
|
|
95
136
|
}
|
|
96
137
|
|
|
97
|
-
const first_rows = await this.dbo?.[table_name]?.find?.(
|
|
138
|
+
const first_rows = await this.dbo?.[table_name]?.find?.(
|
|
139
|
+
_filter,
|
|
140
|
+
{ orderBy: orderByAsc, select: sync_fields, limit, offset },
|
|
141
|
+
undefined,
|
|
142
|
+
table_rules,
|
|
143
|
+
);
|
|
98
144
|
const last_rows = first_rows?.slice(-1); // Why not logic below?
|
|
99
145
|
// const last_rows = await _this?.dbo[table_name]?.find?.(_filter, { orderBy: (orderByDesc as OrderBy), select: sync_fields, limit: 1, offset: -offset || 0 }, null, table_rules);
|
|
100
|
-
const count = await this.dbo?.[table_name]?.count?.(
|
|
101
|
-
|
|
102
|
-
|
|
146
|
+
const count = await this.dbo?.[table_name]?.count?.(
|
|
147
|
+
_filter,
|
|
148
|
+
undefined,
|
|
149
|
+
undefined,
|
|
150
|
+
table_rules,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
s_fr: first_rows?.[0] || null,
|
|
155
|
+
s_lr: last_rows?.[0] || null,
|
|
156
|
+
s_count: count,
|
|
157
|
+
};
|
|
103
158
|
},
|
|
104
159
|
getClientRowInfo = (args: SyncBatchInfo = {}) => {
|
|
105
160
|
const { from_synced = null, to_synced = null, end_offset = null } = args;
|
|
106
161
|
const res = new Promise<any>((resolve, reject) => {
|
|
107
|
-
const onSyncRequest = { from_synced, to_synced, end_offset }
|
|
108
|
-
socket.emit(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
162
|
+
const onSyncRequest = { from_synced, to_synced, end_offset }; //, forReal: true };
|
|
163
|
+
socket.emit(
|
|
164
|
+
channel_name,
|
|
165
|
+
{ onSyncRequest },
|
|
166
|
+
(resp?: onSyncRequestResponse) => {
|
|
167
|
+
if (resp && "onSyncRequest" in resp && resp?.onSyncRequest) {
|
|
168
|
+
const c_fr = resp.onSyncRequest.c_fr,
|
|
169
|
+
c_lr = resp.onSyncRequest.c_lr,
|
|
170
|
+
c_count = resp.onSyncRequest.c_count;
|
|
171
|
+
|
|
172
|
+
// console.log(onSyncRequest, { c_fr, c_lr, c_count }, socket._user);
|
|
173
|
+
return resolve({ c_fr, c_lr, c_count });
|
|
174
|
+
} else if (resp && "err" in resp && resp?.err) {
|
|
175
|
+
reject(resp.err);
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
);
|
|
120
179
|
});
|
|
121
180
|
|
|
122
181
|
return res;
|
|
123
182
|
},
|
|
124
183
|
getClientData = (from_synced = 0, offset = 0): Promise<AnyObject[]> => {
|
|
125
184
|
return new Promise((resolve, reject) => {
|
|
126
|
-
const onPullRequest = {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
185
|
+
const onPullRequest = {
|
|
186
|
+
from_synced: from_synced || 0,
|
|
187
|
+
offset: offset || 0,
|
|
188
|
+
limit: batch_size,
|
|
189
|
+
};
|
|
190
|
+
socket.emit(
|
|
191
|
+
channel_name,
|
|
192
|
+
{ onPullRequest },
|
|
193
|
+
async (resp?: { data?: AnyObject[] }) => {
|
|
194
|
+
if (resp && resp.data && Array.isArray(resp.data)) {
|
|
195
|
+
// console.log({ onPullRequest, resp }, socket._user)
|
|
196
|
+
resolve(sortClientData(resp.data));
|
|
197
|
+
} else {
|
|
198
|
+
reject(
|
|
199
|
+
"unexpected onPullRequest response: " + JSON.stringify(resp),
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
);
|
|
135
204
|
});
|
|
136
205
|
|
|
137
206
|
function sortClientData(data: AnyObject[]) {
|
|
138
207
|
return data.sort((a, b) => {
|
|
139
208
|
/* Order by increasing synced and ids (sorted alphabetically) */
|
|
140
|
-
return (
|
|
209
|
+
return (
|
|
210
|
+
+a[synced_field] - +b[synced_field] ||
|
|
211
|
+
id_fields
|
|
212
|
+
.sort()
|
|
213
|
+
.map((idKey) =>
|
|
214
|
+
a[idKey] < b[idKey] ? -1 : a[idKey] > b[idKey] ? 1 : 0,
|
|
215
|
+
)
|
|
216
|
+
.find((v) => v) ||
|
|
217
|
+
0
|
|
218
|
+
);
|
|
141
219
|
});
|
|
142
220
|
}
|
|
143
221
|
},
|
|
144
|
-
getServerData = async (
|
|
222
|
+
getServerData = async (
|
|
223
|
+
from_synced = 0,
|
|
224
|
+
offset = 0,
|
|
225
|
+
): Promise<AnyObject[]> => {
|
|
145
226
|
const _filter = {
|
|
146
227
|
...filter,
|
|
147
|
-
[synced_field]: { $gte: from_synced || 0 }
|
|
228
|
+
[synced_field]: { $gte: from_synced || 0 },
|
|
148
229
|
};
|
|
149
230
|
|
|
150
|
-
if (!this?.dbo?.[table_name]?.find)
|
|
231
|
+
if (!this?.dbo?.[table_name]?.find)
|
|
232
|
+
throw "_this?.dbo?.[table_name]?.find is missing";
|
|
151
233
|
|
|
152
234
|
try {
|
|
153
235
|
const res = this?.dbo?.[table_name]?.find?.(
|
|
154
236
|
_filter,
|
|
155
237
|
{
|
|
156
238
|
select: params.select,
|
|
157
|
-
orderBy:
|
|
239
|
+
orderBy: orderByAsc as OrderBy,
|
|
158
240
|
offset: offset || 0,
|
|
159
|
-
limit: batch_size
|
|
241
|
+
limit: batch_size,
|
|
160
242
|
},
|
|
161
243
|
undefined,
|
|
162
|
-
table_rules
|
|
244
|
+
table_rules,
|
|
163
245
|
);
|
|
164
246
|
|
|
165
247
|
if (!res) throw "_this?.dbo?.[table_name]?.find is missing";
|
|
@@ -167,140 +249,196 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
167
249
|
return res;
|
|
168
250
|
} catch (e) {
|
|
169
251
|
console.error("Sync getServerData failed: ", e);
|
|
170
|
-
throw "INTERNAL ERROR"
|
|
252
|
+
throw "INTERNAL ERROR";
|
|
171
253
|
}
|
|
172
254
|
},
|
|
173
255
|
deleteData = async (deleted: AnyObject[]) => {
|
|
174
256
|
// console.log("deleteData deleteData deleteData " + deleted.length);
|
|
175
257
|
if (allow_delete) {
|
|
176
|
-
return Promise.all(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
258
|
+
return Promise.all(
|
|
259
|
+
deleted.map(async (d) => {
|
|
260
|
+
const id_filter = pickKeys(d, id_fields);
|
|
261
|
+
try {
|
|
262
|
+
await (this.dbo[table_name] as TableHandler).delete(
|
|
263
|
+
id_filter,
|
|
264
|
+
undefined,
|
|
265
|
+
undefined,
|
|
266
|
+
table_rules,
|
|
267
|
+
);
|
|
268
|
+
return 1;
|
|
269
|
+
} catch (e) {
|
|
270
|
+
console.error(e);
|
|
271
|
+
}
|
|
272
|
+
return 0;
|
|
273
|
+
}),
|
|
274
|
+
);
|
|
186
275
|
} else {
|
|
187
|
-
console.warn(
|
|
276
|
+
console.warn(
|
|
277
|
+
"client tried to delete data without permission (allow_delete is false)",
|
|
278
|
+
);
|
|
188
279
|
}
|
|
189
280
|
return false;
|
|
190
281
|
},
|
|
191
|
-
|
|
192
282
|
/**
|
|
193
|
-
* Upserts the given client data where synced_field is higher than on server
|
|
283
|
+
* Upserts the given client data where synced_field is higher than on server
|
|
194
284
|
*/
|
|
195
285
|
upsertData = async (data: AnyObject[]) => {
|
|
196
|
-
|
|
197
286
|
const start = Date.now();
|
|
198
|
-
const result = await this.dboBuilder
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
287
|
+
const result = await this.dboBuilder
|
|
288
|
+
.getTX(async (dbTX) => {
|
|
289
|
+
const tbl = dbTX[table_name] as TableHandler;
|
|
290
|
+
const existingData = await tbl.find(
|
|
291
|
+
{ $or: data.map((d) => pickKeys(d, id_fields)) },
|
|
292
|
+
{
|
|
293
|
+
select: [synced_field, ...id_fields],
|
|
294
|
+
orderBy: orderByAsc as OrderBy,
|
|
295
|
+
},
|
|
296
|
+
undefined,
|
|
297
|
+
table_rules,
|
|
298
|
+
);
|
|
299
|
+
let inserts = data.filter(
|
|
300
|
+
(d) => !existingData.find((ed) => rowsIdsMatch(ed, d)),
|
|
301
|
+
);
|
|
302
|
+
let updates = data.filter((d) =>
|
|
303
|
+
existingData.find(
|
|
304
|
+
(ed) =>
|
|
305
|
+
rowsIdsMatch(ed, d) && +ed[synced_field] < +d[synced_field],
|
|
306
|
+
),
|
|
307
|
+
);
|
|
308
|
+
try {
|
|
309
|
+
if (!table_rules) throw "table_rules missing";
|
|
310
|
+
|
|
311
|
+
if (table_rules.update && updates.length) {
|
|
312
|
+
const updateData: [any, any][] = [];
|
|
313
|
+
await Promise.all(
|
|
314
|
+
updates.map((upd) => {
|
|
315
|
+
const id_filter = pickKeys(upd, id_fields);
|
|
316
|
+
const syncSafeFilter = {
|
|
317
|
+
$and: [
|
|
318
|
+
id_filter,
|
|
319
|
+
{ [synced_field]: { "<": upd[synced_field] } },
|
|
320
|
+
],
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
updateData.push([syncSafeFilter, omitKeys(upd, id_fields)]);
|
|
324
|
+
}),
|
|
325
|
+
);
|
|
326
|
+
await tbl.updateBatch(
|
|
327
|
+
updateData,
|
|
328
|
+
{ removeDisallowedFields: true },
|
|
329
|
+
undefined,
|
|
330
|
+
table_rules,
|
|
331
|
+
);
|
|
332
|
+
} else {
|
|
333
|
+
updates = [];
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (table_rules.insert && inserts.length) {
|
|
337
|
+
await tbl.insert(
|
|
338
|
+
inserts,
|
|
339
|
+
{ removeDisallowedFields: true },
|
|
340
|
+
undefined,
|
|
341
|
+
table_rules,
|
|
342
|
+
);
|
|
343
|
+
} else {
|
|
344
|
+
inserts = [];
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return { inserts, updates };
|
|
348
|
+
} catch (e) {
|
|
349
|
+
console.trace(e);
|
|
350
|
+
throw e;
|
|
231
351
|
}
|
|
352
|
+
})
|
|
353
|
+
.then(({ inserts, updates }) => {
|
|
354
|
+
log(
|
|
355
|
+
`upsertData: inserted( ${inserts.length} ) updated( ${updates.length} ) total( ${data.length} ) \n last insert ${JSON.stringify(inserts.at(-1))} \n last update ${JSON.stringify(updates.at(-1))}`,
|
|
356
|
+
);
|
|
357
|
+
return {
|
|
358
|
+
inserted: inserts.length,
|
|
359
|
+
updated: updates.length,
|
|
360
|
+
total: data.length,
|
|
361
|
+
};
|
|
362
|
+
})
|
|
363
|
+
.catch((err) => {
|
|
364
|
+
console.trace(
|
|
365
|
+
"Something went wrong with syncing to server: \n ->",
|
|
366
|
+
err,
|
|
367
|
+
data.length,
|
|
368
|
+
id_fields,
|
|
369
|
+
);
|
|
370
|
+
return Promise.reject(
|
|
371
|
+
"Something went wrong with syncing to server: ",
|
|
372
|
+
);
|
|
373
|
+
});
|
|
232
374
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
}).then(({ inserts, updates }) => {
|
|
240
|
-
log(`upsertData: inserted( ${inserts.length} ) updated( ${updates.length} ) total( ${data.length} ) \n last insert ${JSON.stringify(inserts.at(-1))} \n last update ${JSON.stringify(updates.at(-1))}`);
|
|
241
|
-
return { inserted: inserts.length, updated: updates.length, total: data.length };
|
|
242
|
-
})
|
|
243
|
-
.catch(err => {
|
|
244
|
-
console.trace("Something went wrong with syncing to server: \n ->", err, data.length, id_fields);
|
|
245
|
-
return Promise.reject("Something went wrong with syncing to server: ")
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
await this._log({
|
|
249
|
-
type: "sync",
|
|
250
|
-
command: "upsertData",
|
|
251
|
-
tableName: sync.table_name,
|
|
252
|
-
rows: data.length,
|
|
375
|
+
await this._log({
|
|
376
|
+
type: "sync",
|
|
377
|
+
command: "upsertData",
|
|
378
|
+
tableName: sync.table_name,
|
|
379
|
+
rows: data.length,
|
|
253
380
|
socketId: socket_id,
|
|
254
381
|
sid: sync.sid,
|
|
255
382
|
duration: Date.now() - start,
|
|
256
|
-
connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map(
|
|
383
|
+
connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map(
|
|
384
|
+
(s) => s.id,
|
|
385
|
+
),
|
|
257
386
|
});
|
|
258
387
|
|
|
259
388
|
return result;
|
|
260
389
|
},
|
|
261
|
-
|
|
262
390
|
/**
|
|
263
391
|
* Pushes the given data to client
|
|
264
|
-
* @param isSynced = true if
|
|
392
|
+
* @param isSynced = true if
|
|
265
393
|
*/
|
|
266
|
-
pushData = async (
|
|
394
|
+
pushData = async (
|
|
395
|
+
data?: AnyObject[],
|
|
396
|
+
isSynced = false,
|
|
397
|
+
err: any = null,
|
|
398
|
+
) => {
|
|
267
399
|
const start = Date.now();
|
|
268
400
|
const result = await new Promise((resolve, reject) => {
|
|
269
|
-
socket.emit(
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
401
|
+
socket.emit(
|
|
402
|
+
channel_name,
|
|
403
|
+
{ data, isSynced },
|
|
404
|
+
(resp?: { ok: boolean }) => {
|
|
405
|
+
if (resp && resp.ok) {
|
|
406
|
+
// console.log("PUSHED to client: fr/lr", data[0], data[data.length - 1]);
|
|
407
|
+
resolve({ pushed: data?.length, resp });
|
|
408
|
+
} else {
|
|
409
|
+
reject(resp);
|
|
410
|
+
console.error("Unexpected response");
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
);
|
|
279
414
|
});
|
|
280
415
|
|
|
281
|
-
await this._log({
|
|
282
|
-
type: "sync",
|
|
283
|
-
command: "pushData",
|
|
284
|
-
tableName: sync.table_name,
|
|
285
|
-
rows: data?.length ?? 0,
|
|
416
|
+
await this._log({
|
|
417
|
+
type: "sync",
|
|
418
|
+
command: "pushData",
|
|
419
|
+
tableName: sync.table_name,
|
|
420
|
+
rows: data?.length ?? 0,
|
|
286
421
|
socketId: socket_id,
|
|
287
422
|
duration: Date.now() - start,
|
|
288
423
|
sid: sync.sid,
|
|
289
|
-
connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map(
|
|
424
|
+
connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map(
|
|
425
|
+
(s) => s.id,
|
|
426
|
+
),
|
|
290
427
|
});
|
|
291
428
|
|
|
292
429
|
return result;
|
|
293
430
|
},
|
|
294
|
-
|
|
295
431
|
/**
|
|
296
|
-
* Returns the lowest synced_field between server and client by checking client and server sync data.
|
|
432
|
+
* Returns the lowest synced_field between server and client by checking client and server sync data.
|
|
297
433
|
* If last rows don't match it will find an earlier matching last row and use that last matching from_synced
|
|
298
434
|
* If no rows or fully synced (c_lr and s_lr match) then returns null
|
|
299
435
|
*/
|
|
300
|
-
getLastSynced = async (
|
|
301
|
-
|
|
436
|
+
getLastSynced = async (
|
|
437
|
+
clientSyncInfo?: ClientSyncInfo,
|
|
438
|
+
): Promise<number | null> => {
|
|
302
439
|
// Get latest row info
|
|
303
|
-
const { c_fr, c_lr, c_count } =
|
|
440
|
+
const { c_fr, c_lr, c_count } =
|
|
441
|
+
clientSyncInfo || (await getClientRowInfo());
|
|
304
442
|
const { s_fr, s_lr, s_count } = await getServerRowInfo();
|
|
305
443
|
|
|
306
444
|
// console.log("getLastSynced", clientData, socket._user )
|
|
@@ -308,7 +446,8 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
308
446
|
let result = null;
|
|
309
447
|
|
|
310
448
|
/* Nothing to sync */
|
|
311
|
-
if (!c_fr && !s_fr || rowsFullyMatch(c_lr, s_lr)) {
|
|
449
|
+
if ((!c_fr && !s_fr) || rowsFullyMatch(c_lr, s_lr)) {
|
|
450
|
+
// c_count === s_count &&
|
|
312
451
|
// sync.last_synced = null;
|
|
313
452
|
result = null;
|
|
314
453
|
|
|
@@ -316,38 +455,49 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
316
455
|
} else if (!rowsFullyMatch(c_fr, s_fr)) {
|
|
317
456
|
if (c_fr && s_fr) {
|
|
318
457
|
result = Math.min(c_fr[synced_field], s_fr[synced_field]);
|
|
319
|
-
|
|
320
458
|
} else if (c_fr || s_fr) {
|
|
321
459
|
result = (c_fr || s_fr)[synced_field];
|
|
322
460
|
}
|
|
323
461
|
|
|
324
462
|
/* Sync from last matching synced value */
|
|
325
463
|
} else if (rowsFullyMatch(c_fr, s_fr)) {
|
|
326
|
-
|
|
327
464
|
if (s_lr && c_lr) {
|
|
328
|
-
result = Math.min(
|
|
465
|
+
result = Math.min(
|
|
466
|
+
...getNumbers([c_lr[synced_field], s_lr[synced_field]]),
|
|
467
|
+
);
|
|
329
468
|
} else {
|
|
330
|
-
result = Math.min(
|
|
469
|
+
result = Math.min(
|
|
470
|
+
...getNumbers([c_fr[synced_field], s_fr?.[synced_field]]),
|
|
471
|
+
);
|
|
331
472
|
}
|
|
332
473
|
|
|
333
474
|
const min_count = Math.min(...getNumbers([c_count, s_count]));
|
|
334
|
-
let end_offset = 1
|
|
475
|
+
let end_offset = 1; // Math.min(s_count, c_count) - 1;
|
|
335
476
|
let step = 0;
|
|
336
477
|
|
|
337
478
|
while (min_count > 5 && end_offset < min_count) {
|
|
338
|
-
const { c_lr = null } = await getClientRowInfo({
|
|
479
|
+
const { c_lr = null } = await getClientRowInfo({
|
|
480
|
+
from_synced: 0,
|
|
481
|
+
to_synced: result,
|
|
482
|
+
end_offset,
|
|
483
|
+
});
|
|
339
484
|
// console.log("getLastSynced... end_offset > " + end_offset);
|
|
340
485
|
let server_row;
|
|
341
486
|
|
|
342
487
|
if (c_lr) {
|
|
343
488
|
const _filter: AnyObject = {};
|
|
344
|
-
sync_fields.map(key => {
|
|
489
|
+
sync_fields.map((key) => {
|
|
345
490
|
_filter[key] = c_lr[key];
|
|
346
491
|
});
|
|
347
|
-
server_row = await this?.dbo?.[table_name]?.find?.(
|
|
492
|
+
server_row = await this?.dbo?.[table_name]?.find?.(
|
|
493
|
+
_filter,
|
|
494
|
+
{ select: sync_fields, limit: 1 },
|
|
495
|
+
undefined,
|
|
496
|
+
table_rules,
|
|
497
|
+
);
|
|
348
498
|
}
|
|
349
499
|
|
|
350
|
-
// if(rowsFullyMatch(c_lr, s_lr)){ //c_count === s_count &&
|
|
500
|
+
// if(rowsFullyMatch(c_lr, s_lr)){ //c_count === s_count &&
|
|
351
501
|
if (server_row && server_row.length) {
|
|
352
502
|
server_row = server_row[0];
|
|
353
503
|
|
|
@@ -365,18 +515,25 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
365
515
|
|
|
366
516
|
return result;
|
|
367
517
|
},
|
|
368
|
-
|
|
369
518
|
updateSyncLR = (data: AnyObject) => {
|
|
370
519
|
if (data.length) {
|
|
371
520
|
const lastRow = data[data.length - 1];
|
|
372
|
-
if (
|
|
373
|
-
|
|
521
|
+
if (
|
|
522
|
+
sync.lr?.[synced_field] &&
|
|
523
|
+
+sync.lr?.[synced_field] > +lastRow[synced_field]
|
|
524
|
+
) {
|
|
525
|
+
console.error(
|
|
526
|
+
{
|
|
527
|
+
syncIssue:
|
|
528
|
+
"sync.lr[synced_field] is greater than lastRow[synced_field]",
|
|
529
|
+
},
|
|
530
|
+
sync.table_name,
|
|
531
|
+
);
|
|
374
532
|
}
|
|
375
533
|
sync.lr = lastRow;
|
|
376
534
|
sync.last_synced = +sync.lr?.[synced_field];
|
|
377
535
|
}
|
|
378
536
|
},
|
|
379
|
-
|
|
380
537
|
/**
|
|
381
538
|
* Will push pull sync between client and server from a given from_synced value
|
|
382
539
|
*/
|
|
@@ -387,14 +544,17 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
387
544
|
min_synced = from_synced || 0,
|
|
388
545
|
max_synced = from_synced;
|
|
389
546
|
|
|
390
|
-
let inserted = 0,
|
|
547
|
+
let inserted = 0,
|
|
548
|
+
updated = 0,
|
|
549
|
+
pushed = 0,
|
|
550
|
+
deleted = 0,
|
|
551
|
+
total = 0;
|
|
391
552
|
|
|
392
553
|
// console.log("syncBatch", from_synced)
|
|
393
554
|
|
|
394
555
|
while (canContinue) {
|
|
395
556
|
const cData = await getClientData(min_synced, offset);
|
|
396
557
|
|
|
397
|
-
|
|
398
558
|
if (cData.length) {
|
|
399
559
|
const res = await upsertData(cData);
|
|
400
560
|
inserted += res.inserted;
|
|
@@ -406,30 +566,42 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
406
566
|
sData = await getServerData(min_synced, offset);
|
|
407
567
|
} catch (e) {
|
|
408
568
|
console.trace("sync getServerData err", e);
|
|
409
|
-
await pushData(
|
|
410
|
-
|
|
569
|
+
await pushData(
|
|
570
|
+
undefined,
|
|
571
|
+
undefined,
|
|
572
|
+
"Internal error. Check server logs",
|
|
573
|
+
);
|
|
574
|
+
throw " d";
|
|
411
575
|
}
|
|
412
576
|
|
|
413
577
|
// console.log("allow_delete", table_rules.delete);
|
|
414
578
|
if (allow_delete && table_rules?.delete) {
|
|
415
|
-
const to_delete = sData.filter(d => {
|
|
416
|
-
!cData.find(c => rowsIdsMatch(c, d))
|
|
579
|
+
const to_delete = sData.filter((d) => {
|
|
580
|
+
!cData.find((c) => rowsIdsMatch(c, d));
|
|
417
581
|
});
|
|
418
|
-
await Promise.all(
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
582
|
+
await Promise.all(
|
|
583
|
+
to_delete.map((d) => {
|
|
584
|
+
deleted++;
|
|
585
|
+
return (this.dbo[table_name] as TableHandler).delete(
|
|
586
|
+
pickKeys(d, id_fields),
|
|
587
|
+
{},
|
|
588
|
+
undefined,
|
|
589
|
+
table_rules,
|
|
590
|
+
);
|
|
591
|
+
}),
|
|
592
|
+
);
|
|
422
593
|
sData = await getServerData(min_synced, offset);
|
|
423
594
|
}
|
|
424
595
|
|
|
425
|
-
const forClient = sData.filter(s => {
|
|
426
|
-
return !cData.find(
|
|
427
|
-
rowsIdsMatch(c, s) &&
|
|
428
|
-
+c[synced_field] >= +s[synced_field]
|
|
596
|
+
const forClient = sData.filter((s) => {
|
|
597
|
+
return !cData.find(
|
|
598
|
+
(c) => rowsIdsMatch(c, s) && +c[synced_field] >= +s[synced_field],
|
|
429
599
|
);
|
|
430
600
|
});
|
|
431
601
|
if (forClient.length) {
|
|
432
|
-
const res: any = await pushData(
|
|
602
|
+
const res: any = await pushData(
|
|
603
|
+
forClient.filter((d) => !sync.wal || !sync.wal.isInHistory(d)),
|
|
604
|
+
);
|
|
433
605
|
pushed += res.pushed;
|
|
434
606
|
}
|
|
435
607
|
|
|
@@ -443,7 +615,10 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
443
615
|
canContinue = sData.length >= limit;
|
|
444
616
|
// console.log(`sData ${sData.length} limit ${limit}`);
|
|
445
617
|
}
|
|
446
|
-
log(
|
|
618
|
+
log(
|
|
619
|
+
`server.syncBatch ${table_name}: inserted( ${inserted} ) updated( ${updated} ) deleted( ${deleted} ) pushed to client( ${pushed} ) total( ${total} )`,
|
|
620
|
+
socket._user,
|
|
621
|
+
);
|
|
447
622
|
|
|
448
623
|
return true;
|
|
449
624
|
};
|
|
@@ -451,7 +626,10 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
451
626
|
if (!wal) {
|
|
452
627
|
/* Used to throttle and merge incomming updates */
|
|
453
628
|
sync.wal = new WAL({
|
|
454
|
-
id_fields,
|
|
629
|
+
id_fields,
|
|
630
|
+
synced_field,
|
|
631
|
+
throttle,
|
|
632
|
+
batch_size,
|
|
455
633
|
DEBUG_MODE: this.dboBuilder.prostgles.opts.DEBUG_MODE,
|
|
456
634
|
onSendStart: () => {
|
|
457
635
|
sync.is_syncing = true;
|
|
@@ -484,7 +662,7 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
484
662
|
*/
|
|
485
663
|
this.syncData(sync, undefined, source);
|
|
486
664
|
},
|
|
487
|
-
})
|
|
665
|
+
});
|
|
488
666
|
}
|
|
489
667
|
|
|
490
668
|
/* Debounce sync requests */
|
|
@@ -495,7 +673,7 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
495
673
|
this.syncTimeout = undefined;
|
|
496
674
|
// console.log("SYNC FROM TIMEOUT")
|
|
497
675
|
this.syncData(sync, undefined, source);
|
|
498
|
-
}, throttle)
|
|
676
|
+
}, throttle);
|
|
499
677
|
}
|
|
500
678
|
// console.log("SYNC THROTTLE")
|
|
501
679
|
return;
|
|
@@ -508,15 +686,23 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
508
686
|
* Add to WAL manager which will sync at the end
|
|
509
687
|
*/
|
|
510
688
|
if (clientData) {
|
|
511
|
-
if (
|
|
689
|
+
if (
|
|
690
|
+
clientData.data &&
|
|
691
|
+
Array.isArray(clientData.data) &&
|
|
692
|
+
clientData.data.length
|
|
693
|
+
) {
|
|
512
694
|
if (!sync.wal) throw "sync.wal missing";
|
|
513
695
|
|
|
514
|
-
sync.wal.addData(clientData.data.map(d => ({ current: d })));
|
|
696
|
+
sync.wal.addData(clientData.data.map((d) => ({ current: d })));
|
|
515
697
|
return;
|
|
516
698
|
// await upsertData(clientData.data, true);
|
|
517
699
|
|
|
518
700
|
/* Not expecting this anymore. use normal db.table.delete channel */
|
|
519
|
-
} else if (
|
|
701
|
+
} else if (
|
|
702
|
+
clientData.deleted &&
|
|
703
|
+
Array.isArray(clientData.deleted) &&
|
|
704
|
+
clientData.deleted.length
|
|
705
|
+
) {
|
|
520
706
|
await deleteData(clientData.deleted);
|
|
521
707
|
}
|
|
522
708
|
} else {
|
|
@@ -554,4 +740,4 @@ export async function syncData (this: PubSubManager, sync: SyncParams, clientDat
|
|
|
554
740
|
|
|
555
741
|
sync.is_syncing = false;
|
|
556
742
|
// console.log(`Finished sync for ${table_name}`, socket._user);
|
|
557
|
-
}
|
|
743
|
+
}
|