insforge 1.2.10 → 1.3.0

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 (335) 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 +44 -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 +28 -28
  25. package/auth/src/lib/broadcastService.ts +117 -115
  26. package/auth/src/pages/SignInPage.tsx +60 -57
  27. package/auth/src/pages/SignUpPage.tsx +60 -57
  28. package/auth/tsconfig.json +32 -32
  29. package/auth/tsconfig.node.json +11 -11
  30. package/backend/package.json +78 -75
  31. package/backend/src/api/routes/ai/index.routes.ts +3 -3
  32. package/backend/src/api/routes/auth/index.routes.ts +667 -570
  33. package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
  34. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  35. package/backend/src/api/routes/database/index.routes.ts +78 -1
  36. package/backend/src/api/routes/database/records.routes.ts +10 -10
  37. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  38. package/backend/src/api/routes/docs/index.routes.ts +75 -76
  39. package/backend/src/api/routes/email/index.routes.ts +35 -0
  40. package/backend/src/api/routes/functions/index.routes.ts +18 -12
  41. package/backend/src/api/routes/metadata/index.routes.ts +12 -0
  42. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  43. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  44. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  45. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  46. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  47. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  48. package/backend/src/infra/database/database.manager.ts +14 -1
  49. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  50. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  51. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  52. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  53. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  54. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  55. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  56. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  57. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  58. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  59. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  60. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  61. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  62. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  63. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  64. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  65. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  66. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  67. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  68. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  69. package/backend/src/infra/security/token.manager.ts +219 -125
  70. package/backend/src/infra/socket/socket.manager.ts +198 -64
  71. package/backend/src/providers/ai/openrouter.provider.ts +12 -9
  72. package/backend/src/providers/email/base.provider.ts +4 -7
  73. package/backend/src/providers/email/cloud.provider.ts +84 -0
  74. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  75. package/backend/src/providers/oauth/index.ts +1 -0
  76. package/backend/src/server.ts +317 -284
  77. package/backend/src/services/ai/ai-model.service.ts +5 -5
  78. package/backend/src/services/ai/chat-completion.service.ts +4 -4
  79. package/backend/src/services/ai/image-generation.service.ts +3 -3
  80. package/backend/src/services/auth/auth.service.ts +14 -0
  81. package/backend/src/services/database/database-table.service.ts +0 -9
  82. package/backend/src/services/database/database.service.ts +127 -0
  83. package/backend/src/services/email/email.service.ts +5 -7
  84. package/backend/src/services/realtime/index.ts +3 -0
  85. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  86. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  87. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  88. package/backend/src/types/auth.ts +11 -0
  89. package/backend/src/types/realtime.ts +18 -0
  90. package/backend/src/types/socket.ts +7 -31
  91. package/backend/src/utils/cookies.ts +35 -0
  92. package/backend/src/utils/s3-config-loader.ts +64 -0
  93. package/backend/src/utils/seed.ts +301 -298
  94. package/backend/src/utils/sql-parser.ts +90 -0
  95. package/backend/tests/README.md +133 -133
  96. package/backend/tests/cleanup-all-test-data.sh +230 -230
  97. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  98. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  99. package/backend/tests/local/test-ai-config.sh +129 -129
  100. package/backend/tests/local/test-ai-usage.sh +80 -80
  101. package/backend/tests/local/test-auth-router.sh +143 -143
  102. package/backend/tests/local/test-database-router.sh +222 -222
  103. package/backend/tests/local/test-e2e.sh +240 -240
  104. package/backend/tests/local/test-fk-errors.sh +96 -96
  105. package/backend/tests/local/test-functions.sh +123 -123
  106. package/backend/tests/local/test-id-field.sh +200 -200
  107. package/backend/tests/local/test-logs.sh +132 -132
  108. package/backend/tests/local/test-public-bucket.sh +264 -264
  109. package/backend/tests/local/test-secrets.sh +249 -249
  110. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  111. package/backend/tests/local/test-traditional-rest.sh +208 -208
  112. package/backend/tests/manual/README.md +50 -50
  113. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  114. package/backend/tests/manual/seed-large-table.sql +100 -100
  115. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  116. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  117. package/backend/tests/manual/test-database-advance.sh +296 -296
  118. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  119. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  120. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  121. package/backend/tests/manual/test-universal-storage.sh +263 -263
  122. package/backend/tests/manual/test-users.sql +17 -17
  123. package/backend/tests/run-all-tests.sh +139 -139
  124. package/backend/tests/setup.ts +0 -0
  125. package/backend/tests/test-config.sh +338 -338
  126. package/backend/tests/unit/analyze-query.test.ts +697 -0
  127. package/backend/tsconfig.json +22 -22
  128. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  129. package/claude-plugin/README.md +133 -133
  130. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
  131. package/docker-compose.prod.yml +204 -200
  132. package/docker-compose.yml +232 -228
  133. package/docker-init/db/db-init.sql +97 -97
  134. package/docker-init/db/jwt.sql +5 -5
  135. package/docker-init/db/postgresql.conf +16 -16
  136. package/docker-init/logs/vector.yml +236 -236
  137. package/docs/README.md +44 -44
  138. package/docs/agent-docs/real-time.md +269 -0
  139. package/docs/changelog.mdx +119 -67
  140. package/docs/core-concepts/ai/architecture.mdx +372 -372
  141. package/docs/core-concepts/ai/sdk.mdx +213 -213
  142. package/docs/core-concepts/authentication/architecture.mdx +278 -278
  143. package/docs/core-concepts/authentication/sdk.mdx +414 -414
  144. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
  145. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
  146. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
  147. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
  148. package/docs/core-concepts/database/architecture.mdx +255 -255
  149. package/docs/core-concepts/database/sdk.mdx +382 -382
  150. package/docs/core-concepts/email/architecture.mdx +101 -0
  151. package/docs/core-concepts/email/sdk.mdx +53 -0
  152. package/docs/core-concepts/functions/architecture.mdx +105 -105
  153. package/docs/core-concepts/functions/sdk.mdx +184 -184
  154. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  155. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  156. package/docs/core-concepts/storage/architecture.mdx +243 -243
  157. package/docs/core-concepts/storage/sdk.mdx +253 -253
  158. package/docs/deployment/README.md +94 -94
  159. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  160. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  161. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  162. package/docs/deployment/deploy-to-render.md +441 -441
  163. package/docs/deprecated/insforge-auth-api.md +214 -214
  164. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  165. package/docs/deprecated/insforge-db-api.md +358 -358
  166. package/docs/deprecated/insforge-db-sdk.md +139 -139
  167. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  168. package/docs/deprecated/insforge-debug.md +64 -64
  169. package/docs/deprecated/insforge-instructions.md +123 -123
  170. package/docs/deprecated/insforge-project.md +117 -117
  171. package/docs/deprecated/insforge-storage-api.md +278 -278
  172. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  173. package/docs/docs.json +232 -210
  174. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  175. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  176. package/docs/examples/framework-guides/react.mdx +165 -165
  177. package/docs/examples/framework-guides/svelte.mdx +153 -153
  178. package/docs/examples/framework-guides/vue.mdx +159 -159
  179. package/docs/examples/overview.mdx +67 -67
  180. package/docs/favicon.svg +19 -19
  181. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  182. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  183. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  184. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  185. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  186. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  187. package/docs/images/icons/ai.svg +4 -4
  188. package/docs/images/logos/nextjs.svg +4 -4
  189. package/docs/images/logos/nuxt.svg +4 -4
  190. package/docs/images/logos/react.svg +5 -5
  191. package/docs/images/logos/svelte.svg +4 -4
  192. package/docs/images/logos/vue.svg +5 -5
  193. package/docs/insforge-instructions-sdk.md +89 -88
  194. package/docs/introduction.mdx +45 -45
  195. package/docs/logo/dark.svg +22 -22
  196. package/docs/logo/light.svg +20 -20
  197. package/docs/partnership.mdx +651 -646
  198. package/docs/quickstart.mdx +82 -82
  199. package/docs/showcase.mdx +52 -52
  200. package/docs/snippets/sdk-installation.mdx +21 -21
  201. package/docs/snippets/service-icons.mdx +27 -27
  202. package/examples/oauth/frontend-oauth-example.html +250 -250
  203. package/examples/response-examples.md +443 -443
  204. package/frontend/components.json +17 -17
  205. package/frontend/package.json +69 -69
  206. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  207. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  208. package/frontend/src/assets/icons/checked.svg +3 -3
  209. package/frontend/src/assets/icons/connected.svg +3 -3
  210. package/frontend/src/assets/icons/error.svg +3 -3
  211. package/frontend/src/assets/icons/loader.svg +9 -9
  212. package/frontend/src/assets/icons/pencil.svg +4 -4
  213. package/frontend/src/assets/icons/refresh.svg +4 -4
  214. package/frontend/src/assets/icons/step_active.svg +3 -3
  215. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  216. package/frontend/src/assets/icons/warning.svg +3 -3
  217. package/frontend/src/assets/logos/apple.svg +3 -3
  218. package/frontend/src/assets/logos/claude_code.svg +3 -3
  219. package/frontend/src/assets/logos/cline.svg +6 -6
  220. package/frontend/src/assets/logos/cursor.svg +20 -20
  221. package/frontend/src/assets/logos/discord.svg +8 -8
  222. package/frontend/src/assets/logos/facebook.svg +3 -3
  223. package/frontend/src/assets/logos/gemini.svg +19 -19
  224. package/frontend/src/assets/logos/github.svg +5 -5
  225. package/frontend/src/assets/logos/google.svg +13 -13
  226. package/frontend/src/assets/logos/grok.svg +10 -10
  227. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  228. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  229. package/frontend/src/assets/logos/instagram.svg +1 -1
  230. package/frontend/src/assets/logos/linkedin.svg +3 -3
  231. package/frontend/src/assets/logos/openai.svg +10 -10
  232. package/frontend/src/assets/logos/roo_code.svg +9 -9
  233. package/frontend/src/assets/logos/spotify.svg +16 -16
  234. package/frontend/src/assets/logos/tiktok.svg +5 -5
  235. package/frontend/src/assets/logos/trae.svg +3 -3
  236. package/frontend/src/assets/logos/windsurf.svg +10 -10
  237. package/frontend/src/assets/logos/x.svg +3 -3
  238. package/frontend/src/components/layout/AppHeader.tsx +9 -10
  239. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  240. package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
  241. package/frontend/src/features/auth/helpers.tsx +8 -0
  242. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  243. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  244. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  245. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  246. package/frontend/src/features/database/hooks/useTables.ts +32 -28
  247. package/frontend/src/features/database/index.ts +1 -0
  248. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
  249. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
  250. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
  251. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  252. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
  253. package/frontend/src/features/database/services/advance.service.ts +0 -26
  254. package/frontend/src/features/database/services/database.service.ts +55 -0
  255. package/frontend/src/features/database/services/table.service.ts +0 -6
  256. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  257. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
  258. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  259. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  260. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  261. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  262. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  263. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  264. package/frontend/src/features/realtime/index.ts +11 -0
  265. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  266. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  267. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  268. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  269. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  270. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
  271. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
  272. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  273. package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
  274. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  275. package/frontend/src/lib/utils/menuItems.ts +24 -0
  276. package/frontend/src/lib/utils/utils.ts +14 -1
  277. package/frontend/tsconfig.json +25 -25
  278. package/frontend/tsconfig.node.json +9 -9
  279. package/functions/deno.json +24 -24
  280. package/functions/server.ts +315 -315
  281. package/i18n/README.ar.md +130 -130
  282. package/i18n/README.de.md +130 -130
  283. package/i18n/README.es.md +154 -154
  284. package/i18n/README.fr.md +134 -134
  285. package/i18n/README.hi.md +129 -129
  286. package/i18n/README.ja.md +174 -174
  287. package/i18n/README.ko.md +136 -136
  288. package/i18n/README.pt-BR.md +131 -131
  289. package/i18n/README.ru.md +129 -129
  290. package/i18n/README.zh-CN.md +133 -133
  291. package/openapi/ai.yaml +715 -715
  292. package/openapi/auth.yaml +1244 -1244
  293. package/openapi/email.yaml +158 -0
  294. package/openapi/functions.yaml +475 -475
  295. package/openapi/health.yaml +29 -29
  296. package/openapi/logs.yaml +223 -223
  297. package/openapi/metadata.yaml +177 -177
  298. package/openapi/realtime.yaml +699 -0
  299. package/openapi/records.yaml +381 -381
  300. package/openapi/secrets.yaml +370 -370
  301. package/openapi/storage.yaml +875 -875
  302. package/openapi/tables.yaml +463 -463
  303. package/package.json +97 -97
  304. package/shared-schemas/package.json +31 -31
  305. package/shared-schemas/src/ai.schema.ts +63 -59
  306. package/shared-schemas/src/auth-api.schema.ts +352 -339
  307. package/shared-schemas/src/auth.schema.ts +1 -1
  308. package/shared-schemas/src/database-api.schema.ts +32 -1
  309. package/shared-schemas/src/database.schema.ts +39 -0
  310. package/shared-schemas/src/docs.schema.ts +26 -0
  311. package/shared-schemas/src/email-api.schema.ts +30 -0
  312. package/shared-schemas/src/index.ts +4 -0
  313. package/shared-schemas/src/metadata.schema.ts +9 -0
  314. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  315. package/shared-schemas/src/realtime.schema.ts +143 -0
  316. package/shared-schemas/tsconfig.json +21 -21
  317. package/tsconfig.json +7 -7
  318. package/zeabur/README.md +13 -13
  319. package/zeabur/template.yml +1032 -1032
  320. package/.cursor/rules/cursor-rules.mdc +0 -94
  321. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  322. package/test-gemini.sh +0 -35
  323. package/test-usage-admin.sh +0 -57
  324. package/test-usage.sh +0 -50
  325. /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
  326. /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
  327. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  328. /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
  329. /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
  330. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  331. /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
  332. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  333. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  334. /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
  335. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -0,0 +1,409 @@
