Sentry를 Content script extension에 세팅하면서 발생했던 문제들을 기록한다.
background 를 경유해서 호출하는 구조를 만들어주면 된다.
Content script
-> Background
-> Sentry
content script
-> background
구간에서 파라미터로 전달한 에러가 소실되는 이슈가 있다. 비단 에러 뿐만아니라 콜백함수를 넘겨도 background에서 null로 변환되어 처리된다.크롬 익스텐션의 chrome.runtime.sendMessage()나 chrome.runtime.onMessage는
내부적으로 메시지를 JSON 형태로 직렬화/역직렬화합니다.
따라서 함수, 에러 객체, 원형 체인(Prototype), 심볼 등은 보낼 수 없고 자동으로 제거되거나 null, {}로 변환됩니다. (참고)
export function serializeError(error: Error | any): any {
if (error instanceof Error) {
return {
name: error.name,
message: error.message,
stack: error.stack,
...Object.getOwnPropertyNames(error).reduce((acc, key) => {
acc[key] = error[key];
return acc;
}, {} as any),
};
}
return error;
}
export function deserializeError(serializedError: any): Error {
if (
serializedError &&
typeof serializedError === 'object' &&
serializedError.name
) {
const error = new Error(serializedError.message);
error.name = serializedError.name;
error.stack = serializedError.stack;
Object.keys(serializedError).forEach((key) => {
if (key !== 'message' && key !== 'name' && key !== 'stack') {
(error as any)[key] = serializedError[key];
}
});
return error;
}
return serializedError;
}
content script > 에러객체를 직렬화해서 background로 전달한다.
background > 직렬화된 error 객체를 역직렬화하여 sentry로 넘긴다.