Skip to content

Commit

Permalink
Merge branch 'develop' into hotfix/3.18.6
Browse files Browse the repository at this point in the history
  • Loading branch information
blackforestboi committed Apr 2, 2024
2 parents 2ee9182 + 269980c commit cd723a0
Show file tree
Hide file tree
Showing 13 changed files with 404 additions and 196 deletions.
2 changes: 1 addition & 1 deletion external/@worldbrain/memex-common
1 change: 1 addition & 0 deletions src/background-mv3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ global['XMLHttpRequest'] = XMLHttpRequest

async function main() {
const rpcManager = setupRpcConnection({
browserAPIs: browser,
sideName: 'background',
role: 'background',
paused: true,
Expand Down
1 change: 1 addition & 0 deletions src/background.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export async function main(): Promise<void> {
__debugCounter = 0

const rpcManager = setupRpcConnection({
browserAPIs: browser,
sideName: 'background',
role: 'background',
paused: true,
Expand Down
41 changes: 23 additions & 18 deletions src/content-scripts/content_script/global.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,11 @@ export async function main(
}
params.loadRemotely = params.loadRemotely ?? true

setupRpcConnection({ sideName: 'content-script-global', role: 'content' })
setupRpcConnection({
browserAPIs: browser,
sideName: 'content-script-global',
role: 'content',
})
// TODO: potential are for improvement, setup RPC earlier or later

const isPdfViewerRunning = params.getContentFingerprints != null
Expand Down Expand Up @@ -265,23 +269,24 @@ export async function main(
},
})

browser.runtime.onMessage.addListener((request: any, sender: any) => {
if (request.action === 'getImageData') {
const imageUrl = request.srcUrl // URL of the image to get data for
return fetch(imageUrl)
.then((response) => response.blob())
.then((blob) => {
return new Promise((resolve) => {
const reader = new FileReader()
reader.onloadend = () =>
resolve({ imageData: reader.result })
reader.readAsDataURL(blob) // Convert the blob to a data URL
})
})
.catch((error) => ({ error: error.toString() }))
}
return Promise.resolve() // Return a resolved promise for non-matching actions or to avoid unhandled promise rejections
})
// browser.runtime.onMessage.addListener((request, sender) => {
// console.log('got msg:', request, sender)
// if (request.action === 'getImageData') {
// const imageUrl = request.srcUrl // URL of the image to get data for
// return fetch(imageUrl)
// .then((response) => response.blob())
// .then((blob) => {
// return new Promise((resolve) => {
// const reader = new FileReader()
// reader.onloadend = () =>
// resolve({ imageData: reader.result })
// reader.readAsDataURL(blob) // Convert the blob to a data URL
// })
// })
// .catch((error) => ({ error: error.toString() }))
// }
// return Promise.resolve() // Return a resolved promise for non-matching actions or to avoid unhandled promise rejections
// })

// 3. Creates an instance of the InPageUI manager class to encapsulate
// business logic of initialising and hide/showing components.
Expand Down
8 changes: 6 additions & 2 deletions src/options/options.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {
MemexTheme,
MemexThemeVariant,
} from '@worldbrain/memex-common/lib/common-ui/styles/types'
import { browser } from 'webextension-polyfill-ts'
import browser from 'webextension-polyfill'

// Include development tools if we are not building for production

Expand All @@ -32,7 +32,11 @@ async function main() {
// ? require('src/dev/redux-devtools-component').default
// : undefined

setupRpcConnection({ sideName: 'extension-page-options', role: 'content' })
setupRpcConnection({
browserAPIs: browser,
sideName: 'extension-page-options',
role: 'content',
})

const store = configureStore({ ReduxDevTools })

Expand Down
2 changes: 0 additions & 2 deletions src/playground.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import {
import browser from 'webextension-polyfill'

async function main() {
setupRpcConnection({ sideName: 'extension-page-options', role: 'content' })

console.log(1)
await runInBackground<{
testCallable: () => Promise<void>
Expand Down
8 changes: 6 additions & 2 deletions src/popup/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { ThemeProvider } from 'styled-components'

import browser from 'webextension-polyfill'
import {
loadThemeVariant,
theme,
Expand Down Expand Up @@ -53,7 +53,11 @@ class Root extends React.Component<RootProps, RootState> {
}

function main() {
setupRpcConnection({ sideName: 'content-script-popup', role: 'content' })
setupRpcConnection({
browserAPIs: browser,
sideName: 'content-script-popup',
role: 'content',
})

const store = configureStore()

Expand Down
172 changes: 172 additions & 0 deletions src/util/rpc/event-rpc-manager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
import createResolvable, { Resolvable } from '@josephg/resolvable'
import type { RPCManager, RPCManagerDependencies, RPCRequest } from './types'
import type { Runtime } from 'webextension-polyfill'
import { createRPCRequestObject, createRPCResponseObject } from './utils'
import { RpcError } from '../webextensionRPC'
import { resolveTabUrl } from '../uri-utils'

export class EventBasedRPCManager implements RPCManager {
private paused?: Resolvable<void>

constructor(private deps: RPCManagerDependencies) {
if (deps.initPaused) {
this.paused = createResolvable()
}
}

private log = (msg: string, obj?: any) => {
if (this.deps.debug === true || globalThis['memex-rpc-debug']) {
msg = `RPC::side=${this.deps.sideName}::` + msg
console['log'](msg, obj ?? {})
}
}

private async postMessageRequestToRPC<T, O>(
request: RPCRequest<T>,
): Promise<O> {
this.log(`messageRequester:: Requested for [${request.headers.name}]`, {
request,
})

let ret: RPCRequest<O>
try {
if (this.deps.sideName === 'background') {
ret = await this.deps.browserAPIs.tabs.sendMessage(
request.headers.tabId,
request,
)
} else {
ret = await this.deps.browserAPIs.runtime.sendMessage(request)
}
} catch (err) {
throw new RpcError(err.message)
}
this.log(
`messageRequester:: Got response for [${request.headers.name}]`,
ret.payload,
)
return ret.payload
}

postMessageRequestToBackground: RPCManager['postMessageRequestToBackground'] = async (
name,
payload,
) => {
const request = createRPCRequestObject(
{ name, originSide: this.deps.sideName },
payload,
)
return this.postMessageRequestToRPC(request)
}

postMessageRequestToTab: RPCManager['postMessageRequestToTab'] = async (
tabId,
name,
payload,
) => {
const request = createRPCRequestObject(
{ name, tabId, originSide: this.deps.sideName },
payload,
)
return this.postMessageRequestToRPC(request)
}

postMessageRequestToTabViaBackground: RPCManager['postMessageRequestToTabViaBackground'] = async (
tabId,
name,
payload,
) => {
const request = createRPCRequestObject(
{
tabId,
proxy: 'background',
name,
originSide: this.deps.sideName,
},
payload,
)
return this.postMessageRequestToRPC(request)
}

private messageResponder = async (
request: RPCRequest,
sender: Runtime.MessageSender,
) => {
const { headers, payload, error, serializedError } = request
const { id, name, type } = headers

// Forward the request to the BG if it was received on the options page via content script
if (
this.deps.sideName === 'extension-page-options' &&
request.headers.proxy == null &&
request.headers.tabId == null
) {
return this.postMessageRequestToBackground(name, payload)
}

await this.paused

if (type === 'RPC_REQUEST') {
this.log(
`messageResponder:: REQUEST received for [${name}]:`,
request,
)

// If the Request type was a proxy, the background shouldn't fullill this request itself
// but pass it on to the specific tab to fullfill
if (headers.proxy === 'background') {
await this.postMessageRequestToTab(headers.tabId, name, payload)
} else {
const f = this.deps.getRegisteredRemoteFunction(name)

if (!f) {
console.error({ side: this.deps.sideName, packet: request })
throw Error(`No registered remote function called ${name}`)
}
Object.defineProperty(f, 'name', { value: name })

this.log(`messageResponder:: RUNNING Function [${name}]`)

let tab =
sender.tab ??
(request.headers.tabId != null
? await this.deps.browserAPIs.tabs?.get(
request.headers.tabId,
) // Tabs API only available in non-CS
: undefined)
tab = resolveTabUrl(tab)

try {
const functionReturn = await f({ tab }, ...payload)
this.log(
`messageResponder:: FINISHED Function [${name}]`,
functionReturn,
)
return createRPCResponseObject({
request,
payload: functionReturn,
originSide: this.deps.sideName,
})
} catch (err) {
this.log(`messageResponder:: ERRORED Function [${name}]`)
throw new RpcError(err.message)
}
}
} else if (type === 'RPC_RESPONSE') {
this.log(`messageResponder:: RESPONSE received for [${name}]`)
// We don't need to do anything with the response - it's available directly from the `sendMessage` calls
}
}

setup: RPCManager['setup'] = () => {
this.deps.browserAPIs.runtime.onMessage.addListener(
this.messageResponder,
)
}

unpause: RPCManager['unpause'] = () => {
const paused = this.paused
delete this.paused
paused?.resolve()
}
}
Loading

0 comments on commit cd723a0

Please sign in to comment.