insforge 1.2.10 → 1.4.8

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 (506) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +46 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +30 -28
  25. package/auth/src/lib/broadcastService.ts +4 -4
  26. package/auth/src/lib/insforge.ts +8 -0
  27. package/auth/src/main.tsx +2 -4
  28. package/auth/src/pages/SignInPage.tsx +5 -2
  29. package/auth/src/pages/SignUpPage.tsx +5 -2
  30. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  31. package/auth/tsconfig.json +33 -32
  32. package/auth/tsconfig.node.json +11 -11
  33. package/backend/package.json +82 -75
  34. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  35. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  36. package/backend/src/api/routes/auth/index.routes.ts +720 -570
  37. package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
  38. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  39. package/backend/src/api/routes/database/index.routes.ts +80 -1
  40. package/backend/src/api/routes/database/records.routes.ts +48 -184
  41. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  42. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  43. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  44. package/backend/src/api/routes/docs/index.routes.ts +76 -76
  45. package/backend/src/api/routes/email/index.routes.ts +35 -0
  46. package/backend/src/api/routes/functions/index.routes.ts +21 -15
  47. package/backend/src/api/routes/metadata/index.routes.ts +38 -0
  48. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  49. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  50. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  51. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  52. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  53. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  54. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  55. package/backend/src/infra/database/database.manager.ts +14 -11
  56. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  57. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  58. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  59. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  60. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  61. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  62. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  63. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  64. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  65. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  66. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  67. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  68. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  69. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  70. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  71. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  72. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  73. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  74. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  75. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  76. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  77. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  78. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  79. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  80. package/backend/src/infra/security/token.manager.ts +216 -125
  81. package/backend/src/infra/socket/socket.manager.ts +198 -64
  82. package/backend/src/providers/ai/openrouter.provider.ts +24 -12
  83. package/backend/src/providers/database/base.provider.ts +39 -0
  84. package/backend/src/providers/database/cloud.provider.ts +159 -0
  85. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  86. package/backend/src/providers/email/base.provider.ts +4 -7
  87. package/backend/src/providers/email/cloud.provider.ts +84 -0
  88. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  89. package/backend/src/providers/oauth/index.ts +1 -0
  90. package/backend/src/server.ts +329 -284
  91. package/backend/src/services/ai/ai-config.service.ts +6 -6
  92. package/backend/src/services/ai/ai-model.service.ts +60 -60
  93. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  94. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  95. package/backend/src/services/ai/helpers.ts +64 -64
  96. package/backend/src/services/ai/image-generation.service.ts +3 -3
  97. package/backend/src/services/ai/index.ts +13 -13
  98. package/backend/src/services/auth/auth-config.service.ts +4 -4
  99. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  100. package/backend/src/services/auth/auth.service.ts +148 -74
  101. package/backend/src/services/auth/index.ts +4 -4
  102. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  103. package/backend/src/services/database/database-advance.service.ts +19 -55
  104. package/backend/src/services/database/database-table.service.ts +38 -94
  105. package/backend/src/services/database/database.service.ts +127 -0
  106. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  107. package/backend/src/services/deployments/deployment.service.ts +693 -0
  108. package/backend/src/services/email/email.service.ts +5 -7
  109. package/backend/src/services/functions/function.service.ts +61 -41
  110. package/backend/src/services/logs/audit.service.ts +10 -10
  111. package/backend/src/services/realtime/index.ts +3 -0
  112. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  113. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  114. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  115. package/backend/src/services/secrets/secret.service.ts +101 -27
  116. package/backend/src/services/storage/storage.service.ts +30 -30
  117. package/backend/src/services/usage/usage.service.ts +6 -6
  118. package/backend/src/types/ai.ts +8 -0
  119. package/backend/src/types/auth.ts +16 -1
  120. package/backend/src/types/database.ts +2 -0
  121. package/backend/src/types/deployments.ts +33 -0
  122. package/backend/src/types/realtime.ts +18 -0
  123. package/backend/src/types/socket.ts +7 -31
  124. package/backend/src/types/storage.ts +1 -1
  125. package/backend/src/types/webhooks.ts +45 -0
  126. package/backend/src/utils/cookies.ts +34 -0
  127. package/backend/src/utils/environment.ts +0 -14
  128. package/backend/src/utils/s3-config-loader.ts +64 -0
  129. package/backend/src/utils/seed.ts +79 -43
  130. package/backend/src/utils/sql-parser.ts +216 -0
  131. package/backend/src/utils/utils.ts +114 -114
  132. package/backend/src/utils/validations.ts +10 -10
  133. package/backend/tests/README.md +133 -133
  134. package/backend/tests/cleanup-all-test-data.sh +230 -230
  135. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  136. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  137. package/backend/tests/local/test-ai-config.sh +129 -129
  138. package/backend/tests/local/test-ai-usage.sh +80 -80
  139. package/backend/tests/local/test-auth-router.sh +143 -143
  140. package/backend/tests/local/test-database-router.sh +222 -222
  141. package/backend/tests/local/test-e2e.sh +240 -240
  142. package/backend/tests/local/test-fk-errors.sh +96 -96
  143. package/backend/tests/local/test-functions.sh +123 -123
  144. package/backend/tests/local/test-id-field.sh +200 -200
  145. package/backend/tests/local/test-logs.sh +132 -132
  146. package/backend/tests/local/test-public-bucket.sh +264 -264
  147. package/backend/tests/local/test-rpc.sh +141 -0
  148. package/backend/tests/local/test-secrets.sh +249 -249
  149. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  150. package/backend/tests/local/test-traditional-rest.sh +208 -208
  151. package/backend/tests/manual/README.md +50 -50
  152. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  153. package/backend/tests/manual/seed-large-table.sql +100 -100
  154. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  155. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  156. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  157. package/backend/tests/manual/test-database-advance.sh +296 -296
  158. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  159. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  160. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  161. package/backend/tests/manual/test-universal-storage.sh +263 -263
  162. package/backend/tests/manual/test-users.sql +17 -17
  163. package/backend/tests/run-all-tests.sh +139 -139
  164. package/backend/tests/setup.ts +0 -0
  165. package/backend/tests/test-config.sh +338 -338
  166. package/backend/tests/unit/analyze-query.test.ts +697 -0
  167. package/backend/tests/unit/database-advance.test.ts +326 -0
  168. package/backend/tests/unit/helpers.test.ts +2 -2
  169. package/backend/tsconfig.json +22 -22
  170. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  171. package/claude-plugin/README.md +133 -133
  172. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +273 -270
  173. package/docker-compose.prod.yml +204 -200
  174. package/docker-compose.yml +232 -228
  175. package/docker-init/db/db-init.sql +97 -97
  176. package/docker-init/db/jwt.sql +5 -5
  177. package/docker-init/db/postgresql.conf +16 -16
  178. package/docker-init/logs/vector.yml +236 -236
  179. package/docs/README.md +44 -44
  180. package/docs/agent-docs/deployment.md +79 -0
  181. package/docs/agent-docs/real-time.md +269 -0
  182. package/docs/changelog.mdx +212 -67
  183. package/docs/core-concepts/ai/architecture.mdx +350 -372
  184. package/docs/core-concepts/ai/sdk.mdx +238 -213
  185. package/docs/core-concepts/authentication/architecture.mdx +276 -278
  186. package/docs/core-concepts/authentication/sdk.mdx +710 -414
  187. package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
  188. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
  189. package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
  190. package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
  191. package/docs/core-concepts/database/architecture.mdx +292 -255
  192. package/docs/core-concepts/database/pgvector.mdx +138 -0
  193. package/docs/core-concepts/database/sdk.mdx +382 -382
  194. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  195. package/docs/core-concepts/email/architecture.mdx +103 -0
  196. package/docs/core-concepts/email/sdk.mdx +53 -0
  197. package/docs/core-concepts/functions/architecture.mdx +105 -105
  198. package/docs/core-concepts/functions/sdk.mdx +183 -184
  199. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  200. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  201. package/docs/core-concepts/storage/architecture.mdx +243 -243
  202. package/docs/core-concepts/storage/sdk.mdx +253 -253
  203. package/docs/deployment/README.md +94 -94
  204. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  205. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  206. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  207. package/docs/deployment/deploy-to-render.md +441 -441
  208. package/docs/deprecated/insforge-auth-api.md +214 -214
  209. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  210. package/docs/deprecated/insforge-db-api.md +358 -358
  211. package/docs/deprecated/insforge-db-sdk.md +139 -139
  212. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  213. package/docs/deprecated/insforge-debug.md +64 -64
  214. package/docs/deprecated/insforge-instructions.md +123 -123
  215. package/docs/deprecated/insforge-project.md +117 -117
  216. package/docs/deprecated/insforge-storage-api.md +278 -278
  217. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  218. package/docs/docs.json +240 -210
  219. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  220. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  221. package/docs/examples/framework-guides/react.mdx +165 -165
  222. package/docs/examples/framework-guides/svelte.mdx +153 -153
  223. package/docs/examples/framework-guides/vue.mdx +159 -159
  224. package/docs/examples/overview.mdx +67 -67
  225. package/docs/favicon.png +0 -0
  226. package/docs/favicon.svg +4 -19
  227. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  228. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  229. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  230. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  231. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  232. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  233. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  234. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  235. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  236. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  237. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  238. package/docs/images/icons/ai.svg +4 -4
  239. package/docs/images/logos/nextjs.svg +4 -4
  240. package/docs/images/logos/nuxt.svg +4 -4
  241. package/docs/images/logos/react.svg +5 -5
  242. package/docs/images/logos/svelte.svg +4 -4
  243. package/docs/images/logos/vue.svg +5 -5
  244. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  245. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  246. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  247. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  248. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  249. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  250. package/docs/images/mcp-setup/cline-1.png +0 -0
  251. package/docs/images/mcp-setup/cline-2.png +0 -0
  252. package/docs/images/mcp-setup/cline-3.png +0 -0
  253. package/docs/images/mcp-setup/connect-project.png +0 -0
  254. package/docs/images/mcp-setup/copilot-1.png +0 -0
  255. package/docs/images/mcp-setup/copilot-2.png +0 -0
  256. package/docs/images/mcp-setup/copilot-3.png +0 -0
  257. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  258. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  259. package/docs/images/mcp-setup/qoder-1.png +0 -0
  260. package/docs/images/mcp-setup/qoder-2.png +0 -0
  261. package/docs/images/mcp-setup/roocode-1.png +0 -0
  262. package/docs/images/mcp-setup/roocode-2.png +0 -0
  263. package/docs/images/mcp-setup/trae-1.png +0 -0
  264. package/docs/images/mcp-setup/trae-2.png +0 -0
  265. package/docs/images/mcp-setup/trae-3.png +0 -0
  266. package/docs/images/mcp-setup/trae-4.png +0 -0
  267. package/docs/images/mcp-setup/trae-5.png +0 -0
  268. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  269. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  270. package/docs/insforge-instructions-sdk.md +93 -88
  271. package/docs/introduction.mdx +46 -45
  272. package/docs/logo/dark.svg +22 -22
  273. package/docs/logo/light.svg +20 -20
  274. package/docs/mcp-setup.mdx +332 -0
  275. package/docs/oauth-server.mdx +563 -0
  276. package/docs/partnership.mdx +720 -646
  277. package/docs/quickstart.mdx +82 -82
  278. package/docs/showcase.mdx +52 -52
  279. package/docs/snippets/sdk-installation.mdx +21 -21
  280. package/docs/snippets/service-icons.mdx +27 -27
  281. package/docs/vscode-extension.mdx +74 -0
  282. package/eslint.config.js +1 -0
  283. package/examples/oauth/frontend-oauth-example.html +250 -250
  284. package/examples/response-examples.md +443 -443
  285. package/frontend/components.json +17 -17
  286. package/frontend/package.json +69 -69
  287. package/frontend/src/App.tsx +8 -3
  288. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  289. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  290. package/frontend/src/assets/icons/checked.svg +3 -3
  291. package/frontend/src/assets/icons/connected.svg +3 -3
  292. package/frontend/src/assets/icons/error.svg +3 -3
  293. package/frontend/src/assets/icons/loader.svg +9 -9
  294. package/frontend/src/assets/icons/pencil.svg +4 -4
  295. package/frontend/src/assets/icons/refresh.svg +4 -4
  296. package/frontend/src/assets/icons/step_active.svg +3 -3
  297. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  298. package/frontend/src/assets/icons/warning.svg +3 -3
  299. package/frontend/src/assets/logos/antigravity.svg +1 -0
  300. package/frontend/src/assets/logos/apple.svg +3 -3
  301. package/frontend/src/assets/logos/claude_code.svg +3 -3
  302. package/frontend/src/assets/logos/cline.svg +6 -6
  303. package/frontend/src/assets/logos/copilot.svg +10 -0
  304. package/frontend/src/assets/logos/cursor.svg +20 -20
  305. package/frontend/src/assets/logos/deepseek.svg +139 -0
  306. package/frontend/src/assets/logos/discord.svg +8 -8
  307. package/frontend/src/assets/logos/facebook.svg +3 -3
  308. package/frontend/src/assets/logos/gemini.svg +19 -19
  309. package/frontend/src/assets/logos/github.svg +5 -5
  310. package/frontend/src/assets/logos/google.svg +13 -13
  311. package/frontend/src/assets/logos/grok.svg +10 -10
  312. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  313. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  314. package/frontend/src/assets/logos/instagram.svg +1 -1
  315. package/frontend/src/assets/logos/kiro.svg +9 -0
  316. package/frontend/src/assets/logos/linkedin.svg +3 -3
  317. package/frontend/src/assets/logos/openai.svg +10 -10
  318. package/frontend/src/assets/logos/qoder.svg +4 -0
  319. package/frontend/src/assets/logos/qwen.svg +15 -0
  320. package/frontend/src/assets/logos/roo_code.svg +9 -9
  321. package/frontend/src/assets/logos/spotify.svg +16 -16
  322. package/frontend/src/assets/logos/tiktok.svg +5 -5
  323. package/frontend/src/assets/logos/trae.svg +3 -3
  324. package/frontend/src/assets/logos/windsurf.svg +10 -10
  325. package/frontend/src/assets/logos/x.svg +3 -3
  326. package/frontend/src/components/CodeBlock.tsx +2 -2
  327. package/frontend/src/components/ConnectCTA.tsx +3 -2
  328. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  329. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  330. package/frontend/src/components/datagrid/index.ts +1 -1
  331. package/frontend/src/components/index.ts +0 -1
  332. package/frontend/src/components/layout/AppHeader.tsx +13 -37
  333. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  334. package/frontend/src/components/layout/Layout.tsx +34 -32
  335. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  336. package/frontend/src/components/radix/Select.tsx +151 -151
  337. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  338. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  339. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  340. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  341. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  342. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  343. package/frontend/src/features/ai/components/index.ts +6 -6
  344. package/frontend/src/features/ai/helpers.ts +147 -141
  345. package/frontend/src/features/ai/{page → pages}/AIPage.tsx +166 -166
  346. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  347. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  348. package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
  349. package/frontend/src/features/auth/components/index.ts +5 -5
  350. package/frontend/src/features/auth/helpers.tsx +8 -0
  351. package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
  352. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  353. package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +1 -1
  354. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  355. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  356. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  357. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  358. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  359. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  360. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  361. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  362. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  363. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  364. package/frontend/src/features/database/constants.ts +16 -28
  365. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  366. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  367. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  368. package/frontend/src/features/database/hooks/useTables.ts +30 -28
  369. package/frontend/src/features/database/index.ts +1 -0
  370. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
  371. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
  372. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
  373. package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
  374. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  375. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
  376. package/frontend/src/features/database/services/advance.service.ts +1 -41
  377. package/frontend/src/features/database/services/database.service.ts +55 -0
  378. package/frontend/src/features/database/services/record.service.ts +4 -20
  379. package/frontend/src/features/database/services/table.service.ts +1 -10
  380. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  381. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  382. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  383. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  384. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  385. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  386. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  387. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  388. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  389. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  390. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  391. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  392. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  393. package/frontend/src/features/functions/components/index.ts +5 -5
  394. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  395. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  396. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  397. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
  398. package/frontend/src/features/functions/services/function.service.ts +8 -25
  399. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  400. package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +125 -118
  401. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  402. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  403. package/frontend/src/features/logs/components/index.ts +1 -0
  404. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  405. package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +36 -6
  406. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  407. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  408. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  409. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  410. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  411. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  412. package/frontend/src/features/onboard/components/index.ts +9 -4
  413. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  414. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  415. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  416. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  417. package/frontend/src/features/onboard/index.ts +17 -13
  418. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  419. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  420. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  421. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  422. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  423. package/frontend/src/features/realtime/index.ts +11 -0
  424. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  425. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  426. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  427. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  428. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  429. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  430. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  431. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
  432. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
  433. package/frontend/src/index.css +249 -249
  434. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  435. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  436. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  437. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  438. package/frontend/src/lib/routing/AppRoutes.tsx +103 -84
  439. package/frontend/src/lib/services/metadata.service.ts +20 -3
  440. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  441. package/frontend/src/lib/utils/menuItems.ts +223 -183
  442. package/frontend/src/lib/utils/utils.ts +196 -183
  443. package/frontend/tsconfig.json +25 -25
  444. package/frontend/tsconfig.node.json +9 -9
  445. package/functions/deno.json +24 -24
  446. package/functions/server.ts +6 -6
  447. package/functions/worker-template.js +1 -1
  448. package/i18n/README.ar.md +130 -130
  449. package/i18n/README.de.md +130 -130
  450. package/i18n/README.es.md +154 -154
  451. package/i18n/README.fr.md +134 -134
  452. package/i18n/README.hi.md +129 -129
  453. package/i18n/README.ja.md +174 -174
  454. package/i18n/README.ko.md +136 -136
  455. package/i18n/README.pt-BR.md +131 -131
  456. package/i18n/README.ru.md +129 -129
  457. package/i18n/README.zh-CN.md +133 -133
  458. package/openapi/ai.yaml +825 -715
  459. package/openapi/auth.yaml +1324 -1244
  460. package/openapi/email.yaml +158 -0
  461. package/openapi/functions.yaml +475 -475
  462. package/openapi/health.yaml +29 -29
  463. package/openapi/logs.yaml +221 -223
  464. package/openapi/metadata.yaml +175 -177
  465. package/openapi/realtime.yaml +699 -0
  466. package/openapi/records.yaml +381 -381
  467. package/openapi/secrets.yaml +370 -370
  468. package/openapi/storage.yaml +875 -875
  469. package/openapi/tables.yaml +462 -463
  470. package/package.json +97 -97
  471. package/shared-schemas/package.json +31 -31
  472. package/shared-schemas/src/ai-api.schema.ts +251 -143
  473. package/shared-schemas/src/ai.schema.ts +8 -4
  474. package/shared-schemas/src/auth-api.schema.ts +380 -339
  475. package/shared-schemas/src/auth.schema.ts +18 -11
  476. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  477. package/shared-schemas/src/database-api.schema.ts +32 -1
  478. package/shared-schemas/src/database.schema.ts +39 -0
  479. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  480. package/shared-schemas/src/deployments.schema.ts +30 -0
  481. package/shared-schemas/src/docs.schema.ts +32 -0
  482. package/shared-schemas/src/email-api.schema.ts +30 -0
  483. package/shared-schemas/src/functions-api.schema.ts +13 -4
  484. package/shared-schemas/src/functions.schema.ts +1 -1
  485. package/shared-schemas/src/index.ts +22 -14
  486. package/shared-schemas/src/metadata.schema.ts +39 -4
  487. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  488. package/shared-schemas/src/realtime.schema.ts +143 -0
  489. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  490. package/shared-schemas/src/secrets.schema.ts +15 -0
  491. package/shared-schemas/tsconfig.json +21 -21
  492. package/tsconfig.json +7 -7
  493. package/zeabur/README.md +26 -13
  494. package/zeabur/template.yml +1001 -1032
  495. package/.cursor/rules/cursor-rules.mdc +0 -94
  496. package/backend/src/types/profile.ts +0 -55
  497. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
  498. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  499. package/test-gemini.sh +0 -35
  500. package/test-usage-admin.sh +0 -57
  501. package/test-usage.sh +0 -50
  502. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  503. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  504. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  505. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  506. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -0,0 +1,446 @@
