You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.5 KiB
76 lines
2.5 KiB
(function (root, factory) { |
|
if (typeof module === "object" && module.exports) module.exports = factory(); |
|
else root.DSH_BRIDGE = factory(); |
|
}(typeof globalThis !== "undefined" ? globalThis : this, function () { |
|
"use strict"; |
|
const TOKEN_KEY = "dshmem-bridge-token"; |
|
const ENABLED_KEY = "dsh-memory-enabled"; |
|
|
|
function available() { |
|
return typeof chrome !== "undefined" && chrome.runtime && typeof chrome.runtime.sendMessage === "function"; |
|
} |
|
|
|
function send(payload) { |
|
return new Promise(function (resolve) { |
|
if (!available()) { |
|
resolve({ ok: false, error: { code: "E_NO_RUNTIME", message: "chrome.runtime unavailable" } }); |
|
return; |
|
} |
|
chrome.runtime.sendMessage({ type: "DSH_BRIDGE_CALL", payload: payload }, function (resp) { |
|
const last = chrome.runtime.lastError; |
|
if (last) resolve({ ok: false, error: { code: "E_RUNTIME", message: last.message } }); |
|
else resolve(resp || { ok: false, error: { code: "E_NO_RESPONSE", message: "empty" } }); |
|
}); |
|
}); |
|
} |
|
|
|
function sendCall(call) { |
|
if (!call || typeof call !== "object" || typeof call.tool !== "string") { |
|
return Promise.resolve({ ok: false, error: { code: "E_ARGS_INVALID", message: "call.tool required" } }); |
|
} |
|
const payload = { tool: call.tool, args: call.args || {} }; |
|
if (call.workspace) payload.workspace = call.workspace; |
|
if (call.confirmToken) payload.confirmToken = call.confirmToken; |
|
return send(payload); |
|
} |
|
|
|
function health() { |
|
return new Promise(function (resolve) { |
|
if (!available()) { |
|
resolve({ ok: false, error: { code: "E_NO_RUNTIME", message: "chrome.runtime unavailable" } }); |
|
return; |
|
} |
|
chrome.runtime.sendMessage({ type: "DSH_BRIDGE_HEALTH" }, function (resp) { |
|
const last = chrome.runtime.lastError; |
|
if (last) resolve({ ok: false, error: { code: "E_RUNTIME", message: last.message } }); |
|
else resolve(resp || { ok: false, error: { code: "E_NO_RESPONSE", message: "empty" } }); |
|
}); |
|
}); |
|
} |
|
|
|
function hasToken() { |
|
return new Promise(function (resolve) { |
|
if (typeof chrome === "undefined" || !chrome.storage) { resolve(false); return; } |
|
chrome.storage.local.get(TOKEN_KEY, function (v) { resolve(Boolean(v && v[TOKEN_KEY])); }); |
|
}); |
|
} |
|
|
|
function isEnabled() { |
|
return new Promise(function (resolve) { |
|
if (typeof chrome === "undefined" || !chrome.storage) { resolve(false); return; } |
|
chrome.storage.local.get(ENABLED_KEY, function (v) { |
|
resolve(Boolean(v && v[ENABLED_KEY])); |
|
}); |
|
}); |
|
} |
|
|
|
return { |
|
sendCall: sendCall, |
|
health: health, |
|
hasToken: hasToken, |
|
isEnabled: isEnabled, |
|
available: available, |
|
TOKEN_KEY: TOKEN_KEY, |
|
ENABLED_KEY: ENABLED_KEY |
|
}; |
|
}));
|
|
|