core-3nweb-client-lib 0.32.1 → 0.34.0

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.
@@ -1,7 +1,7 @@
1
- import { Caller, CoreSideServices } from "../ipc-via-protobuf/connector";
1
+ import { CoreSide, ClientSide } from "../ipc-via-protobuf/connector";
2
2
  import { ClientCAPsWraps, CAPsExposures, TypeDifference } from "./generic";
3
3
  type W3N = web3n.caps.common.W3N;
4
- export declare function exposeW3N<T extends W3N>(coreSide: CoreSideServices, w3n: T, extraCAPs?: CAPsExposures<TypeDifference<T, W3N>>): void;
5
- export declare function makeW3Nclient<T extends W3N>(clientSide: Caller, extraCAPs?: ClientCAPsWraps<TypeDifference<T, W3N>>): T;
6
- export declare function promiseW3Nclient<T extends W3N>(clientSide: Caller, extraCAPs?: ClientCAPsWraps<TypeDifference<T, W3N>>): Promise<T>;
4
+ export declare function exposeW3N<T extends W3N>(coreSide: CoreSide, w3n: T, extraCAPs?: CAPsExposures<TypeDifference<T, W3N>>): void;
5
+ export declare function makeW3Nclient<T extends W3N>(clientSide: ClientSide, extraCAPs?: ClientCAPsWraps<TypeDifference<T, W3N>>): T;
6
+ export declare function promiseW3Nclient<T extends W3N>(clientSide: ClientSide, extraCAPs?: ClientCAPsWraps<TypeDifference<T, W3N>>): Promise<T>;
7
7
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2020 - 2021, 2023 3NSoft Inc.
3
+ Copyright (C) 2020 - 2021, 2023 - 2024 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -1,14 +1,14 @@
1
- import { ExposedObj, ExposedFn, CoreSideServices, Caller } from "../ipc-via-protobuf/connector";
1
+ import { ExposedObj, ExposedFn, CoreSideServices, Caller, CoreSide, CallerToClient, ClientSideServices, ClientSide } from "../ipc-via-protobuf/connector";
2
2
  export type CAPsExposures<T> = {
3
- [cap in keyof Required<T>]: (cap: any, coreSide: CoreSideServices) => ExposedObj<any> | ExposedFn;
3
+ [cap in keyof Required<T>]: (cap: any, coreSide: CoreSideServices, callerToClient: CallerToClient) => ExposedObj<any> | ExposedFn;
4
4
  };
5
5
  export type TypeDifference<T extends TExc, TExc extends object> = {
6
6
  [cap in Exclude<keyof T, keyof TExc>]: T[cap];
7
7
  };
8
- export declare function exposeCAPs<T extends W3N, W3N extends object>(coreSide: CoreSideServices, w3n: T, mainCAPs: CAPsExposures<W3N>, extraCAPs: CAPsExposures<TypeDifference<T, W3N>> | undefined): void;
9
- export type MakeCapClient = (clientSide: Caller, objPath: string[]) => any;
8
+ export declare function exposeCAPs<T extends W3N, W3N extends object>(coreSide: CoreSide, w3n: T, mainCAPs: CAPsExposures<W3N>, extraCAPs: CAPsExposures<TypeDifference<T, W3N>> | undefined): void;
9
+ export type MakeCapClient = (clientSide: Caller, objPath: string[], expServices: ClientSideServices) => any;
10
10
  export type ClientCAPsWraps<T> = {
11
11
  [cap in keyof Required<T>]: MakeCapClient;
12
12
  };
13
- export declare function makeClientSide<T extends W3N, W3N extends object>(clientSide: Caller, mainCAPs: ClientCAPsWraps<W3N>, extraCAPs: ClientCAPsWraps<TypeDifference<T, W3N>> | undefined): T;
14
- export declare function promiseClientSide<T extends W3N, W3N extends object>(clientSide: Caller, mainCAPs: ClientCAPsWraps<W3N>, extraCAPs: ClientCAPsWraps<TypeDifference<T, W3N>> | undefined): Promise<T>;
13
+ export declare function makeClientSide<T extends W3N, W3N extends object>({ caller, exposedServices }: ClientSide, mainCAPs: ClientCAPsWraps<W3N>, extraCAPs: ClientCAPsWraps<TypeDifference<T, W3N>> | undefined): T;
14
+ export declare function promiseClientSide<T extends W3N, W3N extends object>({ caller, exposedServices }: ClientSide, mainCAPs: ClientCAPsWraps<W3N>, extraCAPs: ClientCAPsWraps<TypeDifference<T, W3N>> | undefined): Promise<T>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2021 - 2022 3NSoft Inc.
3
+ Copyright (C) 2021 - 2022, 2024 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -27,55 +27,55 @@ function exposeCAPs(coreSide, w3n, mainCAPs, extraCAPs) {
27
27
  if (extraCAPs) {
28
28
  addCAPsInExposure(expW3N, coreSide, w3n, extraCAPs);
29
29
  }
30
- coreSide.exposeW3NService(expW3N);
30
+ coreSide.exposedServices.exposeW3NService(expW3N);
31
31
  }