1
+ ---
2
+ title: Realtime SDK Reference
3
+ description: Real-time subscriptions and messaging with the InsForge SDK
4
+ ---
5
+
6
+ import Installation from '/snippets/sdk-installation.mdx';
7
+
8
+ <Installation />
9
+
10
+ ## connect()
11
+
12
+ Establish a WebSocket connection to the realtime server.
13
+
14
+ ### Returns
15
+
16
+ ```typescript
17
+ Promise<void>
18
+ ```
19
+
20
+ <Note>
21
+ The SDK automatically includes the authentication token from the logged-in user. Multiple calls to `connect()` while connecting will safely return the same promise.
22
+ </Note>
23
+
24
+ ### Connection Timeout
25
+
26
+ The connection will timeout after **10 seconds** if the server is unreachable, rejecting the promise with a timeout error.
27
+
28
+ ### Example
29
+
30
+ ```javascript
31
+ try {
32
+ await insforge.realtime.connect()
33
+ console.log('Connected:', insforge.realtime.isConnected)
34
+ } catch (error) {
35
+ console.error('Connection failed:', error.message)
36
+ }
37
+ ```
38
+
39
+ ---
40
+
41
+ ## subscribe()
42
+
43
+ Subscribe to a channel to receive events.
44
+
45
+ ### Parameters
46
+
47
+ - `channel` (string, required) - Channel name (e.g., `'orders:123'`, `'chat:room-1'`)
48
+
49
+ ### Returns
50
+
51
+ ```typescript
52
+ Promise<{
53
+ ok: boolean,
54
+ channel: string,
55
+ error?: { code: string, message: string }
56
+ }>
57
+ ```
58
+
59
+ <Note>
60
+ **Auto-connect**: If not connected, `subscribe()` will automatically call `connect()` for you. However, calling `connect()` explicitly is still recommended so you can set up connection event listeners (`connect`, `disconnect`, `connect_error`) beforehand.
61
+
62
+ <Tip>
63
+ By default, all users can subscribe to any channel. If RLS is enabled on `realtime.channels`, subscriptions are subject to SELECT policies.
64
+ </Tip>
65
+ </Note>
66
+
67
+ ### Example
68
+
69
+ ```javascript
70
+ await insforge.realtime.connect()
71
+ const response = await insforge.realtime.subscribe('orders:123')
72
+
73
+ if (response.ok) {
74
+ console.log('Subscribed to:', response.channel)
75
+ } else {
76
+ console.error('Failed:', response.error?.message)
77
+ }
78
+
79
+ const response = await insforge.realtime.subscribe('orders:456')
80
+ ```
81
+
82
+ ### Output (Success)
83
+
84
+ ```json
85
+ {
86
+ "ok": true,
87
+ "channel": "orders:123"
88
+ }
89
+ ```
90
+
91
+ ### Output (Error - Connection Failed)
92
+
93
+ ```json
94
+ {
95
+ "ok": false,
96
+ "channel": "orders:123",
97
+ "error": {
98
+ "code": "CONNECTION_FAILED",
99
+ "message": "Connection timeout after 10000ms"
100
+ }
101
+ }
102
+ ```
103
+
104
+ ### Output (Error - Unauthorized)
105
+
106
+ ```json
107
+ {
108
+ "ok": false,
109
+ "channel": "orders:123",
110
+ "error": {
111
+ "code": "UNAUTHORIZED",
112
+ "message": "Not authorized to subscribe to this channel"
113
+ }
114
+ }
115
+ ```
116
+
117
+ ---
118
+
119
+ ## unsubscribe()
120
+
121
+ Unsubscribe from a channel. This is a fire-and-forget operation.
122
+
123
+ ### Parameters
124
+
125
+ - `channel` (string, required) - Channel name to unsubscribe from
126
+
127
+ ### Example
128
+
129
+ ```javascript
130
+ insforge.realtime.unsubscribe('orders:123')
131
+ ```
132
+
133
+ ---
134
+
135
+ ## publish()
136
+
137
+ Publish a message to a channel.
138
+
139
+ ### Parameters
140
+
141
+ - `channel` (string, required) - Channel name
142
+ - `event` (string, required) - Event name
143
+ - `payload` (object, required) - Message payload
144
+
145
+ <Warning>
146
+ You must be subscribed to a channel before publishing to it. If RLS is enabled on `realtime.messages`, publishing is also subject to INSERT policies.
147
+ </Warning>
148
+
149
+ ### Example
150
+
151
+ ```javascript
152
+ await insforge.realtime.publish('orders:123', 'status_changed', {
153
+ status: 'shipped',
154
+ trackingNumber: 'ABC123'
155
+ })
156
+ ```
157
+
158
+ ---
159
+
160
+ ## on()
161
+
162
+ Listen for events.
163
+
164
+ ### Parameters
165
+
166
+ - `event` (string, required) - Event name to listen for
167
+ - `callback` (function, required) - Callback function receiving the payload
168
+
169
+ ### Reserved Events
170
+
171
+ | Event | Payload | Description |
172
+ |-------|---------|-------------|
173
+ | `connect` | - | Fired when connected to the server |
174
+ | `connect_error` | `Error` | Fired when connection fails (including reconnection attempts) |
175
+ | `disconnect` | `string` (reason) | Fired when disconnected from the server |
176
+ | `error` | `RealtimeErrorPayload` | Fired when a realtime error occurs |
177
+
178
+ ### Example
179
+
180
+ ```javascript
181
+ // Custom events
182
+ insforge.realtime.on('order_updated', (payload) => {
183
+ console.log('Order updated:', payload)
184
+ })
185
+
186
+ // Connection events
187
+ insforge.realtime.on('connect', () => {
188
+ console.log('Connected! Socket ID:', insforge.realtime.socketId)
189
+ })
190
+
191
+ insforge.realtime.on('connect_error', (error) => {
192
+ console.error('Connection failed:', error.message)
193
+ })
194
+
195
+ insforge.realtime.on('disconnect', (reason) => {
196
+ console.log('Disconnected:', reason)
197
+ })
198
+
199
+ // Realtime error handling
200
+ insforge.realtime.on('error', (error) => {
201
+ console.error('Realtime error:', error.code, error.message)
202
+ })
203
+ ```
204
+
205
+ ### Error Codes
206
+
207
+ | Code | Description |
208
+ |------|-------------|
209
+ | `UNAUTHORIZED` | Not authorized to subscribe/publish to this channel |
210
+ | `NOT_SUBSCRIBED` | Must subscribe to channel before publishing |
211
+ | `INTERNAL_ERROR` | Server error occurred |
212
+
213
+ ---
214
+
215
+ ## Message Types
216
+
217
+ All messages from the server include a `meta` field with metadata enforced by the server.
218
+
219
+ ### SocketMessage
220
+
221
+ ```typescript
222
+ import type { SocketMessage, SocketMessageMeta } from '@insforge/sdk'
223
+
224
+ interface SocketMessage {
225
+ meta: SocketMessageMeta
226
+ // ...your custom payload fields
227
+ }
228
+
229
+ interface SocketMessageMeta {
230
+ channel?: string // Channel the message was sent to
231
+ messageId: string // Unique message ID (UUID)
232
+ senderType: 'system' | 'user'
233
+ senderId?: string // User ID of sender (UUID) if senderType is 'user'
234
+ timestamp: string // Server timestamp ISO string
235
+ }
236
+ ```
237
+
238
+ ### Example with Type Safety
239
+
240
+ ```typescript
241
+ import type { SocketMessage } from '@insforge/sdk'
242
+
243
+ interface ChatMessage extends SocketMessage {
244
+ text: string
245
+ sender: string
246
+ }
247
+
248
+ insforge.realtime.on<ChatMessage>('new_message', (payload) => {
249
+ console.log('Message ID:', payload.meta.messageId)
250
+ console.log('Sender ID:', payload.meta.senderId)
251
+ console.log('Sent at:', payload.meta.timestamp)
252
+ console.log('Text:', payload.text)
253
+ })
254
+ ```
255
+
256
+ ---
257
+
258
+ ## off()
259
+
260
+ Remove an event listener.
261
+
262
+ ### Parameters
263
+
264
+ - `event` (string, required) - Event name
265
+ - `callback` (function, required) - The callback function to remove
266
+
267
+ ### Example
268
+
269
+ ```javascript
270
+ function handleOrderUpdate(payload) {
271
+ console.log('Order updated:', payload)
272
+ }
273
+
274
+ // Add listener
275
+ insforge.realtime.on('order_updated', handleOrderUpdate)
276
+
277
+ // Remove listener
278
+ insforge.realtime.off('order_updated', handleOrderUpdate)
279
+ ```
280
+
281
+ ---
282
+
283
+ ## once()
284
+
285
+ Listen for an event only once, then automatically remove the listener.
286
+
287
+ ### Parameters
288
+
289
+ - `event` (string, required) - Event name to listen for
290
+ - `callback` (function, required) - Callback function receiving the payload
291
+
292
+ ### Example
293
+
294
+ ```javascript
295
+ // Wait for a single event
296
+ insforge.realtime.once('order_completed', (payload) => {
297
+ console.log('Order completed:', payload)
298
+ // Listener is automatically removed after this callback
299
+ })
300
+
301
+ // Useful for one-time confirmations
302
+ insforge.realtime.once('connect', () => {
303
+ console.log('First connection established')
304
+ })
305
+ ```
306
+
307
+ ---
308
+
309
+ ## disconnect()
310
+
311
+ Disconnect from the realtime server and clear all subscriptions.
312
+
313
+ ### Example
314
+
315
+ ```javascript
316
+ insforge.realtime.disconnect()
317
+ ```
318
+
319
+ ---
320
+
321
+ ## Properties
322
+
323
+ ### isConnected
324
+
325
+ Check if connected to the realtime server.
326
+
327
+ ```javascript
328
+ if (insforge.realtime.isConnected) {
329
+ console.log('Connected')
330
+ }
331
+ ```
332
+
333
+ ### connectionState
334
+
335
+ Get the current connection state.
336
+
337
+ ```typescript
338
+ type ConnectionState = 'disconnected' | 'connecting' | 'connected'
339
+ ```
340
+
341
+ ```javascript
342
+ console.log(insforge.realtime.connectionState) // 'connected'
343
+ ```
344
+
345
+ ### socketId
346
+
347
+ Get the socket ID (available when connected).
348
+
349
+ ```javascript
350
+ console.log(insforge.realtime.socketId) // 'abc123xyz'
351
+ ```
352
+
353
+ ### getSubscribedChannels()
354
+
355
+ Get all currently subscribed channels.
356
+
357
+ ```javascript
358
+ const channels = insforge.realtime.getSubscribedChannels()
359
+ console.log(channels) // ['orders:123', 'chat:room-1']
360
+ ```
361
+
362
+ ---
363
+
364
+ ## Complete Example
365
+
366
+ ### Chat Room
367
+
368
+ ```javascript
369
+ const insforge = createClient({ baseUrl: 'https://your-app.insforge.app' })
370
+
371
+ // Setup error handling
372
+ insforge.realtime.on('error', (error) => {
373
+ console.error('Error:', error.message)
374
+ })
375
+
376
+ insforge.realtime.on('disconnect', (reason) => {
377
+ console.log('Disconnected:', reason)
378
+ })
379
+
380
+ // Connect and subscribe
381
+ await insforge.realtime.connect()
382
+ const { ok } = await insforge.realtime.subscribe('chat:room-1')
383
+
384
+ if (!ok) {
385
+ console.error('Failed to join room')
386
+ return
387
+ }
388
+
389
+ // Listen for messages
390
+ insforge.realtime.on('new_message', (payload) => {
391
+ displayMessage(payload.sender, payload.text)
392
+ })
393
+
394
+ // Send a message
395
+ async function sendMessage(text) {
396
+ await insforge.realtime.publish('chat:room-1', 'new_message', {
397
+ sender: currentUser.name,
398
+ text,
399
+ timestamp: new Date().toISOString()
400
+ })
401
+ }
402
+
403
+ // Cleanup on leave
404
+ function leaveRoom() {
405
+ insforge.realtime.unsubscribe('chat:room-1')
406
+ insforge.realtime.disconnect()
407
+ }
408
+ ```
409
+