@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
|
@@ -40,10 +40,10 @@ const SCHEMA: Integration = {
|
|
|
40
40
|
"Microsoft SQL Server is a relational database management system developed by Microsoft. ",
|
|
41
41
|
friendlyName: "MS SQL Server",
|
|
42
42
|
type: "Relational",
|
|
43
|
-
features:
|
|
44
|
-
DatasourceFeature.CONNECTION_CHECKING,
|
|
45
|
-
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
46
|
-
|
|
43
|
+
features: {
|
|
44
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
45
|
+
[DatasourceFeature.FETCH_TABLE_NAMES]: true,
|
|
46
|
+
},
|
|
47
47
|
datasource: {
|
|
48
48
|
user: {
|
|
49
49
|
type: DatasourceFieldType.STRING,
|
|
@@ -40,7 +40,9 @@ const getSchema = () => {
|
|
|
40
40
|
type: "Non-relational",
|
|
41
41
|
description:
|
|
42
42
|
"MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.",
|
|
43
|
-
features:
|
|
43
|
+
features: {
|
|
44
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
45
|
+
},
|
|
44
46
|
datasource: {
|
|
45
47
|
connectionString: {
|
|
46
48
|
type: DatasourceFieldType.STRING,
|
|
@@ -36,10 +36,10 @@ const SCHEMA: Integration = {
|
|
|
36
36
|
type: "Relational",
|
|
37
37
|
description:
|
|
38
38
|
"MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",
|
|
39
|
-
features:
|
|
40
|
-
DatasourceFeature.CONNECTION_CHECKING,
|
|
41
|
-
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
42
|
-
|
|
39
|
+
features: {
|
|
40
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
41
|
+
[DatasourceFeature.FETCH_TABLE_NAMES]: true,
|
|
42
|
+
},
|
|
43
43
|
datasource: {
|
|
44
44
|
host: {
|
|
45
45
|
type: DatasourceFieldType.STRING,
|
|
@@ -50,10 +50,10 @@ const SCHEMA: Integration = {
|
|
|
50
50
|
type: "Relational",
|
|
51
51
|
description:
|
|
52
52
|
"Oracle Database is an object-relational database management system developed by Oracle Corporation",
|
|
53
|
-
features:
|
|
54
|
-
DatasourceFeature.CONNECTION_CHECKING,
|
|
55
|
-
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
56
|
-
|
|
53
|
+
features: {
|
|
54
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
55
|
+
[DatasourceFeature.FETCH_TABLE_NAMES]: true,
|
|
56
|
+
},
|
|
57
57
|
datasource: {
|
|
58
58
|
host: {
|
|
59
59
|
type: DatasourceFieldType.STRING,
|
|
@@ -52,10 +52,10 @@ const SCHEMA: Integration = {
|
|
|
52
52
|
type: "Relational",
|
|
53
53
|
description:
|
|
54
54
|
"PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
|
|
55
|
-
features:
|
|
56
|
-
DatasourceFeature.CONNECTION_CHECKING,
|
|
57
|
-
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
58
|
-
|
|
55
|
+
features: {
|
|
56
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
57
|
+
[DatasourceFeature.FETCH_TABLE_NAMES]: true,
|
|
58
|
+
},
|
|
59
59
|
datasource: {
|
|
60
60
|
host: {
|
|
61
61
|
type: DatasourceFieldType.STRING,
|
|
@@ -21,7 +21,9 @@ const SCHEMA: Integration = {
|
|
|
21
21
|
"Redis is a caching tool, providing powerful key-value store capabilities.",
|
|
22
22
|
friendlyName: "Redis",
|
|
23
23
|
type: "Non-relational",
|
|
24
|
-
features:
|
|
24
|
+
features: {
|
|
25
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
26
|
+
},
|
|
25
27
|
datasource: {
|
|
26
28
|
host: {
|
|
27
29
|
type: "string",
|
package/src/integrations/s3.ts
CHANGED
|
@@ -24,7 +24,9 @@ const SCHEMA: Integration = {
|
|
|
24
24
|
"Amazon Simple Storage Service (Amazon S3) is an object storage service that offers industry-leading scalability, data availability, security, and performance.",
|
|
25
25
|
friendlyName: "Amazon S3",
|
|
26
26
|
type: "Object store",
|
|
27
|
-
features:
|
|
27
|
+
features: {
|
|
28
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
29
|
+
},
|
|
28
30
|
datasource: {
|
|
29
31
|
region: {
|
|
30
32
|
type: "string",
|
|
@@ -22,7 +22,9 @@ const SCHEMA: Integration = {
|
|
|
22
22
|
"Snowflake is a solution for data warehousing, data lakes, data engineering, data science, data application development, and securely sharing and consuming shared data.",
|
|
23
23
|
friendlyName: "Snowflake",
|
|
24
24
|
type: "Relational",
|
|
25
|
-
features:
|
|
25
|
+
features: {
|
|
26
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
27
|
+
},
|
|
26
28
|
datasource: {
|
|
27
29
|
account: {
|
|
28
30
|
type: "string",
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
checkDebounce,
|
|
10
10
|
setDebounce,
|
|
11
11
|
} from "../utilities/redis"
|
|
12
|
-
import { db as dbCore, cache
|
|
13
|
-
import {
|
|
12
|
+
import { db as dbCore, cache } from "@budibase/backend-core"
|
|
13
|
+
import { UserCtx, Database } from "@budibase/types"
|
|
14
14
|
|
|
15
15
|
const DEBOUNCE_TIME_SEC = 30
|
|
16
16
|
|
|
@@ -23,7 +23,7 @@ const DEBOUNCE_TIME_SEC = 30
|
|
|
23
23
|
* through the authorized middleware *
|
|
24
24
|
****************************************************/
|
|
25
25
|
|
|
26
|
-
async function checkDevAppLocks(ctx:
|
|
26
|
+
async function checkDevAppLocks(ctx: UserCtx) {
|
|
27
27
|
const appId = ctx.appId
|
|
28
28
|
|
|
29
29
|
// if any public usage, don't proceed
|
|
@@ -35,15 +35,14 @@ async function checkDevAppLocks(ctx: BBContext) {
|
|
|
35
35
|
if (!appId || !appId.startsWith(APP_DEV_PREFIX)) {
|
|
36
36
|
return
|
|
37
37
|
}
|
|
38
|
-
if (!(await doesUserHaveLock(appId, ctx.user))) {
|
|
39
|
-
ctx.throw(400, "User does not hold app lock.")
|
|
40
|
-
}
|
|
41
38
|
|
|
42
|
-
//
|
|
43
|
-
await
|
|
39
|
+
// If this user already owns the lock, then update it
|
|
40
|
+
if (await doesUserHaveLock(appId, ctx.user)) {
|
|
41
|
+
await updateLock(appId, ctx.user)
|
|
42
|
+
}
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
async function updateAppUpdatedAt(ctx:
|
|
45
|
+
async function updateAppUpdatedAt(ctx: UserCtx) {
|
|
47
46
|
const appId = ctx.appId
|
|
48
47
|
// if debouncing skip this update
|
|
49
48
|
// get methods also aren't updating
|
|
@@ -51,20 +50,29 @@ async function updateAppUpdatedAt(ctx: BBContext) {
|
|
|
51
50
|
return
|
|
52
51
|
}
|
|
53
52
|
await dbCore.doWithDB(appId, async (db: Database) => {
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
try {
|
|
54
|
+
const metadata = await db.get(DocumentType.APP_METADATA)
|
|
55
|
+
metadata.updatedAt = new Date().toISOString()
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user?.userId!)
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
const response = await db.put(metadata)
|
|
60
|
+
metadata._rev = response.rev
|
|
61
|
+
await cache.app.invalidateAppMetadata(appId, metadata)
|
|
62
|
+
// set a new debounce record with a short TTL
|
|
63
|
+
await setDebounce(appId, DEBOUNCE_TIME_SEC)
|
|
64
|
+
} catch (err: any) {
|
|
65
|
+
// if a 409 occurs, then multiple clients connected at the same time - ignore
|
|
66
|
+
if (err?.status === 409) {
|
|
67
|
+
return
|
|
68
|
+
} else {
|
|
69
|
+
throw err
|
|
70
|
+
}
|
|
71
|
+
}
|
|
64
72
|
})
|
|
65
73
|
}
|
|
66
74
|
|
|
67
|
-
export default async function builder(ctx:
|
|
75
|
+
export default async function builder(ctx: UserCtx) {
|
|
68
76
|
const appId = ctx.appId
|
|
69
77
|
// this only functions within an app context
|
|
70
78
|
if (!appId) {
|
package/src/startup.ts
CHANGED
|
@@ -16,6 +16,7 @@ import * as bullboard from "./automations/bullboard"
|
|
|
16
16
|
import * as pro from "@budibase/pro"
|
|
17
17
|
import * as api from "./api"
|
|
18
18
|
import sdk from "./sdk"
|
|
19
|
+
import { initialise as initialiseWebsockets } from "./websockets"
|
|
19
20
|
|
|
20
21
|
let STARTUP_RAN = false
|
|
21
22
|
|
|
@@ -64,6 +65,7 @@ export async function startup(app?: any, server?: any) {
|
|
|
64
65
|
fileSystem.init()
|
|
65
66
|
await redis.init()
|
|
66
67
|
eventInit()
|
|
68
|
+
initialiseWebsockets(app, server)
|
|
67
69
|
|
|
68
70
|
// run migrations on startup if not done via http
|
|
69
71
|
// not recommended in a clustered environment
|
|
@@ -373,7 +373,7 @@ class TestConfiguration {
|
|
|
373
373
|
|
|
374
374
|
// HEADERS
|
|
375
375
|
|
|
376
|
-
defaultHeaders(extras = {}) {
|
|
376
|
+
defaultHeaders(extras = {}, prodApp = false) {
|
|
377
377
|
const tenantId = this.getTenantId()
|
|
378
378
|
const authObj: AuthToken = {
|
|
379
379
|
userId: this.defaultUserValues.globalUserId,
|
|
@@ -390,7 +390,9 @@ class TestConfiguration {
|
|
|
390
390
|
...extras,
|
|
391
391
|
}
|
|
392
392
|
|
|
393
|
-
if (
|
|
393
|
+
if (prodApp) {
|
|
394
|
+
headers[constants.Header.APP_ID] = this.prodAppId
|
|
395
|
+
} else if (this.appId) {
|
|
394
396
|
headers[constants.Header.APP_ID] = this.appId
|
|
395
397
|
}
|
|
396
398
|
return headers
|
|
@@ -199,6 +199,48 @@ export function loopAutomation(tableId: string, loopOpts?: any): Automation {
|
|
|
199
199
|
return automation as Automation
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
export function collectAutomation(tableId?: string): Automation {
|
|
203
|
+
const automation: any = {
|
|
204
|
+
name: "looping",
|
|
205
|
+
type: "automation",
|
|
206
|
+
definition: {
|
|
207
|
+
steps: [
|
|
208
|
+
{
|
|
209
|
+
id: "b",
|
|
210
|
+
type: "ACTION",
|
|
211
|
+
internal: true,
|
|
212
|
+
stepId: AutomationActionStepId.EXECUTE_SCRIPT,
|
|
213
|
+
inputs: {
|
|
214
|
+
code: "return [1,2,3]",
|
|
215
|
+
},
|
|
216
|
+
schema: BUILTIN_ACTION_DEFINITIONS.EXECUTE_SCRIPT.schema,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
id: "c",
|
|
220
|
+
type: "ACTION",
|
|
221
|
+
internal: true,
|
|
222
|
+
stepId: AutomationActionStepId.COLLECT,
|
|
223
|
+
inputs: {
|
|
224
|
+
collection: "{{ literal steps.1.value }}",
|
|
225
|
+
},
|
|
226
|
+
schema: BUILTIN_ACTION_DEFINITIONS.SERVER_LOG.schema,
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
trigger: {
|
|
230
|
+
id: "a",
|
|
231
|
+
type: "TRIGGER",
|
|
232
|
+
event: "row:save",
|
|
233
|
+
stepId: AutomationTriggerStepId.ROW_SAVED,
|
|
234
|
+
inputs: {
|
|
235
|
+
tableId,
|
|
236
|
+
},
|
|
237
|
+
schema: TRIGGER_DEFINITIONS.ROW_SAVED.schema,
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
}
|
|
241
|
+
return automation as Automation
|
|
242
|
+
}
|
|
243
|
+
|
|
202
244
|
export function basicRow(tableId: string) {
|
|
203
245
|
return {
|
|
204
246
|
name: "Test Contact",
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
AutomationStatus,
|
|
20
20
|
AutomationMetadata,
|
|
21
21
|
AutomationJob,
|
|
22
|
+
AutomationData,
|
|
22
23
|
} from "@budibase/types"
|
|
23
24
|
import {
|
|
24
25
|
LoopStep,
|
|
@@ -30,6 +31,7 @@ import { WorkerCallback } from "./definitions"
|
|
|
30
31
|
import { context, logging } from "@budibase/backend-core"
|
|
31
32
|
import { processObject } from "@budibase/string-templates"
|
|
32
33
|
import { cloneDeep } from "lodash/fp"
|
|
34
|
+
import { performance } from "perf_hooks"
|
|
33
35
|
import * as sdkUtils from "../sdk/utils"
|
|
34
36
|
import env from "../environment"
|
|
35
37
|
const FILTER_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.FILTER.stepId
|
|
@@ -37,8 +39,8 @@ const LOOP_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.LOOP.stepId
|
|
|
37
39
|
const CRON_STEP_ID = triggerDefs.CRON.stepId
|
|
38
40
|
const STOPPED_STATUS = { success: true, status: AutomationStatus.STOPPED }
|
|
39
41
|
|
|
40
|
-
function getLoopIterations(loopStep: LoopStep
|
|
41
|
-
|
|
42
|
+
function getLoopIterations(loopStep: LoopStep) {
|
|
43
|
+
let binding = loopStep.inputs.binding
|
|
42
44
|
if (!binding) {
|
|
43
45
|
return 0
|
|
44
46
|
}
|
|
@@ -240,7 +242,9 @@ class Orchestrator {
|
|
|
240
242
|
let loopStepNumber: any = undefined
|
|
241
243
|
let loopSteps: LoopStep[] | undefined = []
|
|
242
244
|
let metadata
|
|
245
|
+
let timeoutFlag = false
|
|
243
246
|
let wasLoopStep = false
|
|
247
|
+
let timeout = this._job.data.event.timeout
|
|
244
248
|
// check if this is a recurring automation,
|
|
245
249
|
if (isProdAppID(this._appId) && isRecurring(automation)) {
|
|
246
250
|
metadata = await this.getMetadata()
|
|
@@ -249,8 +253,18 @@ class Orchestrator {
|
|
|
249
253
|
return
|
|
250
254
|
}
|
|
251
255
|
}
|
|
252
|
-
|
|
256
|
+
const start = performance.now()
|
|
253
257
|
for (let step of automation.definition.steps) {
|
|
258
|
+
if (timeoutFlag) {
|
|
259
|
+
break
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (timeout) {
|
|
263
|
+
setTimeout(() => {
|
|
264
|
+
timeoutFlag = true
|
|
265
|
+
}, timeout || 12000)
|
|
266
|
+
}
|
|
267
|
+
|
|
254
268
|
stepCount++
|
|
255
269
|
let input: any,
|
|
256
270
|
iterations = 1,
|
|
@@ -264,22 +278,17 @@ class Orchestrator {
|
|
|
264
278
|
|
|
265
279
|
if (loopStep) {
|
|
266
280
|
input = await processObject(loopStep.inputs, this._context)
|
|
267
|
-
iterations = getLoopIterations(loopStep as LoopStep
|
|
281
|
+
iterations = getLoopIterations(loopStep as LoopStep)
|
|
268
282
|
}
|
|
269
283
|
for (let index = 0; index < iterations; index++) {
|
|
270
284
|
let originalStepInput = cloneDeep(step.inputs)
|
|
271
285
|
// Handle if the user has set a max iteration count or if it reaches the max limit set by us
|
|
272
286
|
if (loopStep && input.binding) {
|
|
273
|
-
let newInput: any = await processObject(
|
|
274
|
-
loopStep.inputs,
|
|
275
|
-
cloneDeep(this._context)
|
|
276
|
-
)
|
|
277
|
-
|
|
278
287
|
let tempOutput = { items: loopSteps, iterations: iterationCount }
|
|
279
288
|
try {
|
|
280
|
-
|
|
289
|
+
loopStep.inputs.binding = automationUtils.typecastForLooping(
|
|
281
290
|
loopStep as LoopStep,
|
|
282
|
-
|
|
291
|
+
loopStep.inputs as LoopInput
|
|
283
292
|
)
|
|
284
293
|
} catch (err) {
|
|
285
294
|
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|
|
@@ -290,13 +299,12 @@ class Orchestrator {
|
|
|
290
299
|
loopStep = undefined
|
|
291
300
|
break
|
|
292
301
|
}
|
|
293
|
-
|
|
294
302
|
let item = []
|
|
295
303
|
if (
|
|
296
304
|
typeof loopStep.inputs.binding === "string" &&
|
|
297
305
|
loopStep.inputs.option === "String"
|
|
298
306
|
) {
|
|
299
|
-
item = automationUtils.stringSplit(
|
|
307
|
+
item = automationUtils.stringSplit(loopStep.inputs.binding)
|
|
300
308
|
} else if (Array.isArray(loopStep.inputs.binding)) {
|
|
301
309
|
item = loopStep.inputs.binding
|
|
302
310
|
}
|
|
@@ -338,6 +346,7 @@ class Orchestrator {
|
|
|
338
346
|
}
|
|
339
347
|
}
|
|
340
348
|
}
|
|
349
|
+
|
|
341
350
|
if (
|
|
342
351
|
index === env.AUTOMATION_MAX_ITERATIONS ||
|
|
343
352
|
index === parseInt(loopStep.inputs.iterations)
|
|
@@ -466,8 +475,25 @@ class Orchestrator {
|
|
|
466
475
|
}
|
|
467
476
|
}
|
|
468
477
|
|
|
478
|
+
const end = performance.now()
|
|
479
|
+
const executionTime = end - start
|
|
480
|
+
|
|
481
|
+
console.info(`Execution time: ${executionTime} milliseconds`, {
|
|
482
|
+
_logKey: "automation",
|
|
483
|
+
executionTime,
|
|
484
|
+
})
|
|
485
|
+
|
|
469
486
|
// store the logs for the automation run
|
|
470
|
-
|
|
487
|
+
try {
|
|
488
|
+
await storeLog(this._automation, this.executionOutput)
|
|
489
|
+
} catch (e: any) {
|
|
490
|
+
if (e.status === 413 && e.request?.data) {
|
|
491
|
+
// if content is too large we shouldn't log it
|
|
492
|
+
delete e.request.data
|
|
493
|
+
e.request.data = { message: "removed due to large size" }
|
|
494
|
+
}
|
|
495
|
+
logging.logAlert("Error writing automation log", e)
|
|
496
|
+
}
|
|
471
497
|
if (isProdAppID(this._appId) && isRecurring(automation) && metadata) {
|
|
472
498
|
await this.updateMetadata(metadata)
|
|
473
499
|
}
|
|
@@ -475,22 +501,56 @@ class Orchestrator {
|
|
|
475
501
|
}
|
|
476
502
|
}
|
|
477
503
|
|
|
478
|
-
export function execute(job: Job
|
|
504
|
+
export function execute(job: Job<AutomationData>, callback: WorkerCallback) {
|
|
479
505
|
const appId = job.data.event.appId
|
|
506
|
+
const automationId = job.data.automation._id
|
|
480
507
|
if (!appId) {
|
|
481
508
|
throw new Error("Unable to execute, event doesn't contain app ID.")
|
|
482
509
|
}
|
|
510
|
+
if (!automationId) {
|
|
511
|
+
throw new Error("Unable to execute, event doesn't contain automation ID.")
|
|
512
|
+
}
|
|
513
|
+
return context.doInAutomationContext({
|
|
514
|
+
appId,
|
|
515
|
+
automationId,
|
|
516
|
+
task: async () => {
|
|
517
|
+
const envVars = await sdkUtils.getEnvironmentVariables()
|
|
518
|
+
// put into automation thread for whole context
|
|
519
|
+
await context.doInEnvironmentContext(envVars, async () => {
|
|
520
|
+
const automationOrchestrator = new Orchestrator(job)
|
|
521
|
+
try {
|
|
522
|
+
const response = await automationOrchestrator.execute()
|
|
523
|
+
callback(null, response)
|
|
524
|
+
} catch (err) {
|
|
525
|
+
callback(err)
|
|
526
|
+
}
|
|
527
|
+
})
|
|
528
|
+
},
|
|
529
|
+
})
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
export function executeSynchronously(job: Job) {
|
|
533
|
+
const appId = job.data.event.appId
|
|
534
|
+
if (!appId) {
|
|
535
|
+
throw new Error("Unable to execute, event doesn't contain app ID.")
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
const timeoutPromise = new Promise((resolve, reject) => {
|
|
539
|
+
setTimeout(() => {
|
|
540
|
+
reject(new Error("Timeout exceeded"))
|
|
541
|
+
}, job.data.event.timeout || 12000)
|
|
542
|
+
})
|
|
543
|
+
|
|
483
544
|
return context.doInAppContext(appId, async () => {
|
|
484
545
|
const envVars = await sdkUtils.getEnvironmentVariables()
|
|
485
546
|
// put into automation thread for whole context
|
|
486
|
-
|
|
547
|
+
return context.doInEnvironmentContext(envVars, async () => {
|
|
487
548
|
const automationOrchestrator = new Orchestrator(job)
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
}
|
|
549
|
+
const response = await Promise.race([
|
|
550
|
+
automationOrchestrator.execute(),
|
|
551
|
+
timeoutPromise,
|
|
552
|
+
])
|
|
553
|
+
return response
|
|
494
554
|
})
|
|
495
555
|
})
|
|
496
556
|
}
|
package/src/threads/index.ts
CHANGED
|
@@ -38,6 +38,9 @@ export class Thread {
|
|
|
38
38
|
this.count = opts.count ? opts.count : 1
|
|
39
39
|
this.disableThreading = this.shouldDisableThreading()
|
|
40
40
|
if (!this.disableThreading) {
|
|
41
|
+
console.debug(
|
|
42
|
+
`[${env.FORKED_PROCESS_NAME}] initialising worker farm type=${type}`
|
|
43
|
+
)
|
|
41
44
|
const workerOpts: any = {
|
|
42
45
|
autoStart: true,
|
|
43
46
|
maxConcurrentWorkers: this.count,
|
|
@@ -45,6 +48,7 @@ export class Thread {
|
|
|
45
48
|
env: {
|
|
46
49
|
...process.env,
|
|
47
50
|
FORKED_PROCESS: "1",
|
|
51
|
+
FORKED_PROCESS_NAME: type,
|
|
48
52
|
},
|
|
49
53
|
},
|
|
50
54
|
}
|
|
@@ -54,6 +58,10 @@ export class Thread {
|
|
|
54
58
|
}
|
|
55
59
|
this.workers = workerFarm(workerOpts, typeToFile(type), ["execute"])
|
|
56
60
|
Thread.workerRefs.push(this.workers)
|
|
61
|
+
} else {
|
|
62
|
+
console.debug(
|
|
63
|
+
`[${env.FORKED_PROCESS_NAME}] skipping worker farm type=${type}`
|
|
64
|
+
)
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
|
|
@@ -72,9 +80,7 @@ export class Thread {
|
|
|
72
80
|
function fire(worker: any) {
|
|
73
81
|
worker.execute(job, (err: any, response: any) => {
|
|
74
82
|
if (err && err.type === "TimeoutError") {
|
|
75
|
-
reject(
|
|
76
|
-
new Error(`Query response time exceeded ${timeout}ms timeout.`)
|
|
77
|
-
)
|
|
83
|
+
reject(new Error(`Thread timeout exceeded ${timeout}ms timeout.`))
|
|
78
84
|
} else if (err) {
|
|
79
85
|
reject(err)
|
|
80
86
|
} else {
|
package/src/threads/utils.ts
CHANGED
|
@@ -26,8 +26,10 @@ function makeVariableKey(queryId: string, variable: string) {
|
|
|
26
26
|
export function threadSetup() {
|
|
27
27
|
// don't run this if not threading
|
|
28
28
|
if (env.isTest() || env.DISABLE_THREADING || !env.isInThread()) {
|
|
29
|
+
console.debug(`[${env.FORKED_PROCESS_NAME}] thread setup skipped`)
|
|
29
30
|
return
|
|
30
31
|
}
|
|
32
|
+
console.debug(`[${env.FORKED_PROCESS_NAME}] thread setup running`)
|
|
31
33
|
db.init()
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -35,10 +35,20 @@ export const getComponentLibraryManifest = async (library: string) => {
|
|
|
35
35
|
const filename = "manifest.json"
|
|
36
36
|
|
|
37
37
|
if (env.isDev() || env.isTest()) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
const paths = [
|
|
39
|
+
join(TOP_LEVEL_PATH, "packages/client", filename),
|
|
40
|
+
join(process.cwd(), "client", filename),
|
|
41
|
+
]
|
|
42
|
+
for (let path of paths) {
|
|
43
|
+
if (fs.existsSync(path)) {
|
|
44
|
+
// always load from new so that updates are refreshed
|
|
45
|
+
delete require.cache[require.resolve(path)]
|
|
46
|
+
return require(path)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Unable to find ${filename} in development environment (may need to build).`
|
|
51
|
+
)
|
|
42
52
|
}
|
|
43
53
|
|
|
44
54
|
if (!appId) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join } from "path"
|
|
1
|
+
import path, { join } from "path"
|
|
2
2
|
import { ObjectStoreBuckets } from "../../constants"
|
|
3
3
|
import fs from "fs"
|
|
4
4
|
import { objectStore } from "@budibase/backend-core"
|
|
@@ -6,6 +6,10 @@ import { resolve } from "../centralPath"
|
|
|
6
6
|
import env from "../../environment"
|
|
7
7
|
import { TOP_LEVEL_PATH } from "./filesystem"
|
|
8
8
|
|
|
9
|
+
export function devClientLibPath() {
|
|
10
|
+
return require.resolve("@budibase/client")
|
|
11
|
+
}
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* Client library paths in the object store:
|
|
11
15
|
* Previously, the entire client library package was downloaded from NPM
|
|
@@ -89,9 +93,10 @@ export async function updateClientLibrary(appId: string) {
|
|
|
89
93
|
let manifest, client
|
|
90
94
|
|
|
91
95
|
if (env.isDev()) {
|
|
96
|
+
const clientPath = devClientLibPath()
|
|
92
97
|
// Load the symlinked version in dev which is always the newest
|
|
93
|
-
manifest =
|
|
94
|
-
client =
|
|
98
|
+
manifest = join(path.dirname(path.dirname(clientPath)), "manifest.json")
|
|
99
|
+
client = clientPath
|
|
95
100
|
} else {
|
|
96
101
|
// Load the bundled version in prod
|
|
97
102
|
manifest = resolve(TOP_LEVEL_PATH, "client", "manifest.json")
|
|
@@ -4,9 +4,11 @@ import { budibaseTempDir } from "../budibaseDir"
|
|
|
4
4
|
import { join } from "path"
|
|
5
5
|
import env from "../../environment"
|
|
6
6
|
import tar from "tar"
|
|
7
|
+
import environment from "../../environment"
|
|
7
8
|
const uuid = require("uuid/v4")
|
|
8
9
|
|
|
9
|
-
export const TOP_LEVEL_PATH =
|
|
10
|
+
export const TOP_LEVEL_PATH =
|
|
11
|
+
environment.TOP_LEVEL_PATH || join(__dirname, "..", "..", "..")
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* Upon first startup of instance there may not be everything we need in tmp directory, set it up.
|
package/src/utilities/redis.ts
CHANGED
|
@@ -6,7 +6,11 @@ const APP_DEV_LOCK_SECONDS = 600
|
|
|
6
6
|
const AUTOMATION_TEST_FLAG_SECONDS = 60
|
|
7
7
|
let devAppClient: any, debounceClient: any, flagClient: any
|
|
8
8
|
|
|
9
|
-
//
|
|
9
|
+
// We need to maintain a duplicate client for socket.io pub/sub
|
|
10
|
+
let socketClient: any
|
|
11
|
+
let socketSubClient: any
|
|
12
|
+
|
|
13
|
+
// We init this as we want to keep the connection open all the time
|
|
10
14
|
// reduces the performance hit
|
|
11
15
|
export async function init() {
|
|
12
16
|
devAppClient = new redis.Client(redis.utils.Databases.DEV_LOCKS)
|
|
@@ -15,12 +19,18 @@ export async function init() {
|
|
|
15
19
|
await devAppClient.init()
|
|
16
20
|
await debounceClient.init()
|
|
17
21
|
await flagClient.init()
|
|
22
|
+
|
|
23
|
+
// Duplicate the socket client for pub/sub
|
|
24
|
+
socketClient = await redis.clients.getSocketClient()
|
|
25
|
+
socketSubClient = socketClient.getClient().duplicate()
|
|
18
26
|
}
|
|
19
27
|
|
|
20
28
|
export async function shutdown() {
|
|
29
|
+
console.log("REDIS SHUTDOWN")
|
|
21
30
|
if (devAppClient) await devAppClient.finish()
|
|
22
31
|
if (debounceClient) await debounceClient.finish()
|
|
23
32
|
if (flagClient) await flagClient.finish()
|
|
33
|
+
if (socketSubClient) socketSubClient.disconnect()
|
|
24
34
|
// shutdown core clients
|
|
25
35
|
await redis.clients.shutdown()
|
|
26
36
|
console.log("Redis shutdown")
|
|
@@ -86,3 +96,10 @@ export async function checkTestFlag(id: string) {
|
|
|
86
96
|
export async function clearTestFlag(id: string) {
|
|
87
97
|
await devAppClient.delete(id)
|
|
88
98
|
}
|
|
99
|
+
|
|
100
|
+
export function getSocketPubSubClients() {
|
|
101
|
+
return {
|
|
102
|
+
pub: socketClient.getClient(),
|
|
103
|
+
sub: socketSubClient,
|
|
104
|
+
}
|
|
105
|
+
}
|