@event-chat/rpc 0.1.30 → 0.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,49 @@
1
+ import { MessageItem, Transport } from '../fields';
2
+ import { RequestOptions } from './RPCAction';
3
+ import RPCDecorator, { ActionRecord } from './RPCDecorator';
4
+ export declare function observerRPC(): Readonly<{
5
+ add: (key: Readonly<Omit<import("./RPCAction").default, "destroy" | "on" | "onBrodcast" | "request"> & Pick<Transport<boolean>, "getType" | "upset"> & {
6
+ request: <K extends string>(keyname: K, reqops: StructuredSerializeOptions & {
7
+ targetOrigin?: string;
8
+ transmit?: () => Promise<readonly WindowClient[]>;
9
+ } & Pick<MessageItem, "requestId" | "sign"> & {
10
+ payload?: any;
11
+ retry?: number;
12
+ } & {
13
+ payload: any;
14
+ }) => Promise<any>;
15
+ }>, value: string) => Map<Readonly<Omit<import("./RPCAction").default, "destroy" | "on" | "onBrodcast" | "request"> & Pick<Transport<boolean>, "getType" | "upset"> & {
16
+ request: <K extends string>(keyname: K, reqops: StructuredSerializeOptions & {
17
+ targetOrigin?: string;
18
+ transmit?: () => Promise<readonly WindowClient[]>;
19
+ } & Pick<MessageItem, "requestId" | "sign"> & {
20
+ payload?: any;
21
+ retry?: number;
22
+ } & {
23
+ payload: any;
24
+ }) => Promise<any>;
25
+ }>, string>;
26
+ clear: () => void;
27
+ remove: (key: Readonly<Omit<import("./RPCAction").default, "destroy" | "on" | "onBrodcast" | "request"> & Pick<Transport<boolean>, "getType" | "upset"> & {
28
+ request: <K extends string>(keyname: K, reqops: StructuredSerializeOptions & {
29
+ targetOrigin?: string;
30
+ transmit?: () => Promise<readonly WindowClient[]>;
31
+ } & Pick<MessageItem, "requestId" | "sign"> & {
32
+ payload?: any;
33
+ retry?: number;
34
+ } & {
35
+ payload: any;
36
+ }) => Promise<any>;
37
+ }>) => boolean;
38
+ brodcastScope: <T>(data: RequestOptions<T>, options?: ScopeProps) => void;
39
+ }>;
40
+ export type RPCIns<T extends Transport<boolean> = Transport<boolean>, EVENT extends ActionRecord = ActionRecord, CONSUME extends ActionRecord = ActionRecord> = ReturnType<typeof RPCDecorator<T, EVENT, CONSUME>>[0];
41
+ type ScopeProps = {
42
+ exclude?: string[];
43
+ include?: string[];
44
+ scopein?: string[];
45
+ scopeout?: string[];
46
+ fallback?: (error: unknown) => void;
47
+ };
48
+ export {};
49
+ //# sourceMappingURL=observerRPC.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observerRPC.d.ts","sourceRoot":"","sources":["../../src/core/observerRPC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE3D,wBAAgB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAMP,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,YAAY,UAAU;GAyBnE;AAED,MAAM,MAAM,MAAM,CAChB,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EACjD,KAAK,SAAS,YAAY,GAAG,YAAY,EACzC,OAAO,SAAS,YAAY,GAAG,YAAY,IACzC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEzD,KAAK,UAAU,GAAG;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACpC,CAAA"}
@@ -0,0 +1,21 @@
1
+ function observerRPC() {
2
+ const scopeMap = new Map();
3
+ return Object.freeze({
4
+ add: scopeMap.set.bind(scopeMap),
5
+ clear: scopeMap.clear.bind(scopeMap),
6
+ remove: scopeMap.delete.bind(scopeMap),
7
+ brodcastScope: (data, options)=>{
8
+ const { exclude, include, scopein, scopeout, fallback } = options ?? {};
9
+ let result = {};
10
+ scopeMap.forEach((scope, item)=>{
11
+ const type = item.getType();
12
+ if (item.connected() && !exclude?.includes(type) && (include?.includes(type) ?? true) && !scopeout?.includes(scope) && (scopein?.includes(scope) ?? true)) result = item.broadcast({
13
+ ...data,
14
+ requestId: data.requestId ?? result.requestId,
15
+ sign: data.sign ?? result.sign
16
+ }, fallback);
17
+ });
18
+ }
19
+ });
20
+ }
21
+ export { observerRPC };
@@ -1,23 +1,22 @@
1
- import { RequestOptions } from '../core/RPCAction';
2
1
  import { ActionRecord } from '../core/RPCDecorator';
