{"version":3,"file":"createRestrictedMethodMessenger.mjs","sourceRoot":"","sources":["../src/createRestrictedMethodMessenger.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,4BAA4B;AA2DhD,MAAM,UAAU,+BAA+B,CAO7C,EACA,aAAa,EACb,SAAS,EACT,WAAW,GAKZ;IAQC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,yBAAyB,GAAG,IAAI,SAAS,CAK7C;QACA,SAAS;QACT,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;IAEH,aAAa,CAAC,QAAQ,CAAC;QACrB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,yBAAyB;KACrC,CAAC,CAAC;IAEH,OAAO,yBAAyB,CAAC;AACnC,CAAC","sourcesContent":["import type {\n  ActionConstraint,\n  EventConstraint,\n  MessengerActions,\n} from '@metamask/messenger';\nimport { Messenger } from '@metamask/messenger';\n\n/**\n * The subset of `RootMessenger`'s actions selected by `DelegatedActions`.\n */\ntype SelectedActions<\n  RootMessenger extends Messenger<string, ActionConstraint, EventConstraint>,\n  DelegatedActions extends readonly MessengerActions<RootMessenger>['type'][],\n> = Extract<\n  MessengerActions<RootMessenger>,\n  { type: DelegatedActions[number] }\n>;\n\n/**\n * Create a child messenger scoped to a restricted-method permission\n * specification, delegating only the spec's declared actions from the root\n * messenger. This produces a minimally-scoped messenger whose action surface\n * matches exactly what the spec has declared it needs.\n *\n * Returns `undefined` when `actionNames` is omitted — there is nothing to\n * scope, and the builder can be invoked without a messenger.\n *\n * @param args - The arguments.\n * @param args.rootMessenger - The root messenger to delegate actions from.\n * @param args.namespace - The namespace for the scoped child messenger,\n * typically the spec's `targetName`.\n * @param args.actionNames - The action types the specification requires,\n * typically the spec's declared `actionNames`. Must be a non-empty tuple of\n * action types that exist on the root messenger.\n * @returns A scoped child messenger with the requested actions delegated, or\n * `undefined` if no actions were requested.\n */\nexport function createRestrictedMethodMessenger<\n  Namespace extends string,\n  RootMessenger extends Messenger<string, ActionConstraint, EventConstraint>,\n  DelegatedActions extends readonly [\n    MessengerActions<RootMessenger>['type'],\n    ...MessengerActions<RootMessenger>['type'][],\n  ],\n>(args: {\n  rootMessenger: RootMessenger;\n  namespace: Namespace;\n  actionNames: DelegatedActions;\n}): Messenger<\n  Namespace,\n  SelectedActions<RootMessenger, DelegatedActions>,\n  never,\n  RootMessenger\n>;\n\nexport function createRestrictedMethodMessenger<\n  Namespace extends string,\n  RootMessenger extends Messenger<string, ActionConstraint, EventConstraint>,\n>(args: {\n  rootMessenger: RootMessenger;\n  namespace: Namespace;\n  actionNames?: undefined;\n}): undefined;\n\nexport function createRestrictedMethodMessenger<\n  Namespace extends string,\n  RootMessenger extends Messenger<string, ActionConstraint, EventConstraint>,\n  DelegatedActions extends [\n    MessengerActions<RootMessenger>['type'],\n    ...MessengerActions<RootMessenger>['type'][],\n  ],\n>({\n  rootMessenger,\n  namespace,\n  actionNames,\n}: {\n  rootMessenger: RootMessenger;\n  namespace: Namespace;\n  actionNames?: DelegatedActions;\n}):\n  | Messenger<\n      Namespace,\n      SelectedActions<RootMessenger, DelegatedActions>,\n      never,\n      RootMessenger\n    >\n  | undefined {\n  if (!actionNames?.length) {\n    return undefined;\n  }\n\n  const restrictedMethodMessenger = new Messenger<\n    Namespace,\n    SelectedActions<RootMessenger, DelegatedActions>,\n    never,\n    RootMessenger\n  >({\n    namespace,\n    parent: rootMessenger,\n  });\n\n  rootMessenger.delegate({\n    actions: actionNames,\n    messenger: restrictedMethodMessenger,\n  });\n\n  return restrictedMethodMessenger;\n}\n"]}