@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
@@ -0,0 +1,74 @@
1
+ import authorized from "../middleware/authorized"
2
+ import { BaseSocket } from "./websocket"
3
+ import { permissions } from "@budibase/backend-core"
4
+ import http from "http"
5
+ import Koa from "koa"
6
+ import { Datasource, Table, SocketSession, ContextUser } from "@budibase/types"
7
+ import { gridSocket } from "./index"
8
+ import { clearLock } from "../utilities/redis"
9
+ import { Socket } from "socket.io"
10
+ import { BuilderSocketEvent } from "@budibase/shared-core"
11
+
12
+ export default class BuilderSocket extends BaseSocket {
13
+ constructor(app: Koa, server: http.Server) {
14
+ super(app, server, "/socket/builder", [authorized(permissions.BUILDER)])
15
+ }
16
+
17
+ async onConnect(socket: Socket) {
18
+ // Initial identification of selected app
19
+ socket.on(BuilderSocketEvent.SelectApp, async (appId, callback) => {
20
+ await this.joinRoom(socket, appId)
21
+
22
+ // Reply with all users in current room
23
+ const sessions = await this.getRoomSessions(appId)
24
+ callback({ users: sessions })
25
+ })
26
+ }
27
+
28
+ async onDisconnect(socket: Socket) {
29
+ // Remove app lock from this user if they have no other connections
30
+ try {
31
+ // @ts-ignore
32
+ const session: SocketSession = socket.data
33
+ const { _id, sessionId, room } = session
34
+ const sessions = await this.getRoomSessions(room)
35
+ const hasOtherSession = sessions.some(otherSession => {
36
+ return _id === otherSession._id && sessionId !== otherSession.sessionId
37
+ })
38
+ if (!hasOtherSession && room) {
39
+ // @ts-ignore
40
+ const user: ContextUser = { _id: socket.data._id }
41
+ await clearLock(room, user)
42
+ }
43
+ } catch (e) {
44
+ // This is fine, just means this user didn't hold the lock
45
+ }
46
+ }
47
+
48
+ emitTableUpdate(ctx: any, table: Table) {
49
+ this.io
50
+ .in(ctx.appId)
51
+ .emit(BuilderSocketEvent.TableChange, { id: table._id, table })
52
+ gridSocket.emitTableUpdate(table)
53
+ }
54
+
55
+ emitTableDeletion(ctx: any, id: string) {
56
+ this.io
57
+ .in(ctx.appId)
58
+ .emit(BuilderSocketEvent.TableChange, { id, table: null })
59
+ gridSocket.emitTableDeletion(id)
60
+ }
61
+
62
+ emitDatasourceUpdate(ctx: any, datasource: Datasource) {
63
+ this.io.in(ctx.appId).emit(BuilderSocketEvent.DatasourceChange, {
64
+ id: datasource._id,
65
+ datasource,
66
+ })
67
+ }
68
+
69
+ emitDatasourceDeletion(ctx: any, id: string) {
70
+ this.io
71
+ .in(ctx.appId)
72
+ .emit(BuilderSocketEvent.DatasourceChange, { id, datasource: null })
73
+ }
74
+ }
@@ -1,10 +1,10 @@
1
- import Socket from "./websocket"
1
+ import { BaseSocket } from "./websocket"
2
2
  import authorized from "../middleware/authorized"
3
3
  import http from "http"
4
4
  import Koa from "koa"
5
5
  import { permissions } from "@budibase/backend-core"
6
6
 
