refactor🎨: (阅读代码):vscode.ts增加注释

master
yetao 2 weeks ago
parent 21adc57d48
commit 0ab21852c4

@ -1,101 +1,218 @@
// 导入 ConfigLocation 和 FileSystemConfig 类型,这些类型定义了文件系统配置的相关属性
import type { ConfigLocation, FileSystemConfig } from 'common/fileSystemConfig';
// 导入 Message、MessageTypes、PromptPathResultMessage 和 SaveConfigResultMessage 类型,这些类型定义了与 WebView 通信相关的消息格式
import type { Message, MessageTypes, PromptPathResultMessage, SaveConfigResultMessage } from 'common/webviewMessages';
/**
* VSCode API
*/
interface VSCodeAPI {
/**
* VSCode
* @param msg -
*/
postMessage(msg: Message): void;
/**
* VSCode
* @param state -
*/
setState(state: any): void;
/**
* VSCode
* @returns undefined
*/
getState<T>(): T | undefined;
}
// 声明一个函数 acquireVsCodeApi用于获取 VSCode API
declare const acquireVsCodeApi: () => VSCodeAPI;
// 导出一个常量 API它是通过调用 acquireVsCodeApi 函数获取到的 VSCode API
export const API: VSCodeAPI = acquireVsCodeApi();
/**
*
* @typeparam T - Message
*/
export type Listener<T extends Message = Message> = (message: T) => void;
/**
*
*/
export type Filter = string | ((message: Message) => boolean);
// 初始化一个数组,用于存储监听器和过滤器
let LISTENERS: [Listener, Filter | undefined][] = [];
/**
*
* @param listener -
* @param filter -
*/
export function addListener(listener: Listener): void;
export function addListener<K extends Message['type']>(listener: Listener<MessageTypes[K]>, filter: K): void;
export function addListener<T extends Message = Message>(listener: Listener<T>, filter: Exclude<Filter, string>): void;
export function addListener(listener: Listener, filter?: Filter) {
// 将监听器和过滤器添加到 LISTENERS 数组中
LISTENERS.push([listener, filter]);
}
/**
*
* @param listener -
*/
export function removeListener<T extends Message = Message>(listener: Listener<T>) {
// 从 LISTENERS 数组中移除指定的监听器
LISTENERS = LISTENERS.filter(([l]) => l !== listener);
}
/**
* message VSCode
* @param event - message
*/
window.addEventListener('message', event => {
// 打印接收到的消息事件
console.log('MESSAGE', event);
// 从事件中获取消息数据,并断言其为 Message 类型
const message: Message = event.data;
// 如果消息不存在或没有类型,则忽略该消息
if (!message || !message.type) return;
// 遍历监听器列表
for (const [listener, filter] of LISTENERS) {
// 如果过滤器是字符串类型
if (typeof filter === 'string') {
// 如果过滤器字符串与消息类型不匹配,则继续下一个监听器
if (filter !== message.type) continue;
// 如果过滤器是函数类型
} else if (filter && !filter(message)) {
// 如果过滤器函数返回 false则继续下一个监听器
continue;
}
// 尝试调用监听器函数处理消息
try {
listener(message);
} catch (e) {
// 如果在处理消息时发生错误,打印错误信息
console.error('Error in message handler', e, message);
}
}
});
/**
* VSCode
* @param name -
* @param location -
* @returns Promise
* @throws
*/
export function createConfig(name: string, location: ConfigLocation): Promise<FileSystemConfig> {
// 返回一个 Promise用于处理异步操作
return new Promise<FileSystemConfig>((resolve, reject) => {
// 生成一个唯一的 ID用于标识当前的配置请求
const uniqueId = `${name}-${Date.now()};`
// 定义一个处理函数,用于处理来自 VSCode 的保存配置结果消息
function handler(message: SaveConfigResultMessage) {
// 如果消息的唯一 ID 与当前请求的唯一 ID 不匹配,则忽略该消息
if (message.uniqueId !== uniqueId) return;
// 从监听器列表中移除当前的处理函数
removeListener(handler);
// 如果消息中包含错误信息,则拒绝 Promise并将错误信息传递给调用者
if (message.error) return reject(message.error);
// 如果消息中包含新创建的配置,则解析 Promise并将配置信息传递给调用者
resolve(message.config);
}
// 添加处理函数到监听器列表中,用于监听 saveConfigResult 类型的消息
addListener(handler, 'saveConfigResult');
// 创建一个新的文件系统配置对象,包含名称和位置信息
const config: FileSystemConfig = { name, _location: location, _locations: [location] };
// 向 VSCode 发送一个消息,请求保存新创建的配置,并附带唯一 ID
API.postMessage({ type: 'saveConfig', config, uniqueId });
});
}
/**
* VSCode
* @param config -
* @param name - 使
* @returns Promise undefined
* @throws
*/
export function saveConfig(config: FileSystemConfig, name?: string): Promise<void> {
// 返回一个 Promise用于处理异步操作
return new Promise((resolve, reject) => {
// 生成一个唯一的 ID用于标识当前的配置保存请求
const uniqueId = `${config.name}-${Date.now()};`
// 定义一个处理函数,用于处理来自 VSCode 的保存配置结果消息
function handler(message: SaveConfigResultMessage) {
// 如果消息的唯一 ID 与当前请求的唯一 ID 不匹配,则忽略该消息
if (message.uniqueId !== uniqueId) return;
// 从监听器列表中移除当前的处理函数
removeListener(handler);
// 如果消息中包含错误信息,则拒绝 Promise并将错误信息传递给调用者
if (message.error) return reject(message.error);
// 如果消息中没有错误信息,则解析 Promise并将 undefined 传递给调用者
resolve();
}
// 添加处理函数到监听器列表中,用于监听 saveConfigResult 类型的消息
addListener(handler, 'saveConfigResult');
// 向 VSCode 发送一个消息,请求保存配置,并附带唯一 ID 和配置名称
API.postMessage({ type: 'saveConfig', config, uniqueId, name });
});
}
/**
* VSCode
* @param config -
* @returns Promise undefined
* @throws
*/
export function deleteConfig(config: FileSystemConfig): Promise<void> {
// 返回一个 Promise用于处理异步操作
return new Promise((resolve, reject) => {
// 生成一个唯一的 ID用于标识当前的配置删除请求
const uniqueId = `${config.name}-${Date.now()};`
// 定义一个处理函数,用于处理来自 VSCode 的保存配置结果消息
function handler(message: SaveConfigResultMessage) {
// 如果消息的唯一 ID 与当前请求的唯一 ID 不匹配,则忽略该消息
if (message.uniqueId !== uniqueId) return;
// 从监听器列表中移除当前的处理函数
removeListener(handler);
// 如果消息中包含错误信息,则拒绝 Promise并将错误信息传递给调用者
if (message.error) return reject(message.error);
// 如果消息中没有错误信息,则解析 Promise并将 undefined 传递给调用者
resolve();
}
// 添加处理函数到监听器列表中,用于监听 saveConfigResult 类型的消息
addListener(handler, 'saveConfigResult');
// 向 VSCode 发送一个消息,请求删除配置,并附带唯一 ID 和删除标志
API.postMessage({ type: 'saveConfig', config, uniqueId, remove: true });
});
}
/**
*
* @returns Promise undefined
* @throws
*/
export function promptPath(): Promise<string | undefined> {
// 返回一个 Promise用于处理异步操作
return new Promise<string | undefined>((resolve, reject) => {
// 生成一个唯一的 ID用于标识当前的路径选择请求
const uniqueId = Date.now().toString();
// 定义一个处理函数,用于处理来自 VSCode 的路径选择结果消息
function handler(message: PromptPathResultMessage) {
// 如果消息的唯一 ID 与当前请求的唯一 ID 不匹配,则忽略该消息
if (message.uniqueId !== uniqueId) return;
// 从监听器列表中移除当前的处理函数
removeListener(handler);
// 如果消息中包含错误信息,则拒绝 Promise并将错误信息传递给调用者
if (message.error) return reject(message.error);
// 如果消息中包含用户选择的路径,则解析 Promise并将路径信息传递给调用者
resolve(message.path);
}
// 添加处理函数到监听器列表中,用于监听 promptPathResult 类型的消息
addListener(handler, 'promptPathResult');
// 向 VSCode 发送一个消息,请求显示文件选择对话框,并附带唯一 ID
API.postMessage({ type: 'promptPath', uniqueId });
});
}

Loading…
Cancel
Save