Cleanup additional messages and add messagr types to MessagePort

This commit is contained in:
hensm
2021-04-25 02:49:22 +01:00
committed by Matt Hensman
parent 0c2535ff1e
commit d424637191
9 changed files with 64 additions and 74 deletions

View File

@@ -0,0 +1,6 @@
"use strict";
export interface TypedMessagePort<T> extends MessagePort {
postMessage(message: T, transfer: Transferable[]): void;
postMessage(message: T, options?: PostMessageOptions): void;
}

View File

@@ -1,53 +1,27 @@
"use strict";
const portMap = new WeakMap<TypedPort<any>, browser.runtime.Port>();
/**
* Allows typed access to a runtime.Port object.
*/
export class TypedPort<T> {
public name: string;
public error?: { message: string };
public sender?: browser.runtime.MessageSender;
export interface TypedPort<T>
extends Omit<browser.runtime.Port
, "onDisconnect"
| "onMessage"
| "postMessage"> {
constructor (port: browser.runtime.Port) {
portMap.set(this, port);
this.name = port.name;
// @ts-ignore
this.error = null;
onDisconnect: {
addListener (cb: (port: TypedPort<T>) => void): void | Promise<void>
, removeListener (cb: (port: TypedPort<T>) => void): void | Promise<void>
, hasListener (cb: (port: TypedPort<T>) => void): boolean
, hasListeners (): boolean
}
public disconnect () {
portMap.get(this)?.disconnect();
, onMessage: {
addListener (cb: (message: T) => void): void | Promise<void>
, removeListener (cb: (message: T) => void): void | Promise<void>
, hasListener (cb: (message: T) => void): boolean
, hasListeners (): boolean
}
public onDisconnect = {
addListener: (cb: (port: TypedPort<T>) => void) => {
portMap.get(this)?.onDisconnect.addListener(cb as any);
}
, removeListener: (cb: (port: TypedPort<T>) => void) => {
portMap.get(this)?.onDisconnect.addListener(cb as any);
}
, hasListener: (cb: (port: TypedPort<T>) => void) => {
return portMap.get(this)?.onDisconnect.hasListener(cb as any)
?? false;
}
};
public onMessage = {
addListener: (cb: (message: T) => void) => {
portMap.get(this)?.onMessage.addListener(cb as any);
}
, removeListener: (cb: (message: T) => void) => {
portMap.get(this)?.onMessage.removeListener(cb as any);
}
, hasListener: (cb: (message: T) => void) => {
return portMap.get(this)?.onMessage.hasListener(cb as any) ?? false;
}
};
public postMessage (message: T) {
portMap.get(this)?.postMessage(message as any);
}
, postMessage (message: T): void
}

View File

@@ -3,14 +3,14 @@
import logger from "./logger";
import options from "./options";
import { Message } from "../messaging";
import { Message, Port } from "../messaging";
type DisconnectListener = (port: browser.runtime.Port) => void;
type DisconnectListener = (port: Port) => void;
type MessageListener = (message: Message) => void;
function connectNative (application: string) {
function connectNative (application: string): Port {
/**
* In order to preserve the synchronous API, messages are
* queued before either the native messaging host or the
@@ -34,7 +34,7 @@ function connectNative (application: string) {
const onMessageListeners = new Set<MessageListener>();
// Port proxy API
const portObject: browser.runtime.Port = {
const portObject: Port = {
error: null as any
, name: ""
@@ -48,6 +48,9 @@ function connectNative (application: string) {
, hasListener (cb: DisconnectListener) {
return onDisconnectListeners.has(cb);
}
, hasListeners () {
return onDisconnectListeners.size > 0;
}
}
, onMessage: {
addListener (cb: MessageListener) {
@@ -59,9 +62,9 @@ function connectNative (application: string) {
, hasListener (cb: MessageListener) {
return onMessageListeners.has(cb);
}
// Workaround for modified types
, hasListeners () { return false; }
, hasListeners () {
return onMessageListeners.size > 0;
}
}
, disconnect () {