7
- export default class ClientAppWebsocket extends Socket {
7
+ export default class ClientAppWebsocket extends BaseSocket {
8
8
  constructor(app: Koa, server: http.Server) {
9
9
  super(app, server, "/socket/client", [authorized(permissions.BUILDER)])
10
10
  }
@@ -1,55 +1,51 @@
1
1
  import authorized from "../middleware/authorized"
2
- import Socket from "./websocket"
2
+ import { BaseSocket } from "./websocket"
3
3
  import { permissions } from "@budibase/backend-core"
4
4
  import http from "http"
5
5
  import Koa from "koa"
6
+ import { getTableId } from "../api/controllers/row/utils"
7
+ import { Row, Table } from "@budibase/types"
8
+ import { Socket } from "socket.io"
9
+ import { GridSocketEvent } from "@budibase/shared-core"
6
10
 
7
- export default class GridSocket extends Socket {
11
+ export default class GridSocket extends BaseSocket {
8
12
  constructor(app: Koa, server: http.Server) {
9
13
  super(app, server, "/socket/grid", [authorized(permissions.BUILDER)])
14
+ }
15
+
16
+ async onConnect(socket: Socket) {
17
+ // Initial identification of connected spreadsheet
18
+ socket.on(GridSocketEvent.SelectTable, async (tableId, callback) => {
19
+ await this.joinRoom(socket, tableId)
20
+
21
+ // Reply with all users in current room
22
+ const sessions = await this.getRoomSessions(tableId)
23
+ callback({ users: sessions })
24
+ })
10
25
 
11
- this.io.on("connection", socket => {
12
- const user = socket.data.user
13
- console.log(`Spreadsheet user connected: ${user?.id}`)
14
-
15
- // Socket state
16
- let currentRoom: string
17
-
18
- // Initial identification of connected spreadsheet
19
- socket.on("select-table", async (tableId, callback) => {
20
- // Leave current room
21
- if (currentRoom) {
22
- socket.to(currentRoom).emit("user-disconnect", socket.data.user)
23
- socket.leave(currentRoom)
24
- }
25
-
26
- // Join new room
27
- currentRoom = tableId
28
- socket.join(currentRoom)
29
- socket.to(currentRoom).emit("user-update", socket.data.user)
30
-
31
- // Reply with all users in current room
32
- const sockets = await this.io.in(currentRoom).fetchSockets()
33
- callback({
34
- users: sockets.map(socket => socket.data.user),
35
- id: user.id,
36
- })
37
- })
38
-
39
- // Handle users selecting a new cell
40
- socket.on("select-cell", cellId => {
41
- socket.data.user.selectedCellId = cellId
42
- if (currentRoom) {
43
- socket.to(currentRoom).emit("user-update", socket.data.user)
44
- }
45
- })
46
-
47
- // Disconnection cleanup
48
- socket.on("disconnect", () => {
49
- if (currentRoom) {
50
- socket.to(currentRoom).emit("user-disconnect", socket.data.user)
51
- }
52
- })
26
+ // Handle users selecting a new cell
27
+ socket.on(GridSocketEvent.SelectCell, cellId => {
28
+ this.updateUser(socket, { focusedCellId: cellId })
53
29
  })
54
30
  }
31
+
32
+ emitRowUpdate(ctx: any, row: Row) {
33
+ const tableId = getTableId(ctx)
34
+ this.io.in(tableId).emit(GridSocketEvent.RowChange, { id: row._id, row })
35
+ }
36
+
37
+ emitRowDeletion(ctx: any, id: string) {
38
+ const tableId = getTableId(ctx)
39
+ this.io.in(tableId).emit(GridSocketEvent.RowChange, { id, row: null })
40
+ }
41
+
42
+ emitTableUpdate(table: Table) {
43
+ this.io
44
+ .in(table._id!)
45
+ .emit(GridSocketEvent.TableChange, { id: table._id, table })
46
+ }
47
+
48
+ emitTableDeletion(id: string) {
49
+ this.io.in(id).emit(GridSocketEvent.TableChange, { id, table: null })
50
+ }
55
51
  }
@@ -1,14 +1,17 @@
1
1
  import http from "http"
2
2
  import Koa from "koa"
3
- import GridSocket from "./grid"
4
3
  import ClientAppSocket from "./client"
4
+ import GridSocket from "./grid"
5
+ import BuilderSocket from "./builder"
5
6
 
6
7
  let clientAppSocket: ClientAppSocket
7
8
  let gridSocket: GridSocket
9
+ let builderSocket: BuilderSocket
8
10
 
9
11
  export const initialise = (app: Koa, server: http.Server) => {
10
12
  clientAppSocket = new ClientAppSocket(app, server)
11
13
  gridSocket = new GridSocket(app, server)
14
+ builderSocket = new BuilderSocket(app, server)
12
15
  }
13
16
 
14
- export { clientAppSocket, gridSocket }
17
+ export { clientAppSocket, gridSocket, builderSocket }
@@ -3,18 +3,26 @@ import http from "http"
3
3
  import Koa from "koa"
4
4
  import Cookies from "cookies"
5
5
  import { userAgent } from "koa-useragent"
6
- import { auth } from "@budibase/backend-core"
6
+ import { auth, redis } from "@budibase/backend-core"
7
7
  import currentApp from "../middleware/currentapp"
8
+ import { createAdapter } from "@socket.io/redis-adapter"
9
+ import { Socket } from "socket.io"
10
+ import { getSocketPubSubClients } from "../utilities/redis"
11
+ import { SocketEvent, SocketSessionTTL } from "@budibase/shared-core"
12
+ import { SocketSession } from "@budibase/types"
8
13
 
9
- export default class Socket {
14
+ export class BaseSocket {
10
15
  io: Server
16
+ path: string
17
+ redisClient?: redis.Client
11
18
 
12
19
  constructor(
13
20
  app: Koa,
14
21
  server: http.Server,
15
- path: string,
22
+ path: string = "/",
16
23
  additionalMiddlewares?: any[]
17
24
  ) {
25
+ this.path = path
18
26
  this.io = new Server(server, {
19
27
  path,
20
28
  })
@@ -59,12 +67,16 @@ export default class Socket {
59
67
  for (let [idx, middleware] of middlewares.entries()) {
60
68
  await middleware(ctx, () => {
61
69
  if (idx === middlewares.length - 1) {
62
- // Middlewares are finished.
70
+ // Middlewares are finished
63
71
  // Extract some data from our enriched koa context to persist
64
72
  // as metadata for the socket
65
- socket.data.user = {
66
- id: ctx.user._id,
67
- email: ctx.user.email,
73
+ const { _id, email, firstName, lastName } = ctx.user
74
+ socket.data = {
75
+ _id,
76
+ email,
77
+ firstName,
78
+ lastName,
79
+ sessionId: socket.id,
68
80
  }
69
81
  next()
70
82
  }
@@ -74,6 +86,185 @@ export default class Socket {
74
86
  next(error)
75
87
  }
76
88
  })
89
+
90
+ // Initialise redis before handling connections
91
+ this.initialise().then(() => {
92
+ this.io.on("connection", async socket => {
93
+ // Add built in handler for heartbeats
94
+ socket.on(SocketEvent.Heartbeat, async () => {
95
+ console.log(socket.data.email, "heartbeat received")
96
+ await this.extendSessionTTL(socket.data.sessionId)
97
+ })
98
+
99
+ // Add early disconnection handler to clean up and leave room
100
+ socket.on("disconnect", async () => {
101
+ // Run any custom disconnection logic before we leave the room,
102
+ // so that we have access to their room etc before disconnection
103
+ await this.onDisconnect(socket)
104
+
105
+ // Leave the current room when the user disconnects if we're in one
106
+ await this.leaveRoom(socket)
107
+ })
108
+
109
+ // Add handlers for this socket
110
+ await this.onConnect(socket)
111
+ })
112
+ })
113
+ }
114
+
115
+ async initialise() {
116
+ // Instantiate redis adapter.
117
+ // We use a fully qualified key name here as this bypasses the normal
118
+ // redis client#s key prefixing.
119
+ const { pub, sub } = getSocketPubSubClients()
120
+ const opts = {
121
+ key: `${redis.utils.Databases.SOCKET_IO}-${this.path}-pubsub`,
122
+ }
123
+ this.io.adapter(createAdapter(pub, sub, opts))
124
+
125
+ // Fetch redis client
126
+ this.redisClient = await redis.clients.getSocketClient()
127
+ }
128
+
129
+ // Gets the redis key for a certain session ID
130
+ getSessionKey(sessionId: string) {
131
+ return `${this.path}-session:${sessionId}`
132
+ }
133
+
134
+ // Gets the redis key for certain room name
135
+ getRoomKey(room: string) {
136
+ return `${this.path}-room:${room}`
137
+ }
138
+
139
+ async extendSessionTTL(sessionId: string) {
140
+ const key = this.getSessionKey(sessionId)
141
+ await this.redisClient?.setExpiry(key, SocketSessionTTL)
142
+ }
143
+
144
+ // Gets an array of all redis keys of users inside a certain room
145
+ async getRoomSessionIds(room: string): Promise<string[]> {
146
+ const keys = await this.redisClient?.get(this.getRoomKey(room))
147
+ return keys || []
148
+ }
149
+
150
+ // Sets the list of redis keys for users inside a certain room.
151
+ // There is no TTL on the actual room key map itself.
152
+ async setRoomSessionIds(room: string, ids: string[]) {
153
+ await this.redisClient?.store(this.getRoomKey(room), ids)
154
+ }
155
+
156
+ // Gets a list of all users inside a certain room
157
+ async getRoomSessions(room?: string): Promise<SocketSession[]> {
158
+ if (room) {
159
+ const sessionIds = await this.getRoomSessionIds(room)
160
+ const keys = sessionIds.map(this.getSessionKey.bind(this))
161
+ const sessions = await this.redisClient?.bulkGet(keys)
162
+ return Object.values(sessions || {})
163
+ } else {
164
+ return []
165
+ }
166
+ }
167
+
168
+ // Detects keys which have been pruned from redis due to TTL expiry in a certain
169
+ // room and broadcasts disconnection messages to ensure clients are aware
170
+ async pruneRoom(room: string) {
171
+ const sessionIds = await this.getRoomSessionIds(room)
172
+ const sessionsExist = await Promise.all(
173
+ sessionIds.map(id => this.redisClient?.exists(this.getSessionKey(id)))
174
+ )
175
+ const prunedSessionIds = sessionIds.filter((id, idx) => {
176
+ if (!sessionsExist[idx]) {
177
+ this.io.to(room).emit(SocketEvent.UserDisconnect, sessionIds[idx])
178
+ return false
179
+ }
180
+ return true
181
+ })
182
+
183
+ // Store new pruned keys
184
+ await this.setRoomSessionIds(room, prunedSessionIds)
185
+ }
186
+
187
+ // Adds a user to a certain room
188
+ async joinRoom(socket: Socket, room: string) {
189
+ if (!room) {
190
+ return
191
+ }
192
+ // Prune room before joining
193
+ await this.pruneRoom(room)
194
+
195
+ // Check if we're already in a room, as we'll need to leave if we are before we
196
+ // can join a different room
197
+ const oldRoom = socket.data.room
198
+ if (oldRoom && oldRoom !== room) {
199
+ await this.leaveRoom(socket)
200
+ }
201
+
202
+ // Join new room
203
+ if (!oldRoom || oldRoom !== room) {
204
+ socket.join(room)
205
+ socket.data.room = room
206
+ }
207
+
208
+ // Store in redis
209
+ // @ts-ignore
210
+ let user: SocketSession = socket.data
211
+ const { sessionId } = user
212
+ const key = this.getSessionKey(sessionId)
213
+ await this.redisClient?.store(key, user, SocketSessionTTL)
214
+ const sessionIds = await this.getRoomSessionIds(room)
215
+ if (!sessionIds.includes(sessionId)) {
216
+ await this.setRoomSessionIds(room, [...sessionIds, sessionId])
217
+ }
218
+
219
+ // Notify other users
220
+ socket.to(room).emit(SocketEvent.UserUpdate, user)
221
+ }
222
+
223
+ // Disconnects a socket from its current room
224
+ async leaveRoom(socket: Socket) {
225
+ // @ts-ignore
226
+ let user: SocketSession = socket.data
227
+ const { room, sessionId } = user
228
+ if (!room) {
229
+ return
230
+ }
231
+
232
+ // Leave room
233
+ socket.leave(room)
234
+ socket.data.room = undefined
235
+
236
+ // Delete from redis
237
+ const key = this.getSessionKey(sessionId)
238
+ await this.redisClient?.delete(key)
239
+ const sessionIds = await this.getRoomSessionIds(room)
240
+ await this.setRoomSessionIds(
241
+ room,
242
+ sessionIds.filter(id => id !== sessionId)
243
+ )
244
+
245
+ // Notify other users
246
+ socket.to(room).emit(SocketEvent.UserDisconnect, sessionId)
247
+ }
248
+
249
+ // Updates a connected user's metadata, assuming a room change is not required.
250
+ async updateUser(socket: Socket, patch: Object) {
251
+ socket.data = {
252
+ ...socket.data,
253
+ ...patch,
254
+ }
255
+
256
+ // If we're in a room, notify others of this change and update redis
257
+ if (socket.data.room) {
258
+ await this.joinRoom(socket, socket.data.room)
259
+ }
260
+ }
261
+
262
+ async onConnect(socket: Socket) {
263
+ // Override
264
+ }
265
+
266
+ async onDisconnect(socket: Socket) {
267
+ // Override
77
268
  }
78
269
 
79
270
  // Emit an event to all sockets
@@ -10,7 +10,15 @@
10
10
  "incremental": true,
11
11
  "types": ["node", "jest"],
12
12
  "outDir": "dist/src",
13
- "skipLibCheck": true
13
+ "skipLibCheck": true,
14
+ "baseUrl": ".",
15
+ "paths": {
16
+ "@budibase/types": ["../types/src"],
17
+ "@budibase/backend-core": ["../backend-core/src"],
18
+ "@budibase/backend-core/*": ["../backend-core/*"],
19
+ "@budibase/shared-core": ["../shared-core/src"],
20
+ "@budibase/pro": ["../pro/packages/pro/src"]
21
+ }
14
22
  },
15
23
  "include": ["src/**/*"],
16
24
  "exclude": [
package/tsconfig.json CHANGED
@@ -5,25 +5,12 @@
5
5
  "declaration": true,
6
6
  "sourceMap": true,
7
7
  "baseUrl": ".",
8
- "outDir": "dist",
9
- "paths": {
10
- "@budibase/types": ["../types/src"],
11
- "@budibase/backend-core": ["../backend-core/src"],
12
- "@budibase/backend-core/*": ["../backend-core/*"],
13
- "@budibase/shared-core": ["../shared-core/src"],
14
- "@budibase/pro": ["../pro/packages/pro/src"]
15
- }
8
+ "outDir": "dist"
16
9
  },
17
10
  "ts-node": {
18
11
  "require": ["tsconfig-paths/register"],
19
12
  "swc": true
20
13
  },
21
- "references": [
22
- { "path": "../types" },
23
- { "path": "../backend-core" },
24
- { "path": "../shared-core" },
25
- { "path": "../../../budibase-pro/packages/pro" }
26
- ],
27
14
  "include": ["src/**/*", "specs"],
28
15
  "exclude": ["node_modules", "dist"]
29
16
  }