This repository has been archived by the owner on Feb 7, 2019. It is now read-only.
/
message-ports.js
103 lines (93 loc) · 3.13 KB
/
message-ports.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import openDataStore from "./datastore";
import getAuthorization, { saveAuthorization } from "./authorization/index";
import updateBrowserAction from "./browser-action";
import * as telemetry from "./telemetry";
import { openView, closeView } from "./views";
import { makeItemSummary } from "../common";
const ports = new Set();
function broadcast(message, excludedSender) {
for (let p of ports) {
if (!excludedSender || p.sender.contextId !== excludedSender.contextId) {
p.postMessage(message);
}
}
}
export default function initializeMessagePorts() {
browser.runtime.onConnect.addListener((port) => {
ports.add(port);
port.onDisconnect.addListener(() => ports.delete(port));
});
browser.runtime.onMessage.addListener(async(message, sender) => {
switch (message.type) {
case "open_view":
return openView(message.name).then(() => ({}));
case "close_view":
return closeView(message.name).then(() => ({}));
case "signin":
try {
return getAuthorization().signIn(message.interactive);
} catch (err) {
console.log(`signin failure: ${err.message}`);
throw err;
}
case "initialize":
return getAuthorization().verify(message.password).then(async() => {
const ds = await openDataStore();
await ds.initialize({
password: message.password,
});
await saveAuthorization(browser.storage.local);
await updateBrowserAction(ds);
return {};
});
case "unlock":
return openDataStore().then(async(ds) => {
await ds.unlock(message.password);
await updateBrowserAction(ds);
return {};
});
case "lock":
return openDataStore().then(async(ds) => {
await ds.lock();
await updateBrowserAction(ds);
return {};
});
case "list_items":
return openDataStore().then(async(ds) => {
return {items: Array.from((await ds.list()).values(),
makeItemSummary)};
});
case "add_item":
return openDataStore().then(async(ds) => {
const item = await ds.add(message.item);
broadcast({type: "added_item", item}, sender);
return {item};
});
case "update_item":
return openDataStore().then(async(ds) => {
const item = await ds.update(message.item);
broadcast({type: "updated_item", item}, sender);
return {item};
});
case "remove_item":
return openDataStore().then(async(ds) => {
await ds.remove(message.id);
broadcast({type: "removed_item", id: message.id}, sender);
return {};
});
case "get_item":
return openDataStore().then(async(ds) => {
return {item: await ds.get(message.id)};
});
case "proxy_telemetry_event":
return telemetry.recordEvent(
message.category, message.method, message.object, message.extra
);
default:
return null;
}
});
}