@noxfly/noxus 1.2.0 → 2.0.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.
package/dist/main.js CHANGED
@@ -56,6 +56,7 @@ __export(main_exports, {
56
56
  NotFoundException: () => NotFoundException,
57
57
  NotImplementedException: () => NotImplementedException,
58
58
  NoxApp: () => NoxApp,
59
+ NoxRendererClient: () => NoxRendererClient,
59
60
  NoxSocket: () => NoxSocket,
60
61
  Patch: () => Patch,
61
62
  PaymentRequiredException: () => PaymentRequiredException,
@@ -77,6 +78,7 @@ __export(main_exports, {
77
78
  VariantAlsoNegotiatesException: () => VariantAlsoNegotiatesException,
78
79
  bootstrapApplication: () => bootstrapApplication,
79
80
  createRendererEventMessage: () => createRendererEventMessage,
81
+ exposeNoxusBridge: () => exposeNoxusBridge,
80
82
  getControllerMetadata: () => getControllerMetadata,
81
83
  getGuardForController: () => getGuardForController,
82
84
  getGuardForControllerAction: () => getGuardForControllerAction,
@@ -85,6 +87,7 @@ __export(main_exports, {
85
87
  getMiddlewaresForControllerAction: () => getMiddlewaresForControllerAction,
86
88
  getModuleMetadata: () => getModuleMetadata,
87
89
  getRouteMetadata: () => getRouteMetadata,
90
+ hasInjectableMetadata: () => hasInjectableMetadata,
88
91
  inject: () => inject,
89
92
  isRendererEventMessage: () => isRendererEventMessage
90
93
  });
@@ -397,6 +400,21 @@ function getGuardForControllerAction(controllerName, actionName) {
397
400
  __name(getGuardForControllerAction, "getGuardForControllerAction");
398
401
  var authorizations = /* @__PURE__ */ new Map();
399
402
 
403
+ // src/decorators/injectable.metadata.ts
404
+ var INJECTABLE_METADATA_KEY = Symbol("INJECTABLE_METADATA_KEY");
405
+ function defineInjectableMetadata(target, lifetime) {
406
+ Reflect.defineMetadata(INJECTABLE_METADATA_KEY, lifetime, target);
407
+ }
408
+ __name(defineInjectableMetadata, "defineInjectableMetadata");
409
+ function getInjectableMetadata(target) {
410
+ return Reflect.getMetadata(INJECTABLE_METADATA_KEY, target);
411
+ }
412
+ __name(getInjectableMetadata, "getInjectableMetadata");
413
+ function hasInjectableMetadata(target) {
414
+ return Reflect.hasMetadata(INJECTABLE_METADATA_KEY, target);
415
+ }
416
+ __name(hasInjectableMetadata, "hasInjectableMetadata");
417
+
400
418
  // src/decorators/method.decorator.ts
401
419
  function createRouteDecorator(verb) {
402
420
  return (path) => {
@@ -644,16 +662,11 @@ function Injectable(lifetime = "scope") {
644
662
  if (typeof target !== "function" || !target.prototype) {
645
663
  throw new Error(`@Injectable can only be used on classes, not on ${typeof target}`);
646
664
  }
647
- Reflect.defineMetadata(INJECTABLE_METADATA_KEY, lifetime, target);
665
+ defineInjectableMetadata(target, lifetime);
648
666
  InjectorExplorer.register(target, lifetime);
649
667
  };
650
668
  }
651
669
  __name(Injectable, "Injectable");
652
- function getInjectableMetadata(target) {
653
- return Reflect.getMetadata(INJECTABLE_METADATA_KEY, target);
654
- }
655
- __name(getInjectableMetadata, "getInjectableMetadata");
656
- var INJECTABLE_METADATA_KEY = Symbol("INJECTABLE_METADATA_KEY");
657
670
 
658
671
  // src/decorators/controller.decorator.ts
659
672
  function Controller(path) {
@@ -707,8 +720,9 @@ var middlewares = /* @__PURE__ */ new Map();
707
720
  // src/request.ts
708
721
  var import_reflect_metadata2 = require("reflect-metadata");
709
722
  var _Request = class _Request {
710
- constructor(event, id, method, path, body) {
723
+ constructor(event, senderId, id, method, path, body) {
711
724
  __publicField(this, "event");
725
+ __publicField(this, "senderId");
712
726
  __publicField(this, "id");
713
727
  __publicField(this, "method");
714
728
  __publicField(this, "path");
@@ -716,6 +730,7 @@ var _Request = class _Request {
716
730
  __publicField(this, "context", RootInjector.createScope());
717
731
  __publicField(this, "params", {});
718
732
  this.event = event;
733
+ this.senderId = senderId;
719
734
  this.id = id;
720
735
  this.method = method;
721
736
  this.path = path;
@@ -1051,7 +1066,7 @@ var _Router = class _Router {
1051
1066
  const batchResponses = [];
1052
1067
  for (const [index, item] of payload.requests.entries()) {
1053
1068
  const subRequestId = item.requestId ?? `${request.id}:${index}`;
1054
- const atomicRequest = new Request(request.event, subRequestId, item.method, item.path, item.body);
1069
+ const atomicRequest = new Request(request.event, request.senderId, subRequestId, item.method, item.path, item.body);
1055
1070
  batchResponses.push(await this.handleAtomic(atomicRequest));
1056
1071
  }
1057
1072
  response.body.responses = batchResponses;
@@ -1271,20 +1286,23 @@ function _ts_decorate2(decorators, target, key, desc) {
1271
1286
  __name(_ts_decorate2, "_ts_decorate");
1272
1287
  var _NoxSocket = class _NoxSocket {
1273
1288
  constructor() {
1274
- __publicField(this, "messagePorts", /* @__PURE__ */ new Map());
1289
+ __publicField(this, "channels", /* @__PURE__ */ new Map());
1275
1290
  }
1276
- register(senderId, channel) {
1277
- this.messagePorts.set(senderId, channel);
1291
+ register(senderId, requestChannel, socketChannel) {
1292
+ this.channels.set(senderId, {
1293
+ request: requestChannel,
1294
+ socket: socketChannel
1295
+ });
1278
1296
  }
1279
1297
  get(senderId) {
1280
- return this.messagePorts.get(senderId);
1298
+ return this.channels.get(senderId);
1281
1299
  }
1282
1300
  unregister(senderId) {
1283
- this.messagePorts.delete(senderId);
1301
+ this.channels.delete(senderId);
1284
1302
  }
1285
1303
  getSenderIds() {
1286
1304
  return [
1287
- ...this.messagePorts.keys()
1305
+ ...this.channels.keys()
1288
1306
  ];
1289
1307
  }
1290
1308
  emit(eventName, payload, targetSenderIds) {
@@ -1295,13 +1313,13 @@ var _NoxSocket = class _NoxSocket {
1295
1313
  const recipients = targetSenderIds ?? this.getSenderIds();
1296
1314
  let delivered = 0;
1297
1315
  for (const senderId of recipients) {
1298
- const channel = this.messagePorts.get(senderId);
1316
+ const channel = this.channels.get(senderId);
1299
1317
  if (!channel) {
1300
1318
  Logger.warn(`No message channel found for sender ID: ${senderId} while emitting "${normalizedEvent}".`);
1301
1319
  continue;
1302
1320
  }
1303
1321
  try {
1304
- channel.port1.postMessage(createRendererEventMessage(normalizedEvent, payload));
1322
+ channel.socket.port1.postMessage(createRendererEventMessage(normalizedEvent, payload));
1305
1323
  delivered++;
1306
1324
  } catch (error) {
1307
1325
  Logger.error(`[Noxus] Failed to emit "${normalizedEvent}" to sender ${senderId}.`, error);
@@ -1338,17 +1356,20 @@ var _NoxApp = class _NoxApp {
1338
1356
  __publicField(this, "router");
1339
1357
  __publicField(this, "socket");
1340
1358
  __publicField(this, "app");
1359
+ /**
1360
+ *
1361
+ */
1341
1362
  __publicField(this, "onRendererMessage", /* @__PURE__ */ __name(async (event) => {
1342
1363
  const { senderId, requestId, path, method, body } = event.data;
1343
- const channel = this.socket.get(senderId);
1344
- if (!channel) {
1364
+ const channels = this.socket.get(senderId);
1365
+ if (!channels) {
1345
1366
  Logger.error(`No message channel found for sender ID: ${senderId}`);
1346
1367
  return;
1347
1368
  }
1348
1369
  try {
1349
- const request = new Request(event, requestId, method, path, body);
1370
+ const request = new Request(event, senderId, requestId, method, path, body);
1350
1371
  const response = await this.router.handle(request);
1351
- channel.port1.postMessage(response);
1372
+ channels.request.port1.postMessage(response);
1352
1373
  } catch (err) {
1353
1374
  const response = {
1354
1375
  requestId,
@@ -1356,7 +1377,7 @@ var _NoxApp = class _NoxApp {
1356
1377
  body: null,
1357
1378
  error: err.message || "Internal Server Error"
1358
1379
  };
1359
- channel.port1.postMessage(response);
1380
+ channels.request.port1.postMessage(response);
1360
1381
  }
1361
1382
  }, "onRendererMessage"));
1362
1383
  this.router = router;
@@ -1385,14 +1406,17 @@ var _NoxApp = class _NoxApp {
1385
1406
  if (this.socket.get(senderId)) {
1386
1407
  this.shutdownChannel(senderId);
1387
1408
  }
1388
- const channel = new import_main.MessageChannelMain();
1389
- channel.port1.on("message", this.onRendererMessage);
1390
- channel.port1.start();
1391
- this.socket.register(senderId, channel);
1409
+ const requestChannel = new import_main.MessageChannelMain();
1410
+ const socketChannel = new import_main.MessageChannelMain();
1411
+ requestChannel.port1.on("message", this.onRendererMessage);
1412
+ requestChannel.port1.start();
1413
+ socketChannel.port1.start();
1414
+ this.socket.register(senderId, requestChannel, socketChannel);
1392
1415
  event.sender.postMessage("port", {
1393
1416
  senderId
1394
1417
  }, [
1395
- channel.port2
1418
+ requestChannel.port2,
1419
+ socketChannel.port2
1396
1420
  ]);
1397
1421
  }
1398
1422
  /**
@@ -1411,14 +1435,16 @@ var _NoxApp = class _NoxApp {
1411
1435
  * @param remove - Whether to remove the channel from the messagePorts map.
1412
1436
  */
1413
1437
  shutdownChannel(channelSenderId) {
1414
- const channel = this.socket.get(channelSenderId);
1415
- if (!channel) {
1438
+ const channels = this.socket.get(channelSenderId);
1439
+ if (!channels) {
1416
1440
  Logger.warn(`No message channel found for sender ID: ${channelSenderId}`);
1417
1441
  return;
1418
1442
  }
1419
- channel.port1.off("message", this.onRendererMessage);
1420
- channel.port1.close();
1421
- channel.port2.close();
1443
+ channels.request.port1.off("message", this.onRendererMessage);
1444
+ channels.request.port1.close();
1445
+ channels.request.port2.close();
1446
+ channels.socket.port1.close();
1447
+ channels.socket.port2.close();
1422
1448
  this.socket.unregister(channelSenderId);
1423
1449
  }
1424
1450
  /**
@@ -1489,6 +1515,42 @@ async function bootstrapApplication(rootModule) {
1489
1515
  }
1490
1516
  __name(bootstrapApplication, "bootstrapApplication");
1491
1517
 
1518
+ // src/preload-bridge.ts
1519
+ var import_renderer = require("electron/renderer");
1520
+ var DEFAULT_EXPOSE_NAME = "noxus";
1521
+ var DEFAULT_INIT_EVENT = "init-port";
1522
+ var DEFAULT_REQUEST_CHANNEL = "gimme-my-port";
1523
+ var DEFAULT_RESPONSE_CHANNEL = "port";
1524
+ function exposeNoxusBridge(options = {}) {
1525
+ const { exposeAs = DEFAULT_EXPOSE_NAME, initMessageType = DEFAULT_INIT_EVENT, requestChannel = DEFAULT_REQUEST_CHANNEL, responseChannel = DEFAULT_RESPONSE_CHANNEL, targetWindow = window } = options;
1526
+ const api = {
1527
+ requestPort: /* @__PURE__ */ __name(() => {
1528
+ import_renderer.ipcRenderer.send(requestChannel);
1529
+ import_renderer.ipcRenderer.once(responseChannel, (event, message) => {
1530
+ const ports = (event.ports ?? []).filter((port) => port !== void 0);
1531
+ if (ports.length === 0) {
1532
+ console.error("[Noxus] No MessagePort received from main process.");
1533
+ return;
1534
+ }
1535
+ for (const port of ports) {
1536
+ try {
1537
+ port.start();
1538
+ } catch (error) {
1539
+ console.error("[Noxus] Failed to start MessagePort.", error);
1540
+ }
1541
+ }
1542
+ targetWindow.postMessage({
1543
+ type: initMessageType,
1544
+ senderId: message?.senderId
1545
+ }, "*", ports);
1546
+ });
1547
+ }, "requestPort")
1548
+ };
1549
+ import_renderer.contextBridge.exposeInMainWorld(exposeAs, api);
1550
+ return api;
1551
+ }
1552
+ __name(exposeNoxusBridge, "exposeNoxusBridge");
1553
+
1492
1554
  // src/renderer-events.ts
1493
1555
  var _RendererEventRegistry = class _RendererEventRegistry {
1494
1556
  constructor() {
@@ -1568,6 +1630,252 @@ var _RendererEventRegistry = class _RendererEventRegistry {
1568
1630
  };
1569
1631
  __name(_RendererEventRegistry, "RendererEventRegistry");
1570
1632
  var RendererEventRegistry = _RendererEventRegistry;
1633
+
1634
+ // src/renderer-client.ts
1635
+ var DEFAULT_INIT_EVENT2 = "init-port";
1636
+ var DEFAULT_BRIDGE_NAMES = [
1637
+ "noxus",
1638
+ "ipcRenderer"
1639
+ ];
1640
+ function defaultRequestId() {
1641
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
1642
+ return crypto.randomUUID();
1643
+ }
1644
+ return `${Date.now().toString(16)}-${Math.floor(Math.random() * 1e8).toString(16)}`;
1645
+ }
1646
+ __name(defaultRequestId, "defaultRequestId");
1647
+ function normalizeBridgeNames(preferred) {
1648
+ const names = [];
1649
+ const add = /* @__PURE__ */ __name((name) => {
1650
+ if (!name) return;
1651
+ if (!names.includes(name)) {
1652
+ names.push(name);
1653
+ }
1654
+ }, "add");
1655
+ if (Array.isArray(preferred)) {
1656
+ for (const name of preferred) {
1657
+ add(name);
1658
+ }
1659
+ } else {
1660
+ add(preferred);
1661
+ }
1662
+ for (const fallback of DEFAULT_BRIDGE_NAMES) {
1663
+ add(fallback);
1664
+ }
1665
+ return names;
1666
+ }
1667
+ __name(normalizeBridgeNames, "normalizeBridgeNames");
1668
+ function resolveBridgeFromWindow(windowRef, preferred) {
1669
+ const names = normalizeBridgeNames(preferred);
1670
+ const globalRef = windowRef;
1671
+ if (!globalRef) {
1672
+ return null;
1673
+ }
1674
+ for (const name of names) {
1675
+ const candidate = globalRef[name];
1676
+ if (candidate && typeof candidate.requestPort === "function") {
1677
+ return candidate;
1678
+ }
1679
+ }
1680
+ return null;
1681
+ }
1682
+ __name(resolveBridgeFromWindow, "resolveBridgeFromWindow");
1683
+ var _NoxRendererClient = class _NoxRendererClient {
1684
+ constructor(options = {}) {
1685
+ __publicField(this, "events", new RendererEventRegistry());
1686
+ __publicField(this, "pendingRequests", /* @__PURE__ */ new Map());
1687
+ __publicField(this, "requestPort");
1688
+ __publicField(this, "socketPort");
1689
+ __publicField(this, "senderId");
1690
+ __publicField(this, "bridge");
1691
+ __publicField(this, "initMessageType");
1692
+ __publicField(this, "windowRef");
1693
+ __publicField(this, "generateRequestId");
1694
+ __publicField(this, "isReady", false);
1695
+ __publicField(this, "setupPromise");
1696
+ __publicField(this, "setupResolve");
1697
+ __publicField(this, "setupReject");
1698
+ __publicField(this, "onWindowMessage", /* @__PURE__ */ __name((event) => {
1699
+ if (event.data?.type !== this.initMessageType) {
1700
+ return;
1701
+ }
1702
+ if (!Array.isArray(event.ports) || event.ports.length < 2) {
1703
+ const error = new Error("[Noxus] Renderer expected two MessagePorts (request + socket).");
1704
+ console.error(error);
1705
+ this.setupReject?.(error);
1706
+ this.resetSetupState();
1707
+ return;
1708
+ }
1709
+ this.windowRef.removeEventListener("message", this.onWindowMessage);
1710
+ this.requestPort = event.ports[0];
1711
+ this.socketPort = event.ports[1];
1712
+ this.senderId = event.data.senderId;
1713
+ if (this.requestPort === void 0 || this.socketPort === void 0) {
1714
+ const error = new Error("[Noxus] Renderer failed to receive valid MessagePorts.");
1715
+ console.error(error);
1716
+ this.setupReject?.(error);
1717
+ this.resetSetupState();
1718
+ return;
1719
+ }
1720
+ this.attachRequestPort(this.requestPort);
1721
+ this.attachSocketPort(this.socketPort);
1722
+ this.isReady = true;
1723
+ this.setupResolve?.();
1724
+ this.resetSetupState(true);
1725
+ }, "onWindowMessage"));
1726
+ __publicField(this, "onSocketMessage", /* @__PURE__ */ __name((event) => {
1727
+ if (this.events.tryDispatchFromMessageEvent(event)) {
1728
+ return;
1729
+ }
1730
+ console.warn("[Noxus] Received a socket message that is not a renderer event payload.", event.data);
1731
+ }, "onSocketMessage"));
1732
+ __publicField(this, "onRequestMessage", /* @__PURE__ */ __name((event) => {
1733
+ if (this.events.tryDispatchFromMessageEvent(event)) {
1734
+ return;
1735
+ }
1736
+ const response = event.data;
1737
+ if (!response || typeof response.requestId !== "string") {
1738
+ console.error("[Noxus] Renderer received an invalid response payload.", response);
1739
+ return;
1740
+ }
1741
+ const pending = this.pendingRequests.get(response.requestId);
1742
+ if (!pending) {
1743
+ console.error(`[Noxus] No pending handler found for request ${response.requestId}.`);
1744
+ return;
1745
+ }
1746
+ this.pendingRequests.delete(response.requestId);
1747
+ this.onRequestCompleted(pending, response);
1748
+ if (response.status >= 400) {
1749
+ pending.reject(response);
1750
+ return;
1751
+ }
1752
+ pending.resolve(response.body);
1753
+ }, "onRequestMessage"));
1754
+ this.windowRef = options.windowRef ?? window;
1755
+ const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);
1756
+ this.bridge = resolvedBridge ?? null;
1757
+ this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT2;
1758
+ this.generateRequestId = options.generateRequestId ?? defaultRequestId;
1759
+ }
1760
+ async setup() {
1761
+ if (this.isReady) {
1762
+ return Promise.resolve();
1763
+ }
1764
+ if (this.setupPromise) {
1765
+ return this.setupPromise;
1766
+ }
1767
+ if (!this.bridge || typeof this.bridge.requestPort !== "function") {
1768
+ throw new Error("[Noxus] Renderer bridge is missing requestPort().");
1769
+ }
1770
+ this.setupPromise = new Promise((resolve, reject) => {
1771
+ this.setupResolve = resolve;
1772
+ this.setupReject = reject;
1773
+ });
1774
+ this.windowRef.addEventListener("message", this.onWindowMessage);
1775
+ this.bridge.requestPort();
1776
+ return this.setupPromise;
1777
+ }
1778
+ dispose() {
1779
+ this.windowRef.removeEventListener("message", this.onWindowMessage);
1780
+ this.requestPort?.close();
1781
+ this.socketPort?.close();
1782
+ this.requestPort = void 0;
1783
+ this.socketPort = void 0;
1784
+ this.senderId = void 0;
1785
+ this.isReady = false;
1786
+ this.pendingRequests.clear();
1787
+ }
1788
+ async request(request) {
1789
+ const senderId = this.senderId;
1790
+ const requestId = this.generateRequestId();
1791
+ if (senderId === void 0) {
1792
+ return Promise.reject(this.createErrorResponse(requestId, "MessagePort is not available"));
1793
+ }
1794
+ const readinessError = this.validateReady(requestId);
1795
+ if (readinessError) {
1796
+ return Promise.reject(readinessError);
1797
+ }
1798
+ const message = {
1799
+ requestId,
1800
+ senderId,
1801
+ ...request
1802
+ };
1803
+ return new Promise((resolve, reject) => {
1804
+ const pending = {
1805
+ resolve,
1806
+ reject: /* @__PURE__ */ __name((response) => reject(response), "reject"),
1807
+ request: message,
1808
+ submittedAt: Date.now()
1809
+ };
1810
+ this.pendingRequests.set(message.requestId, pending);
1811
+ this.requestPort.postMessage(message);
1812
+ });
1813
+ }
1814
+ async batch(requests) {
1815
+ return this.request({
1816
+ method: "BATCH",
1817
+ path: "",
1818
+ body: {
1819
+ requests
1820
+ }
1821
+ });
1822
+ }
1823
+ getSenderId() {
1824
+ return this.senderId;
1825
+ }
1826
+ onRequestCompleted(pending, response) {
1827
+ if (typeof console.groupCollapsed === "function") {
1828
+ console.groupCollapsed(`${response.status} ${pending.request.method} /${pending.request.path}`);
1829
+ }
1830
+ if (response.error) {
1831
+ console.error("error message:", response.error);
1832
+ }
1833
+ if (response.body !== void 0) {
1834
+ console.info("response:", response.body);
1835
+ }
1836
+ console.info("request:", pending.request);
1837
+ console.info(`Request duration: ${Date.now() - pending.submittedAt} ms`);
1838
+ if (typeof console.groupCollapsed === "function") {
1839
+ console.groupEnd();
1840
+ }
1841
+ }
1842
+ attachRequestPort(port) {
1843
+ port.onmessage = this.onRequestMessage;
1844
+ port.start();
1845
+ }
1846
+ attachSocketPort(port) {
1847
+ port.onmessage = this.onSocketMessage;
1848
+ port.start();
1849
+ }
1850
+ validateReady(requestId) {
1851
+ if (!this.isElectronEnvironment()) {
1852
+ return this.createErrorResponse(requestId, "Not running in Electron environment");
1853
+ }
1854
+ if (!this.requestPort) {
1855
+ return this.createErrorResponse(requestId, "MessagePort is not available");
1856
+ }
1857
+ return void 0;
1858
+ }
1859
+ createErrorResponse(requestId, message) {
1860
+ return {
1861
+ status: 500,
1862
+ requestId,
1863
+ error: message
1864
+ };
1865
+ }
1866
+ resetSetupState(success = false) {
1867
+ if (!success) {
1868
+ this.setupPromise = void 0;
1869
+ }
1870
+ this.setupResolve = void 0;
1871
+ this.setupReject = void 0;
1872
+ }
1873
+ isElectronEnvironment() {
1874
+ return typeof window !== "undefined" && /Electron/.test(window.navigator.userAgent);
1875
+ }
1876
+ };
1877
+ __name(_NoxRendererClient, "NoxRendererClient");
1878
+ var NoxRendererClient = _NoxRendererClient;
1571
1879
  // Annotate the CommonJS export names for ESM import in node:
1572
1880
  0 && (module.exports = {
1573
1881
  AppInjector,
@@ -1598,6 +1906,7 @@ var RendererEventRegistry = _RendererEventRegistry;
1598
1906
  NotFoundException,
1599
1907
  NotImplementedException,
1600
1908
  NoxApp,
1909
+ NoxRendererClient,
1601
1910
  NoxSocket,
1602
1911
  Patch,
1603
1912
  PaymentRequiredException,
@@ -1619,6 +1928,7 @@ var RendererEventRegistry = _RendererEventRegistry;
1619
1928
  VariantAlsoNegotiatesException,
1620
1929
  bootstrapApplication,
1621
1930
  createRendererEventMessage,
1931
+ exposeNoxusBridge,
1622
1932
  getControllerMetadata,
1623
1933
  getGuardForController,
1624
1934
  getGuardForControllerAction,
@@ -1627,6 +1937,7 @@ var RendererEventRegistry = _RendererEventRegistry;
1627
1937
  getMiddlewaresForControllerAction,
1628
1938
  getModuleMetadata,
1629
1939
  getRouteMetadata,
1940
+ hasInjectableMetadata,
1630
1941
  inject,
1631
1942
  isRendererEventMessage
1632
1943
  });