Google chrome extension chrome扩展之间的公共数据库

Google chrome extension chrome扩展之间的公共数据库,google-chrome-extension,local-storage,web-sql,Google Chrome Extension,Local Storage,Web Sql,我想创建一个公共数据库,以便其他扩展可以访问它,创建表,添加实体,删除它们想要的实体 我看到,实现这一点的唯一方法是在多个扩展之间使用消息传递,但这种解决方案对我来说是有问题的,因为我需要“管理”权限才能知道其他扩展ID 有一个选项可以在不知道其ID的情况下向所有扩展发送消息?或者有另一种方法可以实现公共数据库而无需发布子同步 顺便说一句,我可以使用localStorage或WebSQL。您是否可以创建一个扩展hub,用于注册其他扩展并具有消息中心 所有希望与公共数据库通信的扩展都可以通过集线

我想创建一个公共数据库,以便其他扩展可以访问它,创建表,添加实体,删除它们想要的实体

我看到,实现这一点的唯一方法是在多个扩展之间使用消息传递,但这种解决方案对我来说是有问题的,因为我需要“管理”权限才能知道其他扩展ID

有一个选项可以在不知道其ID的情况下向所有扩展发送消息?或者有另一种方法可以实现公共数据库而无需发布子同步


顺便说一句,我可以使用localStorage或WebSQL。

您是否可以创建一个扩展hub,用于注册其他扩展并具有消息中心

所有希望与公共数据库通信的扩展都可以通过集线器进行通信。从后台页面初始化后,每个扩展都可以向中心注册它们的ID以及它们想要订阅的事件

从每个扩展注册操作 然后,执行的每个动作都将传达给中心: 然后集线器扩展将侦听事件。对于“注册”操作,中心会将扩展注册为“subscribeTo”操作的端点。对于其他操作(“createFoo”或“deleteFoo”),中心将迭代事件的已注册扩展列表,并执行发送“操作”名称和可选“上下文”的sendRequest

集线器和所有希望通信的扩展之间可以知道一个共享的“密钥”,以防止集线器侦听来自未知源的事件

Hub extension background.js:
var actionToExtMap={};
chrome.extension.onRequestExternal.addListener(函数(请求、发送方、sendResponse){
if(request.key==“somePrivKey”){
if(request.action==“register”){
对于(i=0;i
chrome.tabs.sendRequest("hub", {
    action: "register",
    key: "somePrivKey",
    id: "extId", 
    subscribeTo: ["createFoo", "deleteFoo"]
});
chrome.tabs.sendRequest("hub", {
    action: "createFoo",
    key: "somePrivKey",
    context: 1
});
var actionToExtMap = {};

chrome.extension.onRequestExternal.addListener(function(request, sender, sendResponse) {
    if (request.key === "somePrivKey") {
        if (request.action === "register") {
            for (i = 0; i < request.subscribeTo.length; i++) {
                var action = request.subscribeTo[i];

                var extsionsForAction = actionToExtMap[action] || [];
                extsionsForAction.push(request.id)
            }

        } else if (request.action) {
            var extensionsToSendAction = actionToExtMap[request.action];
            for (i = 0; i < extensionsToSendAction.length; i++) {
                chrome.extension.sendRequest(extensionsToSendAction[i], {
                    action: request.action,
                    context: request.context //pass an option context object
                }
            }
        }
    }
});