@multiplatform.one/frappe 6.6.0 → 7.0.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/README.md +1 -1
- package/dist/cjs/auth.native.js.map +1 -1
- package/dist/cjs/call.native.js.map +1 -1
- package/dist/cjs/collection.native.js.map +1 -1
- package/dist/cjs/common/types.native.js.map +1 -1
- package/dist/cjs/core/http.cjs +45 -1
- package/dist/cjs/core/http.native.js +72 -1
- package/dist/cjs/core/http.native.js.map +1 -1
- package/dist/cjs/core/types.native.js.map +1 -1
- package/dist/cjs/core/wire.native.js.map +1 -1
- package/dist/cjs/db.native.js.map +1 -1
- package/dist/cjs/devtools/FrappeDevtoolsPanel.native.js.map +1 -1
- package/dist/cjs/devtools/index.native.js.map +1 -1
- package/dist/cjs/devtools/plugin.native.js.map +1 -1
- package/dist/cjs/devtools/theme.native.js.map +1 -1
- package/dist/cjs/doctype.cjs +15 -2
- package/dist/cjs/doctype.native.js +22 -5
- package/dist/cjs/doctype.native.js.map +1 -1
- package/dist/cjs/file.native.js.map +1 -1
- package/dist/cjs/fixtureDb.native.js.map +1 -1
- package/dist/cjs/fixtures.native.js.map +1 -1
- package/dist/cjs/frappeApp.native.js.map +1 -1
- package/dist/cjs/frappeReact.cjs +55 -1
- package/dist/cjs/frappeReact.native.js +67 -2
- package/dist/cjs/frappeReact.native.js.map +1 -1
- package/dist/cjs/index.cjs +8 -0
- package/dist/cjs/index.native.js +10 -2
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/optimistic.cjs +32 -2
- package/dist/cjs/optimistic.native.js +34 -1
- package/dist/cjs/optimistic.native.js.map +1 -1
- package/dist/cjs/pacer.native.js.map +1 -1
- package/dist/cjs/plugin/index.native.js.map +1 -1
- package/dist/cjs/realtime.cjs +234 -11
- package/dist/cjs/realtime.native.js +368 -18
- package/dist/cjs/realtime.native.js.map +1 -1
- package/dist/cjs/sync/backfill.native.js.map +1 -1
- package/dist/cjs/sync/filters.native.js.map +1 -1
- package/dist/cjs/sync/index.cjs +45 -1
- package/dist/cjs/sync/index.native.js +71 -1
- package/dist/cjs/sync/index.native.js.map +1 -1
- package/dist/cjs/sync/merge.native.js.map +1 -1
- package/dist/cjs/sync/mutationEngine.cjs +51 -15
- package/dist/cjs/sync/mutationEngine.native.js +69 -16
- package/dist/cjs/sync/mutationEngine.native.js.map +1 -1
- package/dist/cjs/sync/mutationJournal.cjs +8 -0
- package/dist/cjs/sync/mutationJournal.native.js +10 -0
- package/dist/cjs/sync/mutationJournal.native.js.map +1 -1
- package/dist/cjs/sync/normalizedCache.native.js.map +1 -1
- package/dist/cjs/sync/persistence.native.js.map +1 -1
- package/dist/cjs/sync/realtime.native.js.map +1 -1
- package/dist/cjs/sync/rehydration.native.js.map +1 -1
- package/dist/cjs/sync/storage.native.js.map +1 -1
- package/dist/cjs/sync/subscriptionManager.native.js.map +1 -1
- package/dist/cjs/sync/types.native.js.map +1 -1
- package/dist/cjs/sync/virtualPageManager.native.js.map +1 -1
- package/dist/cjs/useLiveQuery.native.js.map +1 -1
- package/dist/cjs/util.native.js.map +1 -1
- package/dist/esm/auth.native.js.map +1 -1
- package/dist/esm/call.native.js.map +1 -1
- package/dist/esm/collection.native.js +1 -1
- package/dist/esm/collection.native.js.map +1 -1
- package/dist/esm/common/types.native.js.map +1 -1
- package/dist/esm/core/http.mjs +45 -2
- package/dist/esm/core/http.mjs.map +1 -1
- package/dist/esm/core/http.native.js +74 -4
- package/dist/esm/core/http.native.js.map +1 -1
- package/dist/esm/core/types.native.js.map +1 -1
- package/dist/esm/core/wire.native.js.map +1 -1
- package/dist/esm/db.native.js +1 -1
- package/dist/esm/db.native.js.map +1 -1
- package/dist/esm/devtools/FrappeDevtoolsPanel.native.js +2 -2
- package/dist/esm/devtools/FrappeDevtoolsPanel.native.js.map +1 -1
- package/dist/esm/devtools/index.native.js +2 -2
- package/dist/esm/devtools/index.native.js.map +1 -1
- package/dist/esm/devtools/plugin.native.js +1 -1
- package/dist/esm/devtools/plugin.native.js.map +1 -1
- package/dist/esm/devtools/theme.native.js.map +1 -1
- package/dist/esm/doctype.mjs +15 -2
- package/dist/esm/doctype.mjs.map +1 -1
- package/dist/esm/doctype.native.js +23 -6
- package/dist/esm/doctype.native.js.map +1 -1
- package/dist/esm/file.native.js.map +1 -1
- package/dist/esm/fixtureDb.native.js +1 -1
- package/dist/esm/fixtureDb.native.js.map +1 -1
- package/dist/esm/fixtures.native.js.map +1 -1
- package/dist/esm/frappeApp.native.js +7 -7
- package/dist/esm/frappeApp.native.js.map +1 -1
- package/dist/esm/frappeReact.mjs +55 -3
- package/dist/esm/frappeReact.mjs.map +1 -1
- package/dist/esm/frappeReact.native.js +73 -10
- package/dist/esm/frappeReact.native.js.map +1 -1
- package/dist/esm/index.mjs +5 -5
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +22 -22
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/optimistic.mjs +27 -1
- package/dist/esm/optimistic.mjs.map +1 -1
- package/dist/esm/optimistic.native.js +30 -1
- package/dist/esm/optimistic.native.js.map +1 -1
- package/dist/esm/pacer.mjs.map +1 -1
- package/dist/esm/pacer.native.js +4 -4
- package/dist/esm/pacer.native.js.map +1 -1
- package/dist/esm/plugin/index.native.js.map +1 -1
- package/dist/esm/realtime.mjs +234 -11
- package/dist/esm/realtime.mjs.map +1 -1
- package/dist/esm/realtime.native.js +369 -19
- package/dist/esm/realtime.native.js.map +1 -1
- package/dist/esm/sync/backfill.native.js +1 -1
- package/dist/esm/sync/backfill.native.js.map +1 -1
- package/dist/esm/sync/filters.native.js.map +1 -1
- package/dist/esm/sync/index.mjs +45 -1
- package/dist/esm/sync/index.mjs.map +1 -1
- package/dist/esm/sync/index.native.js +79 -9
- package/dist/esm/sync/index.native.js.map +1 -1
- package/dist/esm/sync/merge.native.js.map +1 -1
- package/dist/esm/sync/mutationEngine.mjs +51 -15
- package/dist/esm/sync/mutationEngine.mjs.map +1 -1
- package/dist/esm/sync/mutationEngine.native.js +73 -20
- package/dist/esm/sync/mutationEngine.native.js.map +1 -1
- package/dist/esm/sync/mutationJournal.mjs +8 -0
- package/dist/esm/sync/mutationJournal.mjs.map +1 -1
- package/dist/esm/sync/mutationJournal.native.js +11 -1
- package/dist/esm/sync/mutationJournal.native.js.map +1 -1
- package/dist/esm/sync/normalizedCache.native.js.map +1 -1
- package/dist/esm/sync/persistence.native.js +2 -2
- package/dist/esm/sync/persistence.native.js.map +1 -1
- package/dist/esm/sync/realtime.native.js +1 -1
- package/dist/esm/sync/realtime.native.js.map +1 -1
- package/dist/esm/sync/rehydration.native.js +1 -1
- package/dist/esm/sync/rehydration.native.js.map +1 -1
- package/dist/esm/sync/storage.native.js.map +1 -1
- package/dist/esm/sync/subscriptionManager.native.js +4 -4
- package/dist/esm/sync/subscriptionManager.native.js.map +1 -1
- package/dist/esm/sync/types.mjs.map +1 -1
- package/dist/esm/sync/types.native.js.map +1 -1
- package/dist/esm/sync/virtualPageManager.native.js +1 -1
- package/dist/esm/sync/virtualPageManager.native.js.map +1 -1
- package/dist/esm/useLiveQuery.native.js.map +1 -1
- package/dist/esm/util.native.js.map +1 -1
- package/dist/jsx/core/http.mjs +45 -2
- package/dist/jsx/core/http.mjs.map +1 -1
- package/dist/jsx/core/http.native.js +72 -1
- package/dist/jsx/core/http.native.js.map +1 -1
- package/dist/jsx/doctype.mjs +15 -2
- package/dist/jsx/doctype.mjs.map +1 -1
- package/dist/jsx/doctype.native.js +22 -5
- package/dist/jsx/doctype.native.js.map +1 -1
- package/dist/jsx/frappeReact.mjs +55 -3
- package/dist/jsx/frappeReact.mjs.map +1 -1
- package/dist/jsx/frappeReact.native.js +66 -1
- package/dist/jsx/frappeReact.native.js.map +1 -1
- package/dist/jsx/index.js +5 -5
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +5 -5
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +8 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/optimistic.mjs +27 -1
- package/dist/jsx/optimistic.mjs.map +1 -1
- package/dist/jsx/optimistic.native.js +34 -1
- package/dist/jsx/optimistic.native.js.map +1 -1
- package/dist/jsx/pacer.mjs.map +1 -1
- package/dist/jsx/pacer.native.js.map +1 -1
- package/dist/jsx/realtime.mjs +234 -11
- package/dist/jsx/realtime.mjs.map +1 -1
- package/dist/jsx/realtime.native.js +368 -18
- package/dist/jsx/realtime.native.js.map +1 -1
- package/dist/jsx/sync/index.mjs +45 -1
- package/dist/jsx/sync/index.mjs.map +1 -1
- package/dist/jsx/sync/index.native.js +71 -1
- package/dist/jsx/sync/index.native.js.map +1 -1
- package/dist/jsx/sync/mutationEngine.mjs +51 -15
- package/dist/jsx/sync/mutationEngine.mjs.map +1 -1
- package/dist/jsx/sync/mutationEngine.native.js +69 -16
- package/dist/jsx/sync/mutationEngine.native.js.map +1 -1
- package/dist/jsx/sync/mutationJournal.mjs +8 -0
- package/dist/jsx/sync/mutationJournal.mjs.map +1 -1
- package/dist/jsx/sync/mutationJournal.native.js +10 -0
- package/dist/jsx/sync/mutationJournal.native.js.map +1 -1
- package/dist/jsx/sync/types.mjs.map +1 -1
- package/dist/jsx/sync/types.native.js.map +1 -1
- package/package.json +8 -8
- package/src/core/http.spec.ts +81 -0
- package/src/core/http.ts +80 -3
- package/src/doctype.spec.ts +82 -3
- package/src/doctype.ts +51 -7
- package/src/frappeReact.ts +126 -4
- package/src/index.ts +28 -3
- package/src/optimistic.spec.ts +113 -2
- package/src/optimistic.ts +95 -0
- package/src/pacer.ts +8 -0
- package/src/realtime.spec.ts +62 -0
- package/src/realtime.ts +440 -14
- package/src/realtimeSse.spec.ts +547 -0
- package/src/sync/index.ts +44 -1
- package/src/sync/mutationEngine.spec.ts +7 -2
- package/src/sync/mutationEngine.ts +83 -27
- package/src/sync/mutationJournal.ts +9 -0
- package/src/sync/mutations.spec.ts +1 -1
- package/src/sync/syncModule.spec.ts +255 -1
- package/src/sync/types.ts +20 -0
- package/types/core/http.d.ts +11 -0
- package/types/core/http.d.ts.map +1 -1
- package/types/doctype.d.ts +7 -0
- package/types/doctype.d.ts.map +1 -1
- package/types/frappeReact.d.ts +50 -2
- package/types/frappeReact.d.ts.map +1 -1
- package/types/index.d.ts +8 -6
- package/types/index.d.ts.map +1 -1
- package/types/optimistic.d.ts +38 -0
- package/types/optimistic.d.ts.map +1 -1
- package/types/pacer.d.ts +8 -0
- package/types/pacer.d.ts.map +1 -1
- package/types/realtime.d.ts +183 -1
- package/types/realtime.d.ts.map +1 -1
- package/types/sync/index.d.ts +16 -1
- package/types/sync/index.d.ts.map +1 -1
- package/types/sync/mutationEngine.d.ts +7 -0
- package/types/sync/mutationEngine.d.ts.map +1 -1
- package/types/sync/mutationJournal.d.ts +6 -0
- package/types/sync/mutationJournal.d.ts.map +1 -1
- package/types/sync/types.d.ts +20 -0
- package/types/sync/types.d.ts.map +1 -1
package/src/optimistic.ts
CHANGED
|
@@ -37,3 +37,98 @@ export { tanstackCreateOptimisticAction as createOptimisticAction };
|
|
|
37
37
|
* await tx.isPersisted.promise;
|
|
38
38
|
* ```
|
|
39
39
|
*/
|
|
40
|
+
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Optimistic RPC lifecycle — the ONE pattern for mutations that ride
|
|
43
|
+
// whitelisted desk RPCs instead of the document CRUD path.
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
//
|
|
46
|
+
// Document CRUD (collection insert/update/delete) is already optimistic via
|
|
47
|
+
// the MutationEngine: local cache apply → journal Pending → server ack →
|
|
48
|
+
// temp-id → real-name remap, snapshot rollback on failure. Desk RPC
|
|
49
|
+
// mutations (add_comment, assign_to, tags, likes, shares…) bypass that
|
|
50
|
+
// engine, and every callsite used to hand-roll "await, then refetch" — the
|
|
51
|
+
// user saw nothing until the server round-trip completed.
|
|
52
|
+
//
|
|
53
|
+
// `runOptimisticRpc` gives those callsites the same lifecycle the engine
|
|
54
|
+
// gives documents, without per-callsite hacks:
|
|
55
|
+
//
|
|
56
|
+
// 1. APPLY — synchronous local apply BEFORE the request leaves;
|
|
57
|
+
// returns the undo used for rollback. The applied state
|
|
58
|
+
// should carry a pending marker so surfaces can render it
|
|
59
|
+
// visible-but-distinct (Axiom 6 HONEST STATE).
|
|
60
|
+
// 2. SEND — the RPC itself.
|
|
61
|
+
// 3. RECONCILE — on ack, converge the optimistic identity (the issued
|
|
62
|
+
// `tmp_*` id) to the server identity so the optimistic
|
|
63
|
+
// record and the server record become ONE record, never
|
|
64
|
+
// duplicates.
|
|
65
|
+
// 4. ROLLBACK — on failure, the apply-phase undo runs, then `onError`
|
|
66
|
+
// surfaces a visible error (house `notify()`), and the
|
|
67
|
+
// error rethrows for the caller.
|
|
68
|
+
|
|
69
|
+
/** Prefix shared with the MutationEngine's synthesized create identities. */
|
|
70
|
+
export const OPTIMISTIC_TEMP_PREFIX = "tmp_";
|
|
71
|
+
|
|
72
|
+
/** Issues a client-only identity for an optimistic record (`tmp_<uuid>`). */
|
|
73
|
+
export function newOptimisticTempId(): string {
|
|
74
|
+
const id =
|
|
75
|
+
typeof crypto !== "undefined" && "randomUUID" in crypto
|
|
76
|
+
? crypto.randomUUID()
|
|
77
|
+
: Math.random().toString(36).slice(2);
|
|
78
|
+
return `${OPTIMISTIC_TEMP_PREFIX}${id}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** True when a document name is a client-issued optimistic identity. */
|
|
82
|
+
export function isOptimisticTempId(name: unknown): name is string {
|
|
83
|
+
return typeof name === "string" && name.startsWith(OPTIMISTIC_TEMP_PREFIX);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface OptimisticRpcContext {
|
|
87
|
+
/** Client-only identity for the optimistic record (`tmp_<uuid>`). */
|
|
88
|
+
tempId: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface OptimisticRpcOptions<TAck> {
|
|
92
|
+
/**
|
|
93
|
+
* Apply the mutation locally, synchronously, before the request is sent.
|
|
94
|
+
* Returns the undo that restores the exact pre-apply state (rollback).
|
|
95
|
+
* The applied record should use `ctx.tempId` as its identity and carry a
|
|
96
|
+
* pending marker for the UI.
|
|
97
|
+
*/
|
|
98
|
+
apply: (ctx: OptimisticRpcContext) => (() => void) | undefined | void;
|
|
99
|
+
/** The server RPC. */
|
|
100
|
+
send: (ctx: OptimisticRpcContext) => Promise<TAck>;
|
|
101
|
+
/**
|
|
102
|
+
* Converge on ack: replace the `ctx.tempId` record with the server's
|
|
103
|
+
* authoritative record (dedupe by server identity — a racing refetch may
|
|
104
|
+
* already have delivered it).
|
|
105
|
+
*/
|
|
106
|
+
reconcile?: (ack: TAck, ctx: OptimisticRpcContext) => void;
|
|
107
|
+
/**
|
|
108
|
+
* Visible-error surface for the rollback path (house `notify()` or an
|
|
109
|
+
* inline error slot). Runs after the apply-phase undo.
|
|
110
|
+
*/
|
|
111
|
+
onError?: (error: unknown, ctx: OptimisticRpcContext) => void;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Runs one mutation through the optimistic lifecycle:
|
|
116
|
+
* apply (local, immediate) → send → reconcile on ack, or undo + onError on
|
|
117
|
+
* failure (the error rethrows).
|
|
118
|
+
*/
|
|
119
|
+
export async function runOptimisticRpc<TAck>(options: OptimisticRpcOptions<TAck>): Promise<TAck> {
|
|
120
|
+
const ctx: OptimisticRpcContext = { tempId: newOptimisticTempId() };
|
|
121
|
+
const undo = options.apply(ctx) ?? undefined;
|
|
122
|
+
try {
|
|
123
|
+
const ack = await options.send(ctx);
|
|
124
|
+
options.reconcile?.(ack, ctx);
|
|
125
|
+
return ack;
|
|
126
|
+
} catch (error) {
|
|
127
|
+
try {
|
|
128
|
+
undo?.();
|
|
129
|
+
} finally {
|
|
130
|
+
options.onError?.(error, ctx);
|
|
131
|
+
}
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
package/src/pacer.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { useCallback, useMemo, useRef, useState } from "react";
|
|
|
6
6
|
import type { FrappeDoc, FrappeDocData } from "./common/types";
|
|
7
7
|
import type { AuthConfig } from "./core/types";
|
|
8
8
|
import { DbModule } from "./db";
|
|
9
|
+
import type { FixtureProvider } from "./fixtures";
|
|
9
10
|
import { HttpClient } from "./core/http";
|
|
10
11
|
import type { SyncModule } from "./sync";
|
|
11
12
|
import { Operation } from "./sync/types";
|
|
@@ -62,6 +63,13 @@ export interface FrappeConnectionConfig {
|
|
|
62
63
|
token?: string | (() => string | Promise<string>);
|
|
63
64
|
type?: string;
|
|
64
65
|
};
|
|
66
|
+
/**
|
|
67
|
+
* Fixture provider for story / test hosts. Consumers already forward it
|
|
68
|
+
* (frappe-ui's FrappeProvider builds this config from its own context), and
|
|
69
|
+
* `useDocTypeMeta` reads doctype metadata from it before reaching for the
|
|
70
|
+
* network.
|
|
71
|
+
*/
|
|
72
|
+
fixtures?: FixtureProvider;
|
|
65
73
|
}
|
|
66
74
|
|
|
67
75
|
function createDbModule(config: FrappeConnectionConfig): DbModule {
|
package/src/realtime.spec.ts
CHANGED
|
@@ -783,6 +783,68 @@ describe("RealtimeModule", () => {
|
|
|
783
783
|
rt.disconnect();
|
|
784
784
|
});
|
|
785
785
|
|
|
786
|
+
it("uses an explicit siteName as the Socket.IO namespace (127.0.0.1 → localhost)", async () => {
|
|
787
|
+
// Frappe socketio maps Host localhost/127.0.0.1 to conf.default_site
|
|
788
|
+
// and rejects any other namespace. Connecting via the IPv4 literal
|
|
789
|
+
// (the serve_dev.py workaround for shcd on [::1]:8000) must still
|
|
790
|
+
// join /localhost, not /127.0.0.1.
|
|
791
|
+
const rt = new RealtimeModule({
|
|
792
|
+
baseURL: "http://127.0.0.1:8000",
|
|
793
|
+
socketPort: 9000,
|
|
794
|
+
siteName: "localhost",
|
|
795
|
+
});
|
|
796
|
+
await (rt as any).connect();
|
|
797
|
+
|
|
798
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
799
|
+
expect(calls[calls.length - 1]?.[0]).toBe("http://127.0.0.1:9000/localhost");
|
|
800
|
+
rt.disconnect();
|
|
801
|
+
});
|
|
802
|
+
|
|
803
|
+
it("dials socketBaseURL when set, joining the siteName namespace (same-origin dev)", async () => {
|
|
804
|
+
// Web dev: the dev server proxies /socket.io on the PAGE origin (e.g.
|
|
805
|
+
// :3998) to the bench socketio — the client must dial that origin, not
|
|
806
|
+
// baseURL+socketPort, so the polling handshake is same-origin.
|
|
807
|
+
const rt = new RealtimeModule({
|
|
808
|
+
baseURL: "http://127.0.0.1:8000",
|
|
809
|
+
socketBaseURL: "http://127.0.0.1:3998",
|
|
810
|
+
siteName: "localhost",
|
|
811
|
+
});
|
|
812
|
+
await (rt as any).connect();
|
|
813
|
+
|
|
814
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
815
|
+
expect(calls[calls.length - 1]?.[0]).toBe("http://127.0.0.1:3998/localhost");
|
|
816
|
+
rt.disconnect();
|
|
817
|
+
});
|
|
818
|
+
|
|
819
|
+
it("socketBaseURL wins over socketPort and trims a trailing slash", async () => {
|
|
820
|
+
const rt = new RealtimeModule({
|
|
821
|
+
baseURL: "http://127.0.0.1:8000",
|
|
822
|
+
socketPort: 9000,
|
|
823
|
+
socketBaseURL: "http://localhost:3998/",
|
|
824
|
+
siteName: "localhost",
|
|
825
|
+
});
|
|
826
|
+
await (rt as any).connect();
|
|
827
|
+
|
|
828
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
829
|
+
expect(calls[calls.length - 1]?.[0]).toBe("http://localhost:3998/localhost");
|
|
830
|
+
rt.disconnect();
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
it("falls back to the baseURL hostname namespace under socketBaseURL without siteName", async () => {
|
|
834
|
+
// Same fallback as the derived path: the namespace comes from the
|
|
835
|
+
// BENCH URL's hostname — never from socketBaseURL, whose hostname is
|
|
836
|
+
// the dev server, not a Frappe site.
|
|
837
|
+
const rt = new RealtimeModule({
|
|
838
|
+
baseURL: "http://bench.example.com:8000",
|
|
839
|
+
socketBaseURL: "http://localhost:3998",
|
|
840
|
+
});
|
|
841
|
+
await (rt as any).connect();
|
|
842
|
+
|
|
843
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
844
|
+
expect(calls[calls.length - 1]?.[0]).toBe("http://localhost:3998/bench.example.com");
|
|
845
|
+
rt.disconnect();
|
|
846
|
+
});
|
|
847
|
+
|
|
786
848
|
it("uses the token scheme when auth type is token", async () => {
|
|
787
849
|
const rt = new RealtimeModule({
|
|
788
850
|
baseURL: "http://localhost:3000",
|