@aurabase/aurabase-js 0.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/.changeset/config.json +11 -0
- package/CHANGELOG.md +30 -0
- package/LICENSE +21 -0
- package/README.md +833 -0
- package/package.json +90 -0
- package/packages/ai/LICENSE +21 -0
- package/packages/ai/README.md +106 -0
- package/packages/ai/dist/index.cjs +229 -0
- package/packages/ai/dist/index.d.cts +139 -0
- package/packages/ai/dist/index.d.ts +139 -0
- package/packages/ai/dist/index.js +226 -0
- package/packages/ai/node_modules/.bin/esbuild +19 -0
- package/packages/ai/node_modules/.bin/tsc +22 -0
- package/packages/ai/node_modules/.bin/tsserver +22 -0
- package/packages/ai/node_modules/.bin/tsup +22 -0
- package/packages/ai/node_modules/.bin/tsup-node +22 -0
- package/packages/ai/node_modules/.bin/vite +22 -0
- package/packages/ai/node_modules/.bin/vitest +22 -0
- package/packages/ai/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/ai/package.json +61 -0
- package/packages/ai/src/AiService.ts +226 -0
- package/packages/ai/src/index.ts +18 -0
- package/packages/ai/src/sse.ts +141 -0
- package/packages/ai/src/types.ts +30 -0
- package/packages/ai/tests/chat-stream.test.ts +151 -0
- package/packages/ai/tests/rag-namespaces.test.ts +54 -0
- package/packages/ai/tests/sse.test.ts +69 -0
- package/packages/ai/tsconfig.json +5 -0
- package/packages/ai/tsup.config.ts +11 -0
- package/packages/aurabase/LICENSE +21 -0
- package/packages/aurabase/README.md +64 -0
- package/packages/aurabase/dist/AuraClient-DAtDbfPB.d.cts +77 -0
- package/packages/aurabase/dist/AuraClient-DAtDbfPB.d.ts +77 -0
- package/packages/aurabase/dist/index.cjs +237 -0
- package/packages/aurabase/dist/index.d.cts +46 -0
- package/packages/aurabase/dist/index.d.ts +46 -0
- package/packages/aurabase/dist/index.js +177 -0
- package/packages/aurabase/dist/ssr.cjs +224 -0
- package/packages/aurabase/dist/ssr.d.cts +65 -0
- package/packages/aurabase/dist/ssr.d.ts +65 -0
- package/packages/aurabase/dist/ssr.js +214 -0
- package/packages/aurabase/node_modules/.bin/esbuild +19 -0
- package/packages/aurabase/node_modules/.bin/tsc +22 -0
- package/packages/aurabase/node_modules/.bin/tsserver +22 -0
- package/packages/aurabase/node_modules/.bin/tsup +22 -0
- package/packages/aurabase/node_modules/.bin/tsup-node +22 -0
- package/packages/aurabase/node_modules/.bin/vite +22 -0
- package/packages/aurabase/node_modules/.bin/vitest +22 -0
- package/packages/aurabase/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/aurabase/package.json +80 -0
- package/packages/aurabase/src/AuraClient.ts +237 -0
- package/packages/aurabase/src/index.ts +152 -0
- package/packages/aurabase/src/ssr.ts +156 -0
- package/packages/aurabase/tests/ai-streaming-rag-e2e.test.ts +82 -0
- package/packages/aurabase/tests/ai.test.ts +111 -0
- package/packages/aurabase/tests/auth-admin.test.ts +515 -0
- package/packages/aurabase/tests/auth-e2e.test.ts +135 -0
- package/packages/aurabase/tests/auth-hardening.test.ts +206 -0
- package/packages/aurabase/tests/auth.test.ts +947 -0
- package/packages/aurabase/tests/database.test.ts +230 -0
- package/packages/aurabase/tests/db-types-e2e.test.ts +217 -0
- package/packages/aurabase/tests/dispose.test.ts +23 -0
- package/packages/aurabase/tests/foreign-token.e2e.test.ts +129 -0
- package/packages/aurabase/tests/functions.test.ts +107 -0
- package/packages/aurabase/tests/integration.test.ts +413 -0
- package/packages/aurabase/tests/live-production-validation.js +241 -0
- package/packages/aurabase/tests/live-sdk-production-validation.js +293 -0
- package/packages/aurabase/tests/mocks.ts +139 -0
- package/packages/aurabase/tests/notifications.test.ts +314 -0
- package/packages/aurabase/tests/observability-backup.test.ts +186 -0
- package/packages/aurabase/tests/observability-hook.test.ts +130 -0
- package/packages/aurabase/tests/production-robustness.test.ts +268 -0
- package/packages/aurabase/tests/public-api-surface.test.ts +53 -0
- package/packages/aurabase/tests/query-builder.test.ts +329 -0
- package/packages/aurabase/tests/readme-smoke-e2e.test.ts +231 -0
- package/packages/aurabase/tests/realtime-filter-e2e.test.ts +344 -0
- package/packages/aurabase/tests/refresh-locks.test.ts +210 -0
- package/packages/aurabase/tests/retry-option.test.ts +17 -0
- package/packages/aurabase/tests/rpc-e2e.test.ts +254 -0
- package/packages/aurabase/tests/rs256-local-e2e.test.ts +114 -0
- package/packages/aurabase/tests/rt-alias-public-e2e.test.ts +235 -0
- package/packages/aurabase/tests/rt-http-broadcast-e2e.test.ts +124 -0
- package/packages/aurabase/tests/service-role-guard.test.ts +99 -0
- package/packages/aurabase/tests/ssr.test.ts +91 -0
- package/packages/aurabase/tests/storage-backend-e2e.test.ts +481 -0
- package/packages/aurabase/tests/storage-sdk-parity-e2e.test.ts +104 -0
- package/packages/aurabase/tests/storage-transform-e2e.test.ts +684 -0
- package/packages/aurabase/tests/storage.test.ts +55 -0
- package/packages/aurabase/tests/types/client-generic.test-d.ts +79 -0
- package/packages/aurabase/tests/types/docs-snippets.test-d.ts +571 -0
- package/packages/aurabase/tests/types/error-code.test-d.ts +53 -0
- package/packages/aurabase/tsconfig.json +5 -0
- package/packages/aurabase/tsconfig.test-d.json +5 -0
- package/packages/aurabase/tsup.config.ts +11 -0
- package/packages/aurabase/vitest.config.ts +16 -0
- package/packages/aurabase/vitest.e2e.config.ts +9 -0
- package/packages/auth/LICENSE +21 -0
- package/packages/auth/README.md +215 -0
- package/packages/auth/dist/index.cjs +1175 -0
- package/packages/auth/dist/index.d.cts +397 -0
- package/packages/auth/dist/index.d.ts +397 -0
- package/packages/auth/dist/index.js +1170 -0
- package/packages/auth/node_modules/.bin/esbuild +19 -0
- package/packages/auth/node_modules/.bin/tsc +22 -0
- package/packages/auth/node_modules/.bin/tsserver +22 -0
- package/packages/auth/node_modules/.bin/tsup +22 -0
- package/packages/auth/node_modules/.bin/tsup-node +22 -0
- package/packages/auth/node_modules/.bin/vite +22 -0
- package/packages/auth/node_modules/.bin/vitest +22 -0
- package/packages/auth/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/auth/package.json +61 -0
- package/packages/auth/src/AuthAdminService.ts +149 -0
- package/packages/auth/src/AuthService.ts +1166 -0
- package/packages/auth/src/SessionManager.ts +92 -0
- package/packages/auth/src/index.ts +17 -0
- package/packages/auth/src/jwks.ts +337 -0
- package/packages/auth/src/pkce.ts +27 -0
- package/packages/auth/src/types.ts +89 -0
- package/packages/auth/tests/auth-lifecycle.test.ts +149 -0
- package/packages/auth/tests/detect-session.test.ts +361 -0
- package/packages/auth/tests/getclaims.test.ts +780 -0
- package/packages/auth/tests/is-mfa-challenge.test.ts +27 -0
- package/packages/auth/tests/password-recovery.test.ts +124 -0
- package/packages/auth/tests/pkce.test.ts +192 -0
- package/packages/auth/tests/session-manager.test.ts +103 -0
- package/packages/auth/tests/set-session.test.ts +139 -0
- package/packages/auth/tests/verify-otp.test.ts +153 -0
- package/packages/auth/tsconfig.json +5 -0
- package/packages/auth/tsup.config.ts +11 -0
- package/packages/core/LICENSE +21 -0
- package/packages/core/README.md +132 -0
- package/packages/core/dist/index.cjs +695 -0
- package/packages/core/dist/index.d.cts +1137 -0
- package/packages/core/dist/index.d.ts +1137 -0
- package/packages/core/dist/index.js +673 -0
- package/packages/core/node_modules/.bin/esbuild +22 -0
- package/packages/core/node_modules/.bin/tsc +22 -0
- package/packages/core/node_modules/.bin/tsserver +22 -0
- package/packages/core/node_modules/.bin/tsup +22 -0
- package/packages/core/node_modules/.bin/tsup-node +22 -0
- package/packages/core/node_modules/.bin/vite +22 -0
- package/packages/core/node_modules/.bin/vitest +22 -0
- package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/core/package.json +57 -0
- package/packages/core/src/AuraError.ts +89 -0
- package/packages/core/src/BaseService.ts +44 -0
- package/packages/core/src/client.ts +34 -0
- package/packages/core/src/cookie-utils.ts +42 -0
- package/packages/core/src/fetch.ts +435 -0
- package/packages/core/src/index.ts +22 -0
- package/packages/core/src/retry.ts +63 -0
- package/packages/core/src/serialize.ts +6 -0
- package/packages/core/src/stores/BaseAuthStore.ts +164 -0
- package/packages/core/src/stores/LocalAuthStore.ts +199 -0
- package/packages/core/src/types.ts +1042 -0
- package/packages/core/tests/auth-store.test.ts +300 -0
- package/packages/core/tests/error-code.test.ts +61 -0
- package/packages/core/tests/error.test.ts +24 -0
- package/packages/core/tests/fetch.test.ts +286 -0
- package/packages/core/tests/mocks.ts +139 -0
- package/packages/core/tests/observability.test.ts +86 -0
- package/packages/core/tests/refresh-hardening.test.ts +164 -0
- package/packages/core/tests/refresh-observability.test.ts +111 -0
- package/packages/core/tests/retry.test.ts +106 -0
- package/packages/core/tests/serialize.test.ts +12 -0
- package/packages/core/tests/timeout.test.ts +79 -0
- package/packages/core/tsconfig.json +5 -0
- package/packages/core/tsup.config.ts +11 -0
- package/packages/db/LICENSE +21 -0
- package/packages/db/README.md +152 -0
- package/packages/db/VENDORED.md +93 -0
- package/packages/db/dist/index.cjs +544 -0
- package/packages/db/dist/index.d.cts +1111 -0
- package/packages/db/dist/index.d.ts +1111 -0
- package/packages/db/dist/index.js +541 -0
- package/packages/db/node_modules/.bin/esbuild +19 -0
- package/packages/db/node_modules/.bin/tsc +22 -0
- package/packages/db/node_modules/.bin/tsserver +22 -0
- package/packages/db/node_modules/.bin/tsup +22 -0
- package/packages/db/node_modules/.bin/tsup-node +22 -0
- package/packages/db/node_modules/.bin/vite +22 -0
- package/packages/db/node_modules/.bin/vitest +22 -0
- package/packages/db/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/db/package.json +62 -0
- package/packages/db/src/DatabaseService.ts +170 -0
- package/packages/db/src/QueryBuilder.ts +830 -0
- package/packages/db/src/index.ts +2 -0
- package/packages/db/src/pgrst-types/common/common.ts +86 -0
- package/packages/db/src/pgrst-types/common/rpc.ts +151 -0
- package/packages/db/src/pgrst-types/feature-flags.ts +20 -0
- package/packages/db/src/pgrst-types/types.ts +134 -0
- package/packages/db/src/select-query-parser/parser.ts +479 -0
- package/packages/db/src/select-query-parser/result.ts +553 -0
- package/packages/db/src/select-query-parser/types.ts +132 -0
- package/packages/db/src/select-query-parser/utils.ts +707 -0
- package/packages/db/tests/filters.test.ts +81 -0
- package/packages/db/tests/mutations-filtered.e2e.test.ts +132 -0
- package/packages/db/tests/mutations-filtered.test.ts +188 -0
- package/packages/db/tests/order.test.ts +45 -0
- package/packages/db/tests/rpc.test.ts +41 -0
- package/packages/db/tests/scale/build-large-schema.ts +94 -0
- package/packages/db/tests/scale/scale-compile.test.ts +167 -0
- package/packages/db/tests/schema.test.ts +77 -0
- package/packages/db/tests/single-accept.e2e.test.ts +123 -0
- package/packages/db/tests/single.test.ts +211 -0
- package/packages/db/tests/types/filters.test-d.ts +52 -0
- package/packages/db/tests/types/fixtures.ts +40 -0
- package/packages/db/tests/types/from-views.test-d.ts +18 -0
- package/packages/db/tests/types/mutations.test-d.ts +23 -0
- package/packages/db/tests/types/rpc.test-d.ts +60 -0
- package/packages/db/tests/types/schema-shape.test-d.ts +8 -0
- package/packages/db/tests/types/select-inference.test-d.ts +38 -0
- package/packages/db/tests/vendored/fixtures.ts +83 -0
- package/packages/db/tests/vendored/get-result.test-d.ts +75 -0
- package/packages/db/tsconfig.json +5 -0
- package/packages/db/tsconfig.test-d.json +5 -0
- package/packages/db/tsup.config.ts +11 -0
- package/packages/db/vitest.config.ts +8 -0
- package/packages/functions/LICENSE +21 -0
- package/packages/functions/README.md +96 -0
- package/packages/functions/dist/index.cjs +173 -0
- package/packages/functions/dist/index.d.cts +81 -0
- package/packages/functions/dist/index.d.ts +81 -0
- package/packages/functions/dist/index.js +168 -0
- package/packages/functions/node_modules/.bin/esbuild +19 -0
- package/packages/functions/node_modules/.bin/tsc +22 -0
- package/packages/functions/node_modules/.bin/tsserver +22 -0
- package/packages/functions/node_modules/.bin/tsup +22 -0
- package/packages/functions/node_modules/.bin/tsup-node +22 -0
- package/packages/functions/node_modules/.bin/vite +22 -0
- package/packages/functions/node_modules/.bin/vitest +22 -0
- package/packages/functions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/functions/package.json +60 -0
- package/packages/functions/src/FunctionsService.ts +188 -0
- package/packages/functions/src/errors.ts +70 -0
- package/packages/functions/src/index.ts +6 -0
- package/packages/functions/tests/invoke.test.ts +97 -0
- package/packages/functions/tests/response-type-errors.test.ts +135 -0
- package/packages/functions/tsconfig.json +5 -0
- package/packages/functions/tsup.config.ts +11 -0
- package/packages/gen/LICENSE +21 -0
- package/packages/gen/README.md +84 -0
- package/packages/gen/dist/cli.cjs +334 -0
- package/packages/gen/dist/cli.d.cts +1 -0
- package/packages/gen/dist/cli.d.ts +1 -0
- package/packages/gen/dist/cli.js +332 -0
- package/packages/gen/dist/index.cjs +257 -0
- package/packages/gen/dist/index.d.cts +12 -0
- package/packages/gen/dist/index.d.ts +12 -0
- package/packages/gen/dist/index.js +255 -0
- package/packages/gen/node_modules/.bin/esbuild +19 -0
- package/packages/gen/node_modules/.bin/tsc +22 -0
- package/packages/gen/node_modules/.bin/tsserver +22 -0
- package/packages/gen/node_modules/.bin/tsup +22 -0
- package/packages/gen/node_modules/.bin/tsup-node +22 -0
- package/packages/gen/node_modules/.bin/vite +22 -0
- package/packages/gen/node_modules/.bin/vitest +22 -0
- package/packages/gen/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/gen/package.json +66 -0
- package/packages/gen/src/cli.ts +67 -0
- package/packages/gen/src/generate.ts +0 -0
- package/packages/gen/src/index.ts +2 -0
- package/packages/gen/tests/compile.test.ts +213 -0
- package/packages/gen/tests/e2e.test.ts +130 -0
- package/packages/gen/tests/generate.test.ts +396 -0
- package/packages/gen/tsconfig.json +5 -0
- package/packages/gen/tsup.config.ts +11 -0
- package/packages/notifications/LICENSE +21 -0
- package/packages/notifications/README.md +134 -0
- package/packages/notifications/dist/index.cjs +128 -0
- package/packages/notifications/dist/index.d.cts +81 -0
- package/packages/notifications/dist/index.d.ts +81 -0
- package/packages/notifications/dist/index.js +125 -0
- package/packages/notifications/node_modules/.bin/esbuild +19 -0
- package/packages/notifications/node_modules/.bin/tsc +22 -0
- package/packages/notifications/node_modules/.bin/tsserver +22 -0
- package/packages/notifications/node_modules/.bin/tsup +22 -0
- package/packages/notifications/node_modules/.bin/tsup-node +22 -0
- package/packages/notifications/node_modules/.bin/vite +22 -0
- package/packages/notifications/node_modules/.bin/vitest +22 -0
- package/packages/notifications/package.json +60 -0
- package/packages/notifications/src/NotificationsService.ts +230 -0
- package/packages/notifications/src/index.ts +19 -0
- package/packages/notifications/tsconfig.json +5 -0
- package/packages/notifications/tsup.config.ts +11 -0
- package/packages/realtime/LICENSE +21 -0
- package/packages/realtime/README.md +183 -0
- package/packages/realtime/dist/index.cjs +977 -0
- package/packages/realtime/dist/index.d.cts +259 -0
- package/packages/realtime/dist/index.d.ts +259 -0
- package/packages/realtime/dist/index.js +973 -0
- package/packages/realtime/node_modules/.bin/esbuild +19 -0
- package/packages/realtime/node_modules/.bin/tsc +22 -0
- package/packages/realtime/node_modules/.bin/tsserver +22 -0
- package/packages/realtime/node_modules/.bin/tsup +22 -0
- package/packages/realtime/node_modules/.bin/tsup-node +22 -0
- package/packages/realtime/node_modules/.bin/vite +22 -0
- package/packages/realtime/node_modules/.bin/vitest +22 -0
- package/packages/realtime/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/realtime/package.json +60 -0
- package/packages/realtime/src/AuraChannel.ts +485 -0
- package/packages/realtime/src/HeartbeatManager.ts +73 -0
- package/packages/realtime/src/RealtimeService.ts +505 -0
- package/packages/realtime/src/columnFilter.ts +301 -0
- package/packages/realtime/src/index.ts +4 -0
- package/packages/realtime/tests/ack-routing.test.ts +81 -0
- package/packages/realtime/tests/column-filter.test.ts +144 -0
- package/packages/realtime/tests/dispatch.test.ts +191 -0
- package/packages/realtime/tests/heartbeat.test.ts +67 -0
- package/packages/realtime/tests/http-broadcast.test.ts +68 -0
- package/packages/realtime/tests/realtime-token.test.ts +43 -0
- package/packages/realtime/tests/reconnect-race.test.ts +149 -0
- package/packages/realtime/tests/ref-id.test.ts +34 -0
- package/packages/realtime/tests/set-auth.test.ts +70 -0
- package/packages/realtime/tsconfig.json +5 -0
- package/packages/realtime/tsup.config.ts +11 -0
- package/packages/storage/LICENSE +21 -0
- package/packages/storage/README.md +141 -0
- package/packages/storage/dist/index.cjs +333 -0
- package/packages/storage/dist/index.d.cts +185 -0
- package/packages/storage/dist/index.d.ts +185 -0
- package/packages/storage/dist/index.js +329 -0
- package/packages/storage/node_modules/.bin/esbuild +19 -0
- package/packages/storage/node_modules/.bin/tsc +22 -0
- package/packages/storage/node_modules/.bin/tsserver +22 -0
- package/packages/storage/node_modules/.bin/tsup +22 -0
- package/packages/storage/node_modules/.bin/tsup-node +22 -0
- package/packages/storage/node_modules/.bin/vite +22 -0
- package/packages/storage/node_modules/.bin/vitest +22 -0
- package/packages/storage/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/storage/package.json +60 -0
- package/packages/storage/src/DownloadBuilder.ts +60 -0
- package/packages/storage/src/StorageService.ts +323 -0
- package/packages/storage/src/index.ts +2 -0
- package/packages/storage/src/path.ts +35 -0
- package/packages/storage/src/transform.ts +15 -0
- package/packages/storage/tests/download.test.ts +64 -0
- package/packages/storage/tests/parity.test.ts +154 -0
- package/packages/storage/tests/path.test.ts +87 -0
- package/packages/storage/tests/transform.test.ts +79 -0
- package/packages/storage/tsconfig.json +5 -0
- package/packages/storage/tsup.config.ts +11 -0
- package/pnpm-workspace.yaml +24 -0
- package/tsconfig.base.json +15 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { ChannelConfig, PostgresChangesFilter, RealtimeEvent, BroadcastFilter, PresenceFilter, SubscribeCallback, BroadcastPayload, PresenceState, ServerMessage, RealtimeListenType, AuraClientLike, AuraResponse } from '@aurabase/core';
|
|
2
|
+
|
|
3
|
+
type ListenerCallback = (payload: RealtimeEvent | Record<string, unknown>) => void;
|
|
4
|
+
type ListenerEntry = {
|
|
5
|
+
type: RealtimeListenType;
|
|
6
|
+
filter: PostgresChangesFilter | BroadcastFilter | PresenceFilter;
|
|
7
|
+
callback: ListenerCallback;
|
|
8
|
+
};
|
|
9
|
+
type SendFn = (data: string) => void;
|
|
10
|
+
/**
|
|
11
|
+
* A realtime channel with Supabase-compatible chainable API.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const channel = aura.channel('room-1')
|
|
16
|
+
* .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' }, (payload) => {
|
|
17
|
+
* console.log('New message:', payload)
|
|
18
|
+
* })
|
|
19
|
+
* .on('broadcast', { event: 'cursor-pos' }, (payload) => {
|
|
20
|
+
* console.log('Cursor:', payload)
|
|
21
|
+
* })
|
|
22
|
+
* .on('presence', { event: 'sync' }, () => {
|
|
23
|
+
* console.log('Presence synced:', channel.presenceState())
|
|
24
|
+
* })
|
|
25
|
+
* .subscribe((status) => {
|
|
26
|
+
* if (status === 'SUBSCRIBED') console.log('Connected!')
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare class AuraChannel {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
private readonly _projectId;
|
|
33
|
+
private readonly _listeners;
|
|
34
|
+
private _subscribed;
|
|
35
|
+
private _sendFn;
|
|
36
|
+
private _subscribeCallback;
|
|
37
|
+
private _presenceState;
|
|
38
|
+
private _isPrivate;
|
|
39
|
+
private _broadcastAck;
|
|
40
|
+
private _broadcastSelf;
|
|
41
|
+
private _presenceKey;
|
|
42
|
+
/** ID de subscription retourné par le serveur (utilisé pour le filtre RLS allowed_sub_ids) */
|
|
43
|
+
private _subscriptionId;
|
|
44
|
+
/** Compteur pour générer des ref_id uniques par connexion */
|
|
45
|
+
private _refCounter;
|
|
46
|
+
/** Dernier event ID recu — utilise pour since_id au reconnect */
|
|
47
|
+
private _lastEventId;
|
|
48
|
+
/** Pending ACK callbacks : ref_id → resolve */
|
|
49
|
+
private _pendingAcks;
|
|
50
|
+
constructor(name: string, projectId: string, options?: ChannelConfig);
|
|
51
|
+
/** Génère un ref_id unique pour la corrélation request/response. */
|
|
52
|
+
private _nextRef;
|
|
53
|
+
/** Full channel name with project prefix (for server protocol) */
|
|
54
|
+
get fullName(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Register a listener for a specific event type.
|
|
57
|
+
* Returns `this` for chaining.
|
|
58
|
+
*/
|
|
59
|
+
on(type: 'postgres_changes', filter: PostgresChangesFilter, callback: (payload: RealtimeEvent) => void): this;
|
|
60
|
+
on(type: 'broadcast', filter: BroadcastFilter, callback: (payload: RealtimeEvent) => void): this;
|
|
61
|
+
on(type: 'presence', filter: PresenceFilter, callback: (payload: any) => void): this;
|
|
62
|
+
/**
|
|
63
|
+
* Subscribe to the channel. Sends the Subscribe message to the server
|
|
64
|
+
* with the full config (postgres_changes, broadcast, presence).
|
|
65
|
+
*/
|
|
66
|
+
subscribe(callback?: SubscribeCallback): this;
|
|
67
|
+
/** Called by RealtimeService once the WS connection is ready. */
|
|
68
|
+
_bindSend(sendFn: SendFn): void;
|
|
69
|
+
/** Send the subscribe message to the server. */
|
|
70
|
+
_doSubscribe(): void;
|
|
71
|
+
/** Unsubscribe from the channel. */
|
|
72
|
+
unsubscribe(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Send a broadcast message to the channel.
|
|
75
|
+
* If broadcast.ack=true, returns a Promise that resolves when the server ACKs.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* // Without ACK (fire & forget)
|
|
80
|
+
* channel.send({ type: 'broadcast', event: 'cursor-pos', payload: { x: 100, y: 200 } })
|
|
81
|
+
*
|
|
82
|
+
* // With ACK (wait for server confirmation)
|
|
83
|
+
* await channel.send({ type: 'broadcast', event: 'cursor-pos', payload: { x: 100 } })
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
send(message: BroadcastPayload): Promise<'ok' | 'timeout' | 'error'>;
|
|
87
|
+
/**
|
|
88
|
+
* Track presence state for this client.
|
|
89
|
+
* Returns a Promise that resolves with 'ok' once tracked (compatible Supabase).
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* await channel.track({ user: 'user-1', online_at: new Date().toISOString() })
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
track(state: Record<string, unknown>): Promise<'ok' | 'error'>;
|
|
97
|
+
/** Stop tracking presence. */
|
|
98
|
+
untrack(): Promise<'ok' | 'error'>;
|
|
99
|
+
/** Get the current presence state for this channel. */
|
|
100
|
+
presenceState(): PresenceState;
|
|
101
|
+
/** Called by RealtimeService when a server message arrives for this channel. */
|
|
102
|
+
_onMessage(msg: ServerMessage): void;
|
|
103
|
+
/** Dispatch a RealtimeEvent to matching listeners. */
|
|
104
|
+
private _dispatchEvent;
|
|
105
|
+
/** Whether this channel has been subscribed. */
|
|
106
|
+
get isSubscribed(): boolean;
|
|
107
|
+
/** Get listeners (for re-subscribe after reconnect). */
|
|
108
|
+
_getListeners(): ListenerEntry[];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Connection state machine */
|
|
112
|
+
type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
|
|
113
|
+
/**
|
|
114
|
+
* Realtime service — manages a single WebSocket connection and multiplexes
|
|
115
|
+
* channels on top of it. Supabase-compatible API.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```ts
|
|
119
|
+
* const aura = createClient('http://localhost:8080', 'my-project')
|
|
120
|
+
*
|
|
121
|
+
* const channel = aura.realtime.channel('room-1')
|
|
122
|
+
* .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' }, (payload) => {
|
|
123
|
+
* console.log('New message:', payload)
|
|
124
|
+
* })
|
|
125
|
+
* .on('broadcast', { event: 'cursor-pos' }, (payload) => {
|
|
126
|
+
* console.log('Cursor:', payload)
|
|
127
|
+
* })
|
|
128
|
+
* .subscribe((status) => {
|
|
129
|
+
* if (status === 'SUBSCRIBED') {
|
|
130
|
+
* channel.send({ type: 'broadcast', event: 'cursor-pos', payload: { x: 100, y: 200 } })
|
|
131
|
+
* }
|
|
132
|
+
* })
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
declare class RealtimeService {
|
|
136
|
+
private readonly client;
|
|
137
|
+
private _ws;
|
|
138
|
+
private _channels;
|
|
139
|
+
private _state;
|
|
140
|
+
private _stateListeners;
|
|
141
|
+
private _autoReconnect;
|
|
142
|
+
private _reconnectAttempts;
|
|
143
|
+
private _maxReconnectAttempts;
|
|
144
|
+
private _reconnectTimer;
|
|
145
|
+
private _intentionalClose;
|
|
146
|
+
private _heartbeat;
|
|
147
|
+
private _tokenRefreshTimer;
|
|
148
|
+
/** Dernier access_token propagé au serveur — évite les pushs redondants (propagation différentielle). */
|
|
149
|
+
private _lastSentToken;
|
|
150
|
+
/** Backoff delays in ms: 1s, 2s, 4s, 8s, 16s, 30s (cap) */
|
|
151
|
+
private static readonly BACKOFF_MS;
|
|
152
|
+
constructor(client: AuraClientLike);
|
|
153
|
+
/** Current connection state. */
|
|
154
|
+
get connectionState(): ConnectionState;
|
|
155
|
+
/** Listen for connection state changes. */
|
|
156
|
+
onStateChange(callback: (state: ConnectionState) => void): () => void;
|
|
157
|
+
private _setState;
|
|
158
|
+
private get _wsUrl();
|
|
159
|
+
/** Ensure the WebSocket connection is open. */
|
|
160
|
+
connect(): void;
|
|
161
|
+
/** Send raw data through the WebSocket. */
|
|
162
|
+
private _send;
|
|
163
|
+
/** Refresh the JWT token on an existing connection (no disconnect). */
|
|
164
|
+
refreshToken(token: string): void;
|
|
165
|
+
/**
|
|
166
|
+
* Définit/rafraîchit explicitement le token utilisé pour l'autorisation des
|
|
167
|
+
* canaux privés et broadcast (parité `@supabase/realtime-js` `setAuth`).
|
|
168
|
+
*
|
|
169
|
+
* - Avec `token` : utilise ce token. Sinon, reprend `client.authStore.token`.
|
|
170
|
+
* - Propage via le pipeline existant `refreshToken` (push
|
|
171
|
+
* `{ type:'access_token', token }` sur une connexion ouverte, dédupliqué via
|
|
172
|
+
* `_lastSentToken`). N'ouvre ni ne ferme aucune connexion WS.
|
|
173
|
+
* - Hors-ligne : `connect()` lit `client.authStore.token` au moment de l'open,
|
|
174
|
+
* donc `setAuth()` doit être appelé avec un token présent dans le store (ou
|
|
175
|
+
* après authentification) pour prendre effet sur une future connexion.
|
|
176
|
+
*
|
|
177
|
+
* À appeler AVANT de s'abonner à un canal privé (`channel(name,{private:true})`).
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```ts
|
|
181
|
+
* aura.realtime.setAuth(session.access_token)
|
|
182
|
+
* const ch = aura.realtime.channel('secret', { private: true }).subscribe()
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
setAuth(token?: string): void;
|
|
186
|
+
/**
|
|
187
|
+
* Envoie un broadcast par HTTP (REST), sans connexion WebSocket ouverte
|
|
188
|
+
* (parité `@supabase/realtime-js`). Utile côté serveur/edge.
|
|
189
|
+
*
|
|
190
|
+
* POST `/v1/realtime/{projectId}/broadcast` avec le contrat du handler backend
|
|
191
|
+
* (`broadcast.rs`) : `{ channel, payload }`, `channel` préfixé par le projet,
|
|
192
|
+
* `event` replié dans `payload` (aligné sur le broadcast WS).
|
|
193
|
+
*
|
|
194
|
+
* @param channel Nom du canal (préfixé projet automatiquement si absent).
|
|
195
|
+
* @param event Nom de l'événement broadcast.
|
|
196
|
+
* @param payload Données de l'événement.
|
|
197
|
+
* @returns `AuraResponse<null>` — `error` non nul en cas de 4xx/rate-limit.
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```ts
|
|
201
|
+
* await aura.realtime.httpBroadcast('room-1', 'cursor', { x: 10, y: 20 })
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
httpBroadcast(channel: string, event: string, payload?: Record<string, unknown>): Promise<AuraResponse<null>>;
|
|
205
|
+
/**
|
|
206
|
+
* Schedule proactive token refresh at 80% of the JWT TTL.
|
|
207
|
+
* Prevents token expiration during an active WebSocket session.
|
|
208
|
+
*/
|
|
209
|
+
private _scheduleTokenRefresh;
|
|
210
|
+
/** Schedule a reconnection attempt with exponential backoff + jitter. */
|
|
211
|
+
private _scheduleReconnect;
|
|
212
|
+
/** Enable/disable auto-reconnect (enabled by default). */
|
|
213
|
+
setAutoReconnect(enabled: boolean, maxAttempts?: number): void;
|
|
214
|
+
/** Disconnect the WebSocket and clean up all channels. */
|
|
215
|
+
disconnect(): void;
|
|
216
|
+
/**
|
|
217
|
+
* Create or retrieve a channel by name.
|
|
218
|
+
* Returns an `AuraChannel` with chainable `.on()` / `.subscribe()` API.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```ts
|
|
222
|
+
* const channel = aura.realtime.channel('room-1')
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
channel(name: string, options?: ChannelConfig): AuraChannel;
|
|
226
|
+
/** Remove a channel. */
|
|
227
|
+
removeChannel(name: string): void;
|
|
228
|
+
/** List active channels. */
|
|
229
|
+
getChannels(): AuraChannel[];
|
|
230
|
+
/** Remove all channels and subscriptions. */
|
|
231
|
+
removeAllChannels(): void;
|
|
232
|
+
/** Route incoming server messages to the correct channel. */
|
|
233
|
+
private _dispatch;
|
|
234
|
+
/**
|
|
235
|
+
* Simple callback-based subscription (legacy API).
|
|
236
|
+
* Prefer using `.channel().on().subscribe()` instead.
|
|
237
|
+
*
|
|
238
|
+
* @deprecated Use `channel().on().subscribe()` instead.
|
|
239
|
+
*/
|
|
240
|
+
on<T = Record<string, unknown>>(channelName: string, callback: (event: any) => void): {
|
|
241
|
+
unsubscribe: () => void;
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* HeartbeatManager — pings périodiques pour maintenir la connexion WS.
|
|
247
|
+
* Utilise un Worker dédié (anti-throttle des onglets en arrière-plan) ; fallback setInterval.
|
|
248
|
+
*/
|
|
249
|
+
declare class HeartbeatManager {
|
|
250
|
+
private _worker;
|
|
251
|
+
private _workerUrl;
|
|
252
|
+
private _interval;
|
|
253
|
+
private _sendFn;
|
|
254
|
+
start(sendPing: () => void, intervalMs?: number): void;
|
|
255
|
+
stop(): void;
|
|
256
|
+
get isActive(): boolean;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export { AuraChannel, type ConnectionState, HeartbeatManager, RealtimeService };
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { ChannelConfig, PostgresChangesFilter, RealtimeEvent, BroadcastFilter, PresenceFilter, SubscribeCallback, BroadcastPayload, PresenceState, ServerMessage, RealtimeListenType, AuraClientLike, AuraResponse } from '@aurabase/core';
|
|
2
|
+
|
|
3
|
+
type ListenerCallback = (payload: RealtimeEvent | Record<string, unknown>) => void;
|
|
4
|
+
type ListenerEntry = {
|
|
5
|
+
type: RealtimeListenType;
|
|
6
|
+
filter: PostgresChangesFilter | BroadcastFilter | PresenceFilter;
|
|
7
|
+
callback: ListenerCallback;
|
|
8
|
+
};
|
|
9
|
+
type SendFn = (data: string) => void;
|
|
10
|
+
/**
|
|
11
|
+
* A realtime channel with Supabase-compatible chainable API.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const channel = aura.channel('room-1')
|
|
16
|
+
* .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' }, (payload) => {
|
|
17
|
+
* console.log('New message:', payload)
|
|
18
|
+
* })
|
|
19
|
+
* .on('broadcast', { event: 'cursor-pos' }, (payload) => {
|
|
20
|
+
* console.log('Cursor:', payload)
|
|
21
|
+
* })
|
|
22
|
+
* .on('presence', { event: 'sync' }, () => {
|
|
23
|
+
* console.log('Presence synced:', channel.presenceState())
|
|
24
|
+
* })
|
|
25
|
+
* .subscribe((status) => {
|
|
26
|
+
* if (status === 'SUBSCRIBED') console.log('Connected!')
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare class AuraChannel {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
private readonly _projectId;
|
|
33
|
+
private readonly _listeners;
|
|
34
|
+
private _subscribed;
|
|
35
|
+
private _sendFn;
|
|
36
|
+
private _subscribeCallback;
|
|
37
|
+
private _presenceState;
|
|
38
|
+
private _isPrivate;
|
|
39
|
+
private _broadcastAck;
|
|
40
|
+
private _broadcastSelf;
|
|
41
|
+
private _presenceKey;
|
|
42
|
+
/** ID de subscription retourné par le serveur (utilisé pour le filtre RLS allowed_sub_ids) */
|
|
43
|
+
private _subscriptionId;
|
|
44
|
+
/** Compteur pour générer des ref_id uniques par connexion */
|
|
45
|
+
private _refCounter;
|
|
46
|
+
/** Dernier event ID recu — utilise pour since_id au reconnect */
|
|
47
|
+
private _lastEventId;
|
|
48
|
+
/** Pending ACK callbacks : ref_id → resolve */
|
|
49
|
+
private _pendingAcks;
|
|
50
|
+
constructor(name: string, projectId: string, options?: ChannelConfig);
|
|
51
|
+
/** Génère un ref_id unique pour la corrélation request/response. */
|
|
52
|
+
private _nextRef;
|
|
53
|
+
/** Full channel name with project prefix (for server protocol) */
|
|
54
|
+
get fullName(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Register a listener for a specific event type.
|
|
57
|
+
* Returns `this` for chaining.
|
|
58
|
+
*/
|
|
59
|
+
on(type: 'postgres_changes', filter: PostgresChangesFilter, callback: (payload: RealtimeEvent) => void): this;
|
|
60
|
+
on(type: 'broadcast', filter: BroadcastFilter, callback: (payload: RealtimeEvent) => void): this;
|
|
61
|
+
on(type: 'presence', filter: PresenceFilter, callback: (payload: any) => void): this;
|
|
62
|
+
/**
|
|
63
|
+
* Subscribe to the channel. Sends the Subscribe message to the server
|
|
64
|
+
* with the full config (postgres_changes, broadcast, presence).
|
|
65
|
+
*/
|
|
66
|
+
subscribe(callback?: SubscribeCallback): this;
|
|
67
|
+
/** Called by RealtimeService once the WS connection is ready. */
|
|
68
|
+
_bindSend(sendFn: SendFn): void;
|
|
69
|
+
/** Send the subscribe message to the server. */
|
|
70
|
+
_doSubscribe(): void;
|
|
71
|
+
/** Unsubscribe from the channel. */
|
|
72
|
+
unsubscribe(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Send a broadcast message to the channel.
|
|
75
|
+
* If broadcast.ack=true, returns a Promise that resolves when the server ACKs.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* // Without ACK (fire & forget)
|
|
80
|
+
* channel.send({ type: 'broadcast', event: 'cursor-pos', payload: { x: 100, y: 200 } })
|
|
81
|
+
*
|
|
82
|
+
* // With ACK (wait for server confirmation)
|
|
83
|
+
* await channel.send({ type: 'broadcast', event: 'cursor-pos', payload: { x: 100 } })
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
send(message: BroadcastPayload): Promise<'ok' | 'timeout' | 'error'>;
|
|
87
|
+
/**
|
|
88
|
+
* Track presence state for this client.
|
|
89
|
+
* Returns a Promise that resolves with 'ok' once tracked (compatible Supabase).
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* await channel.track({ user: 'user-1', online_at: new Date().toISOString() })
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
track(state: Record<string, unknown>): Promise<'ok' | 'error'>;
|
|
97
|
+
/** Stop tracking presence. */
|
|
98
|
+
untrack(): Promise<'ok' | 'error'>;
|
|
99
|
+
/** Get the current presence state for this channel. */
|
|
100
|
+
presenceState(): PresenceState;
|
|
101
|
+
/** Called by RealtimeService when a server message arrives for this channel. */
|
|
102
|
+
_onMessage(msg: ServerMessage): void;
|
|
103
|
+
/** Dispatch a RealtimeEvent to matching listeners. */
|
|
104
|
+
private _dispatchEvent;
|
|
105
|
+
/** Whether this channel has been subscribed. */
|
|
106
|
+
get isSubscribed(): boolean;
|
|
107
|
+
/** Get listeners (for re-subscribe after reconnect). */
|
|
108
|
+
_getListeners(): ListenerEntry[];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Connection state machine */
|
|
112
|
+
type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
|
|
113
|
+
/**
|
|
114
|
+
* Realtime service — manages a single WebSocket connection and multiplexes
|
|
115
|
+
* channels on top of it. Supabase-compatible API.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```ts
|
|
119
|
+
* const aura = createClient('http://localhost:8080', 'my-project')
|
|
120
|
+
*
|
|
121
|
+
* const channel = aura.realtime.channel('room-1')
|
|
122
|
+
* .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' }, (payload) => {
|
|
123
|
+
* console.log('New message:', payload)
|
|
124
|
+
* })
|
|
125
|
+
* .on('broadcast', { event: 'cursor-pos' }, (payload) => {
|
|
126
|
+
* console.log('Cursor:', payload)
|
|
127
|
+
* })
|
|
128
|
+
* .subscribe((status) => {
|
|
129
|
+
* if (status === 'SUBSCRIBED') {
|
|
130
|
+
* channel.send({ type: 'broadcast', event: 'cursor-pos', payload: { x: 100, y: 200 } })
|
|
131
|
+
* }
|
|
132
|
+
* })
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
declare class RealtimeService {
|
|
136
|
+
private readonly client;
|
|
137
|
+
private _ws;
|
|
138
|
+
private _channels;
|
|
139
|
+
private _state;
|
|
140
|
+
private _stateListeners;
|
|
141
|
+
private _autoReconnect;
|
|
142
|
+
private _reconnectAttempts;
|
|
143
|
+
private _maxReconnectAttempts;
|
|
144
|
+
private _reconnectTimer;
|
|
145
|
+
private _intentionalClose;
|
|
146
|
+
private _heartbeat;
|
|
147
|
+
private _tokenRefreshTimer;
|
|
148
|
+
/** Dernier access_token propagé au serveur — évite les pushs redondants (propagation différentielle). */
|
|
149
|
+
private _lastSentToken;
|
|
150
|
+
/** Backoff delays in ms: 1s, 2s, 4s, 8s, 16s, 30s (cap) */
|
|
151
|
+
private static readonly BACKOFF_MS;
|
|
152
|
+
constructor(client: AuraClientLike);
|
|
153
|
+
/** Current connection state. */
|
|
154
|
+
get connectionState(): ConnectionState;
|
|
155
|
+
/** Listen for connection state changes. */
|
|
156
|
+
onStateChange(callback: (state: ConnectionState) => void): () => void;
|
|
157
|
+
private _setState;
|
|
158
|
+
private get _wsUrl();
|
|
159
|
+
/** Ensure the WebSocket connection is open. */
|
|
160
|
+
connect(): void;
|
|
161
|
+
/** Send raw data through the WebSocket. */
|
|
162
|
+
private _send;
|
|
163
|
+
/** Refresh the JWT token on an existing connection (no disconnect). */
|
|
164
|
+
refreshToken(token: string): void;
|
|
165
|
+
/**
|
|
166
|
+
* Définit/rafraîchit explicitement le token utilisé pour l'autorisation des
|
|
167
|
+
* canaux privés et broadcast (parité `@supabase/realtime-js` `setAuth`).
|
|
168
|
+
*
|
|
169
|
+
* - Avec `token` : utilise ce token. Sinon, reprend `client.authStore.token`.
|
|
170
|
+
* - Propage via le pipeline existant `refreshToken` (push
|
|
171
|
+
* `{ type:'access_token', token }` sur une connexion ouverte, dédupliqué via
|
|
172
|
+
* `_lastSentToken`). N'ouvre ni ne ferme aucune connexion WS.
|
|
173
|
+
* - Hors-ligne : `connect()` lit `client.authStore.token` au moment de l'open,
|
|
174
|
+
* donc `setAuth()` doit être appelé avec un token présent dans le store (ou
|
|
175
|
+
* après authentification) pour prendre effet sur une future connexion.
|
|
176
|
+
*
|
|
177
|
+
* À appeler AVANT de s'abonner à un canal privé (`channel(name,{private:true})`).
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```ts
|
|
181
|
+
* aura.realtime.setAuth(session.access_token)
|
|
182
|
+
* const ch = aura.realtime.channel('secret', { private: true }).subscribe()
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
setAuth(token?: string): void;
|
|
186
|
+
/**
|
|
187
|
+
* Envoie un broadcast par HTTP (REST), sans connexion WebSocket ouverte
|
|
188
|
+
* (parité `@supabase/realtime-js`). Utile côté serveur/edge.
|
|
189
|
+
*
|
|
190
|
+
* POST `/v1/realtime/{projectId}/broadcast` avec le contrat du handler backend
|
|
191
|
+
* (`broadcast.rs`) : `{ channel, payload }`, `channel` préfixé par le projet,
|
|
192
|
+
* `event` replié dans `payload` (aligné sur le broadcast WS).
|
|
193
|
+
*
|
|
194
|
+
* @param channel Nom du canal (préfixé projet automatiquement si absent).
|
|
195
|
+
* @param event Nom de l'événement broadcast.
|
|
196
|
+
* @param payload Données de l'événement.
|
|
197
|
+
* @returns `AuraResponse<null>` — `error` non nul en cas de 4xx/rate-limit.
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```ts
|
|
201
|
+
* await aura.realtime.httpBroadcast('room-1', 'cursor', { x: 10, y: 20 })
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
httpBroadcast(channel: string, event: string, payload?: Record<string, unknown>): Promise<AuraResponse<null>>;
|
|
205
|
+
/**
|
|
206
|
+
* Schedule proactive token refresh at 80% of the JWT TTL.
|
|
207
|
+
* Prevents token expiration during an active WebSocket session.
|
|
208
|
+
*/
|
|
209
|
+
private _scheduleTokenRefresh;
|
|
210
|
+
/** Schedule a reconnection attempt with exponential backoff + jitter. */
|
|
211
|
+
private _scheduleReconnect;
|
|
212
|
+
/** Enable/disable auto-reconnect (enabled by default). */
|
|
213
|
+
setAutoReconnect(enabled: boolean, maxAttempts?: number): void;
|
|
214
|
+
/** Disconnect the WebSocket and clean up all channels. */
|
|
215
|
+
disconnect(): void;
|
|
216
|
+
/**
|
|
217
|
+
* Create or retrieve a channel by name.
|
|
218
|
+
* Returns an `AuraChannel` with chainable `.on()` / `.subscribe()` API.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```ts
|
|
222
|
+
* const channel = aura.realtime.channel('room-1')
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
channel(name: string, options?: ChannelConfig): AuraChannel;
|
|
226
|
+
/** Remove a channel. */
|
|
227
|
+
removeChannel(name: string): void;
|
|
228
|
+
/** List active channels. */
|
|
229
|
+
getChannels(): AuraChannel[];
|
|
230
|
+
/** Remove all channels and subscriptions. */
|
|
231
|
+
removeAllChannels(): void;
|
|
232
|
+
/** Route incoming server messages to the correct channel. */
|
|
233
|
+
private _dispatch;
|
|
234
|
+
/**
|
|
235
|
+
* Simple callback-based subscription (legacy API).
|
|
236
|
+
* Prefer using `.channel().on().subscribe()` instead.
|
|
237
|
+
*
|
|
238
|
+
* @deprecated Use `channel().on().subscribe()` instead.
|
|
239
|
+
*/
|
|
240
|
+
on<T = Record<string, unknown>>(channelName: string, callback: (event: any) => void): {
|
|
241
|
+
unsubscribe: () => void;
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* HeartbeatManager — pings périodiques pour maintenir la connexion WS.
|
|
247
|
+
* Utilise un Worker dédié (anti-throttle des onglets en arrière-plan) ; fallback setInterval.
|
|
248
|
+
*/
|
|
249
|
+
declare class HeartbeatManager {
|
|
250
|
+
private _worker;
|
|
251
|
+
private _workerUrl;
|
|
252
|
+
private _interval;
|
|
253
|
+
private _sendFn;
|
|
254
|
+
start(sendPing: () => void, intervalMs?: number): void;
|
|
255
|
+
stop(): void;
|
|
256
|
+
get isActive(): boolean;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export { AuraChannel, type ConnectionState, HeartbeatManager, RealtimeService };
|