3
- import { EntryOptions, MessageItem, Transport } from '../fields';
4
- export declare function createMessagePortRPC<EVENT extends ActionRecord, CONSUME extends ActionRecord>(target: MessagePort, config?: EntryOptions<EVENT, CONSUME>): readonly [Readonly<Omit<import("../core/RPCAction").default, "destroy" | "on" | "onBrodcast" | "request"> & Pick<Transport<boolean>, "getType" | "upset"> & {
5
- request: <K extends keyof CONSUME>(...args: Parameters<CONSUME[K]> extends [] ? [keyname: K, reqops?: (Parameters<CONSUME[K]> extends [] ? Omit<RequestOptions, "payload"> & {
2
+ import { EntryOptions } from '../fields';
3
+ export declare function createMessagePortRPC<EVENT extends ActionRecord, CONSUME extends ActionRecord>(target: MessagePort, config?: EntryOptions<EVENT, CONSUME>): readonly [Readonly<Omit<import("../core/RPCAction").default, "destroy" | "on" | "onBrodcast" | "request"> & Pick<import("..").Transport<boolean>, "getType" | "upset"> & {
4
+ request: <K extends keyof CONSUME>(...args: Parameters<CONSUME[K]> extends [] ? [keyname: K, reqops?: (Parameters<CONSUME[K]> extends [] ? Omit<import("../core/RPCAction").RequestOptions, "payload"> & {
6
5
  payload?: never;
7
6
  } : StructuredSerializeOptions & {
8
7
  targetOrigin?: string;
9
8
  transmit?: () => Promise<readonly WindowClient[]>;
10
- } & Pick<MessageItem, "requestId" | "sign"> & {
9
+ } & Pick<import("..").MessageItem, "requestId" | "sign"> & {
11
10
  payload?: Parameters<CONSUME[K]>[0] | undefined;
12
11
  retry?: number;
13
12
  } & {
14
13
  payload: Parameters<CONSUME[K]>[0];
15
- }) | undefined] : [keyname: K, reqops: Parameters<CONSUME[K]> extends [] ? Omit<RequestOptions, "payload"> & {
14
+ }) | undefined] : [keyname: K, reqops: Parameters<CONSUME[K]> extends [] ? Omit<import("../core/RPCAction").RequestOptions, "payload"> & {
16
15
  payload?: never;
17
16
  } : StructuredSerializeOptions & {
18
17
  targetOrigin?: string;
19
18
  transmit?: () => Promise<readonly WindowClient[]>;
20
- } & Pick<MessageItem, "requestId" | "sign"> & {
19
+ } & Pick<import("..").MessageItem, "requestId" | "sign"> & {
21
20
  payload?: Parameters<CONSUME[K]>[0] | undefined;
22
21
  retry?: number;
23
22
  } & {
@@ -25,24 +24,30 @@ export declare function createMessagePortRPC<EVENT extends ActionRecord, CONSUME
25
24
  }]) => Promise<ReturnType<CONSUME[K]> extends infer T ? T extends ReturnType<CONSUME[K]> ? T extends Promise<infer R> ? R : T : never : never>;
26
25
  }>, () => void];
27
26
  export declare function observerMessagePortRPC(): Readonly<{
28
- brodcastScope: <T>(data: RequestOptions<T>, fallback?: (error: unknown) => void) => void;
29
- push: <EVENT extends ActionRecord, CONSUME extends ActionRecord>(target: MessagePort, config?: EntryConfig<EVENT, CONSUME>) => readonly [Readonly<Omit<import("../core/RPCAction").default, "destroy" | "on" | "onBrodcast" | "request"> & Pick<Transport<boolean>, "getType" | "upset"> & {
30
- request: <K extends keyof CONSUME>(...args: Parameters<CONSUME[K]> extends [] ? [keyname: K, reqops?: (Parameters<CONSUME[K]> extends [] ? Omit<RequestOptions, "payload"> & {
27
+ brodcastScope: <T>(data: import("../core/RPCAction").RequestOptions<T>, options?: {
28
+ exclude?: string[];
29
+ include?: string[];
30
+ scopein?: string[];
31
+ scopeout?: string[];
32
+ fallback?: (error: unknown) => void;
33
+ }) => void;
34
+ push: <EVENT extends ActionRecord, CONSUME extends ActionRecord>(target: MessagePort, config?: EntryConfig<EVENT, CONSUME>) => readonly [Readonly<Omit<import("../core/RPCAction").default, "destroy" | "on" | "onBrodcast" | "request"> & Pick<import("..").Transport<boolean>, "getType" | "upset"> & {
35
+ request: <K extends keyof CONSUME>(...args: Parameters<CONSUME[K]> extends [] ? [keyname: K, reqops?: (Parameters<CONSUME[K]> extends [] ? Omit<import("../core/RPCAction").RequestOptions, "payload"> & {
31
36
  payload?: never;
32
37
  } : StructuredSerializeOptions & {
33
38
  targetOrigin?: string;
34
39
  transmit?: () => Promise<readonly WindowClient[]>;
35
- } & Pick<MessageItem, "requestId" | "sign"> & {
40
+ } & Pick<import("..").MessageItem, "requestId" | "sign"> & {
36
41
  payload?: Parameters<CONSUME[K]>[0] | undefined;
37
42
  retry?: number;
38
43
  } & {
39
44
  payload: Parameters<CONSUME[K]>[0];
40
- }) | undefined] : [keyname: K, reqops: Parameters<CONSUME[K]> extends [] ? Omit<RequestOptions, "payload"> & {
45
+ }) | undefined] : [keyname: K, reqops: Parameters<CONSUME[K]> extends [] ? Omit<import("../core/RPCAction").RequestOptions, "payload"> & {
41
46
  payload?: never;
42
47
  } : StructuredSerializeOptions & {
43
48
  targetOrigin?: string;
44
49
  transmit?: () => Promise<readonly WindowClient[]>;
45
- } & Pick<MessageItem, "requestId" | "sign"> & {
50
+ } & Pick<import("..").MessageItem, "requestId" | "sign"> & {
46
51
  payload?: Parameters<CONSUME[K]>[0] | undefined;
47
52
  retry?: number;
48
53
  } & {
@@ -52,5 +57,6 @@ export declare function observerMessagePortRPC(): Readonly<{
52
57
  }>;
53
58
  export type EntryConfig<EVENT extends ActionRecord, CONSUME extends ActionRecord> = EntryOptions<EVENT, CONSUME> & {
54
59
  destroy?: boolean;
60
+ name?: string;
55
61
  };
56
62
  //# sourceMappingURL=messagePort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messagePort.d.ts","sourceRoot":"","sources":["../../src/entry/messagePort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGhE,wBAAgB,oBAAoB,CAAC,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,EAC3F,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;gBAItC;AAED,wBAAgB,sBAAsB;oBAKb,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI;WAgBxE,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,UAC5D,WAAW,WACV,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;GA4BvC;AAED,MAAM,MAAM,WAAW,CAAC,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,IAAI,YAAY,CAC9F,KAAK,EACL,OAAO,CACR,GAAG;IACF,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA"}
1
+ {"version":3,"file":"messagePort.d.ts","sourceRoot":"","sources":["../../src/entry/messagePort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,oBAAoB,CAAC,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,EAC3F,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;gBAItC;AAED,wBAAgB,sBAAsB;;;;;;;;WAEtB,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,UAC5D,WAAW,WACV,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;GA4BvC;AAED,MAAM,MAAM,WAAW,CAAC,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,IAAI,YAAY,CAC9F,KAAK,EACL,OAAO,CACR,GAAG;IACF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA"}
@@ -1,23 +1,14 @@
1
1
  import RPCDecorator from "../core/RPCDecorator.js";
2
+ import { observerRPC } from "../core/observerRPC.js";
2
3
  import MessagePortTransport from "../transports/MessagePortTransport.js";
3
4
  function createMessagePortRPC(target, config) {
4
5
  const { context, options } = config ?? {};
5
6
  return RPCDecorator(new MessagePortTransport(target, options), context);
6
7
  }
7
8
  function observerMessagePortRPC() {
8
- const ports = new Set();
9
- const brodcastScope = (data, fallback)=>{
10
- let result = {};
11
- ports.forEach((port)=>{
12
- if (port.connected()) result = port.broadcast({
13
- ...data,
14
- requestId: data.requestId ?? result.requestId,
15
- sign: data.sign ?? result.sign
16
- }, fallback);
17
- });
18
- };
9
+ const { add, brodcastScope, remove } = observerRPC();
19
10
  const push = (target, config)=>{
20
- const { context, destroy, ...ops } = config ?? {};
11
+ const { context, destroy, name = '', ...ops } = config ?? {};
21
12
  const RPCIns = createMessagePortRPC(target, {
22
13
  ...ops,
23
14
  context: {
@@ -25,13 +16,13 @@ function observerMessagePortRPC() {
25
16
  config: {
26
17
  ...context?.config,
27
18
  onConnect: ()=>{
28
- ports.add(RPCIns[0]);
19
+ add(RPCIns[0], name);
29
20
  context?.config?.onConnect?.();
30
21
  },
31
22
  onDisconnect: (dest)=>{
32
23
  if (destroy) {
33
24
  RPCIns[1]();
34
- ports.delete(RPCIns[0]);
25
+ remove(RPCIns[0]);
35
26
  context?.config?.onDisconnect?.(true);
36
27
  } else context?.config?.onDisconnect?.(dest);
37
28
  }
@@ -1,7 +1,13 @@
1
1
  import { ActionRecord } from '../core/RPCDecorator';
2
2
  import { EntryConfig, createMessagePortRPC } from './messagePort';
3
3
  export declare function obseverShareWorkerGlobalScopeRPC<EVENT extends ActionRecord, CONSUME extends ActionRecord>(target: SharedWorkerGlobalScope, generate?: GenerateCtx<EVENT, CONSUME>): Readonly<{
4
- brodcastScope: <T>(data: import("../core/RPCAction").RequestOptions<T>, fallback?: (error: unknown) => void) => void;
4
+ brodcastScope: <T>(data: import("../core/RPCAction").RequestOptions<T>, options?: {
5
+ exclude?: string[];
6
+ include?: string[];
7
+ scopein?: string[];
8
+ scopeout?: string[];
9
+ fallback?: (error: unknown) => void;
10
+ }) => void;
5
11
  }>;
6
12
  type GenerateCtx<EVENT extends ActionRecord, CONSUME extends ActionRecord> = () => EntryConfig<EVENT, CONSUME> & {
7
13
  provider?: (RPCIns: ReturnType<typeof createMessagePortRPC<EVENT, CONSUME>>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"sharedWorkerGlobalScope.d.ts","sourceRoot":"","sources":["../../src/entry/sharedWorkerGlobalScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAA0B,MAAM,eAAe,CAAA;AAEzF,wBAAgB,gCAAgC,CAC9C,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,EAC5B,MAAM,EAAE,uBAAuB,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;;GAQxE;AAED,KAAK,WAAW,CAAC,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,IAAI,MAAM,WAAW,CAC5F,KAAK,EACL,OAAO,CACR,GAAG;IACF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAA;CACrF,CAAA"}
1
+ {"version":3,"file":"sharedWorkerGlobalScope.d.ts","sourceRoot":"","sources":["../../src/entry/sharedWorkerGlobalScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAA0B,MAAM,eAAe,CAAA;AAEzF,wBAAgB,gCAAgC,CAC9C,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,EAC5B,MAAM,EAAE,uBAAuB,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;;;;;;;;GAQxE;AAED,KAAK,WAAW,CAAC,KAAK,SAAS,YAAY,EAAE,OAAO,SAAS,YAAY,IAAI,MAAM,WAAW,CAC5F,KAAK,EACL,OAAO,CACR,GAAG;IACF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAA;CACrF,CAAA"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from './createCtx';
2
- export { type MessageItem, type Transport } from './fields';
3
- export { default as RPCDecorator } from './core/RPCDecorator';
2
+ export type { MessageItem, Transport } from './fields';
4
3
  export type { MessageInfoType as MessageInfo } from './core/RPCAction';
4
+ export { type RPCIns, observerRPC } from './core/observerRPC';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAC7D,YAAY,EAAE,eAAe,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACtD,YAAY,EAAE,eAAe,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import RPCDecorator from "./core/RPCDecorator.js";
1
+ import { observerRPC } from "./core/observerRPC.js";
2
2
  export * from "./createCtx.js";
3
- export { RPCDecorator };
3
+ export { observerRPC };
@@ -1 +1 @@
1
- {"version":3,"file":"RPCProvider.d.ts","sourceRoot":"","sources":["../../src/react/RPCProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAkC,MAAM,OAAO,CAAA;AAY7E,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAqDtC,CAAA;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"RPCProvider.d.ts","sourceRoot":"","sources":["../../src/react/RPCProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAkC,MAAM,OAAO,CAAA;AAI7E,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAwBtC,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -1,35 +1,24 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useRef } from "react";
3
- import { objectValues } from "../utils.js";
4
- import { RPCInstanceContext, TARGET_TYPE_STRINGS } from "./fields.js";
3
+ import { observerRPC } from "../core/observerRPC.js";
4
+ import { RPCInstanceContext } from "./fields.js";
5
5
  const RPCProvider = ({ children })=>{
6
- const list = useRef(new Map());
7
- const brodcastScope = useCallback((data, options)=>{
8
- const { exclude, include, typein, typeout, fallback } = options ?? {};
9
- if (list.current.size > 0) {
10
- const scope = objectValues(TARGET_TYPE_STRINGS).filter((item)=>!exclude?.includes(item)).filter((item)=>!include || include.includes(item)).map(String);
11
- let result = {};
12
- list.current.forEach((group, item)=>{
13
- if ('getType' in item && scope.includes(item.getType()) && !typeout?.includes(group) && (!typein || typein.includes(group))) result = item.broadcast({
14
- ...data,
15
- requestId: data.requestId ?? result.requestId,
16
- sign: data.sign ?? result.sign
17
- }, fallback);
18
- });
19
- }
6
+ const observer = useRef(observerRPC());
7
+ const mount = useCallback((item, name)=>{
8
+ const { add, remove } = observer.current;
9
+ if (!('getType' in item)) return;
10
+ if (void 0 === name) remove(item);
11
+ else add(item, name);
20
12
  }, []);
21
- const mount = useCallback((data, name)=>{
22
- const newMap = new Map(list.current);
23
- if (void 0 !== name) newMap.set(data, name);
24
- else newMap.delete(data);
25
- list.current = newMap;
13
+ useEffect(()=>{
14
+ const ins = observer.current;
15
+ return ()=>{
16
+ ins.clear();
17
+ };
26
18
  }, []);
27
- useEffect(()=>()=>{
28
- list.current = new Map();
29
- }, []);
30
19
  return /*#__PURE__*/ jsx(RPCInstanceContext.Provider, {
31
20
  value: {
32
- brodcastScope,
21
+ brodcastScope: observer.current.brodcastScope,
33
22
  mount
34
23
  },
35
24
  children: children
@@ -1,6 +1,4 @@
1
- import RPCAction, { RequestOptions } from '../core/RPCAction';
2
- import { Transport } from '../fields';
3
- import { ValueOf } from '../utils';
1
+ import { RPCIns, observerRPC } from '../core/observerRPC';
4
2
  export declare const RPCInstanceContext: import("react").Context<RPCInstanceContextIns>;
5
3
  export declare const TARGET_TYPE_STRINGS: Readonly<{
6
4
  BroadcastChannel: "[object BroadcastChannel]";
@@ -13,16 +11,10 @@ export declare const TARGET_TYPE_STRINGS: Readonly<{
13
11
  Worker: "[object Worker]";
14
12
  DedicatedWorkerGlobalScope: "[object DedicatedWorkerGlobalScope]";
15
13
  }>;
16
- export interface RPCInstanceContextIns {
17
- brodcastScope?: <T>(data: RequestOptions<T>, options?: ScopeProps) => void;
14
+ export interface RPCInstanceContextIns extends BrodcastType {
18
15
  mount?: (item: RPCItem, name?: string) => void;
19
16
  }
20
- export type RPCItem = (Pick<RPCAction, 'broadcast'> & Pick<Transport<boolean>, 'getType'>) | Record<never, never>;
21
- export type ScopeProps = {
22
- exclude?: Array<ValueOf<typeof TARGET_TYPE_STRINGS>>;
23
- include?: Array<ValueOf<typeof TARGET_TYPE_STRINGS>>;
24
- typein?: string[];
25
- typeout?: string[];
26
- fallback?: (error: unknown) => void;
27
- };
17
+ type BrodcastType = Partial<Pick<ReturnType<typeof observerRPC>, 'brodcastScope'>>;
18
+ type RPCItem = RPCIns | Record<never, never>;
19
+ export {};
28
20
  //# sourceMappingURL=fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/react/fields.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAe,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC,eAAO,MAAM,kBAAkB,gDAA2C,CAAA;AAC1E,eAAO,MAAM,mBAAmB;;;;;;;;;;EAU9B,CAAA;AAEF,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IAC1E,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/C;AAED,MAAM,MAAM,OAAO,GACf,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,GACpE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAExB,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAA;IACpD,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAA;IACpD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACpC,CAAA"}
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/react/fields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGzD,eAAO,MAAM,kBAAkB,gDAA2C,CAAA;AAC1E,eAAO,MAAM,mBAAmB;;;;;;;;;;EAU9B,CAAA;AAEF,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/C;AAED,KAAK,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,EAAE,eAAe,CAAC,CAAC,CAAA;AAClF,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA"}
@@ -24,7 +24,13 @@ declare const useRPC: <TARGET extends TargetInit, EVENT extends ActionRecord, CO
24
24
  payload: Parameters<CONSUME[K]>[0];
25
25
  }]) => Promise<ReturnType<CONSUME[K]> extends infer T_1 ? T_1 extends ReturnType<CONSUME[K]> ? T_1 extends Promise<infer R> ? R : T_1 : never : never>;
26
26
  }>;
27
- brodcastScope: <T_1>(data: import("../core/RPCAction").RequestOptions<T_1>, options?: import("./fields").ScopeProps) => void;
27
+ brodcastScope: <T_1>(data: import("../core/RPCAction").RequestOptions<T_1>, options?: {
28
+ exclude?: string[];
29
+ include?: string[];
30
+ scopein?: string[];
31
+ scopeout?: string[];
32
+ fallback?: (error: unknown) => void;
33
+ }) => void;
28
34
  destroy: () => void;
29
35
  mount: (name: string) => void;
30
36
  connected: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAMnE,QAAA,MAAM,MAAM,GACV,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,EAE5B,KAAK,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;kBAiC7E,MAAM;;;EAsFhB,CAAA;AAED,eAAe,MAAM,CAAA;AAGrB,MAAM,MAAM,UAAU,GAClB,gBAAgB,GAChB,yBAAyB,GACzB,YAAY,GACZ,SAAS,GACT,MAAM,GACN,MAAM,GACN,iBAAiB,GACjB,IAAI,CAAA;AAER,UAAU,cAAc,CAAC,MAAM,SAAS,UAAU;IAChD,IAAI,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACjC;AAED,UAAU,eAAe,CACvB,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,CAE5B,SAAQ,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;IAChE,KAAK,EAAE,CACL,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAClC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;CACvC;AAED,UAAU,eAAe,CACvB,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,CAE5B,SAAQ,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;IAChE,KAAK,EAAE,CACL,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KACnC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;CAChD;AAED,KAAK,SAAS,CACZ,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,IAC1B,UAAU,CACZ,OAAO,YAAY,CACjB;IAAC,MAAM;CAAC,SAAS,CAAC,IAAI,CAAC,GACnB,IAAI,GACJ,MAAM,SAAS,gBAAgB,GAC7B,SAAS,CAAC,IAAI,CAAC,GACf,SAAS,CAAC,KAAK,CAAC,EACtB,KAAK,EACL,OAAO,CACR,CACF,CAAA"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAMnE,QAAA,MAAM,MAAM,GACV,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,EAE5B,KAAK,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAiC7E,MAAM;;;EAsFhB,CAAA;AAED,eAAe,MAAM,CAAA;AAGrB,MAAM,MAAM,UAAU,GAClB,gBAAgB,GAChB,yBAAyB,GACzB,YAAY,GACZ,SAAS,GACT,MAAM,GACN,MAAM,GACN,iBAAiB,GACjB,IAAI,CAAA;AAER,UAAU,cAAc,CAAC,MAAM,SAAS,UAAU;IAChD,IAAI,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACjC;AAED,UAAU,eAAe,CACvB,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,CAE5B,SAAQ,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;IAChE,KAAK,EAAE,CACL,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAClC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;CACvC;AAED,UAAU,eAAe,CACvB,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,CAE5B,SAAQ,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;IAChE,KAAK,EAAE,CACL,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KACnC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;CAChD;AAED,KAAK,SAAS,CACZ,MAAM,SAAS,UAAU,EACzB,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,IAC1B,UAAU,CACZ,OAAO,YAAY,CACjB;IAAC,MAAM;CAAC,SAAS,CAAC,IAAI,CAAC,GACnB,IAAI,GACJ,MAAM,SAAS,gBAAgB,GAC7B,SAAS,CAAC,IAAI,CAAC,GACf,SAAS,CAAC,KAAK,CAAC,EACtB,KAAK,EACL,OAAO,CACR,CACF,CAAA"}
@@ -2,6 +2,8 @@ import { ListenerType, MessageItem } from '../fields';
2
2
  import BaseTransport from './BaseTransport';
3
3
  declare class WebSocketTransport extends BaseTransport<WebSocket> {
4
4
  private _onconnect;
5
+ private _closeHandle;
6
+ private _messageHandle;
5
7
  destroy(): void;
6
8
  observe(close?: () => void): void;
7
9
  onmessage(listener: ListenerType): void;
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../src/transports/WebSocketTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAErD,OAAO,aAAa,MAAM,iBAAiB,CAAA;AAS3C,cAAM,kBAAmB,SAAQ,aAAa,CAAC,SAAS,CAAC;IACvD,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO;IAOP,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAMjC,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAavC,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,WAAW;CAajC;AAED,eAAe,kBAAkB,CAAA"}
1
+ {"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../src/transports/WebSocketTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAErD,OAAO,aAAa,MAAM,iBAAiB,CAAA;AAG3C,cAAM,kBAAmB,SAAQ,aAAa,CAAC,SAAS,CAAC;IACvD,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,cAAc,CAA6C;IAEnE,OAAO;IAKP,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAOjC,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IA8BvC,QAAQ,IAAI,IAAI;IAOhB,WAAW,CAAC,OAAO,EAAE,WAAW;CAQjC;AAED,eAAe,kBAAkB,CAAA"}
@@ -2,29 +2,51 @@ import { ProxyPromise } from "../utils.js";
2
2
  import BaseTransport from "./BaseTransport.js";
3
3
  class WebSocketTransport extends BaseTransport {
4
4
  _onconnect = Promise.resolve(false);
5
+ _closeHandle;
6
+ _messageHandle;
5
7
  destroy() {
6
- this._target.onclose = null;
7
- this._target.onopen = null;
8
+ this._closeHandle = void 0;
8
9
  if (this._target.readyState === WebSocket.OPEN) this._target.close();
9
10
  }
10
11
  observe(close) {
11
- this._target.onclose = ()=>{
12
- close?.();
13
- };
12
+ if (close) {
13
+ this._closeHandle = close;
14
+ this._target.addEventListener('close', this._closeHandle, {
15
+ once: true
16
+ });
17
+ }
14
18
  }
15
19
  onmessage(listener) {
16
- this._target.onmessage = listener;
17
20
  this._onconnect = new Promise((resolve)=>{
18
- this._target.onopen = ()=>{
19
- resolve(true);
20
- };
21
- this._target.onclose = ()=>{
22
- resolve(false);
21
+ const handleConnect = (event)=>{
22
+ this._target.removeEventListener('open', handleConnect);
23
+ this._target.removeEventListener('close', handleConnect);
24
+ resolve('open' === event.type);
23
25
  };
26
+ this._target.addEventListener('open', handleConnect, {
27
+ once: true
28
+ });
29
+ this._target.addEventListener('close', handleConnect, {
30
+ once: true
31
+ });
24
32
  });
33
+ this._messageHandle = (event)=>{
34
+ try {
35
+ if ('string' == typeof event.data) listener({
36
+ data: JSON.parse(event.data),
37
+ origin: event.origin,
38
+ ports: event.ports,
39
+ source: event.source
40
+ });
41
+ } catch {}
42
+ };
43
+ this._target.addEventListener('message', this._messageHandle, this._options.message);
25
44
  }
26
45
  onremove() {
27
- this._target.onmessage = null;
46
+ if (this._messageHandle) {
47
+ this._target.removeEventListener('message', this._messageHandle, this._options.message);
48
+ this._messageHandle = void 0;
49
+ }
28
50
  }
29
51
  postMessage(message) {
30
52
  const target = this._target;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@event-chat/rpc",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {