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.
- package/.claude-plugin/marketplace.json +20 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +28 -28
- package/auth/src/lib/broadcastService.ts +117 -115
- package/auth/src/pages/SignInPage.tsx +60 -57
- package/auth/src/pages/SignUpPage.tsx +60 -57
- package/auth/tsconfig.json +32 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +78 -75
- package/backend/src/api/routes/ai/index.routes.ts +3 -3
- package/backend/src/api/routes/auth/index.routes.ts +667 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +78 -1
- package/backend/src/api/routes/database/records.routes.ts +10 -10
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/docs/index.routes.ts +75 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +18 -12
- package/backend/src/api/routes/metadata/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/infra/database/database.manager.ts +14 -1
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/infra/security/token.manager.ts +219 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +12 -9
- package/backend/src/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +317 -284
- package/backend/src/services/ai/ai-model.service.ts +5 -5
- package/backend/src/services/ai/chat-completion.service.ts +4 -4
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/auth/auth.service.ts +14 -0
- package/backend/src/services/database/database-table.service.ts +0 -9
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +5 -7
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/types/auth.ts +11 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -298
- package/backend/src/utils/sql-parser.ts +90 -0
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -249
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -244
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -67
- package/docs/core-concepts/ai/architecture.mdx +372 -372
- package/docs/core-concepts/ai/sdk.mdx +213 -213
- package/docs/core-concepts/authentication/architecture.mdx +278 -278
- package/docs/core-concepts/authentication/sdk.mdx +414 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
- package/docs/core-concepts/database/architecture.mdx +255 -255
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -105
- package/docs/core-concepts/functions/sdk.mdx +184 -184
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.svg +19 -19
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- package/docs/insforge-instructions-sdk.md +89 -88
- package/docs/introduction.mdx +45 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/partnership.mdx +651 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -69
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +3 -3
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -3
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +1 -1
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -3
- package/frontend/src/components/layout/AppHeader.tsx +9 -10
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useTables.ts +32 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
- package/frontend/src/features/database/services/advance.service.ts +0 -26
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/table.service.ts +0 -6
- package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +24 -0
- package/frontend/src/lib/utils/utils.ts +14 -1
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -315
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +715 -715
- package/openapi/auth.yaml +1244 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai.schema.ts +63 -59
- package/shared-schemas/src/auth-api.schema.ts +352 -339
- package/shared-schemas/src/auth.schema.ts +1 -1
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +4 -0
- package/shared-schemas/src/metadata.schema.ts +9 -0
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -13
- package/zeabur/template.yml +1032 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
- /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
|
+
|