Skip to content

Commit 3918009

Browse files
committed
feat: switch renderer to use new ipc logger
1 parent 15e61a5 commit 3918009

File tree

8 files changed

+66
-15
lines changed

8 files changed

+66
-15
lines changed

electron/renderer/context/logger.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import type { ReactNode } from 'react';
22
import { createContext, useEffect } from 'react';
33
import type { Logger } from '../../common/logger/types.js';
4-
import { createLogger } from '../lib/logger/create-logger.js';
4+
import { getScopedLogger } from '../lib/logger/logger.factory.js';
55
import {
66
startMonitoringUnhandledExceptions,
77
stopMonitoringUnhandledExceptions,
8-
} from '../lib/logger/monitor-exceptions.js';
8+
} from '../lib/logger/monitor.exceptions.js';
99

10-
const defaultLogger = createLogger('renderer');
10+
const defaultLogger = getScopedLogger('renderer');
1111

1212
/**
1313
* React context for accessing a logger.

electron/renderer/hooks/characters.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import sortBy from 'lodash-es/sortBy.js';
33
import { useCallback, useEffect, useState } from 'react';
44
import { create } from 'zustand';
55
import { useShallow } from 'zustand/react/shallow';
6-
import { isBlank } from '../../common/string/is-blank.js';
6+
import { isBlank } from '../../common/string/string.utils.js';
77
import { runInBackground } from '../lib/async/run-in-background.js';
88
import type { Character } from '../types/game.types.js';
99
import { usePubSub, useSubscribe } from './pubsub.jsx';

electron/renderer/hooks/logger.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useContext, useEffect, useState } from 'react';
22
import type { Logger } from '../../common/logger/types.js';
33
import { LoggerContext } from '../context/logger.jsx';
4-
import { createLogger } from '../lib/logger/create-logger.js';
4+
import { getScopedLogger } from '../lib/logger/logger.factory.js';
55

66
/**
77
* To use this hook, the component must be inside a `LoggerProvider` hierarchy.
@@ -18,7 +18,7 @@ export const useLogger = (scope?: string): Logger => {
1818

1919
useEffect(() => {
2020
if (scope) {
21-
setLogger(createLogger(scope));
21+
setLogger(getScopedLogger(scope));
2222
} else {
2323
setLogger(context.logger);
2424
}

electron/renderer/hooks/pubsub.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { create } from 'zustand';
33
import { useShallow } from 'zustand/react/shallow';
44
import type { Logger } from '../../common/logger/types.js';
55
import { runInBackground } from '../lib/async/run-in-background.js';
6-
import { createLogger } from '../lib/logger/create-logger.js';
6+
import { getScopedLogger } from '../lib/logger/logger.factory.js';
77

88
export type PubSubSubscriber = (data?: any) => Promise<void> | void;
99

@@ -143,7 +143,7 @@ interface PubSubStoreData {
143143
* An implementation of the PubSub pattern.
144144
*/
145145
const usePubSubStore = create<PubSubStoreData>((set, get) => ({
146-
logger: createLogger('hooks:pubsub'),
146+
logger: getScopedLogger('hooks:pubsub'),
147147

148148
subscribers: {},
149149

electron/renderer/instrumentation.ts

-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
import * as SentryNextjs from '@sentry/nextjs';
22
import type { Instrumentation } from 'next';
3-
import { initializeLogging } from './lib/logger/initialize-logging.js';
43

54
/**
65
* Nextjs Instrumentation for monitoring and logging.
76
* https://nextjs.org/docs/pages/building-your-application/optimizing/instrumentation
87
*/
98
export const register = async (): Promise<void> => {
10-
registerLogger();
119
registerSentry();
1210
};
1311

14-
const registerLogger = (): void => {
15-
initializeLogging();
16-
};
17-
1812
/**
1913
* Sentry Config for Next.js
2014
* https://docs.sentry.io/platforms/javascript/guides/nextjs/configuration/options/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { describe, it } from 'vitest';
2+
3+
describe('monitor-exceptions', () => {
4+
describe('#startMonitoringUnhandledExceptions', () => {
5+
it.todo('');
6+
});
7+
8+
describe('#stopMonitoringUnhandledExceptions', () => {
9+
it.todo('');
10+
});
11+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { getScopedLogger } from './logger.factory.js';
2+
3+
/**
4+
* Catch and log unhandled exceptions, such as promise rejections.
5+
* Requires the `window` object, so can only run client-side.
6+
*/
7+
export const startMonitoringUnhandledExceptions = (): void => {
8+
window.addEventListener('error', errorEventHandler);
9+
window.addEventListener('unhandledrejection', rejectionEventHandler);
10+
};
11+
12+
export const stopMonitoringUnhandledExceptions = (): void => {
13+
window.removeEventListener('error', errorEventHandler);
14+
window.removeEventListener('unhandledrejection', rejectionEventHandler);
15+
};
16+
17+
const errorEventHandler = (event: ErrorEvent) => {
18+
event.preventDefault();
19+
logError({
20+
message: `[RENDERER:WINDOW:ERROR] ${event.message}`,
21+
data: {
22+
error: event.error,
23+
},
24+
});
25+
};
26+
27+
const rejectionEventHandler = (event: PromiseRejectionEvent) => {
28+
event.preventDefault();
29+
logError({
30+
message: '[RENDERER:WINDOW:UNHANDLED_REJECTION]',
31+
data: {
32+
reason: event.reason,
33+
},
34+
});
35+
};
36+
37+
const logError = (options: {
38+
message: string;
39+
data?: Record<string, unknown>;
40+
}): void => {
41+
const { message, data } = options;
42+
43+
const logger = getScopedLogger('renderer:error:monitor');
44+
45+
logger.error(message, data);
46+
};

electron/renderer/pages/grid.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { KeyboardEventHandler, ReactNode } from 'react';
88
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
99
import * as rxjs from 'rxjs';
1010
import { v4 as uuid } from 'uuid';
11-
import { getExperienceMindState } from '../../common/game/get-experience-mindstate.js';
11+
import { getExperienceMindState } from '../../common/game/game.utils.js';
1212
import type {
1313
ExperienceGameEvent,
1414
GameCommandMessage,

0 commit comments

Comments
 (0)