1
+ ---
2
+ title: Realtime Architecture
3
+ description: Real-time messaging with PostgreSQL triggers, WebSockets, and webhooks
4
+ ---
5
+
6
+ ## Overview
7
+
8
+ InsForge Realtime provides a powerful event-driven messaging system that bridges database changes to connected clients. Events are triggered by PostgreSQL triggers, delivered through WebSocket connections via Socket.IO, and optionally forwarded to webhook endpoints.
9
+
10
+ ## Technology Stack
11
+
12
+ ```mermaid
13
+ graph TB
14
+ Trigger[Database Trigger] --> Publish[realtime.publish]
15
+ Publish --> Messages[(realtime.messages)]
16
+ Messages --> PGNotify[pg_notify]
17
+ PGNotify --> Manager[Realtime Manager]
18
+ Manager --> SocketIO[Socket.IO Server]
19
+ Manager --> Webhooks[Webhook Sender]
20
+ SocketIO --> SDK[InsForge SDK]
21
+ SDK --> App[Client Application]
22
+ Webhooks --> External[External Services]
23
+
24
+ Channels[(realtime.channels)]
25
+ RLS[RLS Policies]
26
+ RLS -.->|SELECT| Channels
27
+ RLS -.->|INSERT| Messages
28
+
29
+ style Trigger fill:#4c1d95,stroke:#8b5cf6,color:#ede9fe
30
+ style Publish fill:#4c1d95,stroke:#8b5cf6,color:#ede9fe
31
+ style Messages fill:#0e7490,stroke:#06b6d4,color:#cffafe
32
+ style Channels fill:#0e7490,stroke:#06b6d4,color:#cffafe
33
+ style PGNotify fill:#0e7490,stroke:#06b6d4,color:#cffafe
34
+ style RLS fill:#7c2d12,stroke:#f97316,color:#fed7aa
35
+ style Manager fill:#166534,stroke:#22c55e,color:#dcfce7
36
+ style SocketIO fill:#c2410c,stroke:#fb923c,color:#fed7aa
37
+ style Webhooks fill:#c2410c,stroke:#fb923c,color:#fed7aa
38
+ style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
39
+ style App fill:#1e293b,stroke:#475569,color:#e2e8f0
40
+ style External fill:#1e293b,stroke:#475569,color:#e2e8f0
41
+ ```
42
+
43
+ ## Core Components
44
+
45
+ | Component | Technology | Purpose |
46
+ |-----------|------------|---------|
47
+ | **Realtime Schema** | PostgreSQL | Channels, messages tables and publish function |
48
+ | **Permission Model** | Grants + RLS (optional) | Controls subscribe and publish access |
49
+ | **Notification Bridge** | pg_notify | Bridges database to Node.js process |
50
+ | **Realtime Manager** | Node.js | Listens for notifications, dispatches messages |
51
+ | **WebSocket Server** | Socket.IO | Bidirectional client communication |
52
+ | **Webhook Sender** | Axios | HTTP delivery to external endpoints |
53
+ | **SDK** | @insforge/sdk | Client-side subscription and messaging |
54
+
55
+ ## Database Schema
56
+
57
+ ### Channels Table
58
+
59
+ The `realtime.channels` table defines available channel patterns and their configuration:
60
+
61
+ | Column | Type | Description |
62
+ |--------|------|-------------|
63
+ | `id` | UUID | Primary key |
64
+ | `pattern` | TEXT | Channel name pattern (e.g., `orders`, `order:%`) |
65
+ | `description` | TEXT | Human-readable description |
66
+ | `webhook_urls` | TEXT[] | Array of webhook endpoints |
67
+ | `enabled` | BOOLEAN | Whether the channel is active |
68
+
69
+ <Note>
70
+ Channel patterns use `:` as separator and `%` for wildcards (SQL LIKE pattern). For example, `order:%` matches `order:123`, `order:456`, etc.
71
+ </Note>
72
+
73
+ ### Messages Table
74
+
75
+ The `realtime.messages` table stores all published messages for audit purposes:
76
+
77
+ | Column | Type | Description |
78
+ |--------|------|-------------|
79
+ | `id` | UUID | Primary key |
80
+ | `event_name` | TEXT | Event type (e.g., `order_created`) |
81
+ | `channel_id` | UUID | Reference to channels table |
82
+ | `channel_name` | TEXT | Resolved channel name (e.g., `order:123`) |
83
+ | `payload` | JSONB | Event data |
84
+ | `sender_type` | TEXT | `system` (trigger) or `user` (client) |
85
+ | `sender_id` | UUID | User ID for client-initiated messages |
86
+ | `ws_audience_count` | INTEGER | WebSocket subscribers at time of delivery |
87
+ | `wh_audience_count` | INTEGER | Webhook URLs configured |
88
+ | `wh_delivered_count` | INTEGER | Successful webhook deliveries |
89
+
90
+ ## Permission Model
91
+
92
+ InsForge Realtime uses PostgreSQL grants and optional Row Level Security (RLS) to control channel access.
93
+
94
+ <Note>
95
+ **RLS is disabled by default** for the best developer experience. Channels and messages are open to all authenticated and anonymous users out of the box. Enable RLS when you need fine-grained access control.
96
+ </Note>
97
+
98
+ ### Default Permissions (RLS Disabled)
99
+
100
+ | Permission | Table | Grant | Access |
101
+ |------------|-------|-------|--------|
102
+ | **Subscribe** | `realtime.channels` | SELECT | All authenticated/anon users |
103
+ | **Publish** | `realtime.messages` | INSERT | All authenticated/anon users |
104
+
105
+ ### Enabling Access Control
106
+
107
+ To restrict access, enable RLS and add policies:
108
+
109
+ ```sql
110
+ -- Step 1: Enable RLS
111
+ ALTER TABLE realtime.channels ENABLE ROW LEVEL SECURITY;
112
+ ALTER TABLE realtime.messages ENABLE ROW LEVEL SECURITY;
113
+
114
+ -- Step 2: Add policies (see examples below)
115
+ ```
116
+
117
+ ### How RLS Works (When Enabled)
118
+
119
+ | Permission | Table | Policy Type | Description |
120
+ |------------|-------|-------------|-------------|
121
+ | **Subscribe** | `realtime.channels` | SELECT | Who can subscribe to a channel |
122
+ | **Publish** | `realtime.messages` | INSERT | Who can publish to a channel |
123
+
124
+ 1. When a client subscribes, the backend executes a SELECT query on `realtime.channels` with the user's role
125
+ 2. RLS policies filter the result. If a matching channel is returned, subscription is allowed
126
+ 3. When a client publishes, the backend attempts an INSERT into `realtime.messages`
127
+ 4. RLS policies evaluate the INSERT. If allowed, the message is stored and broadcast
128
+
129
+ ### Helper Function
130
+
131
+ Use `realtime.channel_name()` in your policies to access the channel being requested:
132
+
133
+ ```sql
134
+ -- Allow authenticated users to subscribe to their own order channels
135
+ CREATE POLICY "users_can_subscribe_own_orders"
136
+ ON realtime.channels
137
+ FOR SELECT
138
+ TO authenticated
139
+ USING (
140
+ pattern = 'order:%'
141
+ AND EXISTS (
142
+ SELECT 1 FROM orders
143
+ WHERE id = NULLIF(split_part(realtime.channel_name(), ':', 2), '')::uuid
144
+ AND user_id = auth.uid()
145
+ )
146
+ );
147
+ ```
148
+
149
+ ## Message Flow
150
+
151
+ ### System Events (Database Triggers)
152
+
153
+ ```mermaid
154
+ sequenceDiagram
155
+ participant App as Application
156
+ participant DB as PostgreSQL
157
+ participant Pub as publish()
158
+ participant Msg as messages table
159
+ participant Manager as Realtime Manager
160
+ participant WS as WebSocket Clients
161
+ participant WH as Webhooks
162
+
163
+ App->>DB: INSERT/UPDATE/DELETE
164
+ DB->>Pub: Trigger fires
165
+ Pub->>Msg: INSERT message
166
+ Msg->>Manager: pg_notify with message_id
167
+ Manager->>Msg: Fetch full message
168
+ Manager->>WS: Broadcast to room
169
+ Manager->>WH: POST to webhook URLs
170
+ Manager->>Msg: Update delivery stats
171
+ ```
172
+
173
+ ### Client Events (User-Initiated)
174
+
175
+ ```mermaid
176
+ sequenceDiagram
177
+ participant Client as SDK Client
178
+ participant Socket as Socket.IO
179
+ participant Msg as messages table
180
+ participant RLS as RLS Policies
181
+ participant Manager as Realtime Manager
182
+
183
+ Client->>Socket: realtime:publish
184
+ Socket->>Msg: insertMessage()
185
+ Msg->>RLS: Evaluate INSERT policy
186
+ Note over Msg: Trigger fires pg_notify
187
+ Manager->>Msg: Fetch message
188
+ Manager->>Socket: Broadcast to room
189
+ ```
190
+
191
+ ## Publish Function
192
+
193
+ The `realtime.publish()` function is called by your database triggers:
194
+
195
+ ```sql
196
+ CREATE OR REPLACE FUNCTION notify_order_changes()
197
+ RETURNS TRIGGER AS $$
198
+ BEGIN
199
+ PERFORM realtime.publish(
200
+ 'order:' || NEW.id::text, -- channel name
201
+ TG_OP || '_order', -- event: INSERT_order, UPDATE_order, etc.
202
+ jsonb_build_object(
203
+ 'id', NEW.id,
204
+ 'status', NEW.status,
205
+ 'total', NEW.total
206
+ )
207
+ );
208
+ RETURN NEW;
209
+ END;
210
+ $$ LANGUAGE plpgsql SECURITY DEFINER;
211
+
212
+ CREATE TRIGGER order_changes_trigger
213
+ AFTER INSERT OR UPDATE ON orders
214
+ FOR EACH ROW
215
+ EXECUTE FUNCTION notify_order_changes();
216
+ ```
217
+
218
+ <Warning>
219
+ The `realtime.publish()` function can only be called by database triggers (SECURITY DEFINER). It bypasses RLS to insert system messages.
220
+ </Warning>
221
+
222
+ ## WebSocket Events
223
+
224
+ ### Client-to-Server Events
225
+
226
+ | Event | Payload | Description |
227
+ |-------|---------|-------------|
228
+ | `realtime:subscribe` | `{ channel: string }` | Subscribe to a channel |
229
+ | `realtime:unsubscribe` | `{ channel: string }` | Unsubscribe from a channel |
230
+ | `realtime:publish` | `{ channel, event, payload }` | Publish a message |
231
+
232
+ ### Server-to-Client Events
233
+
234
+ | Event | Payload | Description |
235
+ |-------|---------|-------------|
236
+ | `{eventName}` | Message payload + meta | Custom event from channel |
237
+ | `realtime:error` | `{ code, message }` | Error notification |
238
+
239
+ ### Socket Message Structure
240
+
241
+ All WebSocket messages include a `meta` object with server-enforced fields alongside the event payload:
242
+
243
+ ```typescript
244
+ interface SocketMessage {
245
+ meta: {
246
+ channel?: string // Channel the message was sent to
247
+ messageId: string // Unique message ID (UUID)
248
+ senderType: 'system' | 'user'
249
+ senderId?: string // User ID for client messages
250
+ timestamp: Date // Server timestamp
251
+ }
252
+ // ...event payload fields
253
+ }
254
+ ```
255
+
256
+ ## Webhook Delivery
257
+
258
+ When channels have `webhook_urls` configured, messages are delivered via HTTP POST:
259
+
260
+ ### Request Format
261
+
262
+ ```http
263
+ POST /your-webhook-endpoint HTTP/1.1
264
+ Content-Type: application/json
265
+ X-InsForge-Event: order_created
266
+ X-InsForge-Channel: order:123
267
+ X-InsForge-Message-Id: a1b2c3d4-e5f6-...
268
+
269
+ {
270
+ "id": "123",
271
+ "status": "confirmed",
272
+ "total": 99.99
273
+ }
274
+ ```
275
+
276
+ ### Delivery Guarantees
277
+
278
+ | Feature | Behavior |
279
+ |---------|----------|
280
+ | **Retries** | 2 retries with 1s, 2s backoff |
281
+ | **Timeout** | 10 seconds per request |
282
+ | **Parallel** | All webhook URLs called concurrently |
283
+ | **Tracking** | Success/failure counts stored per message |
284
+
285
+ ## Sender Types
286
+
287
+ | Type | Source | Description |
288
+ |------|--------|-------------|
289
+ | **system** | Database triggers | Events from `realtime.publish()` function |
290
+ | **user** | Client SDK | Events from `insforge.realtime.publish()` |
291
+
292
+ <Tip>
293
+ System events are trusted and bypass publish RLS checks. User events must pass INSERT policy on `realtime.messages`.
294
+ </Tip>
295
+
296
+ ## Developer Workflow
297
+
298
+ <Steps>
299
+ <Step title="Define Channels">
300
+ Create channel patterns in `realtime.channels`:
301
+ ```sql
302
+ INSERT INTO realtime.channels (pattern, description)
303
+ VALUES ('order:%', 'Order-specific events');
304
+ ```
305
+ </Step>
306
+
307
+ <Step title="Configure Permissions (Optional)">
308
+ RLS is disabled by default, so all users can subscribe and publish. To restrict access, enable RLS and add policies:
309
+ ```sql
310
+ -- Step 1: Enable RLS
311
+ ALTER TABLE realtime.channels ENABLE ROW LEVEL SECURITY;
312
+ ALTER TABLE realtime.messages ENABLE ROW LEVEL SECURITY;
313
+
314
+ -- Step 2: Add policies
315
+ -- Subscribe: users can only subscribe to their own order channels
316
+ CREATE POLICY "users_subscribe_own_orders"
317
+ ON realtime.channels FOR SELECT
318
+ TO authenticated
319
+ USING (
320
+ pattern = 'order:%'
321
+ AND EXISTS (
322
+ SELECT 1 FROM orders
323
+ WHERE id = NULLIF(split_part(realtime.channel_name(), ':', 2), '')::uuid
324
+ AND user_id = auth.uid()
325
+ )
326
+ );
327
+
328
+ -- Publish: only admins can publish to order channels
329
+ CREATE POLICY "admins_publish_orders"
330
+ ON realtime.messages FOR INSERT
331
+ TO authenticated
332
+ WITH CHECK (
333
+ channel_name LIKE 'order:%'
334
+ AND EXISTS (
335
+ SELECT 1 FROM admins
336
+ WHERE user_id = auth.uid()
337
+ )
338
+ );
339
+ ```
340
+ </Step>
341
+
342
+ <Step title="Create Triggers">
343
+ Add trigger function and trigger to emit events on database changes:
344
+ ```sql
345
+ CREATE OR REPLACE FUNCTION notify_order_changes()
346
+ RETURNS TRIGGER AS $$
347
+ BEGIN
348
+ PERFORM realtime.publish(
349
+ 'order:' || NEW.id::text,
350
+ TG_OP || '_order',
351
+ jsonb_build_object('id', NEW.id, 'status', NEW.status)
352
+ );
353
+ RETURN NEW;
354
+ END;
355
+ $$ LANGUAGE plpgsql SECURITY DEFINER;
356
+
357
+ CREATE TRIGGER order_realtime
358
+ AFTER INSERT OR UPDATE ON orders
359
+ FOR EACH ROW EXECUTE FUNCTION notify_order_changes();
360
+ ```
361
+ </Step>
362
+
363
+ <Step title="Subscribe in Client">
364
+ Use the SDK to subscribe and listen:
365
+ ```javascript
366
+ await insforge.realtime.connect()
367
+ await insforge.realtime.subscribe('order:123')
368
+ insforge.realtime.on('UPDATE_order', (data) => {
369
+ console.log('Order updated:', data)
370
+ })
371
+ ```
372
+ </Step>
373
+ </Steps>
374
+
375
+ ## Architecture Features
376
+
377
+ <CardGroup cols={2}>
378
+ <Card title="Database-Driven" icon="database">
379
+ Events originate from PostgreSQL triggers, ensuring consistency with your data
380
+ </Card>
381
+
382
+ <Card title="Optional RLS Security" icon="shield">
383
+ Works out of the box, with optional RLS for fine-grained access control
384
+ </Card>
385
+
386
+ <Card title="Dual Delivery" icon="arrows-split-up-and-left">
387
+ Messages delivered to both WebSocket clients and webhook endpoints simultaneously
388
+ </Card>
389
+
390
+ <Card title="Audit Trail" icon="clipboard-list">
391
+ All messages stored in database with delivery statistics for debugging and replay
392
+ </Card>
393
+
394
+ <Card title="Pattern Matching" icon="asterisk">
395
+ Wildcard channel patterns let you define permissions for dynamic channels
396
+ </Card>
397
+
398
+ <Card title="Bidirectional" icon="arrows-left-right">
399
+ Clients can both receive events and publish their own messages (subject to RLS)
400
+ </Card>
401
+ </CardGroup>
402
+
403
+ ## Performance Characteristics
404
+
405
+ | Metric | Value | Notes |
406
+ |--------|-------|-------|
407
+ | **Latency** | ~10-50ms | Database to client, depends on network |
408
+ | **Throughput** | High | Limited by PostgreSQL NOTIFY and Socket.IO |
409
+ | **Persistence** | Full | All messages stored in database |
410
+ | **Reconnection** | Automatic | Socket.IO handles reconnection |
411
+ | **Webhook Timeout** | 10s | Per webhook request |
412
+
413
+ ## Best Practices
414
+
415
+ <CardGroup cols={2}>
416
+ <Card title="Keep Payloads Small" icon="compress">
417
+ Only include necessary data in payloads
418
+ </Card>
419
+
420
+ <Card title="Use Specific Channels" icon="bullseye">
421
+ Prefer `order:123` over broadcasting to `orders` for reducing the traffic
422
+ </Card>
423
+
424
+ <Card title="Add RLS When Needed" icon="gavel">
425
+ Enable RLS and add policies when you need to restrict channel access
426
+ </Card>
427
+
428
+ <Card title="Monitor Delivery" icon="chart-bar">
429
+ Check `ws_audience_count` and `wh_delivered_count` to debug delivery issues
430
+ </Card>
431
+
432
+ <Card title="Handle Reconnection" icon="rotate">
433
+ Design clients to refetch state on reconnect since missed messages are not replayed
434
+ </Card>
435
+
436
+ <Card title="Use Webhooks for Reliability" icon="webhook">
437
+ For critical notifications, configure webhook URLs as backup delivery method
438
+ </Card>
439
+ </CardGroup>
440
+
441
+ ## Limitations
442
+
443
+ - **No Message Replay**: Clients don't receive messages missed during disconnection
444
+ - **No Presence**: No built-in tracking of who's online in a channel
445
+ - **Single Region**: Messages delivered from single backend instance
446
+ - **Webhook Retries**: Limited to 2 retries with short timeout