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