diff --git a/src/context/connect.tsx b/src/context/connect.tsx index f8ebb1c9..facd0ae5 100644 --- a/src/context/connect.tsx +++ b/src/context/connect.tsx @@ -3,9 +3,10 @@ import type { Accessor, JSX } from 'solid-js' import type { Author, Reaction, Shout, Topic } from '../graphql/schema/core.gen' import { EventStreamContentType, fetchEventSource } from '@microsoft/fetch-event-source' -import { createContext, createEffect, createSignal, useContext } from 'solid-js' +import { createContext, createEffect, createSignal, on, useContext } from 'solid-js' import { Chat, Message } from '../graphql/schema/chat.gen' +import { sseUrl } from '../utils/config' import { useSession } from './session' const RECONNECT_TIMES = 2 @@ -38,51 +39,59 @@ export const ConnectProvider = (props: { children: JSX.Element }) => { setHandlers((hhh) => [...hhh, handler]) } - createEffect(async () => { - const token = session()?.access_token - if (token && !connected() && retried() <= RECONNECT_TIMES) { - console.info('[context.connect] init SSE connection') - try { - await fetchEventSource('https://connect.discours.io', { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - Authorization: token, - }, - onmessage(event) { - const m: SSEMessage = JSON.parse(event.data || '{}') - console.log('[context.connect] Received message:', m) - messageHandlers().forEach((handler) => handler(m)) - }, - onopen: (response) => { - console.log('[context.connect] SSE connection opened', response) - if (response.ok && response.headers.get('content-type') === EventStreamContentType) { - setConnected(true) - setRetried(0) - return Promise.resolve() - } - return Promise.reject(`SSE: cannot connect to real-time updates, status: ${response.status}`) - }, - onclose() { - console.log('[context.connect] SSE connection closed by server') - setConnected(false) - if (retried() < RECONNECT_TIMES) { - setRetried((r) => r + 1) - } - }, - onerror(err) { - console.error('[context.connect] SSE connection error:', err) - setConnected(false) - if (retried() < RECONNECT_TIMES) { - setRetried((r) => r + 1) - } else throw Error(err) - }, - }) - } catch (error) { - console.error('[context.connect] SSE connection failed:', error) - } - } - }) + createEffect( + on( + () => session()?.access_token, + async ([tkn]) => { + if (!sseUrl) return + if (!tkn) return + if (!connected() && retried() <= RECONNECT_TIMES) { + console.info('[context.connect] got token, init SSE connection') + try { + await fetchEventSource(sseUrl, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: tkn, + }, + onmessage(event) { + const m: SSEMessage = JSON.parse(event.data || '{}') + console.log('[context.connect] Received message:', m) + messageHandlers().forEach((handler) => handler(m)) + }, + onopen: (response) => { + console.log('[context.connect] SSE connection opened', response) + if (response.ok && response.headers.get('content-type') === EventStreamContentType) { + setConnected(true) + setRetried(0) + return Promise.resolve() + } + return Promise.reject( + `SSE: cannot connect to real-time updates, status: ${response.status}`, + ) + }, + onclose() { + console.log('[context.connect] SSE connection closed by server') + setConnected(false) + if (retried() < RECONNECT_TIMES) { + setRetried((r) => r + 1) + } + }, + onerror(err) { + console.error('[context.connect] SSE connection error:', err) + setConnected(false) + if (retried() < RECONNECT_TIMES) { + setRetried((r) => r + 1) + } else throw Error(err) + }, + }) + } catch (error) { + console.error('[context.connect] SSE connection failed:', error) + } + } + }, + ), + ) const value: ConnectContextType = { addHandler, connected } diff --git a/src/renderer/_default.page.client.tsx b/src/renderer/_default.page.client.tsx index 8b74aca6..91f46405 100644 --- a/src/renderer/_default.page.client.tsx +++ b/src/renderer/_default.page.client.tsx @@ -9,7 +9,7 @@ import { hydrate } from 'solid-js/web' import { App } from '../components/App' import { initRouter } from '../stores/router' -import { GLITCHTIP_DSN } from '../utils/config' +import { errorsReportingDsn } from '../utils/config' import { resolveHydrationPromise } from '../utils/hydrationPromise' let layoutReady = false @@ -22,7 +22,7 @@ export const render = async (pageContext: PageContextBuiltInClientWithClientRout initRouter(pathname, searchParams) SentryInit({ - dsn: GLITCHTIP_DSN, + dsn: errorsReportingDsn, tracesSampleRate: 0.01, integrations: [replayIntegration()], // Session Replay diff --git a/src/utils/config.ts b/src/utils/config.ts index 79280145..f2b64482 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -1,17 +1,8 @@ export const isDev = import.meta.env.MODE === 'development' - -const defaultThumborUrl = 'https://images.discours.io' export const cdnUrl = 'https://cdn.discours.io' -export const thumborUrl = import.meta.env.PUBLIC_THUMBOR_URL || defaultThumborUrl - -export const SENTRY_DSN = import.meta.env.PUBLIC_SENTRY_DSN || '' -export const GLITCHTIP_DSN = import.meta.env.PUBLIC_GLITCHTIP_DSN || '' - -const defaultCoreUrl = 'https://coretest.discours.io' -export const coreApiUrl = import.meta.env.PUBLIC_CORE_API || defaultCoreUrl - -const defaultChatUrl = 'https://inboxtest.discours.io' -export const chatApiUrl = import.meta.env.PUBLIC_CHAT_API || defaultChatUrl - -const defaultAuthUrl = 'https://authtest.discours.io' -export const authApiUrl = import.meta.env.PUBLIC_AUTH_API || defaultAuthUrl +export const thumborUrl = import.meta.env.PUBLIC_THUMBOR_URL || 'https://images.discours.io' +export const errorsReportingDsn = import.meta.env.PUBLIC_GLITCHTIP_DSN || import.meta.env.PUBLIC_SENTRY_DSN || '' +export const coreApiUrl = 'https://coretest.discours.io' +export const chatApiUrl = 'https://inboxtest.discours.io' +export const authApiUrl = 'https://authtest.discours.io' +export const sseUrl = 'https://presencetest.discours.io'