socket-function 0.10.3 → 0.10.4

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.
package/SocketFunction.ts CHANGED
@@ -65,6 +65,7 @@ export class SocketFunction {
65
65
  Shape extends SocketExposedShape<{
66
66
  [key in keyof ClassInstance]: (...args: any[]) => Promise<unknown>;
67
67
  }>,
68
+ Statics
68
69
  >(
69
70
  classGuid: string,
70
71
  instance: ClassInstance,
@@ -75,8 +76,9 @@ export class SocketFunction {
75
76
  config?: {
76
77
  /** @noAutoExpose If true SocketFunction.expose(Controller) must be called explicitly. */
77
78
  noAutoExpose?: boolean;
79
+ statics?: Statics;
78
80
  }
79
- ): SocketRegistered<ExtractShape<ClassInstance, Shape>> {
81
+ ): SocketRegistered<ExtractShape<ClassInstance, Shape>> & Statics {
80
82
  let getDefaultHooks = defaultHooksFnc && lazy(defaultHooksFnc);
81
83
  const getShape = lazy(() => {
82
84
  let shape = shapeFnc() as SocketExposedShape;
@@ -146,7 +148,7 @@ export class SocketFunction {
146
148
  if (!config?.noAutoExpose) {
147
149
  this.expose(result);
148
150
  }
149
- return result;
151
+ return Object.assign(result, config?.statics);
150
152
  }
151
153
 
152
154
  public static onNextDisconnect(nodeId: string, callback: () => void) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "socket-function",
3
- "version": "0.10.3",
3
+ "version": "0.10.4",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "note1": "note on node-forge fork, see https://github.com/digitalbazaar/forge/issues/744 for details",
@@ -64,6 +64,8 @@ const requireSeqNumProcessId = "requireSeqNumProcessId_" + Date.now() + "_" + Ma
64
64
  const htmlFile = isNodeTrue() && fs.readFileSync(__dirname + "/require.html").toString();
65
65
  const jsFile = isNodeTrue() && fs.readFileSync(__dirname + "/require.js").toString();
66
66
  const bufferShim = isNodeTrue() && fs.readFileSync(__dirname + "/buffer.js").toString();
67
+ const BEFORE_ENTRY_TEMPLATE = "<!-- BEFORE_ENTRY_TEMPLATE -->";
68
+ const ENTRY_TEMPLATE = "<!-- ENTRY_TEMPLATE -->";
67
69
 
68
70
  const resolvedHTMLFile = isNodeTrue() && (
69
71
  htmlFile
@@ -71,13 +73,30 @@ const resolvedHTMLFile = isNodeTrue() && (
71
73
  .replace(`<script src="./require.js"></script>`, `<script>${jsFile}</script>`)
72
74
  );
73
75
 
76
+ let beforeEntryText: string[] = [];
77
+ function injectHTMLBeforeStartup(text: string) {
78
+ beforeEntryText.push(text);
79
+ }
80
+
81
+ type GetModulesResult = ReturnType<RequireControllerBase["getModules"]> extends Promise<infer T> ? T : never;
82
+ type GetModulesArgs = Parameters<RequireControllerBase["getModules"]>;
83
+ let mapGetModules: {
84
+ remap(result: GetModulesResult, args: GetModulesArgs): Promise<GetModulesResult>
85
+ }[] = [];
86
+ function addMapGetModules(remap: typeof mapGetModules[number]["remap"]) {
87
+ mapGetModules.push({ remap });
88
+ }
89
+
74
90
  class RequireControllerBase {
75
91
  public rootResolvePath = "";
76
92
 
77
93
  public async requireHTML(bootRequirePath?: string) {
78
94
  let result = resolvedHTMLFile;
95
+ if (beforeEntryText.length > 0) {
96
+ result = result.replace(BEFORE_ENTRY_TEMPLATE, beforeEntryText.join("\n"));
97
+ }
79
98
  if (bootRequirePath) {
80
- result = result.replace(`<!-- ENTRY_TEMPLATE -->`, `<script>require(${JSON.stringify(bootRequirePath)});</script>`);
99
+ result = result.replace(ENTRY_TEMPLATE, `<script>require(${JSON.stringify(bootRequirePath)});</script>`);
81
100
  }
82
101
  return setHTTPResultHeaders(Buffer.from(result), { "Content-Type": "text/html" });
83
102
  }
@@ -101,6 +120,7 @@ class RequireControllerBase {
101
120
  e?: number;
102
121
  }[];
103
122
  },
123
+ config?: {}
104
124
  ): Promise<{
105
125
  requestsResolvedPaths: string[];
106
126
  modules: {
@@ -232,10 +252,21 @@ class RequireControllerBase {
232
252
  addModule(clientModule, true);
233
253
  }
234
254
 
235
- return { requestsResolvedPaths, modules, requireSeqNumProcessId };
255
+ let result: GetModulesResult = { requestsResolvedPaths, modules, requireSeqNumProcessId };
256
+ for (let remap of mapGetModules) {
257
+ result = await remap.remap(result, [pathRequests, alreadyHave, config]);
258
+ }
259
+ return result;
236
260
  }
237
261
  }
238
262
 
263
+ type ClientRemapCallback = (args: GetModulesArgs) => Promise<GetModulesArgs>;
264
+ declare global {
265
+ /** Must be set clientside BEFORE requests are made (so you likely want to use RequireController.addMapGetModules
266
+ * to inject code that will use this) */
267
+ var remapImportRequestsClientside: undefined | ClientRemapCallback[];
268
+ }
269
+
239
270
  let baseController = new RequireControllerBase();
240
271
  export function setRequireBootRequire(path: string) {
241
272
  baseController.rootResolvePath = path;
@@ -252,6 +283,10 @@ export const RequireController = SocketFunction.register(
252
283
  }),
253
284
  undefined,
254
285
  {
255
- noAutoExpose: true
286
+ noAutoExpose: true,
287
+ statics: {
288
+ injectHTMLBeforeStartup,
289
+ addMapGetModules,
290
+ }
256
291
  }
257
292
  );
@@ -9,6 +9,7 @@
9
9
  <script src="./buffer.js"></script>
10
10
  <script src="./require.js"></script>
11
11
 
12
+ <!-- BEFORE_ENTRY_TEMPLATE -->
12
13
  <!-- ENTRY_TEMPLATE -->
13
14
  </body>
14
15
  </html>
@@ -166,6 +166,12 @@
166
166
  args.push(true);
167
167
  }
168
168
  let requestUrl = location.origin + location.pathname + `?classGuid=RequireController-e2f811f3-14b8-4759-b0d6-73f14516cf1d&functionName=getModules`;
169
+ let remapImportRequestsClientside = globalThis.remapImportRequestsClientside;
170
+ if (remapImportRequestsClientside) {
171
+ for (let fnc of remapImportRequestsClientside) {
172
+ args = await fnc(args);
173
+ }
174
+ }
169
175
  let rawText = await requestText(requestUrl, { args });
170
176
  let resultObj;
171
177
  try {