(feat): big call and chatting stuff #23
4 changed files with 28 additions and 23 deletions
commit
a43c05f035
|
|
@ -1 +1 @@
|
||||||
Subproject commit 594646ac39d986f0787aa614a99d580035a67318
|
Subproject commit fee0a8fa9994b6a2d04e0966387c713c47c39b7c
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
"build:apps": "pnpm run copy-licenses && pnpm run pre-build && pnpm run build:mobile && pnpm run build:desktop && pnpm run copy-releases",
|
"build:apps": "pnpm run copy-licenses && pnpm run pre-build && pnpm run build:mobile && pnpm run build:desktop && pnpm run copy-releases",
|
||||||
"build:packages": "node utils/scripts/build-packages.ts",
|
"build:packages": "node utils/scripts/build-packages.ts",
|
||||||
"update:packages": "node utils/scripts/update-packages.ts",
|
"update:packages": "node utils/scripts/update-packages.ts",
|
||||||
"dev:web": "cd apps/web && pnpm dev",
|
"dev": "cd apps/web && pnpm dev",
|
||||||
"build:web": "cd apps/web && pnpm run build",
|
"build:web": "cd apps/web && pnpm run build",
|
||||||
"preview:web": "cd apps/web && pnpm run preview",
|
"preview:web": "cd apps/web && pnpm run preview",
|
||||||
"dev:mobile": "cd apps/tauri && pnpm dev:mobile",
|
"dev:mobile": "cd apps/tauri && pnpm dev:mobile",
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,7 @@ export function Provider(props: {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
blockConnection?: boolean;
|
blockConnection?: boolean;
|
||||||
}) {
|
}) {
|
||||||
const { load, save } = useStorage();
|
const { load } = useStorage();
|
||||||
|
|
||||||
const [readyState, setReadyState] = useState<number>(
|
const [readyState, setReadyState] = useState<number>(
|
||||||
ConnectionState.Disconnected,
|
ConnectionState.Disconnected,
|
||||||
|
|
@ -241,7 +241,7 @@ export function Provider(props: {
|
||||||
const interval = setInterval(async () => {
|
const interval = setInterval(async () => {
|
||||||
try {
|
try {
|
||||||
const originalNow = Date.now();
|
const originalNow = Date.now();
|
||||||
const data = await send("Ping", { LastPing: originalNow });
|
const data = await send("ClientPing", { LastPing: originalNow });
|
||||||
setOwnPing(Date.now() - originalNow);
|
setOwnPing(Date.now() - originalNow);
|
||||||
|
|
||||||
const remotePing = data.data.PingIota;
|
const remotePing = data.data.PingIota;
|
||||||
|
|
@ -300,19 +300,13 @@ export function Provider(props: {
|
||||||
|
|
||||||
await MTPClient.init();
|
await MTPClient.init();
|
||||||
|
|
||||||
const [userId, keyring, storedSessionId] = await Promise.all([
|
const [userId, keyring] = await Promise.all([
|
||||||
load("user_id"),
|
load("user_id"),
|
||||||
load("mtp_keyring"),
|
load("mtp_keyring"),
|
||||||
load("session_id"),
|
|
||||||
]);
|
]);
|
||||||
if (!userId || !keyring) {
|
if (!userId || !keyring) {
|
||||||
throw new Error("Missing login credentials");
|
throw new Error("Missing login credentials");
|
||||||
}
|
}
|
||||||
let sessionId = storedSessionId;
|
|
||||||
if (!Number.isSafeInteger(sessionId) || sessionId <= 0) {
|
|
||||||
sessionId = Date.now();
|
|
||||||
await save("session_id", sessionId);
|
|
||||||
}
|
|
||||||
const forcedOmikronUrl = await load("forced_omikron_url");
|
const forcedOmikronUrl = await load("forced_omikron_url");
|
||||||
const forcedOmikronPublicKey = await load("forced_omikron_public_key");
|
const forcedOmikronPublicKey = await load("forced_omikron_public_key");
|
||||||
|
|
||||||
|
|
@ -422,16 +416,27 @@ export function Provider(props: {
|
||||||
setReadyState(client.state);
|
setReadyState(client.state);
|
||||||
setIdentifying(true);
|
setIdentifying(true);
|
||||||
|
|
||||||
await client.auth();
|
const stateSync = new Promise<ProtocolMessage<"ClientStateSync">>(
|
||||||
const finalResponse = validateResponse(
|
(resolve, reject) => {
|
||||||
"ClientStateSync",
|
const timeout = setTimeout(() => {
|
||||||
await client.request("ClientConnected", {
|
unsubscribe();
|
||||||
SessionId: sessionId,
|
reject(new Error("Initial state synchronization timed out"));
|
||||||
VersionNumber: 0,
|
}, 120_000);
|
||||||
CacheValid: false,
|
const unsubscribe = client.subscribe(
|
||||||
CacheSchemaVersion: 0,
|
"ClientStateSync",
|
||||||
}),
|
(message) => {
|
||||||
|
clearTimeout(timeout);
|
||||||
|
unsubscribe();
|
||||||
|
try {
|
||||||
|
resolve(validateResponse("ClientStateSync", message));
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
const [, finalResponse] = await Promise.all([client.auth(), stateSync]);
|
||||||
|
|
||||||
if (finalResponse.type.startsWith("Error")) {
|
if (finalResponse.type.startsWith("Error")) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
|
|
@ -440,7 +445,7 @@ export function Provider(props: {
|
||||||
}
|
}
|
||||||
|
|
||||||
const acknowledgement = await client.request("ClientStateAck", {
|
const acknowledgement = await client.request("ClientStateAck", {
|
||||||
SessionId: sessionId,
|
SessionId: finalResponse.data.SessionId,
|
||||||
VersionNumber: finalResponse.data.VersionNumber,
|
VersionNumber: finalResponse.data.VersionNumber,
|
||||||
});
|
});
|
||||||
if (acknowledgement.type.startsWith("Error")) {
|
if (acknowledgement.type.startsWith("Error")) {
|
||||||
|
|
@ -541,7 +546,7 @@ export function Provider(props: {
|
||||||
setIdentifying(false);
|
setIdentifying(false);
|
||||||
sonnerToast.dismiss("mtp-connection-toast");
|
sonnerToast.dismiss("mtp-connection-toast");
|
||||||
};
|
};
|
||||||
}, [mtpUrl, props.blockConnection, load, save]);
|
}, [mtpUrl, props.blockConnection, load]);
|
||||||
|
|
||||||
// No Iota check
|
// No Iota check
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
||||||
|
|
@ -225,7 +225,7 @@ export const mtp = {
|
||||||
request: user.partial(),
|
request: user.partial(),
|
||||||
response: z.object({}),
|
response: z.object({}),
|
||||||
},
|
},
|
||||||
Ping: {
|
ClientPing: {
|
||||||
request: z.object({
|
request: z.object({
|
||||||
LastPing: z.number(),
|
LastPing: z.number(),
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue