@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.
Files changed (414) hide show
  1. package/.dockerignore +7 -6
  2. package/Dockerfile +16 -8
  3. package/builder/assets/index.4f47d591.js +1869 -0
  4. package/builder/assets/index.6ebb99b3.css +6 -0
  5. package/builder/index.html +2 -2
  6. package/client/manifest.json +5229 -0
  7. package/dist/automation.js +32566 -0
  8. package/dist/automation.js.map +7 -0
  9. package/dist/index.js +45038 -13
  10. package/dist/index.js.map +7 -0
  11. package/dist/query.js +24454 -0
  12. package/dist/query.js.map +7 -0
  13. package/jest.config.ts +3 -0
  14. package/nodemon.json +1 -1
  15. package/package.json +33 -15
  16. package/pm2.config.js +1 -1
  17. package/scripts/build.js +48 -0
  18. package/src/api/controllers/application.ts +21 -22
  19. package/src/api/controllers/automation.ts +37 -9
  20. package/src/api/controllers/datasource.ts +25 -15
  21. package/src/api/controllers/deploy/index.ts +1 -0
  22. package/src/api/controllers/plugin/index.ts +1 -1
  23. package/src/api/controllers/row/external.ts +39 -15
  24. package/src/api/controllers/row/index.ts +18 -24
  25. package/src/api/controllers/row/internal.ts +1 -1
  26. package/src/api/controllers/row/staticFormula.ts +6 -1
  27. package/src/api/controllers/row/utils.ts +12 -0
  28. package/src/api/controllers/static/index.ts +3 -3
  29. package/src/api/controllers/table/index.ts +3 -0
  30. package/src/api/controllers/table/internal.ts +2 -6
  31. package/src/api/controllers/table/utils.ts +32 -1
  32. package/src/api/controllers/view/index.ts +5 -5
  33. package/src/api/controllers/webhook.ts +33 -9
  34. package/src/api/routes/application.ts +5 -0
  35. package/src/api/routes/automation.ts +0 -1
  36. package/src/api/routes/datasource.ts +2 -2
  37. package/src/api/routes/static.ts +3 -1
  38. package/src/api/routes/tests/{automation.spec.js → automation.spec.ts} +106 -31
  39. package/src/api/routes/tests/view.spec.js +4 -3
  40. package/src/api/routes/tests/{webhook.spec.js → webhook.spec.ts} +33 -11
  41. package/src/app.ts +0 -1
  42. package/src/automations/actions.ts +8 -0
  43. package/src/automations/logging/index.ts +21 -0
  44. package/src/automations/steps/bash.ts +4 -0
  45. package/src/automations/steps/collect.ts +58 -0
  46. package/src/automations/steps/createRow.ts +4 -0
  47. package/src/automations/steps/delay.ts +1 -0
  48. package/src/automations/steps/deleteRow.ts +4 -0
  49. package/src/automations/steps/discord.ts +4 -0
  50. package/src/automations/steps/executeQuery.ts +4 -0
  51. package/src/automations/steps/executeScript.ts +4 -0
  52. package/src/automations/steps/filter.ts +1 -0
  53. package/src/automations/steps/loop.ts +1 -0
  54. package/src/automations/steps/make.ts +4 -0
  55. package/src/automations/steps/openai.ts +106 -0
  56. package/src/automations/steps/outgoingWebhook.ts +4 -0
  57. package/src/automations/steps/queryRows.ts +4 -0
  58. package/src/automations/steps/sendSmtpEmail.ts +4 -0
  59. package/src/automations/steps/serverLog.ts +4 -0
  60. package/src/automations/steps/slack.ts +4 -0
  61. package/src/automations/steps/updateRow.ts +4 -0
  62. package/src/automations/steps/zapier.ts +4 -0
  63. package/src/automations/tests/openai.spec.ts +86 -0
  64. package/src/automations/triggers.ts +3 -2
  65. package/src/constants/index.ts +17 -16
  66. package/src/db/inMemoryView.ts +1 -0
  67. package/src/db/linkedRows/index.ts +5 -3
  68. package/src/environment.ts +3 -0
  69. package/src/integration-test/postgres.spec.ts +5 -5
  70. package/src/integrations/airtable.ts +3 -1
  71. package/src/integrations/arangodb.ts +3 -1
  72. package/src/integrations/base/sqlTable.ts +0 -1
  73. package/src/integrations/couchdb.ts +3 -1
  74. package/src/integrations/dynamodb.ts +3 -1
  75. package/src/integrations/elasticsearch.ts +3 -1
  76. package/src/integrations/firebase.ts +3 -1
  77. package/src/integrations/googlesheets.ts +37 -13
  78. package/src/integrations/microsoftSqlServer.ts +4 -4
  79. package/src/integrations/mongodb.ts +3 -1
  80. package/src/integrations/mysql.ts +4 -4
  81. package/src/integrations/oracle.ts +4 -4
  82. package/src/integrations/postgres.ts +4 -4
  83. package/src/integrations/redis.ts +10 -2
  84. package/src/integrations/s3.ts +3 -1
  85. package/src/integrations/snowflake.ts +3 -1
  86. package/src/middleware/builder.ts +26 -18
  87. package/src/sdk/app/automations/index.ts +2 -0
  88. package/src/sdk/app/automations/utils.ts +7 -0
  89. package/src/sdk/plugins/plugins.ts +1 -1
  90. package/src/startup.ts +2 -0
  91. package/src/tests/utilities/TestConfiguration.ts +4 -2
  92. package/src/tests/utilities/structures.ts +42 -0
  93. package/src/threads/automation.ts +91 -23
  94. package/src/threads/index.ts +9 -3
  95. package/src/threads/utils.ts +2 -0
  96. package/src/utilities/fileSystem/app.ts +14 -4
  97. package/src/utilities/fileSystem/clientLibrary.ts +8 -3
  98. package/src/utilities/fileSystem/filesystem.ts +3 -1
  99. package/src/utilities/redis.ts +25 -3
  100. package/src/utilities/rowProcessor/index.ts +4 -1
  101. package/src/utilities/rowProcessor/map.ts +1 -1
  102. package/src/websockets/builder.ts +77 -0
  103. package/src/websockets/client.ts +2 -2
  104. package/src/websockets/grid.ts +44 -44
  105. package/src/websockets/index.ts +13 -6
  106. package/src/websockets/websocket.ts +207 -7
  107. package/tsconfig.build.json +9 -1
  108. package/tsconfig.json +1 -14
  109. package/builder/assets/index.07382a47.css +0 -6
  110. package/builder/assets/index.3d5c50fb.js +0 -1786
  111. package/dist/api/controllers/analytics.js +0 -46
  112. package/dist/api/controllers/apikeys.js +0 -72
  113. package/dist/api/controllers/application.js +0 -574
  114. package/dist/api/controllers/auth.js +0 -80
  115. package/dist/api/controllers/automation.js +0 -303
  116. package/dist/api/controllers/backup.js +0 -37
  117. package/dist/api/controllers/component.js +0 -59
  118. package/dist/api/controllers/datasource.js +0 -352
  119. package/dist/api/controllers/deploy/Deployment.js +0 -53
  120. package/dist/api/controllers/deploy/index.js +0 -198
  121. package/dist/api/controllers/dev.js +0 -146
  122. package/dist/api/controllers/integration.js +0 -28
  123. package/dist/api/controllers/layout.js +0 -49
  124. package/dist/api/controllers/metadata.js +0 -63
  125. package/dist/api/controllers/migrations.js +0 -29
  126. package/dist/api/controllers/ops.js +0 -40
  127. package/dist/api/controllers/permission.js +0 -162
  128. package/dist/api/controllers/plugin/file.js +0 -24
  129. package/dist/api/controllers/plugin/github.js +0 -69
  130. package/dist/api/controllers/plugin/index.js +0 -112
  131. package/dist/api/controllers/plugin/npm.js +0 -58
  132. package/dist/api/controllers/plugin/uploaders.js +0 -11
  133. package/dist/api/controllers/plugin/url.js +0 -24
  134. package/dist/api/controllers/plugin/utils.js +0 -27
  135. package/dist/api/controllers/public/applications.js +0 -146
  136. package/dist/api/controllers/public/mapping/applications.js +0 -29
  137. package/dist/api/controllers/public/mapping/index.js +0 -11
  138. package/dist/api/controllers/public/mapping/queries.js +0 -36
  139. package/dist/api/controllers/public/mapping/rows.js +0 -24
  140. package/dist/api/controllers/public/mapping/tables.js +0 -23
  141. package/dist/api/controllers/public/mapping/types.js +0 -2
  142. package/dist/api/controllers/public/mapping/users.js +0 -29
  143. package/dist/api/controllers/public/metrics.js +0 -113
  144. package/dist/api/controllers/public/queries.js +0 -58
  145. package/dist/api/controllers/public/rows.js +0 -120
  146. package/dist/api/controllers/public/tables.js +0 -95
  147. package/dist/api/controllers/public/users.js +0 -93
  148. package/dist/api/controllers/public/utils.js +0 -56
  149. package/dist/api/controllers/query/import/index.js +0 -87
  150. package/dist/api/controllers/query/import/sources/base/index.js +0 -75
  151. package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
  152. package/dist/api/controllers/query/import/sources/curl.js +0 -99
  153. package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
  154. package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
  155. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
  156. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
  157. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
  158. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
  159. package/dist/api/controllers/query/index.js +0 -299
  160. package/dist/api/controllers/query/validation.js +0 -53
  161. package/dist/api/controllers/role.js +0 -109
  162. package/dist/api/controllers/routing.js +0 -105
  163. package/dist/api/controllers/row/ExternalRequest.js +0 -683
  164. package/dist/api/controllers/row/external.js +0 -339
  165. package/dist/api/controllers/row/index.js +0 -203
  166. package/dist/api/controllers/row/internal.js +0 -509
  167. package/dist/api/controllers/row/internalSearch.js +0 -28
  168. package/dist/api/controllers/row/staticFormula.js +0 -165
  169. package/dist/api/controllers/row/utils.js +0 -183
  170. package/dist/api/controllers/screen.js +0 -110
  171. package/dist/api/controllers/script.js +0 -30
  172. package/dist/api/controllers/static/index.js +0 -268
  173. package/dist/api/controllers/table/bulkFormula.js +0 -173
  174. package/dist/api/controllers/table/external.js +0 -279
  175. package/dist/api/controllers/table/index.js +0 -179
  176. package/dist/api/controllers/table/internal.js +0 -197
  177. package/dist/api/controllers/table/utils.js +0 -379
  178. package/dist/api/controllers/templates.js +0 -56
  179. package/dist/api/controllers/user.js +0 -124
  180. package/dist/api/controllers/view/exporters.js +0 -46
  181. package/dist/api/controllers/view/index.js +0 -193
  182. package/dist/api/controllers/view/utils.js +0 -177
  183. package/dist/api/controllers/view/viewBuilder.js +0 -158
  184. package/dist/api/controllers/webhook.js +0 -134
  185. package/dist/api/index.js +0 -55
  186. package/dist/api/routes/analytics.js +0 -34
  187. package/dist/api/routes/apikeys.js +0 -37
  188. package/dist/api/routes/application.js +0 -48
  189. package/dist/api/routes/auth.js +0 -33
  190. package/dist/api/routes/automation.js +0 -50
  191. package/dist/api/routes/backup.js +0 -35
  192. package/dist/api/routes/component.js +0 -35
  193. package/dist/api/routes/datasource.js +0 -45
  194. package/dist/api/routes/deploy.js +0 -37
  195. package/dist/api/routes/dev.js +0 -49
  196. package/dist/api/routes/index.js +0 -75
  197. package/dist/api/routes/integration.js +0 -37
  198. package/dist/api/routes/layout.js +0 -37
  199. package/dist/api/routes/metadata.js +0 -40
  200. package/dist/api/routes/migrations.js +0 -36
  201. package/dist/api/routes/ops.js +0 -52
  202. package/dist/api/routes/permission.js +0 -44
  203. package/dist/api/routes/plugin.js +0 -39
  204. package/dist/api/routes/public/applications.js +0 -174
  205. package/dist/api/routes/public/index.js +0 -140
  206. package/dist/api/routes/public/metrics.js +0 -30
  207. package/dist/api/routes/public/middleware/mapper.js +0 -97
  208. package/dist/api/routes/public/queries.js +0 -72
  209. package/dist/api/routes/public/rows.js +0 -158
  210. package/dist/api/routes/public/tables.js +0 -152
  211. package/dist/api/routes/public/users.js +0 -135
  212. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  213. package/dist/api/routes/query.js +0 -47
  214. package/dist/api/routes/role.js +0 -40
  215. package/dist/api/routes/routing.js +0 -39
  216. package/dist/api/routes/row.js +0 -239
  217. package/dist/api/routes/screen.js +0 -39
  218. package/dist/api/routes/script.js +0 -35
  219. package/dist/api/routes/static.js +0 -80
  220. package/dist/api/routes/table.js +0 -163
  221. package/dist/api/routes/templates.js +0 -37
  222. package/dist/api/routes/user.js +0 -43
  223. package/dist/api/routes/utils/validators.js +0 -238
  224. package/dist/api/routes/view.js +0 -42
  225. package/dist/api/routes/webhook.js +0 -43
  226. package/dist/app.js +0 -132
  227. package/dist/automations/actions.js +0 -137
  228. package/dist/automations/automationUtils.js +0 -173
  229. package/dist/automations/bullboard.js +0 -71
  230. package/dist/automations/index.js +0 -43
  231. package/dist/automations/logging/index.js +0 -53
  232. package/dist/automations/steps/bash.js +0 -111
  233. package/dist/automations/steps/createRow.js +0 -108
  234. package/dist/automations/steps/delay.js +0 -53
  235. package/dist/automations/steps/deleteRow.js +0 -96
  236. package/dist/automations/steps/discord.js +0 -116
  237. package/dist/automations/steps/executeQuery.js +0 -134
  238. package/dist/automations/steps/executeScript.js +0 -106
  239. package/dist/automations/steps/filter.js +0 -112
  240. package/dist/automations/steps/loop.js +0 -54
  241. package/dist/automations/steps/make.js +0 -134
  242. package/dist/automations/steps/outgoingWebhook.js +0 -166
  243. package/dist/automations/steps/queryRows.js +0 -216
  244. package/dist/automations/steps/sendSmtpEmail.js +0 -115
  245. package/dist/automations/steps/serverLog.js +0 -65
  246. package/dist/automations/steps/slack.js +0 -98
  247. package/dist/automations/steps/updateRow.js +0 -144
  248. package/dist/automations/steps/utils.js +0 -56
  249. package/dist/automations/steps/zapier.js +0 -130
  250. package/dist/automations/triggerInfo/app.js +0 -36
  251. package/dist/automations/triggerInfo/cron.js +0 -35
  252. package/dist/automations/triggerInfo/index.js +0 -40
  253. package/dist/automations/triggerInfo/rowDeleted.js +0 -36
  254. package/dist/automations/triggerInfo/rowSaved.js +0 -44
  255. package/dist/automations/triggerInfo/rowUpdated.js +0 -44
  256. package/dist/automations/triggerInfo/webhook.js +0 -40
  257. package/dist/automations/triggers.js +0 -181
  258. package/dist/automations/utils.js +0 -275
  259. package/dist/constants/definitions.js +0 -2
  260. package/dist/constants/index.js +0 -181
  261. package/dist/constants/layouts.js +0 -148
  262. package/dist/constants/screens.js +0 -51
  263. package/dist/db/defaultData/datasource_bb_default.js +0 -574
  264. package/dist/db/defaultData/employeeImport.js +0 -155
  265. package/dist/db/defaultData/expensesImport.js +0 -117
  266. package/dist/db/defaultData/inventoryImport.js +0 -109
  267. package/dist/db/defaultData/jobsImport.js +0 -152
  268. package/dist/db/dynamoClient.js +0 -124
  269. package/dist/db/inMemoryView.js +0 -62
  270. package/dist/db/index.js +0 -43
  271. package/dist/db/linkedRows/LinkController.js +0 -392
  272. package/dist/db/linkedRows/LinkDocument.js +0 -33
  273. package/dist/db/linkedRows/index.js +0 -206
  274. package/dist/db/linkedRows/linkUtils.js +0 -131
  275. package/dist/db/newid.js +0 -7
  276. package/dist/db/utils.js +0 -248
  277. package/dist/db/views/staticViews.js +0 -144
  278. package/dist/ddApm.js +0 -11
  279. package/dist/definitions/automations.js +0 -8
  280. package/dist/definitions/common.js +0 -2
  281. package/dist/definitions/datasource.js +0 -7
  282. package/dist/definitions/openapi.js +0 -6
  283. package/dist/environment.js +0 -109
  284. package/dist/events/AutomationEmitter.js +0 -53
  285. package/dist/events/BudibaseEmitter.js +0 -25
  286. package/dist/events/docUpdates/index.js +0 -17
  287. package/dist/events/docUpdates/processors.js +0 -18
  288. package/dist/events/docUpdates/syncUsers.js +0 -49
  289. package/dist/events/index.js +0 -11
  290. package/dist/events/utils.js +0 -43
  291. package/dist/integrations/airtable.js +0 -173
  292. package/dist/integrations/arangodb.js +0 -119
  293. package/dist/integrations/base/query.js +0 -32
  294. package/dist/integrations/base/sql.js +0 -600
  295. package/dist/integrations/base/sqlTable.js +0 -167
  296. package/dist/integrations/base/types.js +0 -2
  297. package/dist/integrations/couchdb.js +0 -140
  298. package/dist/integrations/dynamodb.js +0 -210
  299. package/dist/integrations/elasticsearch.js +0 -201
  300. package/dist/integrations/firebase.js +0 -189
  301. package/dist/integrations/googlesheets.js +0 -493
  302. package/dist/integrations/index.js +0 -138
  303. package/dist/integrations/microsoftSqlServer.js +0 -308
  304. package/dist/integrations/mongodb.js +0 -630
  305. package/dist/integrations/mysql.js +0 -291
  306. package/dist/integrations/oracle.js +0 -415
  307. package/dist/integrations/postgres.js +0 -335
  308. package/dist/integrations/queries/sql.js +0 -84
  309. package/dist/integrations/redis.js +0 -187
  310. package/dist/integrations/rest.js +0 -400
  311. package/dist/integrations/s3.js +0 -256
  312. package/dist/integrations/snowflake.js +0 -114
  313. package/dist/integrations/utils.js +0 -295
  314. package/dist/middleware/appInfo.js +0 -22
  315. package/dist/middleware/authorized.js +0 -112
  316. package/dist/middleware/builder.js +0 -93
  317. package/dist/middleware/currentapp.js +0 -103
  318. package/dist/middleware/joi-validator.js +0 -43
  319. package/dist/middleware/publicApi.js +0 -25
  320. package/dist/middleware/resourceId.js +0 -59
  321. package/dist/middleware/selfhost.js +0 -24
  322. package/dist/middleware/utils.js +0 -8
  323. package/dist/migrations/functions/appUrls.js +0 -42
  324. package/dist/migrations/functions/backfill/app/automations.js +0 -31
  325. package/dist/migrations/functions/backfill/app/datasources.js +0 -28
  326. package/dist/migrations/functions/backfill/app/layouts.js +0 -33
  327. package/dist/migrations/functions/backfill/app/queries.js +0 -49
  328. package/dist/migrations/functions/backfill/app/roles.js +0 -28
  329. package/dist/migrations/functions/backfill/app/screens.js +0 -28
  330. package/dist/migrations/functions/backfill/app/tables.js +0 -37
  331. package/dist/migrations/functions/backfill/app.js +0 -176
  332. package/dist/migrations/functions/backfill/global/configs.js +0 -67
  333. package/dist/migrations/functions/backfill/global/quotas.js +0 -60
  334. package/dist/migrations/functions/backfill/global/users.js +0 -50
  335. package/dist/migrations/functions/backfill/global.js +0 -205
  336. package/dist/migrations/functions/backfill/index.js +0 -32
  337. package/dist/migrations/functions/backfill/installation.js +0 -80
  338. package/dist/migrations/functions/syncQuotas.js +0 -52
  339. package/dist/migrations/functions/tableSettings.js +0 -130
  340. package/dist/migrations/functions/usageQuotas/index.js +0 -16
  341. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
  342. package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
  343. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  344. package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
  345. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  346. package/dist/migrations/index.js +0 -111
  347. package/dist/migrations/tests/helpers.js +0 -72
  348. package/dist/migrations/tests/structures.js +0 -37
  349. package/dist/sdk/app/applications/index.js +0 -28
  350. package/dist/sdk/app/applications/sync.js +0 -164
  351. package/dist/sdk/app/applications/utils.js +0 -21
  352. package/dist/sdk/app/automations/index.js +0 -29
  353. package/dist/sdk/app/automations/webhook.js +0 -54
  354. package/dist/sdk/app/backups/constants.js +0 -6
  355. package/dist/sdk/app/backups/exports.js +0 -160
  356. package/dist/sdk/app/backups/imports.js +0 -170
  357. package/dist/sdk/app/backups/index.js +0 -29
  358. package/dist/sdk/app/backups/statistics.js +0 -73
  359. package/dist/sdk/app/datasources/datasources.js +0 -173
  360. package/dist/sdk/app/datasources/index.js +0 -27
  361. package/dist/sdk/app/queries/index.js +0 -27
  362. package/dist/sdk/app/queries/queries.js +0 -60
  363. package/dist/sdk/app/rows/attachments.js +0 -61
  364. package/dist/sdk/app/rows/index.js +0 -28
  365. package/dist/sdk/app/rows/rows.js +0 -30
  366. package/dist/sdk/app/tables/index.js +0 -65
  367. package/dist/sdk/index.js +0 -27
  368. package/dist/sdk/plugins/index.js +0 -27
  369. package/dist/sdk/plugins/plugins.js +0 -53
  370. package/dist/sdk/users/index.js +0 -27
  371. package/dist/sdk/users/utils.js +0 -87
  372. package/dist/sdk/utils/index.js +0 -29
  373. package/dist/startup.js +0 -158
  374. package/dist/threads/automation.js +0 -450
  375. package/dist/threads/definitions.js +0 -2
  376. package/dist/threads/index.js +0 -140
  377. package/dist/threads/query.js +0 -265
  378. package/dist/threads/utils.js +0 -120
  379. package/dist/tsconfig.build.tsbuildinfo +0 -1
  380. package/dist/utilities/appDirectoryTemplate/package.json +0 -10
  381. package/dist/utilities/budibaseDir.js +0 -5
  382. package/dist/utilities/centralPath.js +0 -27
  383. package/dist/utilities/csv.js +0 -33
  384. package/dist/utilities/fileSystem/app.js +0 -88
  385. package/dist/utilities/fileSystem/clientLibrary.js +0 -138
  386. package/dist/utilities/fileSystem/filesystem.js +0 -180
  387. package/dist/utilities/fileSystem/index.js +0 -21
  388. package/dist/utilities/fileSystem/plugin.js +0 -76
  389. package/dist/utilities/fileSystem/processor.js +0 -34
  390. package/dist/utilities/fileSystem/template.js +0 -47
  391. package/dist/utilities/global.js +0 -149
  392. package/dist/utilities/index.js +0 -143
  393. package/dist/utilities/redis.js +0 -117
  394. package/dist/utilities/retry.js +0 -30
  395. package/dist/utilities/routing/index.js +0 -39
  396. package/dist/utilities/rowProcessor/index.js +0 -282
  397. package/dist/utilities/rowProcessor/map.js +0 -116
  398. package/dist/utilities/rowProcessor/utils.js +0 -87
  399. package/dist/utilities/schema.js +0 -112
  400. package/dist/utilities/scriptRunner.js +0 -26
  401. package/dist/utilities/security.js +0 -57
  402. package/dist/utilities/statusCodes.js +0 -9
  403. package/dist/utilities/usageQuota/rows.js +0 -88
  404. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  405. package/dist/utilities/users.js +0 -57
  406. package/dist/utilities/workerRequests.js +0 -171
  407. package/dist/watch.js +0 -53
  408. package/dist/websockets/client.js +0 -14
  409. package/dist/websockets/grid.js +0 -60
  410. package/dist/websockets/index.js +0 -17
  411. package/dist/websockets/websocket.js +0 -78
  412. /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
  413. /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
  414. /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: (page - 1) * limit,
