From 50036a283b120bad69b3db6ba64bc026277ee34e Mon Sep 17 00:00:00 2001 From: Igor Vinokur Date: Sat, 11 May 2019 15:25:11 +0300 Subject: [PATCH] Fix "Converting circular structure to JSON" Error --- packages/plugin-ext/src/api/rpc-protocol.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/plugin-ext/src/api/rpc-protocol.ts b/packages/plugin-ext/src/api/rpc-protocol.ts index e9f97f30f526e..4dc3c6b6951bc 100644 --- a/packages/plugin-ext/src/api/rpc-protocol.ts +++ b/packages/plugin-ext/src/api/rpc-protocol.ts @@ -318,7 +318,8 @@ class MessageFactory { if (messageToSendHostId) { prefix = `"hostID":"${messageToSendHostId}",`; } - return `{${prefix}"type":${MessageType.Request},"id":"${req}","proxyId":"${rpcId}","method":"${method}","args":${JSON.stringify(args, ObjectsTransferrer.replacer)}}`; + return `{${prefix}"type":${MessageType.Request},"id":"${req}","proxyId":"${rpcId}","method":"${method}","args": + ${JSON.stringify(args, (key, value) => ObjectsTransferrer.replacer([], key, value))}}`; } public static replyOK(req: string, res: any, messageToSendHostId?: string): string { @@ -329,7 +330,7 @@ class MessageFactory { if (typeof res === 'undefined') { return `{${prefix}"type":${MessageType.Reply},"id":"${req}"}`; } - return `{${prefix}"type":${MessageType.Reply},"id":"${req}","res":${JSON.stringify(res, ObjectsTransferrer.replacer)}}`; + return `{${prefix}"type":${MessageType.Reply},"id":"${req}","res":${JSON.stringify(res, (key, value) => ObjectsTransferrer.replacer([], key, value))}}`; } public static replyErr(req: string, err: any, messageToSendHostId?: string): string { @@ -357,7 +358,7 @@ class MessageFactory { namespace ObjectsTransferrer { // tslint:disable-next-line:no-any - export function replacer(key: string | undefined, value: any): any { + export function replacer(cache: any[], key: string | undefined, value: any): any { if (value instanceof URI) { return { $type: SerializedObjectType.THEIA_URI, @@ -387,6 +388,15 @@ namespace ObjectsTransferrer { $type: SerializedObjectType.VSCODE_URI, data: uri.toString() } as SerializedObject; + } else if (value && typeof value === 'object') { + if (cache.indexOf(value) !== -1) { + try { + return JSON.parse(JSON.stringify(value)); + } catch (e) { + return; + } + } + cache.push(value); } return value;