@budibase/server 2.6.19-alpha.5 → 2.6.19-alpha.51
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.4f47d591.js +1869 -0
- package/builder/assets/index.6ebb99b3.css +6 -0
- package/builder/index.html +2 -2
- package/client/manifest.json +5229 -0
- package/dist/automation.js +32566 -0
- package/dist/automation.js.map +7 -0
- package/dist/index.js +45038 -13
- package/dist/index.js.map +7 -0
- package/dist/query.js +24454 -0
- package/dist/query.js.map +7 -0
- package/jest.config.ts +3 -0
- package/nodemon.json +1 -1
- package/package.json +33 -15
- 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 +25 -15
- package/src/api/controllers/deploy/index.ts +1 -0
- package/src/api/controllers/plugin/index.ts +1 -1
- package/src/api/controllers/row/external.ts +39 -15
- package/src/api/controllers/row/index.ts +18 -24
- package/src/api/controllers/row/internal.ts +1 -1
- package/src/api/controllers/row/staticFormula.ts +6 -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/datasource.ts +2 -2
- 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/view.spec.js +4 -3
- 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/db/linkedRows/index.ts +5 -3
- package/src/environment.ts +3 -0
- package/src/integration-test/postgres.spec.ts +5 -5
- 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 +37 -13
- 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 +10 -2
- 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/sdk/plugins/plugins.ts +1 -1
- 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 +91 -23
- 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 +25 -3
- package/src/utilities/rowProcessor/index.ts +4 -1
- package/src/utilities/rowProcessor/map.ts +1 -1
- package/src/websockets/builder.ts +77 -0
- package/src/websockets/client.ts +2 -2
- package/src/websockets/grid.ts +44 -44
- package/src/websockets/index.ts +13 -6
- package/src/websockets/websocket.ts +207 -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
|
@@ -66,10 +66,10 @@ const SCHEMA: Integration = {
|
|
|
66
66
|
"Create and collaborate on online spreadsheets in real-time and from any device.",
|
|
67
67
|
friendlyName: "Google Sheets",
|
|
68
68
|
type: "Spreadsheet",
|
|
69
|
-
features:
|
|
70
|
-
DatasourceFeature.CONNECTION_CHECKING,
|
|
71
|
-
DatasourceFeature.FETCH_TABLE_NAMES,
|
|
72
|
-
|
|
69
|
+
features: {
|
|
70
|
+
[DatasourceFeature.CONNECTION_CHECKING]: true,
|
|
71
|
+
[DatasourceFeature.FETCH_TABLE_NAMES]: true,
|
|
72
|
+
},
|
|
73
73
|
datasource: {
|
|
74
74
|
spreadsheetId: {
|
|
75
75
|
display: "Google Sheet URL",
|
|
@@ -457,22 +457,41 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
457
457
|
}) {
|
|
458
458
|
try {
|
|
459
459
|
await this.connect()
|
|
460
|
+
const hasFilters = dataFilters.hasFilters(query.filters)
|
|
461
|
+
const limit = query.paginate?.limit || 100
|
|
462
|
+
const page: number =
|
|
463
|
+
typeof query.paginate?.page === "number"
|
|
464
|
+
? query.paginate.page
|
|
465
|
+
: parseInt(query.paginate?.page || "1")
|
|
466
|
+
const offset = (page - 1) * limit
|
|
460
467
|
const sheet = this.client.sheetsByTitle[query.sheet]
|
|
461
468
|
let rows: GoogleSpreadsheetRow[] = []
|
|
462
|
-
if (query.paginate) {
|
|
463
|
-
const limit = query.paginate.limit || 100
|
|
464
|
-
let page: number =
|
|
465
|
-
typeof query.paginate.page === "number"
|
|
466
|
-
? query.paginate.page
|
|
467
|
-
: parseInt(query.paginate.page || "1")
|
|
469
|
+
if (query.paginate && !hasFilters) {
|
|
468
470
|
rows = await sheet.getRows({
|
|
469
471
|
limit,
|
|
470
|
-
offset
|
|
472
|
+
offset,
|
|
471
473
|
})
|
|
472
474
|
} else {
|
|
473
475
|
rows = await sheet.getRows()
|
|
474
476
|
}
|
|
475
|
-
|
|
477
|
+
// this is a special case - need to handle the _id, it doesn't exist
|
|
478
|
+
// we cannot edit the returned structure from google, it does not have
|
|
479
|
+
// setter functions and is immutable, easier to update the filters
|
|
480
|
+
// to look for the _rowNumber property rather than rowNumber
|
|
481
|
+
if (query.filters?.equal) {
|
|
482
|
+
const idFilterKeys = Object.keys(query.filters.equal).filter(filter =>
|
|
483
|
+
filter.includes(GOOGLE_SHEETS_PRIMARY_KEY)
|
|
484
|
+
)
|
|
485
|
+
for (let idFilterKey of idFilterKeys) {
|
|
486
|
+
const id = query.filters.equal[idFilterKey]
|
|
487
|
+
delete query.filters.equal[idFilterKey]
|
|
488
|
+
query.filters.equal[`_${GOOGLE_SHEETS_PRIMARY_KEY}`] = id
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
let filtered = dataFilters.runLuceneQuery(rows, query.filters)
|
|
492
|
+
if (hasFilters && query.paginate) {
|
|
493
|
+
filtered = filtered.slice(offset, offset + limit)
|
|
494
|
+
}
|
|
476
495
|
const headerValues = sheet.headerValues
|
|
477
496
|
let response = []
|
|
478
497
|
for (let row of filtered) {
|
|
@@ -535,7 +554,12 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
|
|
535
554
|
const row = rows[query.rowIndex]
|
|
536
555
|
if (row) {
|
|
537
556
|
await row.delete()
|
|
538
|
-
return [
|
|
557
|
+
return [
|
|
558
|
+
{
|
|
559
|
+
deleted: query.rowIndex,
|
|
560
|
+
[GOOGLE_SHEETS_PRIMARY_KEY]: query.rowIndex,
|
|
561
|
+
},
|
|
562
|
+
]
|
|
539
563
|
} else {
|
|
540
564
|
throw new Error("Row does not exist.")
|
|
541
565
|
}
|
|
@@ -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",
|
|
@@ -175,7 +177,13 @@ class RedisIntegration {
|
|
|
175
177
|
const pipeline = this.client.pipeline(pipelineCommands)
|
|
176
178
|
const result = await pipeline.exec()
|
|
177
179
|
|
|
178
|
-
return result
|
|
180
|
+
return result?.map((output: any) => {
|
|
181
|
+
if (typeof output === "string") {
|
|
182
|
+
return output
|
|
183
|
+
} else if (Array.isArray(output)) {
|
|
184
|
+
return output[1]
|
|
185
|
+
}
|
|
186
|
+
})
|
|
179
187
|
})
|
|
180
188
|
}
|
|
181
189
|
}
|
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) {
|
|
@@ -36,6 +36,6 @@ export async function processUploaded(plugin: FileType, source?: PluginSource) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const doc = await pro.plugins.storePlugin(metadata, directory, source)
|
|
39
|
-
clientAppSocket
|
|
39
|
+
clientAppSocket?.emit("plugin-update", { name: doc.name, hash: doc.hash })
|
|
40
40
|
return doc
|
|
41
41
|
}
|
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,15 +39,23 @@ 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
|
}
|
|
47
|
+
const isString = typeof binding === "string"
|
|
48
|
+
try {
|
|
49
|
+
if (isString) {
|
|
50
|
+
binding = JSON.parse(binding)
|
|
51
|
+
}
|
|
52
|
+
} catch (err) {
|
|
53
|
+
// ignore error - wasn't able to parse
|
|
54
|
+
}
|
|
45
55
|
if (Array.isArray(binding)) {
|
|
46
56
|
return binding.length
|
|
47
57
|
}
|
|
48
|
-
if (
|
|
58
|
+
if (isString) {
|
|
49
59
|
return automationUtils.stringSplit(binding).length
|
|
50
60
|
}
|
|
51
61
|
return 0
|
|
@@ -240,7 +250,9 @@ class Orchestrator {
|
|
|
240
250
|
let loopStepNumber: any = undefined
|
|
241
251
|
let loopSteps: LoopStep[] | undefined = []
|
|
242
252
|
let metadata
|
|
253
|
+
let timeoutFlag = false
|
|
243
254
|
let wasLoopStep = false
|
|
255
|
+
let timeout = this._job.data.event.timeout
|
|
244
256
|
// check if this is a recurring automation,
|
|
245
257
|
if (isProdAppID(this._appId) && isRecurring(automation)) {
|
|
246
258
|
metadata = await this.getMetadata()
|
|
@@ -249,8 +261,18 @@ class Orchestrator {
|
|
|
249
261
|
return
|
|
250
262
|
}
|
|
251
263
|
}
|
|
252
|
-
|
|
264
|
+
const start = performance.now()
|
|
253
265
|
for (let step of automation.definition.steps) {
|
|
266
|
+
if (timeoutFlag) {
|
|
267
|
+
break
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (timeout) {
|
|
271
|
+
setTimeout(() => {
|
|
272
|
+
timeoutFlag = true
|
|
273
|
+
}, timeout || 12000)
|
|
274
|
+
}
|
|
275
|
+
|
|
254
276
|
stepCount++
|
|
255
277
|
let input: any,
|
|
256
278
|
iterations = 1,
|
|
@@ -264,22 +286,17 @@ class Orchestrator {
|
|
|
264
286
|
|
|
265
287
|
if (loopStep) {
|
|
266
288
|
input = await processObject(loopStep.inputs, this._context)
|
|
267
|
-
iterations = getLoopIterations(loopStep as LoopStep
|
|
289
|
+
iterations = getLoopIterations(loopStep as LoopStep)
|
|
268
290
|
}
|
|
269
291
|
for (let index = 0; index < iterations; index++) {
|
|
270
292
|
let originalStepInput = cloneDeep(step.inputs)
|
|
271
293
|
// Handle if the user has set a max iteration count or if it reaches the max limit set by us
|
|
272
294
|
if (loopStep && input.binding) {
|
|
273
|
-
let newInput: any = await processObject(
|
|
274
|
-
loopStep.inputs,
|
|
275
|
-
cloneDeep(this._context)
|
|
276
|
-
)
|
|
277
|
-
|
|
278
295
|
let tempOutput = { items: loopSteps, iterations: iterationCount }
|
|
279
296
|
try {
|
|
280
|
-
|
|
297
|
+
loopStep.inputs.binding = automationUtils.typecastForLooping(
|
|
281
298
|
loopStep as LoopStep,
|
|
282
|
-
|
|
299
|
+
loopStep.inputs as LoopInput
|
|
283
300
|
)
|
|
284
301
|
} catch (err) {
|
|
285
302
|
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|
|
@@ -290,13 +307,12 @@ class Orchestrator {
|
|
|
290
307
|
loopStep = undefined
|
|
291
308
|
break
|
|
292
309
|
}
|
|
293
|
-
|
|
294
310
|
let item = []
|
|
295
311
|
if (
|
|
296
312
|
typeof loopStep.inputs.binding === "string" &&
|
|
297
313
|
loopStep.inputs.option === "String"
|
|
298
314
|
) {
|
|
299
|
-
item = automationUtils.stringSplit(
|
|
315
|
+
item = automationUtils.stringSplit(loopStep.inputs.binding)
|
|
300
316
|
} else if (Array.isArray(loopStep.inputs.binding)) {
|
|
301
317
|
item = loopStep.inputs.binding
|
|
302
318
|
}
|
|
@@ -338,6 +354,7 @@ class Orchestrator {
|
|
|
338
354
|
}
|
|
339
355
|
}
|
|
340
356
|
}
|
|
357
|
+
|
|
341
358
|
if (
|
|
342
359
|
index === env.AUTOMATION_MAX_ITERATIONS ||
|
|
343
360
|
index === parseInt(loopStep.inputs.iterations)
|
|
@@ -466,8 +483,25 @@ class Orchestrator {
|
|
|
466
483
|
}
|
|
467
484
|
}
|
|
468
485
|
|
|
486
|
+
const end = performance.now()
|
|
487
|
+
const executionTime = end - start
|
|
488
|
+
|
|
489
|
+
console.info(`Execution time: ${executionTime} milliseconds`, {
|
|
490
|
+
_logKey: "automation",
|
|
491
|
+
executionTime,
|
|
492
|
+
})
|
|
493
|
+
|
|
469
494
|
// store the logs for the automation run
|
|
470
|
-
|
|
495
|
+
try {
|
|
496
|
+
await storeLog(this._automation, this.executionOutput)
|
|
497
|
+
} catch (e: any) {
|
|
498
|
+
if (e.status === 413 && e.request?.data) {
|
|
499
|
+
// if content is too large we shouldn't log it
|
|
500
|
+
delete e.request.data
|
|
501
|
+
e.request.data = { message: "removed due to large size" }
|
|
502
|
+
}
|
|
503
|
+
logging.logAlert("Error writing automation log", e)
|
|
504
|
+
}
|
|
471
505
|
if (isProdAppID(this._appId) && isRecurring(automation) && metadata) {
|
|
472
506
|
await this.updateMetadata(metadata)
|
|
473
507
|
}
|
|
@@ -475,22 +509,56 @@ class Orchestrator {
|
|
|
475
509
|
}
|
|
476
510
|
}
|
|
477
511
|
|
|
478
|
-
export function execute(job: Job
|
|
512
|
+
export function execute(job: Job<AutomationData>, callback: WorkerCallback) {
|
|
479
513
|
const appId = job.data.event.appId
|
|
514
|
+
const automationId = job.data.automation._id
|
|
480
515
|
if (!appId) {
|
|
481
516
|
throw new Error("Unable to execute, event doesn't contain app ID.")
|
|
482
517
|
}
|
|
518
|
+
if (!automationId) {
|
|
519
|
+
throw new Error("Unable to execute, event doesn't contain automation ID.")
|
|
520
|
+
}
|
|
521
|
+
return context.doInAutomationContext({
|
|
522
|
+
appId,
|
|
523
|
+
automationId,
|
|
524
|
+
task: async () => {
|
|
525
|
+
const envVars = await sdkUtils.getEnvironmentVariables()
|
|
526
|
+
// put into automation thread for whole context
|
|
527
|
+
await context.doInEnvironmentContext(envVars, async () => {
|
|
528
|
+
const automationOrchestrator = new Orchestrator(job)
|
|
529
|
+
try {
|
|
530
|
+
const response = await automationOrchestrator.execute()
|
|
531
|
+
callback(null, response)
|
|
532
|
+
} catch (err) {
|
|
533
|
+
callback(err)
|
|
534
|
+
}
|
|
535
|
+
})
|
|
536
|
+
},
|
|
537
|
+
})
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
export function executeSynchronously(job: Job) {
|
|
541
|
+
const appId = job.data.event.appId
|
|
542
|
+
if (!appId) {
|
|
543
|
+
throw new Error("Unable to execute, event doesn't contain app ID.")
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
const timeoutPromise = new Promise((resolve, reject) => {
|
|
547
|
+
setTimeout(() => {
|
|
548
|
+
reject(new Error("Timeout exceeded"))
|
|
549
|
+
}, job.data.event.timeout || 12000)
|
|
550
|
+
})
|
|
551
|
+
|
|
483
552
|
return context.doInAppContext(appId, async () => {
|
|
484
553
|
const envVars = await sdkUtils.getEnvironmentVariables()
|
|
485
554
|
// put into automation thread for whole context
|
|
486
|
-
|
|
555
|
+
return context.doInEnvironmentContext(envVars, async () => {
|
|
487
556
|
const automationOrchestrator = new Orchestrator(job)
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
}
|
|
557
|
+
const response = await Promise.race([
|
|
558
|
+
automationOrchestrator.execute(),
|
|
559
|
+
timeoutPromise,
|
|
560
|
+
])
|
|
561
|
+
return response
|
|
494
562
|
})
|
|
495
563
|
})
|
|
496
564
|
}
|
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
|
|