32
- function addCAPsInExposure(expW3N, coreSide, w3n, capExposures) {
32
+ function addCAPsInExposure(expW3N, { exposedServices, caller: callerToClient }, w3n, capExposures) {
33
33
  for (const capName in capExposures) {
34
34
  const expose = capExposures[capName];
35
35
  (0, assert_1.assert)(typeof expose === 'function');
36
36
  (0, assert_1.assert)(!expW3N[capName], `Capability ${capName} is already exposed, and we specifically have no shadowing.`);
37
37
  const cap = w3n[capName];
38
38
  if (cap) {
39
- expW3N[capName] = expose(cap, coreSide);
39
+ expW3N[capName] = expose(cap, exposedServices, callerToClient);
40
40
  }
41
41
  }
42
42
  }
43
- function makeClientSide(clientSide, mainCAPs, extraCAPs) {
44
- (0, assert_1.assert)(!!clientSide.listObj);
43
+ function makeClientSide({ caller, exposedServices }, mainCAPs, extraCAPs) {
44
+ (0, assert_1.assert)(!!caller.listObj);
45
45
  const objPath = [connector_1.W3N_NAME];
46
- const lstOfCAPs = clientSide.listObj(objPath);
46
+ const lstOfCAPs = caller.listObj(objPath);
47
47
  const w3n = {};
48
48
  for (const cap of lstOfCAPs) {
49
49
  const capObjPath = objPath.concat(cap);
50
50
  if (mainCAPs[cap]) {
51
51
  const makeCap = mainCAPs[cap];
52
52
  (0, assert_1.assert)(typeof makeCap === 'function');
53
- w3n[cap] = makeCap(clientSide, capObjPath);
53
+ w3n[cap] = makeCap(caller, capObjPath, exposedServices);
54
54
  }
55
55
  else if (extraCAPs) {
56
56
  const makeCap = extraCAPs[cap];
57
57
  (0, assert_1.assert)(typeof makeCap === 'function');
58
- w3n[cap] = makeCap(clientSide, capObjPath);
58
+ w3n[cap] = makeCap(caller, capObjPath, exposedServices);
59
59
  }
60
60
  }
61
61
  return w3n;
62
62
  }
63
- async function promiseClientSide(clientSide, mainCAPs, extraCAPs) {
64
- (0, assert_1.assert)(!!clientSide.listObjAsync);
63
+ async function promiseClientSide({ caller, exposedServices }, mainCAPs, extraCAPs) {
64
+ (0, assert_1.assert)(!!caller.listObjAsync);
65
65
  const objPath = [connector_1.W3N_NAME];
66
- const lstOfCAPs = (await clientSide.listObjAsync(objPath));
66
+ const lstOfCAPs = (await caller.listObjAsync(objPath));
67
67
  const w3n = {};
68
68
  for (const cap of lstOfCAPs) {
69
69
  const capObjPath = objPath.concat(cap);
70
70
  if (mainCAPs[cap]) {
71
71
  const makeCap = mainCAPs[cap];
72
72
  (0, assert_1.assert)(typeof makeCap === 'function');
73
- w3n[cap] = await makeCap(clientSide, capObjPath);
73
+ w3n[cap] = await makeCap(caller, capObjPath, exposedServices);
74
74
  }
75
75
  else if (extraCAPs) {
76
76
  const makeCap = extraCAPs[cap];
77
77
  (0, assert_1.assert)(typeof makeCap === 'function');
78
- w3n[cap] = await makeCap(clientSide, capObjPath);
78
+ w3n[cap] = await makeCap(caller, capObjPath, exposedServices);
79
79
  }
80
80
  }
81
81
  return w3n;
@@ -1,6 +1,6 @@
1
- import { CoreSideServices, Caller } from "../ipc-via-protobuf/connector";
1
+ import { CoreSide, ClientSide } from "../ipc-via-protobuf/connector";
2
2
  import { ClientCAPsWraps, CAPsExposures, TypeDifference } from "./generic";
3
3
  type W3N = web3n.startup.W3N;
4
- export declare function exposeStartupW3N<T extends W3N>(coreSide: CoreSideServices, w3n: T, extraCAPs?: CAPsExposures<TypeDifference<T, W3N>>): void;
5
- export declare function makeStartupW3Nclient<T extends W3N>(clientSide: Caller, extraCAPs?: ClientCAPsWraps<TypeDifference<T, W3N>>): W3N;
4
+ export declare function exposeStartupW3N<T extends W3N>(coreSide: CoreSide, w3n: T, extraCAPs?: CAPsExposures<TypeDifference<T, W3N>>): void;
5
+ export declare function makeStartupW3Nclient<T extends W3N>(clientSide: ClientSide, extraCAPs?: ClientCAPsWraps<TypeDifference<T, W3N>>): W3N;
6
6
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2020 - 2023 3NSoft Inc.
3
+ Copyright (C) 2020 - 2024 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -32,10 +32,6 @@ class ClientsSideImpl {
32
32
  this.weakSrvByRefs = new Map();
33
33
  this.srvFinalRegistry = new FinalizationRegistry(this.doOnClientObjDrop.bind(this));
34
34
  this.isStopped = false;
35
- if ((this.asyncReqToListObj && this.syncReqToListObj)
36
- || (!this.asyncReqToListObj && !this.syncReqToListObj)) {
37
- throw new Error(`Expect either sync or async obj listing function.`);
38
- }
39
35
  Object.seal(this);
40
36
  }
41
37
  stop(exc) {
@@ -18,10 +18,12 @@ export declare class ExposedObjs {
18
18
  private readonly objs;
19
19
  private readonly objToRefs;
20
20
  exposeDroppableService<T extends string>(objType: T, exp: ExposedFn | ExposedObj<any>, original: any): ObjectReference<T>;
21
+ private newRef;
21
22
  getOriginalObj<T>(ref: ObjectReference<any>): T;
22
23
  getObjForTransfer<T extends string>(ref: ObjectReference<T>): TransferableObj<T>;
23
24
  findRefIfAlreadyExposed(o: any): ObjectReference<any> | undefined;
24
- exposeStaticService(name: string, exp: ExposedFn | ExposedObj<any>): void;
25
+ exposeW3NService(exp: ExposedFn | ExposedObj<any>): void;
26
+ exposeStaticService<T extends string>(objType: T, exp: ExposedFn | ExposedObj<any>): ObjectReference<T>;
25
27
  drop(name: string): void;
26
28
  find(path: string[] | undefined): ExposedFn | ExposedObj<any> | undefined;
27
29
  findFn(path: string[] | undefined): ExposedFn;
@@ -132,6 +132,7 @@ class ServicesSideImpl {
132
132
  const expSrv = {
133
133
  exposeDroppableService: this.exposedObjs.exposeDroppableService.bind(this.exposedObjs),
134
134
  exposeStaticService: this.exposedObjs.exposeStaticService.bind(this.exposedObjs),
135
+ exposeW3NService: this.exposedObjs.exposeW3NService.bind(this.exposedObjs),
135
136
  getOriginalObj: this.exposedObjs.getOriginalObj.bind(this.exposedObjs),
136
137
  listObj: path => {
137
138
  const obj = this.exposedObjs.find(path);
@@ -152,16 +153,19 @@ class ExposedObjs {
152
153
  this.objToRefs = new Map();
153
154
  }
154
155
  exposeDroppableService(objType, exp, original) {
156
+ const ref = this.newRef(objType);
157
+ this.objs.set(ref.path[0], { exp, original, objType });
158
+ this.objToRefs.set(original, ref);
159
+ return ref;
160
+ }
161
+ newRef(objType) {
155
162
  let id;
156
163
  do {
157
164
  id = (0, random_node_1.stringOfB64CharsSync)(20);
158
165
  } while (this.objs.has(id));
159
- const ref = {
166
+ return {
160
167
  objType, path: [id]
161
168
  };
162
- this.objs.set(id, { exp, original, objType });
163
- this.objToRefs.set(original, ref);
164
- return ref;
165
169
  }
166
170
  getOriginalObj(ref) {
167
171
  const o = this.objs.get(ref.path[0]);
@@ -187,11 +191,21 @@ class ExposedObjs {
187
191
  findRefIfAlreadyExposed(o) {
188
192
  return this.objToRefs.get(o);
189
193
  }
190
- exposeStaticService(name, exp) {
191
- this.objs.set(name, {
194
+ exposeW3NService(exp) {
195
+ if (this.objs.has(connector_1.W3N_NAME)) {
196
+ throw new Error(`${connector_1.W3N_NAME} object has already been added`);
197
+ }
198
+ this.objs.set(connector_1.W3N_NAME, {
192
199
  exp, original: undefined, objType: 'non-transferable'
193
200
  });
194
201
  }
202
+ exposeStaticService(objType, exp) {
203
+ const ref = this.newRef(objType);
204
+ this.objs.set(ref.path[0], {
205
+ exp, original: undefined, objType
206
+ });
207
+ return ref;
208
+ }
195
209
  drop(name) {
196
210
  if (name !== connector_1.W3N_NAME) {
197
211
  const o = this.objs.get(name);
@@ -1,10 +1,21 @@
1
1
  import { Observer, SubjectLike, Subscribable } from "rxjs";
2
2
  import { ObjectReference, Value } from "./protobuf-msg";
3
3
  import { ProtoType } from '../lib-client/protobuf-type';
4
+ export interface ClientSide {
5
+ caller: Caller;
6
+ exposedServices: ClientSideServices;
7
+ close: (err?: any) => void;
8
+ }
9
+ export interface CoreSide {
10
+ caller: CallerToClient;
11
+ exposedServices: CoreSideServices;
12
+ close: (err?: any) => void;
13
+ }
4
14
  export interface ServicesImpl {
5
15
  exposeDroppableService<T extends string>(objType: T, exp: ExposedFn | ExposedObj<any>, original: any): ObjectReference<T>;
16
+ exposeStaticService<T extends string>(objType: T, exp: ExposedFn | ExposedObj<any>): ObjectReference<T>;
6
17
  getOriginalObj<T>(ref: ObjectReference<any>): T;
7
- exposeStaticService(name: string, exp: ExposedFn | ExposedObj<any>): void;
18
+ exposeW3NService(exp: ExposedFn | ExposedObj<any>): void;
8
19
  listObj(path: string[]): string[] | null;
9
20
  getObjForTransfer<T extends string>(ref: ObjectReference<T>): TransferableObj<T>;
10
21
  findRefIfAlreadyExposed(o: any): ObjectReference<any> | undefined;
@@ -13,29 +24,26 @@ export interface TransferableObj<T extends string> {
13
24
  type: T;
14
25
  o: any;
15
26
  }
16
- export interface ServicesSide {
17
- exposedServices(): ServicesImpl;
18
- processCallStart(fnCallNum: number, path: string[] | undefined, body: EnvelopeBody): void;
19
- processCallCancelation(fnCallNum: number): void;
20
- processListObj(fnCallNum: number, path: string[] | undefined): void;
21
- processObjectDrop(path: string[] | undefined): void;
22
- stop(): void;
23
- }
24
27
  export interface CoreSideServices {
25
28
  exposeDroppableService: ServicesImpl['exposeDroppableService'];
26
29
  getOriginalObj: ServicesImpl['getOriginalObj'];
27
- exposeW3NService(exp: ExposedFn | ExposedObj<any>): void;
30
+ exposeW3NService: ServicesImpl['exposeW3NService'];
28
31
  listObj: ServicesImpl['listObj'];
29
32
  getObjForTransfer: ServicesImpl['getObjForTransfer'];
30
33
  findRefIfAlreadyExposed: ServicesImpl['findRefIfAlreadyExposed'];
31
34
  }
32
- export interface CoreSide {
33
- exposedServices: CoreSideServices;
34
- close: (err?: any) => void;
35
+ export interface ClientSideServices {
36
+ exposeDroppableService: ServicesImpl['exposeDroppableService'];
37
+ getOriginalObj: ServicesImpl['getOriginalObj'];
38
+ exposeStaticService: ServicesImpl['exposeStaticService'];
39
+ getObjForTransfer: ServicesImpl['getObjForTransfer'];
40
+ findRefIfAlreadyExposed: ServicesImpl['findRefIfAlreadyExposed'];
35
41
  }
36
- export interface ClientSide {
37
- caller: Caller;
38
- close: (err?: any) => void;
42
+ export interface CallerToClient {
43
+ startPromiseCall: Caller['startPromiseCall'];
44
+ startObservableCall: Caller['startObservableCall'];
45
+ registerClientDrop: Caller['registerClientDrop'];
46
+ srvRefOf: Caller['srvRefOf'];
39
47
  }
40
48
  export interface Caller {
41
49
  startPromiseCall(path: string[], req: EnvelopeBody): Promise<EnvelopeBody>;
@@ -52,6 +60,14 @@ export interface Caller {
52
60
  export interface ObjectFromCore {
53
61
  _isObjectFromCore: true;
54
62
  }
63
+ export interface ServicesSide {
64
+ exposedServices(): ServicesImpl;
65
+ processCallStart(fnCallNum: number, path: string[] | undefined, body: EnvelopeBody): void;
66
+ processCallCancelation(fnCallNum: number): void;
67
+ processListObj(fnCallNum: number, path: string[] | undefined): void;
68
+ processObjectDrop(path: string[] | undefined): void;
69
+ stop(): void;
70
+ }
55
71
  export interface ClientsSide {
56
72
  caller(): Caller;
57
73
  processInterimCallReply(fnCallNum: number, body: EnvelopeBody): void;
@@ -51,7 +51,7 @@ class ObjectsConnector {
51
51
  switch (side) {
52
52
  case 'core':
53
53
  this.services = makeServicesSide(sendMsg);
54
- this.clients = undefined;
54
+ this.clients = makeClientsSide(sendMsg, undefined, undefined);
55
55
  break;
56
56
  case "client":
57
57
  if ((!listObj && !listObjAsync)
@@ -59,35 +59,35 @@ class ObjectsConnector {
59
59
  throw new Error(`Client side needs either listObj, or listObjAsync argument`);
60
60
  }
61
61
  this.clients = makeClientsSide(sendMsg, listObj, listObjAsync);
62
- this.services = undefined;
62
+ this.services = makeServicesSide(sendMsg);
63
63
  break;
64
64
  }
65
65
  Object.seal(this);
66
66
  }
67
67
  static makeCoreSide(fromCore, toCore) {
68
68
  const connector = new ObjectsConnector('core', fromCore, toCore);
69
- const { exposeDroppableService, exposeStaticService, findRefIfAlreadyExposed, getObjForTransfer, getOriginalObj, listObj } = connector.services.exposedServices();
70
- let w3nIsSet = false;
69
+ const { exposeDroppableService, exposeW3NService, findRefIfAlreadyExposed, getObjForTransfer, getOriginalObj, listObj } = connector.services.exposedServices();
70
+ const { registerClientDrop, srvRefOf, startObservableCall, startPromiseCall } = connector.clients.caller();
71
71
  return {
72
72
  exposedServices: {
73
- exposeDroppableService,
74
- exposeW3NService: exp => {
75
- if (w3nIsSet) {
76
- throw new Error(`${exports.W3N_NAME} object has already been added`);
77
- }
78
- exposeStaticService(exports.W3N_NAME, exp);
79
- w3nIsSet = true;
80
- },
81
- findRefIfAlreadyExposed, getObjForTransfer,
82
- getOriginalObj, listObj
73
+ exposeDroppableService, exposeW3NService, findRefIfAlreadyExposed,
74
+ getObjForTransfer, getOriginalObj, listObj
75
+ },
76
+ caller: {
77
+ registerClientDrop, srvRefOf, startObservableCall, startPromiseCall
83
78
  },
84
79
  close: err => connector.close(err)
85
80
  };
86
81
  }
87
82
  static makeClientSide(fromClient, toClient, listObj, listObjAsync) {
88
83
  const connector = new ObjectsConnector('client', fromClient, toClient, listObj, listObjAsync);
84
+ const { exposeDroppableService, findRefIfAlreadyExposed, getObjForTransfer, getOriginalObj, exposeStaticService } = connector.services.exposedServices();
89
85
  return {
90
86
  caller: connector.clients.caller(),
87
+ exposedServices: {
88
+ exposeDroppableService, findRefIfAlreadyExposed, getObjForTransfer,
89
+ getOriginalObj, exposeStaticService
90
+ },
91
91
  close: err => connector.close(err)
92
92
  };
93
93
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "core-3nweb-client-lib",
3
- "version": "0.32.1",
3
+ "version": "0.34.0",
4
4
  "description": "3NWeb client core library, embeddable into different environments",
5
5
  "main": "build/lib-index.js",
6
6
  "types": "build/lib-index.d.ts",