@budibase/server 2.6.19-alpha.4 → 2.6.19-alpha.41
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/.dockerignore +7 -6
- package/Dockerfile +16 -8
- package/builder/assets/index.49c9e712.css +6 -0
- package/builder/assets/index.e3ce193c.js +1870 -0
- package/builder/index.html +2 -2
- package/client/manifest.json +5229 -0
- package/dist/automation.js +32478 -0
- package/dist/automation.js.map +7 -0
- package/dist/index.js +44909 -13
- package/dist/index.js.map +7 -0
- package/dist/query.js +24402 -0
- package/dist/query.js.map +7 -0
- package/jest.config.ts +3 -0
- package/nodemon.json +1 -1
- package/package.json +32 -13
- package/pm2.config.js +1 -1
- package/scripts/build.js +48 -0
- package/src/api/controllers/application.ts +21 -22
- package/src/api/controllers/automation.ts +37 -9
- package/src/api/controllers/datasource.ts +4 -0
- package/src/api/controllers/deploy/index.ts +1 -0
- package/src/api/controllers/row/index.ts +15 -22
- package/src/api/controllers/row/internal.ts +1 -1
- package/src/api/controllers/row/utils.ts +12 -0
- package/src/api/controllers/static/index.ts +3 -3
- package/src/api/controllers/table/index.ts +3 -0
- package/src/api/controllers/table/internal.ts +2 -6
- package/src/api/controllers/table/utils.ts +32 -1
- package/src/api/controllers/view/index.ts +5 -5
- package/src/api/controllers/webhook.ts +33 -9
- package/src/api/routes/application.ts +5 -0
- package/src/api/routes/automation.ts +0 -1
- package/src/api/routes/static.ts +3 -1
- package/src/api/routes/tests/{automation.spec.js → automation.spec.ts} +106 -31
- package/src/api/routes/tests/{webhook.spec.js → webhook.spec.ts} +33 -11
- package/src/app.ts +0 -1
- package/src/automations/actions.ts +8 -0
- package/src/automations/logging/index.ts +21 -0
- package/src/automations/steps/bash.ts +4 -0
- package/src/automations/steps/collect.ts +58 -0
- package/src/automations/steps/createRow.ts +4 -0
- package/src/automations/steps/delay.ts +1 -0
- package/src/automations/steps/deleteRow.ts +4 -0
- package/src/automations/steps/discord.ts +4 -0
- package/src/automations/steps/executeQuery.ts +4 -0
- package/src/automations/steps/executeScript.ts +4 -0
- package/src/automations/steps/filter.ts +1 -0
- package/src/automations/steps/loop.ts +1 -0
- package/src/automations/steps/make.ts +4 -0
- package/src/automations/steps/openai.ts +106 -0
- package/src/automations/steps/outgoingWebhook.ts +4 -0
- package/src/automations/steps/queryRows.ts +4 -0
- package/src/automations/steps/sendSmtpEmail.ts +4 -0
- package/src/automations/steps/serverLog.ts +4 -0
- package/src/automations/steps/slack.ts +4 -0
- package/src/automations/steps/updateRow.ts +4 -0
- package/src/automations/steps/zapier.ts +4 -0
- package/src/automations/tests/openai.spec.ts +86 -0
- package/src/automations/triggers.ts +3 -2
- package/src/constants/index.ts +17 -16
- package/src/db/inMemoryView.ts +1 -0
- package/src/environment.ts +3 -0
- package/src/integrations/airtable.ts +3 -1
- package/src/integrations/arangodb.ts +3 -1
- package/src/integrations/base/sqlTable.ts +0 -1
- package/src/integrations/couchdb.ts +3 -1
- package/src/integrations/dynamodb.ts +3 -1
- package/src/integrations/elasticsearch.ts +3 -1
- package/src/integrations/firebase.ts +3 -1
- package/src/integrations/googlesheets.ts +4 -4
- package/src/integrations/microsoftSqlServer.ts +4 -4
- package/src/integrations/mongodb.ts +3 -1
- package/src/integrations/mysql.ts +4 -4
- package/src/integrations/oracle.ts +4 -4
- package/src/integrations/postgres.ts +4 -4
- package/src/integrations/redis.ts +3 -1
- package/src/integrations/s3.ts +3 -1
- package/src/integrations/snowflake.ts +3 -1
- package/src/middleware/builder.ts +26 -18
- package/src/sdk/app/automations/index.ts +2 -0
- package/src/sdk/app/automations/utils.ts +7 -0
- package/src/startup.ts +2 -0
- package/src/tests/utilities/TestConfiguration.ts +4 -2
- package/src/tests/utilities/structures.ts +42 -0
- package/src/threads/automation.ts +82 -22
- package/src/threads/index.ts +9 -3
- package/src/threads/utils.ts +2 -0
- package/src/utilities/fileSystem/app.ts +14 -4
- package/src/utilities/fileSystem/clientLibrary.ts +8 -3
- package/src/utilities/fileSystem/filesystem.ts +3 -1
- package/src/utilities/redis.ts +18 -1
- package/src/utilities/rowProcessor/map.ts +1 -1
- package/src/websockets/builder.ts +74 -0
- package/src/websockets/client.ts +2 -2
- package/src/websockets/grid.ts +40 -44
- package/src/websockets/index.ts +5 -2
- package/src/websockets/websocket.ts +198 -7
- package/tsconfig.build.json +9 -1
- package/tsconfig.json +1 -14
- package/builder/assets/index.07382a47.css +0 -6
- package/builder/assets/index.3d5c50fb.js +0 -1786
- package/dist/api/controllers/analytics.js +0 -46
- package/dist/api/controllers/apikeys.js +0 -72
- package/dist/api/controllers/application.js +0 -574
- package/dist/api/controllers/auth.js +0 -80
- package/dist/api/controllers/automation.js +0 -303
- package/dist/api/controllers/backup.js +0 -37
- package/dist/api/controllers/component.js +0 -59
- package/dist/api/controllers/datasource.js +0 -352
- package/dist/api/controllers/deploy/Deployment.js +0 -53
- package/dist/api/controllers/deploy/index.js +0 -198
- package/dist/api/controllers/dev.js +0 -146
- package/dist/api/controllers/integration.js +0 -28
- package/dist/api/controllers/layout.js +0 -49
- package/dist/api/controllers/metadata.js +0 -63
- package/dist/api/controllers/migrations.js +0 -29
- package/dist/api/controllers/ops.js +0 -40
- package/dist/api/controllers/permission.js +0 -162
- package/dist/api/controllers/plugin/file.js +0 -24
- package/dist/api/controllers/plugin/github.js +0 -69
- package/dist/api/controllers/plugin/index.js +0 -112
- package/dist/api/controllers/plugin/npm.js +0 -58
- package/dist/api/controllers/plugin/uploaders.js +0 -11
- package/dist/api/controllers/plugin/url.js +0 -24
- package/dist/api/controllers/plugin/utils.js +0 -27
- package/dist/api/controllers/public/applications.js +0 -146
- package/dist/api/controllers/public/mapping/applications.js +0 -29
- package/dist/api/controllers/public/mapping/index.js +0 -11
- package/dist/api/controllers/public/mapping/queries.js +0 -36
- package/dist/api/controllers/public/mapping/rows.js +0 -24
- package/dist/api/controllers/public/mapping/tables.js +0 -23
- package/dist/api/controllers/public/mapping/types.js +0 -2
- package/dist/api/controllers/public/mapping/users.js +0 -29
- package/dist/api/controllers/public/metrics.js +0 -113
- package/dist/api/controllers/public/queries.js +0 -58
- package/dist/api/controllers/public/rows.js +0 -120
- package/dist/api/controllers/public/tables.js +0 -95
- package/dist/api/controllers/public/users.js +0 -93
- package/dist/api/controllers/public/utils.js +0 -56
- package/dist/api/controllers/query/import/index.js +0 -87
- package/dist/api/controllers/query/import/sources/base/index.js +0 -75
- package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
- package/dist/api/controllers/query/import/sources/curl.js +0 -99
- package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
- package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
- package/dist/api/controllers/query/index.js +0 -299
- package/dist/api/controllers/query/validation.js +0 -53
- package/dist/api/controllers/role.js +0 -109
- package/dist/api/controllers/routing.js +0 -105
- package/dist/api/controllers/row/ExternalRequest.js +0 -683
- package/dist/api/controllers/row/external.js +0 -339
- package/dist/api/controllers/row/index.js +0 -203
- package/dist/api/controllers/row/internal.js +0 -509
- package/dist/api/controllers/row/internalSearch.js +0 -28
- package/dist/api/controllers/row/staticFormula.js +0 -165
- package/dist/api/controllers/row/utils.js +0 -183
- package/dist/api/controllers/screen.js +0 -110
- package/dist/api/controllers/script.js +0 -30
- package/dist/api/controllers/static/index.js +0 -268
- package/dist/api/controllers/table/bulkFormula.js +0 -173
- package/dist/api/controllers/table/external.js +0 -279
- package/dist/api/controllers/table/index.js +0 -179
- package/dist/api/controllers/table/internal.js +0 -197
- package/dist/api/controllers/table/utils.js +0 -379
- package/dist/api/controllers/templates.js +0 -56
- package/dist/api/controllers/user.js +0 -124
- package/dist/api/controllers/view/exporters.js +0 -46
- package/dist/api/controllers/view/index.js +0 -193
- package/dist/api/controllers/view/utils.js +0 -177
- package/dist/api/controllers/view/viewBuilder.js +0 -158
- package/dist/api/controllers/webhook.js +0 -134
- package/dist/api/index.js +0 -55
- package/dist/api/routes/analytics.js +0 -34
- package/dist/api/routes/apikeys.js +0 -37
- package/dist/api/routes/application.js +0 -48
- package/dist/api/routes/auth.js +0 -33
- package/dist/api/routes/automation.js +0 -50
- package/dist/api/routes/backup.js +0 -35
- package/dist/api/routes/component.js +0 -35
- package/dist/api/routes/datasource.js +0 -45
- package/dist/api/routes/deploy.js +0 -37
- package/dist/api/routes/dev.js +0 -49
- package/dist/api/routes/index.js +0 -75
- package/dist/api/routes/integration.js +0 -37
- package/dist/api/routes/layout.js +0 -37
- package/dist/api/routes/metadata.js +0 -40
- package/dist/api/routes/migrations.js +0 -36
- package/dist/api/routes/ops.js +0 -52
- package/dist/api/routes/permission.js +0 -44
- package/dist/api/routes/plugin.js +0 -39
- package/dist/api/routes/public/applications.js +0 -174
- package/dist/api/routes/public/index.js +0 -140
- package/dist/api/routes/public/metrics.js +0 -30
- package/dist/api/routes/public/middleware/mapper.js +0 -97
- package/dist/api/routes/public/queries.js +0 -72
- package/dist/api/routes/public/rows.js +0 -158
- package/dist/api/routes/public/tables.js +0 -152
- package/dist/api/routes/public/users.js +0 -135
- package/dist/api/routes/public/utils/Endpoint.js +0 -36
- package/dist/api/routes/query.js +0 -47
- package/dist/api/routes/role.js +0 -40
- package/dist/api/routes/routing.js +0 -39
- package/dist/api/routes/row.js +0 -239
- package/dist/api/routes/screen.js +0 -39
- package/dist/api/routes/script.js +0 -35
- package/dist/api/routes/static.js +0 -80
- package/dist/api/routes/table.js +0 -163
- package/dist/api/routes/templates.js +0 -37
- package/dist/api/routes/user.js +0 -43
- package/dist/api/routes/utils/validators.js +0 -238
- package/dist/api/routes/view.js +0 -42
- package/dist/api/routes/webhook.js +0 -43
- package/dist/app.js +0 -132
- package/dist/automations/actions.js +0 -137
- package/dist/automations/automationUtils.js +0 -173
- package/dist/automations/bullboard.js +0 -71
- package/dist/automations/index.js +0 -43
- package/dist/automations/logging/index.js +0 -53
- package/dist/automations/steps/bash.js +0 -111
- package/dist/automations/steps/createRow.js +0 -108
- package/dist/automations/steps/delay.js +0 -53
- package/dist/automations/steps/deleteRow.js +0 -96
- package/dist/automations/steps/discord.js +0 -116
- package/dist/automations/steps/executeQuery.js +0 -134
- package/dist/automations/steps/executeScript.js +0 -106
- package/dist/automations/steps/filter.js +0 -112
- package/dist/automations/steps/loop.js +0 -54
- package/dist/automations/steps/make.js +0 -134
- package/dist/automations/steps/outgoingWebhook.js +0 -166
- package/dist/automations/steps/queryRows.js +0 -216
- package/dist/automations/steps/sendSmtpEmail.js +0 -115
- package/dist/automations/steps/serverLog.js +0 -65
- package/dist/automations/steps/slack.js +0 -98
- package/dist/automations/steps/updateRow.js +0 -144
- package/dist/automations/steps/utils.js +0 -56
- package/dist/automations/steps/zapier.js +0 -130
- package/dist/automations/triggerInfo/app.js +0 -36
- package/dist/automations/triggerInfo/cron.js +0 -35
- package/dist/automations/triggerInfo/index.js +0 -40
- package/dist/automations/triggerInfo/rowDeleted.js +0 -36
- package/dist/automations/triggerInfo/rowSaved.js +0 -44
- package/dist/automations/triggerInfo/rowUpdated.js +0 -44
- package/dist/automations/triggerInfo/webhook.js +0 -40
- package/dist/automations/triggers.js +0 -181
- package/dist/automations/utils.js +0 -275
- package/dist/constants/definitions.js +0 -2
- package/dist/constants/index.js +0 -181
- package/dist/constants/layouts.js +0 -148
- package/dist/constants/screens.js +0 -51
- package/dist/db/defaultData/datasource_bb_default.js +0 -574
- package/dist/db/defaultData/employeeImport.js +0 -155
- package/dist/db/defaultData/expensesImport.js +0 -117
- package/dist/db/defaultData/inventoryImport.js +0 -109
- package/dist/db/defaultData/jobsImport.js +0 -152
- package/dist/db/dynamoClient.js +0 -124
- package/dist/db/inMemoryView.js +0 -62
- package/dist/db/index.js +0 -43
- package/dist/db/linkedRows/LinkController.js +0 -392
- package/dist/db/linkedRows/LinkDocument.js +0 -33
- package/dist/db/linkedRows/index.js +0 -206
- package/dist/db/linkedRows/linkUtils.js +0 -131
- package/dist/db/newid.js +0 -7
- package/dist/db/utils.js +0 -248
- package/dist/db/views/staticViews.js +0 -144
- package/dist/ddApm.js +0 -11
- package/dist/definitions/automations.js +0 -8
- package/dist/definitions/common.js +0 -2
- package/dist/definitions/datasource.js +0 -7
- package/dist/definitions/openapi.js +0 -6
- package/dist/environment.js +0 -109
- package/dist/events/AutomationEmitter.js +0 -53
- package/dist/events/BudibaseEmitter.js +0 -25
- package/dist/events/docUpdates/index.js +0 -17
- package/dist/events/docUpdates/processors.js +0 -18
- package/dist/events/docUpdates/syncUsers.js +0 -49
- package/dist/events/index.js +0 -11
- package/dist/events/utils.js +0 -43
- package/dist/integrations/airtable.js +0 -173
- package/dist/integrations/arangodb.js +0 -119
- package/dist/integrations/base/query.js +0 -32
- package/dist/integrations/base/sql.js +0 -600
- package/dist/integrations/base/sqlTable.js +0 -167
- package/dist/integrations/base/types.js +0 -2
- package/dist/integrations/couchdb.js +0 -140
- package/dist/integrations/dynamodb.js +0 -210
- package/dist/integrations/elasticsearch.js +0 -201
- package/dist/integrations/firebase.js +0 -189
- package/dist/integrations/googlesheets.js +0 -493
- package/dist/integrations/index.js +0 -138
- package/dist/integrations/microsoftSqlServer.js +0 -308
- package/dist/integrations/mongodb.js +0 -630
- package/dist/integrations/mysql.js +0 -291
- package/dist/integrations/oracle.js +0 -415
- package/dist/integrations/postgres.js +0 -335
- package/dist/integrations/queries/sql.js +0 -84
- package/dist/integrations/redis.js +0 -187
- package/dist/integrations/rest.js +0 -400
- package/dist/integrations/s3.js +0 -256
- package/dist/integrations/snowflake.js +0 -114
- package/dist/integrations/utils.js +0 -295
- package/dist/middleware/appInfo.js +0 -22
- package/dist/middleware/authorized.js +0 -112
- package/dist/middleware/builder.js +0 -93
- package/dist/middleware/currentapp.js +0 -103
- package/dist/middleware/joi-validator.js +0 -43
- package/dist/middleware/publicApi.js +0 -25
- package/dist/middleware/resourceId.js +0 -59
- package/dist/middleware/selfhost.js +0 -24
- package/dist/middleware/utils.js +0 -8
- package/dist/migrations/functions/appUrls.js +0 -42
- package/dist/migrations/functions/backfill/app/automations.js +0 -31
- package/dist/migrations/functions/backfill/app/datasources.js +0 -28
- package/dist/migrations/functions/backfill/app/layouts.js +0 -33
- package/dist/migrations/functions/backfill/app/queries.js +0 -49
- package/dist/migrations/functions/backfill/app/roles.js +0 -28
- package/dist/migrations/functions/backfill/app/screens.js +0 -28
- package/dist/migrations/functions/backfill/app/tables.js +0 -37
- package/dist/migrations/functions/backfill/app.js +0 -176
- package/dist/migrations/functions/backfill/global/configs.js +0 -67
- package/dist/migrations/functions/backfill/global/quotas.js +0 -60
- package/dist/migrations/functions/backfill/global/users.js +0 -50
- package/dist/migrations/functions/backfill/global.js +0 -205
- package/dist/migrations/functions/backfill/index.js +0 -32
- package/dist/migrations/functions/backfill/installation.js +0 -80
- package/dist/migrations/functions/syncQuotas.js +0 -52
- package/dist/migrations/functions/tableSettings.js +0 -130
- package/dist/migrations/functions/usageQuotas/index.js +0 -16
- package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
- package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
- package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
- package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
- package/dist/migrations/functions/userEmailViewCasing.js +0 -24
- package/dist/migrations/index.js +0 -111
- package/dist/migrations/tests/helpers.js +0 -72
- package/dist/migrations/tests/structures.js +0 -37
- package/dist/sdk/app/applications/index.js +0 -28
- package/dist/sdk/app/applications/sync.js +0 -164
- package/dist/sdk/app/applications/utils.js +0 -21
- package/dist/sdk/app/automations/index.js +0 -29
- package/dist/sdk/app/automations/webhook.js +0 -54
- package/dist/sdk/app/backups/constants.js +0 -6
- package/dist/sdk/app/backups/exports.js +0 -160
- package/dist/sdk/app/backups/imports.js +0 -170
- package/dist/sdk/app/backups/index.js +0 -29
- package/dist/sdk/app/backups/statistics.js +0 -73
- package/dist/sdk/app/datasources/datasources.js +0 -173
- package/dist/sdk/app/datasources/index.js +0 -27
- package/dist/sdk/app/queries/index.js +0 -27
- package/dist/sdk/app/queries/queries.js +0 -60
- package/dist/sdk/app/rows/attachments.js +0 -61
- package/dist/sdk/app/rows/index.js +0 -28
- package/dist/sdk/app/rows/rows.js +0 -30
- package/dist/sdk/app/tables/index.js +0 -65
- package/dist/sdk/index.js +0 -27
- package/dist/sdk/plugins/index.js +0 -27
- package/dist/sdk/plugins/plugins.js +0 -53
- package/dist/sdk/users/index.js +0 -27
- package/dist/sdk/users/utils.js +0 -87
- package/dist/sdk/utils/index.js +0 -29
- package/dist/startup.js +0 -158
- package/dist/threads/automation.js +0 -450
- package/dist/threads/definitions.js +0 -2
- package/dist/threads/index.js +0 -140
- package/dist/threads/query.js +0 -265
- package/dist/threads/utils.js +0 -120
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/utilities/appDirectoryTemplate/package.json +0 -10
- package/dist/utilities/budibaseDir.js +0 -5
- package/dist/utilities/centralPath.js +0 -27
- package/dist/utilities/csv.js +0 -33
- package/dist/utilities/fileSystem/app.js +0 -88
- package/dist/utilities/fileSystem/clientLibrary.js +0 -138
- package/dist/utilities/fileSystem/filesystem.js +0 -180
- package/dist/utilities/fileSystem/index.js +0 -21
- package/dist/utilities/fileSystem/plugin.js +0 -76
- package/dist/utilities/fileSystem/processor.js +0 -34
- package/dist/utilities/fileSystem/template.js +0 -47
- package/dist/utilities/global.js +0 -149
- package/dist/utilities/index.js +0 -143
- package/dist/utilities/redis.js +0 -117
- package/dist/utilities/retry.js +0 -30
- package/dist/utilities/routing/index.js +0 -39
- package/dist/utilities/rowProcessor/index.js +0 -282
- package/dist/utilities/rowProcessor/map.js +0 -116
- package/dist/utilities/rowProcessor/utils.js +0 -87
- package/dist/utilities/schema.js +0 -112
- package/dist/utilities/scriptRunner.js +0 -26
- package/dist/utilities/security.js +0 -57
- package/dist/utilities/statusCodes.js +0 -9
- package/dist/utilities/usageQuota/rows.js +0 -88
- package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
- package/dist/utilities/users.js +0 -57
- package/dist/utilities/workerRequests.js +0 -171
- package/dist/watch.js +0 -53
- package/dist/websockets/client.js +0 -14
- package/dist/websockets/grid.js +0 -60
- package/dist/websockets/index.js +0 -17
- package/dist/websockets/websocket.js +0 -78
- /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
- /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
- /package/dist/{api/controllers/static/templates/preview.hbs → preview.hbs} +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import authorized from "../middleware/authorized"
|
|
2
|
+
import { BaseSocket } from "./websocket"
|
|
3
|
+
import { permissions } from "@budibase/backend-core"
|
|
4
|
+
import http from "http"
|
|
5
|
+
import Koa from "koa"
|
|
6
|
+
import { Datasource, Table, SocketSession, ContextUser } from "@budibase/types"
|
|
7
|
+
import { gridSocket } from "./index"
|
|
8
|
+
import { clearLock } from "../utilities/redis"
|
|
9
|
+
import { Socket } from "socket.io"
|
|
10
|
+
import { BuilderSocketEvent } from "@budibase/shared-core"
|
|
11
|
+
|
|
12
|
+
export default class BuilderSocket extends BaseSocket {
|
|
13
|
+
constructor(app: Koa, server: http.Server) {
|
|
14
|
+
super(app, server, "/socket/builder", [authorized(permissions.BUILDER)])
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async onConnect(socket: Socket) {
|
|
18
|
+
// Initial identification of selected app
|
|
19
|
+
socket.on(BuilderSocketEvent.SelectApp, async (appId, callback) => {
|
|
20
|
+
await this.joinRoom(socket, appId)
|
|
21
|
+
|
|
22
|
+
// Reply with all users in current room
|
|
23
|
+
const sessions = await this.getRoomSessions(appId)
|
|
24
|
+
callback({ users: sessions })
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async onDisconnect(socket: Socket) {
|
|
29
|
+
// Remove app lock from this user if they have no other connections
|
|
30
|
+
try {
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
const session: SocketSession = socket.data
|
|
33
|
+
const { _id, sessionId, room } = session
|
|
34
|
+
const sessions = await this.getRoomSessions(room)
|
|
35
|
+
const hasOtherSession = sessions.some(otherSession => {
|
|
36
|
+
return _id === otherSession._id && sessionId !== otherSession.sessionId
|
|
37
|
+
})
|
|
38
|
+
if (!hasOtherSession && room) {
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
const user: ContextUser = { _id: socket.data._id }
|
|
41
|
+
await clearLock(room, user)
|
|
42
|
+
}
|
|
43
|
+
} catch (e) {
|
|
44
|
+
// This is fine, just means this user didn't hold the lock
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
emitTableUpdate(ctx: any, table: Table) {
|
|
49
|
+
this.io
|
|
50
|
+
.in(ctx.appId)
|
|
51
|
+
.emit(BuilderSocketEvent.TableChange, { id: table._id, table })
|
|
52
|
+
gridSocket.emitTableUpdate(table)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
emitTableDeletion(ctx: any, id: string) {
|
|
56
|
+
this.io
|
|
57
|
+
.in(ctx.appId)
|
|
58
|
+
.emit(BuilderSocketEvent.TableChange, { id, table: null })
|
|
59
|
+
gridSocket.emitTableDeletion(id)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
emitDatasourceUpdate(ctx: any, datasource: Datasource) {
|
|
63
|
+
this.io.in(ctx.appId).emit(BuilderSocketEvent.DatasourceChange, {
|
|
64
|
+
id: datasource._id,
|
|
65
|
+
datasource,
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
emitDatasourceDeletion(ctx: any, id: string) {
|
|
70
|
+
this.io
|
|
71
|
+
.in(ctx.appId)
|
|
72
|
+
.emit(BuilderSocketEvent.DatasourceChange, { id, datasource: null })
|
|
73
|
+
}
|
|
74
|
+
}
|
package/src/websockets/client.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { BaseSocket } from "./websocket"
|
|
2
2
|
import authorized from "../middleware/authorized"
|
|
3
3
|
import http from "http"
|
|
4
4
|
import Koa from "koa"
|
|
5
5
|
import { permissions } from "@budibase/backend-core"
|
|
6
6
|
|
|
7
|
-
export default class ClientAppWebsocket extends
|
|
7
|
+
export default class ClientAppWebsocket extends BaseSocket {
|
|
8
8
|
constructor(app: Koa, server: http.Server) {
|
|
9
9
|
super(app, server, "/socket/client", [authorized(permissions.BUILDER)])
|
|
10
10
|
}
|
package/src/websockets/grid.ts
CHANGED
|
@@ -1,55 +1,51 @@
|
|
|
1
1
|
import authorized from "../middleware/authorized"
|
|
2
|
-
import
|
|
2
|
+
import { BaseSocket } from "./websocket"
|
|
3
3
|
import { permissions } from "@budibase/backend-core"
|
|
4
4
|
import http from "http"
|
|
5
5
|
import Koa from "koa"
|
|
6
|
+
import { getTableId } from "../api/controllers/row/utils"
|
|
7
|
+
import { Row, Table } from "@budibase/types"
|
|
8
|
+
import { Socket } from "socket.io"
|
|
9
|
+
import { GridSocketEvent } from "@budibase/shared-core"
|
|
6
10
|
|
|
7
|
-
export default class GridSocket extends
|
|
11
|
+
export default class GridSocket extends BaseSocket {
|
|
8
12
|
constructor(app: Koa, server: http.Server) {
|
|
9
13
|
super(app, server, "/socket/grid", [authorized(permissions.BUILDER)])
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async onConnect(socket: Socket) {
|
|
17
|
+
// Initial identification of connected spreadsheet
|
|
18
|
+
socket.on(GridSocketEvent.SelectTable, async (tableId, callback) => {
|
|
19
|
+
await this.joinRoom(socket, tableId)
|
|
20
|
+
|
|
21
|
+
// Reply with all users in current room
|
|
22
|
+
const sessions = await this.getRoomSessions(tableId)
|
|
23
|
+
callback({ users: sessions })
|
|
24
|
+
})
|
|
10
25
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// Socket state
|
|
16
|
-
let currentRoom: string
|
|
17
|
-
|
|
18
|
-
// Initial identification of connected spreadsheet
|
|
19
|
-
socket.on("select-table", async (tableId, callback) => {
|
|
20
|
-
// Leave current room
|
|
21
|
-
if (currentRoom) {
|
|
22
|
-
socket.to(currentRoom).emit("user-disconnect", socket.data.user)
|
|
23
|
-
socket.leave(currentRoom)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Join new room
|
|
27
|
-
currentRoom = tableId
|
|
28
|
-
socket.join(currentRoom)
|
|
29
|
-
socket.to(currentRoom).emit("user-update", socket.data.user)
|
|
30
|
-
|
|
31
|
-
// Reply with all users in current room
|
|
32
|
-
const sockets = await this.io.in(currentRoom).fetchSockets()
|
|
33
|
-
callback({
|
|
34
|
-
users: sockets.map(socket => socket.data.user),
|
|
35
|
-
id: user.id,
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// Handle users selecting a new cell
|
|
40
|
-
socket.on("select-cell", cellId => {
|
|
41
|
-
socket.data.user.selectedCellId = cellId
|
|
42
|
-
if (currentRoom) {
|
|
43
|
-
socket.to(currentRoom).emit("user-update", socket.data.user)
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
// Disconnection cleanup
|
|
48
|
-
socket.on("disconnect", () => {
|
|
49
|
-
if (currentRoom) {
|
|
50
|
-
socket.to(currentRoom).emit("user-disconnect", socket.data.user)
|
|
51
|
-
}
|
|
52
|
-
})
|
|
26
|
+
// Handle users selecting a new cell
|
|
27
|
+
socket.on(GridSocketEvent.SelectCell, cellId => {
|
|
28
|
+
this.updateUser(socket, { focusedCellId: cellId })
|
|
53
29
|
})
|
|
54
30
|
}
|
|
31
|
+
|
|
32
|
+
emitRowUpdate(ctx: any, row: Row) {
|
|
33
|
+
const tableId = getTableId(ctx)
|
|
34
|
+
this.io.in(tableId).emit(GridSocketEvent.RowChange, { id: row._id, row })
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
emitRowDeletion(ctx: any, id: string) {
|
|
38
|
+
const tableId = getTableId(ctx)
|
|
39
|
+
this.io.in(tableId).emit(GridSocketEvent.RowChange, { id, row: null })
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
emitTableUpdate(table: Table) {
|
|
43
|
+
this.io
|
|
44
|
+
.in(table._id!)
|
|
45
|
+
.emit(GridSocketEvent.TableChange, { id: table._id, table })
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
emitTableDeletion(id: string) {
|
|
49
|
+
this.io.in(id).emit(GridSocketEvent.TableChange, { id, table: null })
|
|
50
|
+
}
|
|
55
51
|
}
|
package/src/websockets/index.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import http from "http"
|
|
2
2
|
import Koa from "koa"
|
|
3
|
-
import GridSocket from "./grid"
|
|
4
3
|
import ClientAppSocket from "./client"
|
|
4
|
+
import GridSocket from "./grid"
|
|
5
|
+
import BuilderSocket from "./builder"
|
|
5
6
|
|
|
6
7
|
let clientAppSocket: ClientAppSocket
|
|
7
8
|
let gridSocket: GridSocket
|
|
9
|
+
let builderSocket: BuilderSocket
|
|
8
10
|
|
|
9
11
|
export const initialise = (app: Koa, server: http.Server) => {
|
|
10
12
|
clientAppSocket = new ClientAppSocket(app, server)
|
|
11
13
|
gridSocket = new GridSocket(app, server)
|
|
14
|
+
builderSocket = new BuilderSocket(app, server)
|
|
12
15
|
}
|
|
13
16
|
|
|
14
|
-
export { clientAppSocket, gridSocket }
|
|
17
|
+
export { clientAppSocket, gridSocket, builderSocket }
|
|
@@ -3,18 +3,26 @@ import http from "http"
|
|
|
3
3
|
import Koa from "koa"
|
|
4
4
|
import Cookies from "cookies"
|
|
5
5
|
import { userAgent } from "koa-useragent"
|
|
6
|
-
import { auth } from "@budibase/backend-core"
|
|
6
|
+
import { auth, redis } from "@budibase/backend-core"
|
|
7
7
|
import currentApp from "../middleware/currentapp"
|
|
8
|
+
import { createAdapter } from "@socket.io/redis-adapter"
|
|
9
|
+
import { Socket } from "socket.io"
|
|
10
|
+
import { getSocketPubSubClients } from "../utilities/redis"
|
|
11
|
+
import { SocketEvent, SocketSessionTTL } from "@budibase/shared-core"
|
|
12
|
+
import { SocketSession } from "@budibase/types"
|
|
8
13
|
|
|
9
|
-
export
|
|
14
|
+
export class BaseSocket {
|
|
10
15
|
io: Server
|
|
16
|
+
path: string
|
|
17
|
+
redisClient?: redis.Client
|
|
11
18
|
|
|
12
19
|
constructor(
|
|
13
20
|
app: Koa,
|
|
14
21
|
server: http.Server,
|
|
15
|
-
path: string,
|
|
22
|
+
path: string = "/",
|
|
16
23
|
additionalMiddlewares?: any[]
|
|
17
24
|
) {
|
|
25
|
+
this.path = path
|
|
18
26
|
this.io = new Server(server, {
|
|
19
27
|
path,
|
|
20
28
|
})
|
|
@@ -59,12 +67,16 @@ export default class Socket {
|
|
|
59
67
|
for (let [idx, middleware] of middlewares.entries()) {
|
|
60
68
|
await middleware(ctx, () => {
|
|
61
69
|
if (idx === middlewares.length - 1) {
|
|
62
|
-
// Middlewares are finished
|
|
70
|
+
// Middlewares are finished
|
|
63
71
|
// Extract some data from our enriched koa context to persist
|
|
64
72
|
// as metadata for the socket
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
73
|
+
const { _id, email, firstName, lastName } = ctx.user
|
|
74
|
+
socket.data = {
|
|
75
|
+
_id,
|
|
76
|
+
email,
|
|
77
|
+
firstName,
|
|
78
|
+
lastName,
|
|
79
|
+
sessionId: socket.id,
|
|
68
80
|
}
|
|
69
81
|
next()
|
|
70
82
|
}
|
|
@@ -74,6 +86,185 @@ export default class Socket {
|
|
|
74
86
|
next(error)
|
|
75
87
|
}
|
|
76
88
|
})
|
|
89
|
+
|
|
90
|
+
// Initialise redis before handling connections
|
|
91
|
+
this.initialise().then(() => {
|
|
92
|
+
this.io.on("connection", async socket => {
|
|
93
|
+
// Add built in handler for heartbeats
|
|
94
|
+
socket.on(SocketEvent.Heartbeat, async () => {
|
|
95
|
+
console.log(socket.data.email, "heartbeat received")
|
|
96
|
+
await this.extendSessionTTL(socket.data.sessionId)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
// Add early disconnection handler to clean up and leave room
|
|
100
|
+
socket.on("disconnect", async () => {
|
|
101
|
+
// Run any custom disconnection logic before we leave the room,
|
|
102
|
+
// so that we have access to their room etc before disconnection
|
|
103
|
+
await this.onDisconnect(socket)
|
|
104
|
+
|
|
105
|
+
// Leave the current room when the user disconnects if we're in one
|
|
106
|
+
await this.leaveRoom(socket)
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// Add handlers for this socket
|
|
110
|
+
await this.onConnect(socket)
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async initialise() {
|
|
116
|
+
// Instantiate redis adapter.
|
|
117
|
+
// We use a fully qualified key name here as this bypasses the normal
|
|
118
|
+
// redis client#s key prefixing.
|
|
119
|
+
const { pub, sub } = getSocketPubSubClients()
|
|
120
|
+
const opts = {
|
|
121
|
+
key: `${redis.utils.Databases.SOCKET_IO}-${this.path}-pubsub`,
|
|
122
|
+
}
|
|
123
|
+
this.io.adapter(createAdapter(pub, sub, opts))
|
|
124
|
+
|
|
125
|
+
// Fetch redis client
|
|
126
|
+
this.redisClient = await redis.clients.getSocketClient()
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Gets the redis key for a certain session ID
|
|
130
|
+
getSessionKey(sessionId: string) {
|
|
131
|
+
return `${this.path}-session:${sessionId}`
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Gets the redis key for certain room name
|
|
135
|
+
getRoomKey(room: string) {
|
|
136
|
+
return `${this.path}-room:${room}`
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async extendSessionTTL(sessionId: string) {
|
|
140
|
+
const key = this.getSessionKey(sessionId)
|
|
141
|
+
await this.redisClient?.setExpiry(key, SocketSessionTTL)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Gets an array of all redis keys of users inside a certain room
|
|
145
|
+
async getRoomSessionIds(room: string): Promise<string[]> {
|
|
146
|
+
const keys = await this.redisClient?.get(this.getRoomKey(room))
|
|
147
|
+
return keys || []
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Sets the list of redis keys for users inside a certain room.
|
|
151
|
+
// There is no TTL on the actual room key map itself.
|
|
152
|
+
async setRoomSessionIds(room: string, ids: string[]) {
|
|
153
|
+
await this.redisClient?.store(this.getRoomKey(room), ids)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Gets a list of all users inside a certain room
|
|
157
|
+
async getRoomSessions(room?: string): Promise<SocketSession[]> {
|
|
158
|
+
if (room) {
|
|
159
|
+
const sessionIds = await this.getRoomSessionIds(room)
|
|
160
|
+
const keys = sessionIds.map(this.getSessionKey.bind(this))
|
|
161
|
+
const sessions = await this.redisClient?.bulkGet(keys)
|
|
162
|
+
return Object.values(sessions || {})
|
|
163
|
+
} else {
|
|
164
|
+
return []
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Detects keys which have been pruned from redis due to TTL expiry in a certain
|
|
169
|
+
// room and broadcasts disconnection messages to ensure clients are aware
|
|
170
|
+
async pruneRoom(room: string) {
|
|
171
|
+
const sessionIds = await this.getRoomSessionIds(room)
|
|
172
|
+
const sessionsExist = await Promise.all(
|
|
173
|
+
sessionIds.map(id => this.redisClient?.exists(this.getSessionKey(id)))
|
|
174
|
+
)
|
|
175
|
+
const prunedSessionIds = sessionIds.filter((id, idx) => {
|
|
176
|
+
if (!sessionsExist[idx]) {
|
|
177
|
+
this.io.to(room).emit(SocketEvent.UserDisconnect, sessionIds[idx])
|
|
178
|
+
return false
|
|
179
|
+
}
|
|
180
|
+
return true
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
// Store new pruned keys
|
|
184
|
+
await this.setRoomSessionIds(room, prunedSessionIds)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Adds a user to a certain room
|
|
188
|
+
async joinRoom(socket: Socket, room: string) {
|
|
189
|
+
if (!room) {
|
|
190
|
+
return
|
|
191
|
+
}
|
|
192
|
+
// Prune room before joining
|
|
193
|
+
await this.pruneRoom(room)
|
|
194
|
+
|
|
195
|
+
// Check if we're already in a room, as we'll need to leave if we are before we
|
|
196
|
+
// can join a different room
|
|
197
|
+
const oldRoom = socket.data.room
|
|
198
|
+
if (oldRoom && oldRoom !== room) {
|
|
199
|
+
await this.leaveRoom(socket)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Join new room
|
|
203
|
+
if (!oldRoom || oldRoom !== room) {
|
|
204
|
+
socket.join(room)
|
|
205
|
+
socket.data.room = room
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Store in redis
|
|
209
|
+
// @ts-ignore
|
|
210
|
+
let user: SocketSession = socket.data
|
|
211
|
+
const { sessionId } = user
|
|
212
|
+
const key = this.getSessionKey(sessionId)
|
|
213
|
+
await this.redisClient?.store(key, user, SocketSessionTTL)
|
|
214
|
+
const sessionIds = await this.getRoomSessionIds(room)
|
|
215
|
+
if (!sessionIds.includes(sessionId)) {
|
|
216
|
+
await this.setRoomSessionIds(room, [...sessionIds, sessionId])
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Notify other users
|
|
220
|
+
socket.to(room).emit(SocketEvent.UserUpdate, user)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Disconnects a socket from its current room
|
|
224
|
+
async leaveRoom(socket: Socket) {
|
|
225
|
+
// @ts-ignore
|
|
226
|
+
let user: SocketSession = socket.data
|
|
227
|
+
const { room, sessionId } = user
|
|
228
|
+
if (!room) {
|
|
229
|
+
return
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Leave room
|
|
233
|
+
socket.leave(room)
|
|
234
|
+
socket.data.room = undefined
|
|
235
|
+
|
|
236
|
+
// Delete from redis
|
|
237
|
+
const key = this.getSessionKey(sessionId)
|
|
238
|
+
await this.redisClient?.delete(key)
|
|
239
|
+
const sessionIds = await this.getRoomSessionIds(room)
|
|
240
|
+
await this.setRoomSessionIds(
|
|
241
|
+
room,
|
|
242
|
+
sessionIds.filter(id => id !== sessionId)
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
// Notify other users
|
|
246
|
+
socket.to(room).emit(SocketEvent.UserDisconnect, sessionId)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Updates a connected user's metadata, assuming a room change is not required.
|
|
250
|
+
async updateUser(socket: Socket, patch: Object) {
|
|
251
|
+
socket.data = {
|
|
252
|
+
...socket.data,
|
|
253
|
+
...patch,
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// If we're in a room, notify others of this change and update redis
|
|
257
|
+
if (socket.data.room) {
|
|
258
|
+
await this.joinRoom(socket, socket.data.room)
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async onConnect(socket: Socket) {
|
|
263
|
+
// Override
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async onDisconnect(socket: Socket) {
|
|
267
|
+
// Override
|
|
77
268
|
}
|
|
78
269
|
|
|
79
270
|
// Emit an event to all sockets
|
package/tsconfig.build.json
CHANGED
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
"incremental": true,
|
|
11
11
|
"types": ["node", "jest"],
|
|
12
12
|
"outDir": "dist/src",
|
|
13
|
-
"skipLibCheck": true
|
|
13
|
+
"skipLibCheck": true,
|
|
14
|
+
"baseUrl": ".",
|
|
15
|
+
"paths": {
|
|
16
|
+
"@budibase/types": ["../types/src"],
|
|
17
|
+
"@budibase/backend-core": ["../backend-core/src"],
|
|
18
|
+
"@budibase/backend-core/*": ["../backend-core/*"],
|
|
19
|
+
"@budibase/shared-core": ["../shared-core/src"],
|
|
20
|
+
"@budibase/pro": ["../pro/packages/pro/src"]
|
|
21
|
+
}
|
|
14
22
|
},
|
|
15
23
|
"include": ["src/**/*"],
|
|
16
24
|
"exclude": [
|
package/tsconfig.json
CHANGED
|
@@ -5,25 +5,12 @@
|
|
|
5
5
|
"declaration": true,
|
|
6
6
|
"sourceMap": true,
|
|
7
7
|
"baseUrl": ".",
|
|
8
|
-
"outDir": "dist"
|
|
9
|
-
"paths": {
|
|
10
|
-
"@budibase/types": ["../types/src"],
|
|
11
|
-
"@budibase/backend-core": ["../backend-core/src"],
|
|
12
|
-
"@budibase/backend-core/*": ["../backend-core/*"],
|
|
13
|
-
"@budibase/shared-core": ["../shared-core/src"],
|
|
14
|
-
"@budibase/pro": ["../pro/packages/pro/src"]
|
|
15
|
-
}
|
|
8
|
+
"outDir": "dist"
|
|
16
9
|
},
|
|
17
10
|
"ts-node": {
|
|
18
11
|
"require": ["tsconfig-paths/register"],
|
|
19
12
|
"swc": true
|
|
20
13
|
},
|
|
21
|
-
"references": [
|
|
22
|
-
{ "path": "../types" },
|
|
23
|
-
{ "path": "../backend-core" },
|
|
24
|
-
{ "path": "../shared-core" },
|
|
25
|
-
{ "path": "../../../budibase-pro/packages/pro" }
|
|
26
|
-
],
|
|
27
14
|
"include": ["src/**/*", "specs"],
|
|
28
15
|
"exclude": ["node_modules", "dist"]
|
|
29
16
|
}
|