Remote Procedure Call implementation for WebExtensions, to easily call functions across content scripts and background script.

webextension-rpc/src/ common.ts
56 lines
1.7 KiB

  1. import type { RpcInfo } from './RpcServer'
  2. export type AsyncFunction = Function & ((...args: any[]) => Promise<any>)
  3. // Our secret tokens to recognise our messages
  4. export const RPC_CALL = '__RPC_CALL__'
  5. export const RPC_RESPONSE = '__RPC_RESPONSE__'
  6. export interface RpcMessage {
  7. __WEBEXTENSION_RPC_MESSAGE__: typeof RPC_CALL | typeof RPC_RESPONSE,
  8. funcName: string,
  9. }
  10. export interface RpcCallMessage<F extends AsyncFunction = AsyncFunction> extends RpcMessage {
  11. __WEBEXTENSION_RPC_MESSAGE__: typeof RPC_CALL,
  12. funcName: F['name'],
  13. args: ReplaceRpcInfo<Parameters<F>, null>,
  14. addRpcInfoAsArgument: number | false,
  15. }
  16. export type RpcResponseMessage<F extends AsyncFunction = AsyncFunction> =
  17. | RpcResponseResolve<F>
  18. | RpcResponseReject
  19. | RpcResponseRpcError
  20. interface RpcResponseMessage_base {
  21. __WEBEXTENSION_RPC_MESSAGE__: typeof RPC_RESPONSE,
  22. }
  23. interface RpcResponseResolve<F extends AsyncFunction> extends RpcResponseMessage_base {
  24. returnValue: ReturnType<F>,
  25. }
  26. interface RpcResponseReject extends RpcResponseMessage_base {
  27. errorMessage: string,
  28. }
  29. interface RpcResponseRpcError extends RpcResponseMessage_base {
  30. rpcError: string,
  31. }
  32. export function isRpcCallMessage(message: any): message is RpcCallMessage {
  33. return !!(message && message['__WEBEXTENSION_RPC_MESSAGE__'] === RPC_CALL)
  34. }
  35. export function isRpcResponseMessage(message: any): message is RpcResponseMessage {
  36. return !!(message && message['__WEBEXTENSION_RPC_MESSAGE__'] === RPC_RESPONSE)
  37. }
  38. type Tail<T extends any[]> = T extends [infer _Head, ...infer Tail] ? Tail : [];
  39. export type ReplaceRpcInfo<Params extends Parameters<AsyncFunction>, Replacement extends any> =
  40. Params extends [RpcInfo, ...any]
  41. ? [Replacement, ...Tail<Params>]
  42. : Params