472
+ offset,
471
473
  })
472
474
  } else {
473
475
  rows = await sheet.getRows()
474
476
  }
475
- const filtered = dataFilters.runLuceneQuery(rows, query.filters)
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 [{ deleted: query.rowIndex }]
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: [DatasourceFeature.CONNECTION_CHECKING],
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: [DatasourceFeature.CONNECTION_CHECKING],
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.map((output: string | string[]) => output[1])
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
  }
@@ -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: [DatasourceFeature.CONNECTION_CHECKING],
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: [DatasourceFeature.CONNECTION_CHECKING],
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, permissions } from "@budibase/backend-core"
13
- import { BBContext, Database } from "@budibase/types"
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: BBContext) {
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
- // they do have lock, update it
43
- await updateLock(appId, ctx.user)
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: BBContext) {
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
- const metadata = await db.get(DocumentType.APP_METADATA)
55
- metadata.updatedAt = new Date().toISOString()
53
+ try {
54
+ const metadata = await db.get(DocumentType.APP_METADATA)
55
+ metadata.updatedAt = new Date().toISOString()
56
56
 
57
- metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user?.userId!)
57
+ metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user?.userId!)
58
58
 
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)
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: BBContext) {
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) {
@@ -1,5 +1,7 @@
1
1
  import * as webhook from "./webhook"
2
+ import * as utils from "./utils"
2
3
 
3
4
  export default {
4
5
  webhook,
6
+ utils,
5
7
  }
@@ -0,0 +1,7 @@
1
+ import { Automation, AutomationActionStepId } from "@budibase/types"
2
+
3
+ export function checkForCollectStep(automation: Automation) {
4
+ return automation.definition.steps.some(
5
+ (step: any) => step.stepId === AutomationActionStepId.COLLECT
6
+ )
7
+ }
@@ -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.emit("plugin-update", { name: doc.name, hash: doc.hash })
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 (this.appId) {
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, input: LoopInput) {
41
- const binding = automationUtils.typecastForLooping(loopStep, input)
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 (typeof binding === "string") {
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, input)
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
- newInput.binding = automationUtils.typecastForLooping(
297
+ loopStep.inputs.binding = automationUtils.typecastForLooping(
281
298
  loopStep as LoopStep,
282
- newInput
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(newInput.binding)
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
- await storeLog(this._automation, this.executionOutput)
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, callback: WorkerCallback) {
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
- await context.doInEnvironmentContext(envVars, async () => {
555
+ return context.doInEnvironmentContext(envVars, async () => {
487
556
  const automationOrchestrator = new Orchestrator(job)
488
- try {
489
- const response = await automationOrchestrator.execute()
490
- callback(null, response)
491
- } catch (err) {
492
- callback(err)
493
- }
557
+ const response = await Promise.race([
558
+ automationOrchestrator.execute(),
559
+ timeoutPromise,
560
+ ])
561
+ return response
494
562
  })
495
563
  })
496
564
  }
@@ -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 {
@@ -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