arkos 1.7.5-rc → 1.7.6-rc

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.
@@ -136,9 +136,6 @@ class IArkosGateway {
136
136
  const errorHandlers = resolvedHooks
137
137
  .filter((h) => h.type === "error")
138
138
  .map((h) => h.handler);
139
- for (const middleware of resolvedMiddlewares) {
140
- ns.use((socket, next) => middleware(socket, next));
141
- }
142
139
  if (resolvedAuth && (0, arkos_config_helpers_1.isAuthenticationEnabled)()) {
143
140
  ns.use(async (socket, next) => {
144
141
  socket = socket;
@@ -173,6 +170,9 @@ class IArkosGateway {
173
170
  throw (0, exit_error_1.default)(`Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : ""} without choosing an authentication mode under arkos.config.${(0, fs_helpers_1.getUserFileExtension)()}.
174
171
 
175
172
  For further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`);
173
+ for (const middleware of resolvedMiddlewares) {
174
+ ns.use((socket, next) => middleware(socket, next));
175
+ }
176
176
  ns.on("connection", async (s) => {
177
177
  const socket = s;
178
178
  socket.locals = {};
@@ -1 +1 @@
1
- {"version":3,"file":"arkos-gateway.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/arkos-gateway.ts"],"names":[],"mappings":";;;;;;AAkBA,qDAAwE;AACxE,uDAA+E;AAC/E,6CAKyB;AACzB,qGAA0E;AAC1E,yCAA8C;AAC9C,mGAA0E;AAC1E,oFAAiF;AACjF,iGAAwE;AACxE,4FAA6D;AAC7D,uEAAmE;AACnE,2DAA6F;AAC7F,mFAGkD;AAClD,gFAAuD;AACvD,+DAAsE;AACtE,qEAGkD;AAElD,MAAa,aAAa;IAYxB,YAAY,MAA0B;QAV9B,WAAM,GAA6B,EAAE,CAAC;QACtC,UAAK,GAAuB,EAAE,CAAC;QAC/B,gBAAW,GAA6B,EAAE,CAAC;QAC3C,aAAQ,GAAoB,EAAE,CAAC;QAC/B,UAAK,GAGP,EAAE,CAAC;QAIP,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;IACjD,CAAC;IAED,IAAI,GAAG;QACL,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC1E,OAAO,IAAI,8CAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAQ,CAAC;IAC7E,CAAC;IAgBD,GAAG,CAAC,GAAG,mBAAkE;QACvE,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;YACvC,IAAI,IAAI,YAAY,aAAa,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAA8B,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,8GAA8G,OAAO,IAAI,IAAI,CAC9H,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAyBD,IAAI,CACF,UAA+D,EAC/D,EAAqB;QAErB,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAC3C,CAAC;YACF,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAS;oBAC3D,OAAO,EAAE,IAAW;oBACpB,KAAK,EAAE,CAAC,EAAE,CAAC;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,iIAAiI,CAClI,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAcD,EAAE,CACA,WAA6C,EAC7C,OAA4B;QAE5B,IAAI,WAAW,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEtC,IAAI,WAAW,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CACb,UAAU,WAAW,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,wCAAwC;gBAC5F,kHAAkH,CACnH,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,MAAc,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAC3E,CAAC;QAEF,MAAM,KAAK,GAA2B;YACpC,MAAM,EAAE,WAAW;YACnB,OAAO;YACP,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;SACnD,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,OAAO,WAAW,EAAE,aAAa,IAAI,QAAQ;YAE9C,WAAW,CAAC,aAAqB,CAAC,WAAW,GAAG,4BAAiB,CAAC,GAAG,CACpE,WAAW,CAAC,aAAc,CAAC,MAAM,EACjC,WAAW,CAAC,aAAc,CAAC,QAAQ,EACnC;gBACE,CAAC,WAAW,CAAC,aAAc,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,aAAa,EAAE,IAAI;aACrE,CACF,CAAC;QAEJ,OAAO,IAAI,CAAC;IACd,CAAC;IAsBD,IAAI,CACF,IAA0B,EAC1B,OAAiE;QAEjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAWD,QAAQ,CAAC,EAAU,EAAE,UAAuC,EAAE;QAC5D,IAAK,EAAU,CAAC,uBAAuB;YACrC,MAAM,IAAI,KAAK,CACb,iLAAiL,CAClL,CAAC;QACH,EAAU,CAAC,uBAAuB,GAAG,IAAI,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAEO,SAAS,CACf,EAAU,EACV,YAAiC,EACjC,iBAGM,EAAE,EACR,iBAAqC,EAAE,EACvC,UAAuC,EAAE,EACzC,uBAAiD,EAAE;QAEnD,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,0CAAmB,CAAC;QACrD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAE1B,MAAM,UAAU,GAAG,YAAY,EAAE,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAA,0BAAS,EAAC,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;YACvD,UAAU,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;QAEhC,MAAM,aAAa,GAAG,UAAU;YAC9B,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;YAClE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAEpB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QAEf,MAAM,YAAY,GAChB,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,KAAK;YACpC,YAAY,EAAE,cAAc,KAAK,KAAK,CAAC;QAEzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,YAAY,EAAE,SAAS,CAAC;QAC3E,MAAM,aAAa,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,mBAAmB,GAAG,CAAC,GAAG,oBAAoB,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3E,MAAM,eAAe,GAAG,aAAa;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAwC,CAAC,CAAC;QAE1D,MAAM,kBAAkB,GAAG,aAAa;aACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAwC,CAAC,CAAC;QAE1D,MAAM,aAAa,GAAG,aAAa;aAChC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAmC,CAAC,CAAC;QAErD,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE,CAAC;YAC7C,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAqB,EAAE,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,YAAY,IAAI,IAAA,8CAAuB,GAAE,EAAE,CAAC;YAC9C,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,MAAW,EAAE,IAAI,EAAE,EAAE;gBACjC,MAAM,GAAG,MAAqB,CAAC;gBAC/B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,4BAAe,CAAC,eAAe,CACnC;wBACE,OAAO,EAAE,MAAM;wBACf,IAAI,EAAE,CAAC,GAAS,EAAE,EAAE;4BAClB,IAAI,GAAG;gCAAE,MAAM,GAAG,CAAC;4BACnB,IAAI,EAAE,CAAC;wBACT,CAAC;qBACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;wBACf,MAAM,IAAI,GAAG,MAAM,sBAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;wBAC5D,IAAI,CAAC,IAAI;4BAAE,MAAM,uCAAkB,CAAC;wBACpC,OAAO,IAAI,CAAC;oBACd,CAAC,EACD,aAAa,CACd,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,IAAA,kCAAwB,EAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE;wBACnD,SAAS;wBACT,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;wBAC3B,KAAK,EAAE,gBAAgB;qBACxB,CAAC,CAAC;oBACH,IAAI,CAAC,GAAG,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IACL,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,YAAY,EAAE,cAAc,CAAC;YAC5D,CAAC,IAAA,4CAAqB,GAAE;YAExB,MAAM,IAAA,oBAAS,EACb,kCAAkC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,+DAA+D,IAAA,iCAAoB,GAAE;;sFAEtF,CAC/E,CAAC;QAEJ,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,CAAgB,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;YAEnB,MAAM,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;YACtD,IAAA,8CAA0B,EAAC,MAAM,CAAC,CAAC;YAEnC,IAAA,mCAAyB,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,mBAAmB,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAEjD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE;gBACxB,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;YAEtD,IAAI,CAAC;gBACH,KAAK,MAAM,OAAO,IAAI,eAAe;oBAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAA,kCAAwB,EAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;oBACxC,SAAS,EAAE,mBAAmB;oBAC9B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBAC3B,KAAK,EAAE,YAAY;iBACpB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBACjC,IAAA,mCAAyB,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAEvE,MAAM,IAAA,sCAAuB,EAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAChD,IAAI,CAAC;oBACH,KAAK,MAAM,OAAO,IAAI,kBAAkB;wBAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAA,kCAAwB,EAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;wBACxC,SAAS,EAAE,mBAAmB;wBAC9B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;wBAC3B,KAAK,EAAE,eAAe;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,IAAK,KAAK,CAAC,MAAc,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO;oBAAE,SAAS;gBAEhE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;gBAEvE,IACE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,YAAY,EAAE,cAAc,CAAC;oBAC5D,CAAC,IAAA,4CAAqB,GAAE;oBAExB,MAAM,IAAA,oBAAS,EACb,2CAA2C,WAAW,CAAC,KAAK,iEAAiE,IAAA,iCAAoB,GAAE;;sFAEzE,CAC3E,CAAC;gBAEJ,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;oBACpD,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;oBACnB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;oBACvC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBAEnB,MAAM,GAAG,GACP,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU;wBACzC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;wBACvB,CAAC,CAAC,SAAS,CAAC;oBAEhB,IAAI,SAAS,GAAG,KAAK,CAAC;oBACtB,MAAM,UAAU,GAAG,GAAG;wBACpB,CAAC,CAAC,CAAC,GAAG,QAAa,EAAE,EAAE;4BACrB,SAAS,GAAG,IAAI,CAAC;4BACjB,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;wBACnB,CAAC;wBACD,CAAC,CAAC,SAAS,CAAC;oBAEd,SAAS,YAAY;wBACnB,IACE,WAAW,CAAC,KAAK,KAAK,KAAK;4BAC3B,WAAW,CAAC,KAAK,KAAK,KAAK;4BAC3B,YAAY,EAAE,KAAK,KAAK,KAAK;4BAE7B,OAAO,IAAI,CAAC;wBAEd,OAAO;4BACL,OAAO,EAAE,IAAI;4BACb,GAAG,EAAE,IAAI;4BACT,GAAG,YAAY,EAAE,KAAK;4BACtB,GAAG,WAAW,EAAE,KAAK;4BACrB,GAAG,WAAW,EAAE,KAAK;yBACtB,CAAC;oBACJ,CAAC;oBAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;oBAEhC,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;wBAC/B,MAAM,cAAc,GAClB,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,IAAI,YAAY,EAAE,MAAM,CAAC;wBAEnE,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS;4BACnC,MAAM,IAAI,wBAAe,CACvB,kDAAkD,CACnD,CAAC;wBAEJ,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;4BACjC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAE3C,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gCAC/B,MAAM,IAAI,wBAAe,CACvB,8BAA8B,EAC9B,kBAAkB,CACnB,CAAC;4BACJ,CAAC;4BAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;4BAE7C,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;gCAChB,MAAM,IAAI,wBAAe,CACvB,4BAA4B,EAC5B,iBAAiB,CAClB,CAAC;4BAEJ,IAAI,cAAc,IAAI,GAAG,GAAG,cAAc,EAAE,CAAC;gCAC3C,MAAM,IAAI,wBAAe,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;4BAClE,CAAC;wBACH,CAAC;wBAED,IAAI,QAAQ,IAAI,QAAQ,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;4BAC5C,IAAI,CAAC,IAAI,EAAE,GAAG;gCACZ,MAAM,IAAI,wBAAe,CACvB,0DAA0D,EAC1D,uBAAuB,EACvB,EAAE,IAAI,EAAE,CACT,CAAC;4BAEJ,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;gCACxD,MAAM,IAAI,wBAAe,CACvB,uDAAuD,EACvD,kBAAkB,CACnB,CAAC;4BAEJ,MAAM,GAAG,GAAG,gBAAgB,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;4BAC5D,MAAM,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,IAAI,CAAC;4BAElC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;4BAEtD,IAAI,QAAQ,KAAK,KAAK;gCACpB,OAAO,UAAU,EAAE,CAAC;oCAClB,OAAO,EAAE,IAAI;oCACb,SAAS,EAAE,IAAI;iCAChB,CAAC,CAAC;4BAEL,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;4BACnC,IAAI,GAAG,OAAO,CAAC;4BAEf,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;wBACrB,CAAC;wBAED,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS,IAAI,iBAAiB,CAAC;wBACpE,IAAI,gBAAgB,KAAK,KAAK,EAAE,CAAC;4BAC/B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,6BAAc,EAClD,MAAM,CAAC,EAAE,EACT,WAAW,CAAC,KAAK,EACjB,gBAAgB,IAAI,EAAE,EACtB,OAAO,CAAC,KAAM,CACf,CAAC;4BACF,IAAI,CAAC,OAAO,EAAE,CAAC;gCACb,MAAM,IAAI,6BAAoB,CAAC,SAAS,EAAE,SAAS,EAAE;oCACnD,UAAU;iCACX,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;wBAED,IACE,OAAO,WAAW,CAAC,aAAa,KAAK,QAAQ;4BAC7C,YAAY;4BACZ,IAAA,8CAAuB,GAAE,EACzB,CAAC;4BACD,MAAM,4BAAe,CAAC,YAAY,CAChC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EACnC,WAAW,EAAE,aAAqB,EAAE,WAAW,EAChD,aAAa,CACd,CAAC;wBACJ,CAAC;wBAED,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;4BAC3B,MAAM,WAAW,GAAG,IAAA,uBAAc,GAAE,CAAC;4BACrC,MAAM,EACJ,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,iBAAiB,GAClB,GAAG,4BAAiB,CAAC;4BAEtB,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC;gCAC3C,MAAM,IAAI,KAAK,CACb,sCAAsC,WAAW,CAAC,UAAW,CAAC,QAAQ,IAAI;oCAC1E,0BAA0B,aAAa,kCAAkC,iBAAiB,KAAK;oCAC/F,wBAAwB,WAAW,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,CAC/E,CAAC;4BAEJ,MAAM,cAAc,GAAG,4BAAiB,CAAC,cAAc,CACrD,WAAW,CAAC,UAAU,EACtB,IAAI,CACL,CAAC;4BAEF,IAAI,cAAc,KAAK,UAAU;gCAC/B,MAAM,IAAI,wBAAe,CACvB,2CAA2C,EAC3C,qBAAqB,EACrB,EAAE,IAAI,EAAE,CACT,CAAC;iCACC,IAAI,cAAc,KAAK,aAAa;gCAAE,IAAI,GAAG,IAAI,CAAC;iCAClD,CAAC;gCACJ,IAAI,CAAC;oCACH,IAAI,GAAG,MAAO,YAAoB,CAChC,WAAW,CAAC,UAAU,EACtB,IAAI,CACL,CAAC;gCACJ,CAAC;gCAAC,OAAO,GAAQ,EAAE,CAAC;oCAClB,MAAM,EAAE,gBAAgB,EAAE,GAAG,4BAAiB,CAAC;oCAE/C,MAAM,QAAQ,GAAG,gBAAgB,EAAE,QAAQ,CAAC;oCAC5C,MAAM,KAAK,GAAG,gBAAgB,EAAE,QAAQ,KAAK,KAAK,CAAC;oCAEnD,MAAM,eAAe,GAAG,0BAAe,CAAC,QAAQ,CAC9C,QAAe,EACf,GAAG,CACJ,CAAC;oCACF,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;oCAEjC,MAAM,IAAI,wBAAe,CACvB,KAAK,CAAC,OAAO,EACb,aAAa,EACb,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAC3B,CAAC;gCACJ,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;wBAEnB,MAAM,IAAA,8BAAoB,EACxB,CAAC,GAAG,cAAc,EAAE,GAAG,UAAU,CAAC,EAClC,MAAM,EACN,IAAI,CACL,CAAC;wBAEF,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;wBAExC,IAAA,+BAAqB,EACnB,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,WAAW,CAAC,KAAK,EACjB,GAAG,EACH,SAAS,CACV,CAAC;wBAEF,IAAI,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;4BACzC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;wBACzB,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAQ,EAAE,CAAC;wBAClB,IAAA,kCAAwB,EACtB,GAAG,EACH,MAAM,EACN,aAAa,EACb;4BACE,SAAS;4BACT,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;4BAC3B,KAAK,EAAE,WAAW,CAAC,KAAK;yBACzB,EACD,GAAG,CACJ,CAAC;oBACJ,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,SAAS,CACb,EAAE,EACF;gBACE,IAAI,EAAE,aAAa;gBACnB,cAAc,EAAE,YAAY;gBAC5B,SAAS,EAAE,iBAAiB;aAC7B,EACD,aAAa,EACb,cAAc,EACd,OAAO,EACP,mBAAmB,CACpB,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAxkBD,sCAwkBC;AA6BD,SAAS,YAAY,CAAC,MAA0B;IAC9C,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,kBAAe,YAAY,CAAC","sourcesContent":["import {\n ArkosGatewayConfig,\n ArkosGatewayErrorHandler,\n ArkosGatewayEventConfig,\n ArkosGatewayEventEntry,\n ArkosGatewayHandler,\n ArkosGatewayHookHandler,\n ArkosGatewayHookType,\n ArkosGatewayPipe,\n ArkosGatewayMiddleware,\n ArkosGatewayConnectionHandler,\n ArkosSocket,\n ArkosGatewayRegisterOptions,\n ArkosBroadcastOperator,\n ArkosEmitTarget,\n} from \"./types\";\nimport { Validator } from \"../../types/validation/validator\";\nimport { BroadcastOperator, Namespace, Server } from \"socket.io\";\nimport { authActionService, authService } from \"../../exports/services\";\nimport { checkRateLimit, clearRateLimitForSocket } from \"./utils/rate-limiter\";\nimport {\n handleArkosGatewayErrors,\n runArkosGatewayPipes,\n handleGatewayEventLog,\n handleGatewayLifecycleLog,\n} from \"./utils/helpers\";\nimport authHookManager from \"../../modules/auth/utils/auth-hooks-manager\";\nimport { getArkosConfig } from \"../../server\";\nimport validationManager from \"../../types/validation/validation-manager\";\nimport { loginRequiredError } from \"../../modules/auth/utils/auth-error-objects\";\nimport errorPrettifier from \"../../modules/base/utils/error-prettifier\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { defaultGatewayStore } from \"./utils/memory-gateway-store\";\nimport { ArkosBroadcastOperatorImpl, mountArkosSocketExtensions } from \"./socket-extensions\";\nimport {\n isAuthenticationEnabled,\n isUsingAuthentication,\n} from \"../../utils/helpers/arkos-config.helpers\";\nimport ExitError from \"../../utils/helpers/exit-error\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport {\n BadRequestError,\n TooManyRequestsError,\n} from \"../../modules/error-handler/utils/errors\";\n\nexport class IArkosGateway {\n private config: ArkosGatewayConfig;\n private events: ArkosGatewayEventEntry[] = [];\n private pipes: ArkosGatewayPipe[] = [];\n private middlewares: ArkosGatewayMiddleware[] = [];\n private gateways: IArkosGateway[] = [];\n private hooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [];\n private _nsp!: Namespace\n\n constructor(config: ArkosGatewayConfig) {\n this.config = config;\n this.config.name = config.name ?? \"web-socket\";\n }\n\n get nsp(): Omit<Namespace, keyof ArkosEmitTarget | keyof BroadcastOperator<any, any>> & ArkosBroadcastOperator {\n if (!this._nsp) throw new Error(`gateway.nsp accessed before register()`);\n return new ArkosBroadcastOperatorImpl(this._nsp.sockets, this._nsp) as any;\n }\n\n /**\n * Register a Socket.io connection-level middleware — runs before a socket\n * is accepted into this gateway's namespace, and before authentication.\n * Also accepts a child `ArkosGateway` which will inherit this gateway's\n * name as prefix along with its auth, rateLimit, and pipes.\n *\n * @example\n * chatGateway.use((socket, next) => {\n * console.log(\"incoming connection\", socket.id)\n * })\n *\n * // nested gateway\n * chatGateway.use(notificationsGateway)\n */\n use(...middlewareOrGateway: Array<ArkosGatewayMiddleware | IArkosGateway>): this {\n for (const item of middlewareOrGateway) {\n if (item instanceof IArkosGateway) {\n this.gateways.push(item);\n } else if (typeof item === \"function\") {\n this.middlewares.push(item as ArkosGatewayMiddleware);\n } else {\n throw new Error(\n `Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received \"${typeof item}\".`\n );\n }\n }\n return this;\n }\n\n /**\n * Register a pipe — middleware that runs before event handlers.\n *\n * When called with a function only, the pipe runs before every event\n * handler in this gateway and drills down to child gateways.\n *\n * When called with an event config object, the pipe runs only for that\n * specific event.\n *\n * @example\n * // runs before every event in this gateway\n * chatGateway.pipe((socket, data) => {\n * })\n *\n * // runs only before \"send_message\"\n * chatGateway.pipe({ event: \"send_message\" }, (socket, data) => {\n * })\n */\n pipe(fn: ArkosGatewayPipe): this;\n pipe<TSchema extends Validator = any>(\n eventConfig: { event: string },\n fn: ArkosGatewayPipe\n ): this;\n pipe<TSchema extends Validator = any>(\n fnOrConfig: ArkosGatewayPipe | ArkosGatewayEventConfig<TSchema>,\n fn?: ArkosGatewayPipe\n ): this {\n if (typeof fnOrConfig === \"function\") {\n this.pipes.push(fnOrConfig);\n } else if (fnOrConfig && typeof fnOrConfig === \"object\" && fn) {\n const entry = this.events.find(\n (e) => e.config.event === fnOrConfig.event\n );\n if (entry) {\n entry.pipes = entry.pipes ?? [];\n entry.pipes.push(fn);\n } else {\n this.events.push({\n config: { event: fnOrConfig.event, _pipeOnly: true } as any,\n handler: null as any,\n pipes: [fn],\n });\n }\n } else {\n throw new Error(\n `Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`\n );\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * @example\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n */\n on<TSchema extends Validator = any>(\n eventConfig: ArkosGatewayEventConfig<TSchema>,\n handler: ArkosGatewayHandler\n ): this {\n if (eventConfig.disabled) return this;\n\n if (eventConfig.authorization && this.config.authentication === false) {\n throw new Error(\n `Event \"${eventConfig.event}\" on \"${this.config.name}\" gateway defines authorization rules ` +\n `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`\n );\n }\n\n const deferred = this.events.find(\n (e) => (e.config as any)._pipeOnly && e.config.event === eventConfig.event\n );\n\n const entry: ArkosGatewayEventEntry = {\n config: eventConfig,\n handler,\n pipes: [...this.pipes, ...(deferred?.pipes ?? [])],\n };\n\n if (deferred) {\n const idx = this.events.indexOf(deferred);\n this.events.splice(idx, 1, entry);\n } else {\n this.events.push(entry);\n }\n\n if (typeof eventConfig?.authorization == \"object\")\n // To reuse later on\n (eventConfig.authorization as any)._authAction = authActionService.add(\n eventConfig.authorization!.action,\n eventConfig.authorization!.resource,\n {\n [eventConfig.authorization!.action]: eventConfig.authorization?.rule,\n }\n );\n\n return this;\n }\n\n /**\n * Register a lifecycle hook.\n *\n * - `\"connection\"` — called after a socket successfully connects and passes authentication.\n * - `\"disconnect\"` — called when a socket disconnects.\n * - `\"error\"` — called when an error is thrown inside any event handler.\n * If not registered, Arkos emits a default `\"error\"` event to the socket.\n *\n * @example\n * chatGateway.hook(\"connection\", (socket) => {\n * console.log(\"connected\", socket.user.id)\n * })\n *\n * chatGateway.hook(\"error\", (err, socket) => {\n * socket.emit(\"error\", { message: err.message })\n * })\n */\n hook(type: \"connection\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"disconnect\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"error\", handler: ArkosGatewayErrorHandler): this;\n hook(\n type: ArkosGatewayHookType,\n handler: ArkosGatewayConnectionHandler | ArkosGatewayErrorHandler\n ): this {\n this.hooks.push({ type, handler });\n return this;\n }\n\n /**\n * Wire this gateway into a Socket.io `Server` instance.\n * Registers the namespace, auth middleware, rate limiting, pipes,\n * and all event handlers — then recurses into child gateways.\n *\n * @example\n * const io = new Server(server)\n * chatGateway.register(io)\n */\n register(io: Server, options: ArkosGatewayRegisterOptions = {}): void {\n if ((io as any)._arkosGatewayRegistered)\n throw new Error(\n `The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/guides/web-sockets/setup.`\n );\n (io as any)._arkosGatewayRegistered = true;\n this._register(io, undefined, this.hooks || [], this.pipes || [], options);\n }\n\n private _register(\n io: Server,\n parentConfig?: ArkosGatewayConfig,\n inheritedHooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [],\n inheritedPipes: ArkosGatewayPipe[] = [],\n options: ArkosGatewayRegisterOptions = {},\n inheritedMiddlewares: ArkosGatewayMiddleware[] = []\n ): void {\n options.store = options.store ?? defaultGatewayStore;\n const { store } = options;\n\n const parentName = parentConfig?.name;\n const ownName = this.config.name;\n this.config = deepmerge(parentConfig || {}, this.config, {\n arrayMerge: (_, sourceArray) => sourceArray,\n });\n this.config.name = ownName;\n const localConfig = this.config;\n\n const namespaceName = parentName\n ? `${parentName.replace(/\\/$/, \"\")}/${ownName.replace(/^\\//, \"\")}`\n : (ownName ?? \"\");\n\n const ns = io.of(namespaceName);\n this._nsp = ns;\n\n const resolvedAuth =\n this.config.authentication !== false &&\n parentConfig?.authentication !== false;\n\n const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;\n const resolvedHooks = [...inheritedHooks, ...this.hooks];\n const resolvedMiddlewares = [...inheritedMiddlewares, ...this.middlewares];\n\n const connectHandlers = resolvedHooks\n .filter((h) => h.type === \"connection\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const disconnectHandlers = resolvedHooks\n .filter((h) => h.type === \"disconnect\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const errorHandlers = resolvedHooks\n .filter((h) => h.type === \"error\")\n .map((h) => h.handler as ArkosGatewayErrorHandler);\n\n for (const middleware of resolvedMiddlewares) {\n ns.use((socket, next) => middleware(socket as ArkosSocket, next));\n }\n\n if (resolvedAuth && isAuthenticationEnabled()) {\n ns.use(async (socket: any, next) => {\n socket = socket as ArkosSocket;\n const startTime = new Date().getTime();\n try {\n await authHookManager.runAuthenticate(\n {\n context: socket,\n done: (err?: any) => {\n if (err) throw err;\n next();\n },\n },\n async (socket) => {\n const user = await authService.getAuthenticatedUser(socket);\n if (!user) throw loginRequiredError;\n return user;\n },\n \"currentUser\"\n );\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, errorHandlers, {\n startTime,\n namespace: this.config.name,\n event: \"authentication\",\n });\n next(err);\n }\n });\n } else if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n ns.on(\"connection\", async (s) => {\n const socket = s as ArkosSocket;\n socket.locals = {};\n\n socket._arkos = { store, gatewayConfig: localConfig };\n mountArkosSocketExtensions(socket);\n\n handleGatewayLifecycleLog(this.config.name, \"connected\", socket.id);\n const connectionStartTime = new Date().getTime();\n\n if (socket.currentUser?.id)\n socket.join(`arkos::user:${socket.currentUser.id}`);\n\n try {\n for (const handler of connectHandlers) await handler(socket);\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"connection\",\n });\n return;\n }\n\n socket.on(\"disconnect\", async () => {\n handleGatewayLifecycleLog(this.config.name, \"disconnected\", socket.id);\n\n await clearRateLimitForSocket(socket.id, store);\n try {\n for (const handler of disconnectHandlers) await handler(socket);\n } catch (err) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"disconnection\",\n });\n }\n });\n\n for (const entry of this.events) {\n if ((entry.config as any)._pipeOnly || !entry.handler) continue;\n\n const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;\n\n if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to use authorization gateway.on(\"${eventConfig.event}\") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n socket.on(eventConfig.event, async (...args: any[]) => {\n socket.locals = {};\n const startTime = new Date().getTime();\n let data = args[0];\n\n const ack =\n typeof args[args.length - 1] === \"function\"\n ? args[args.length - 1]\n : undefined;\n\n let ackCalled = false;\n const wrappedAck = ack\n ? (...response: any) => {\n ackCalled = true;\n ack(...response);\n }\n : undefined;\n\n function resolveDedup() {\n if (\n eventConfig.dedup === false ||\n localConfig.dedup === false ||\n parentConfig?.dedup === false\n )\n return null;\n\n return {\n enabled: true,\n ttl: 3600,\n ...parentConfig?.dedup,\n ...localConfig?.dedup,\n ...eventConfig?.dedup,\n };\n }\n\n const dedupOpt = resolveDedup();\n\n try {\n const meta = data?._meta || {};\n const resolvedMaxAge =\n eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;\n\n if (resolvedMaxAge && !meta.timestamp)\n throw new BadRequestError(\n \"Missing _meta.timestamp for maxAge deduplication\"\n );\n\n if (meta.timestamp !== undefined) {\n const timestamp = new Date(meta.timestamp);\n\n if (isNaN(timestamp.getTime())) {\n throw new BadRequestError(\n \"Invalid data._meta.timestamp\",\n \"InvalidTimestamp\"\n );\n }\n\n const age = Date.now() - timestamp.getTime();\n\n if (age + 1000 < 0)\n throw new BadRequestError(\n \"Timestamp is in the future\",\n \"FutureTimestamp\"\n );\n\n if (resolvedMaxAge && age > resolvedMaxAge) {\n throw new BadRequestError(\"Message is too old\", \"StaleMessage\");\n }\n }\n\n if (dedupOpt && dedupOpt?.enabled !== false) {\n if (!meta?.mid)\n throw new BadRequestError(\n \"Missing data._meta.mid in your payload for deduplication\",\n \"MissingDedupMessageId\",\n { data }\n );\n\n if (typeof meta.mid !== \"string\" || meta.mid.trim() === \"\")\n throw new BadRequestError(\n \"Invalid data._meta.mid, it must be a non-empty string\",\n \"InvalidMessageId\"\n );\n\n const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;\n const ttl = dedupOpt?.ttl ?? 3600;\n\n const acquired = await store.setIfNotExists(key, ttl);\n\n if (acquired === false)\n return wrappedAck?.({\n success: true,\n duplicate: true,\n });\n\n const { _meta, ...payload } = data;\n data = payload;\n\n socket.meta = meta;\n }\n\n const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;\n if (rateLimitOptions !== false) {\n const { allowed, retryAfter } = await checkRateLimit(\n socket.id,\n eventConfig.event,\n rateLimitOptions || {},\n options.store!\n );\n if (!allowed) {\n throw new TooManyRequestsError(undefined, undefined, {\n retryAfter,\n });\n }\n }\n\n if (\n typeof eventConfig.authorization === \"object\" &&\n resolvedAuth &&\n isAuthenticationEnabled()\n ) {\n await authHookManager.runAuthorize(\n { context: socket, done: () => { } },\n (eventConfig?.authorization as any)?._authAction,\n \"currentUser\"\n );\n }\n\n if (eventConfig.validation) {\n const arkosConfig = getArkosConfig();\n const {\n validationFn,\n isValidValidator,\n validatorName,\n validatorNameType,\n } = validationManager;\n\n if (!isValidValidator(eventConfig.validation))\n throw new Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, ` +\n `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +\n `under event handler \"${eventConfig.event}\" in \"${this.config.name}\" gateway.`\n );\n\n const shouldValidate = validationManager.shouldValidate(\n eventConfig.validation,\n data\n );\n\n if (shouldValidate === \"prohibit\")\n throw new BadRequestError(\n \"Event data is not allowed for this event.\",\n \"EventDataNotAllowed\",\n { data }\n );\n else if (shouldValidate === \"passthrough\") data = data;\n else {\n try {\n data = await (validationFn as any)(\n eventConfig.validation,\n data\n );\n } catch (err: any) {\n const { validationConfig } = validationManager;\n\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n\n throw new BadRequestError(\n error.message,\n `InvalidData`,\n isZod ? err.format() : err\n );\n }\n }\n }\n\n socket.data = data;\n\n await runArkosGatewayPipes(\n [...inheritedPipes, ...eventPipes],\n socket,\n data\n );\n\n await handler(socket, data, wrappedAck);\n\n handleGatewayEventLog(\n this.config.name,\n eventConfig.event,\n 200,\n startTime\n );\n\n if (eventConfig.ack && ack && !ackCalled) {\n ack({ success: true });\n }\n } catch (err: any) {\n handleArkosGatewayErrors(\n err,\n socket,\n errorHandlers,\n {\n startTime,\n namespace: this.config.name,\n event: eventConfig.event,\n },\n ack\n );\n }\n });\n }\n });\n\n for (const child of this.gateways) {\n child._register(\n io,\n {\n name: namespaceName,\n authentication: resolvedAuth,\n rateLimit: resolvedRateLimit,\n },\n resolvedHooks,\n inheritedPipes,\n options,\n resolvedMiddlewares\n );\n }\n }\n}\n\n/**\n * Creates an Arkos WebSocket Gateway backed by Socket.io.\n *\n * Handles authentication, validation, rate limiting, pipes,\n * error handling, and nested gateways — all declaratively.\n * Enhances every connected socket with `socket.user()`, `socket.peer()`,\n * `socket.retry()`, and automatic `_meta` injection on outgoing emits.\n *\n * @example\n * ```ts\n * const chatGateway = ArkosGateway({\n * name: \"chat\",\n * authentication: true,\n * rateLimit: { windowMs: 60_000, max: 200 },\n * })\n *\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n * ```\n * @since 1.7.0-canary.18\n * @see {@link https://www.arkosjs.com/docs/core-concepts/components/gateways}\n */\nfunction ArkosGateway(config: ArkosGatewayConfig) {\n return new IArkosGateway(config);\n}\n\nexport default ArkosGateway;\n"]}
1
+ {"version":3,"file":"arkos-gateway.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/arkos-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArkosGatewayConfig,\n ArkosGatewayErrorHandler,\n ArkosGatewayEventConfig,\n ArkosGatewayEventEntry,\n ArkosGatewayHandler,\n ArkosGatewayHookHandler,\n ArkosGatewayHookType,\n ArkosGatewayPipe,\n ArkosGatewayMiddleware,\n ArkosGatewayConnectionHandler,\n ArkosSocket,\n ArkosGatewayRegisterOptions,\n ArkosBroadcastOperator,\n ArkosEmitTarget,\n} from \"./types\";\nimport { Validator } from \"../../types/validation/validator\";\nimport { BroadcastOperator, Namespace, Server } from \"socket.io\";\nimport { authActionService, authService } from \"../../exports/services\";\nimport { checkRateLimit, clearRateLimitForSocket } from \"./utils/rate-limiter\";\nimport {\n handleArkosGatewayErrors,\n runArkosGatewayPipes,\n handleGatewayEventLog,\n handleGatewayLifecycleLog,\n} from \"./utils/helpers\";\nimport authHookManager from \"../../modules/auth/utils/auth-hooks-manager\";\nimport { getArkosConfig } from \"../../server\";\nimport validationManager from \"../../types/validation/validation-manager\";\nimport { loginRequiredError } from \"../../modules/auth/utils/auth-error-objects\";\nimport errorPrettifier from \"../../modules/base/utils/error-prettifier\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { defaultGatewayStore } from \"./utils/memory-gateway-store\";\nimport { ArkosBroadcastOperatorImpl, mountArkosSocketExtensions } from \"./socket-extensions\";\nimport {\n isAuthenticationEnabled,\n isUsingAuthentication,\n} from \"../../utils/helpers/arkos-config.helpers\";\nimport ExitError from \"../../utils/helpers/exit-error\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport {\n BadRequestError,\n TooManyRequestsError,\n} from \"../../modules/error-handler/utils/errors\";\n\nexport class IArkosGateway {\n private config: ArkosGatewayConfig;\n private events: ArkosGatewayEventEntry[] = [];\n private pipes: ArkosGatewayPipe[] = [];\n private middlewares: ArkosGatewayMiddleware[] = [];\n private gateways: IArkosGateway[] = [];\n private hooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [];\n private _nsp!: Namespace\n\n constructor(config: ArkosGatewayConfig) {\n this.config = config;\n this.config.name = config.name ?? \"web-socket\";\n }\n\n get nsp(): Omit<Namespace, keyof ArkosEmitTarget | keyof BroadcastOperator<any, any>> & ArkosBroadcastOperator {\n if (!this._nsp) throw new Error(`gateway.nsp accessed before register()`);\n return new ArkosBroadcastOperatorImpl(this._nsp.sockets, this._nsp) as any;\n }\n\n /**\n * Register a Socket.io connection-level middleware — runs before a socket\n * is accepted into this gateway's namespace, and after authentication\n * (so `socket.currentUser` is available).\n * Also accepts a child `ArkosGateway` which will inherit this gateway's\n * name as prefix along with its auth, rateLimit, and pipes.\n *\n * @example\n * chatGateway.use((socket, next) => {\n * console.log(\"incoming connection\", socket.id)\n * })\n *\n * // nested gateway\n * chatGateway.use(notificationsGateway)\n */\n use(...middlewareOrGateway: Array<ArkosGatewayMiddleware | IArkosGateway>): this {\n for (const item of middlewareOrGateway) {\n if (item instanceof IArkosGateway) {\n this.gateways.push(item);\n } else if (typeof item === \"function\") {\n this.middlewares.push(item as ArkosGatewayMiddleware);\n } else {\n throw new Error(\n `Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received \"${typeof item}\".`\n );\n }\n }\n return this;\n }\n\n /**\n * Register a pipe — middleware that runs before event handlers.\n *\n * When called with a function only, the pipe runs before every event\n * handler in this gateway and drills down to child gateways.\n *\n * When called with an event config object, the pipe runs only for that\n * specific event.\n *\n * @example\n * // runs before every event in this gateway\n * chatGateway.pipe((socket, data) => {\n * })\n *\n * // runs only before \"send_message\"\n * chatGateway.pipe({ event: \"send_message\" }, (socket, data) => {\n * })\n */\n pipe(fn: ArkosGatewayPipe): this;\n pipe<TSchema extends Validator = any>(\n eventConfig: { event: string },\n fn: ArkosGatewayPipe\n ): this;\n pipe<TSchema extends Validator = any>(\n fnOrConfig: ArkosGatewayPipe | ArkosGatewayEventConfig<TSchema>,\n fn?: ArkosGatewayPipe\n ): this {\n if (typeof fnOrConfig === \"function\") {\n this.pipes.push(fnOrConfig);\n } else if (fnOrConfig && typeof fnOrConfig === \"object\" && fn) {\n const entry = this.events.find(\n (e) => e.config.event === fnOrConfig.event\n );\n if (entry) {\n entry.pipes = entry.pipes ?? [];\n entry.pipes.push(fn);\n } else {\n this.events.push({\n config: { event: fnOrConfig.event, _pipeOnly: true } as any,\n handler: null as any,\n pipes: [fn],\n });\n }\n } else {\n throw new Error(\n `Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`\n );\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * @example\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n */\n on<TSchema extends Validator = any>(\n eventConfig: ArkosGatewayEventConfig<TSchema>,\n handler: ArkosGatewayHandler\n ): this {\n if (eventConfig.disabled) return this;\n\n if (eventConfig.authorization && this.config.authentication === false) {\n throw new Error(\n `Event \"${eventConfig.event}\" on \"${this.config.name}\" gateway defines authorization rules ` +\n `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`\n );\n }\n\n const deferred = this.events.find(\n (e) => (e.config as any)._pipeOnly && e.config.event === eventConfig.event\n );\n\n const entry: ArkosGatewayEventEntry = {\n config: eventConfig,\n handler,\n pipes: [...this.pipes, ...(deferred?.pipes ?? [])],\n };\n\n if (deferred) {\n const idx = this.events.indexOf(deferred);\n this.events.splice(idx, 1, entry);\n } else {\n this.events.push(entry);\n }\n\n if (typeof eventConfig?.authorization == \"object\")\n // To reuse later on\n (eventConfig.authorization as any)._authAction = authActionService.add(\n eventConfig.authorization!.action,\n eventConfig.authorization!.resource,\n {\n [eventConfig.authorization!.action]: eventConfig.authorization?.rule,\n }\n );\n\n return this;\n }\n\n /**\n * Register a lifecycle hook.\n *\n * - `\"connection\"` — called after a socket successfully connects and passes authentication.\n * - `\"disconnect\"` — called when a socket disconnects.\n * - `\"error\"` — called when an error is thrown inside any event handler.\n * If not registered, Arkos emits a default `\"error\"` event to the socket.\n *\n * @example\n * chatGateway.hook(\"connection\", (socket) => {\n * console.log(\"connected\", socket.user.id)\n * })\n *\n * chatGateway.hook(\"error\", (err, socket) => {\n * socket.emit(\"error\", { message: err.message })\n * })\n */\n hook(type: \"connection\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"disconnect\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"error\", handler: ArkosGatewayErrorHandler): this;\n hook(\n type: ArkosGatewayHookType,\n handler: ArkosGatewayConnectionHandler | ArkosGatewayErrorHandler\n ): this {\n this.hooks.push({ type, handler });\n return this;\n }\n\n /**\n * Wire this gateway into a Socket.io `Server` instance.\n * Registers the namespace, auth middleware, rate limiting, pipes,\n * and all event handlers — then recurses into child gateways.\n *\n * @example\n * const io = new Server(server)\n * chatGateway.register(io)\n */\n register(io: Server, options: ArkosGatewayRegisterOptions = {}): void {\n if ((io as any)._arkosGatewayRegistered)\n throw new Error(\n `The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/guides/web-sockets/setup.`\n );\n (io as any)._arkosGatewayRegistered = true;\n this._register(io, undefined, this.hooks || [], this.pipes || [], options);\n }\n\n private _register(\n io: Server,\n parentConfig?: ArkosGatewayConfig,\n inheritedHooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [],\n inheritedPipes: ArkosGatewayPipe[] = [],\n options: ArkosGatewayRegisterOptions = {},\n inheritedMiddlewares: ArkosGatewayMiddleware[] = []\n ): void {\n options.store = options.store ?? defaultGatewayStore;\n const { store } = options;\n\n const parentName = parentConfig?.name;\n const ownName = this.config.name;\n this.config = deepmerge(parentConfig || {}, this.config, {\n arrayMerge: (_, sourceArray) => sourceArray,\n });\n this.config.name = ownName;\n const localConfig = this.config;\n\n const namespaceName = parentName\n ? `${parentName.replace(/\\/$/, \"\")}/${ownName.replace(/^\\//, \"\")}`\n : (ownName ?? \"\");\n\n const ns = io.of(namespaceName);\n this._nsp = ns;\n\n const resolvedAuth =\n this.config.authentication !== false &&\n parentConfig?.authentication !== false;\n\n const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;\n const resolvedHooks = [...inheritedHooks, ...this.hooks];\n const resolvedMiddlewares = [...inheritedMiddlewares, ...this.middlewares];\n\n const connectHandlers = resolvedHooks\n .filter((h) => h.type === \"connection\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const disconnectHandlers = resolvedHooks\n .filter((h) => h.type === \"disconnect\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const errorHandlers = resolvedHooks\n .filter((h) => h.type === \"error\")\n .map((h) => h.handler as ArkosGatewayErrorHandler);\n\n if (resolvedAuth && isAuthenticationEnabled()) {\n ns.use(async (socket: any, next) => {\n socket = socket as ArkosSocket;\n const startTime = new Date().getTime();\n try {\n await authHookManager.runAuthenticate(\n {\n context: socket,\n done: (err?: any) => {\n if (err) throw err;\n next();\n },\n },\n async (socket) => {\n const user = await authService.getAuthenticatedUser(socket);\n if (!user) throw loginRequiredError;\n return user;\n },\n \"currentUser\"\n );\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, errorHandlers, {\n startTime,\n namespace: this.config.name,\n event: \"authentication\",\n });\n next(err);\n }\n });\n } else if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n for (const middleware of resolvedMiddlewares) {\n ns.use((socket, next) => middleware(socket as ArkosSocket, next));\n }\n\n ns.on(\"connection\", async (s) => {\n const socket = s as ArkosSocket;\n socket.locals = {};\n\n socket._arkos = { store, gatewayConfig: localConfig };\n mountArkosSocketExtensions(socket);\n\n handleGatewayLifecycleLog(this.config.name, \"connected\", socket.id);\n const connectionStartTime = new Date().getTime();\n\n if (socket.currentUser?.id)\n socket.join(`arkos::user:${socket.currentUser.id}`);\n\n try {\n for (const handler of connectHandlers) await handler(socket);\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"connection\",\n });\n return;\n }\n\n socket.on(\"disconnect\", async () => {\n handleGatewayLifecycleLog(this.config.name, \"disconnected\", socket.id);\n\n await clearRateLimitForSocket(socket.id, store);\n try {\n for (const handler of disconnectHandlers) await handler(socket);\n } catch (err) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"disconnection\",\n });\n }\n });\n\n for (const entry of this.events) {\n if ((entry.config as any)._pipeOnly || !entry.handler) continue;\n\n const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;\n\n if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to use authorization gateway.on(\"${eventConfig.event}\") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n socket.on(eventConfig.event, async (...args: any[]) => {\n socket.locals = {};\n const startTime = new Date().getTime();\n let data = args[0];\n\n const ack =\n typeof args[args.length - 1] === \"function\"\n ? args[args.length - 1]\n : undefined;\n\n let ackCalled = false;\n const wrappedAck = ack\n ? (...response: any) => {\n ackCalled = true;\n ack(...response);\n }\n : undefined;\n\n function resolveDedup() {\n if (\n eventConfig.dedup === false ||\n localConfig.dedup === false ||\n parentConfig?.dedup === false\n )\n return null;\n\n return {\n enabled: true,\n ttl: 3600,\n ...parentConfig?.dedup,\n ...localConfig?.dedup,\n ...eventConfig?.dedup,\n };\n }\n\n const dedupOpt = resolveDedup();\n\n try {\n const meta = data?._meta || {};\n const resolvedMaxAge =\n eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;\n\n if (resolvedMaxAge && !meta.timestamp)\n throw new BadRequestError(\n \"Missing _meta.timestamp for maxAge deduplication\"\n );\n\n if (meta.timestamp !== undefined) {\n const timestamp = new Date(meta.timestamp);\n\n if (isNaN(timestamp.getTime())) {\n throw new BadRequestError(\n \"Invalid data._meta.timestamp\",\n \"InvalidTimestamp\"\n );\n }\n\n const age = Date.now() - timestamp.getTime();\n\n if (age + 1000 < 0)\n throw new BadRequestError(\n \"Timestamp is in the future\",\n \"FutureTimestamp\"\n );\n\n if (resolvedMaxAge && age > resolvedMaxAge) {\n throw new BadRequestError(\"Message is too old\", \"StaleMessage\");\n }\n }\n\n if (dedupOpt && dedupOpt?.enabled !== false) {\n if (!meta?.mid)\n throw new BadRequestError(\n \"Missing data._meta.mid in your payload for deduplication\",\n \"MissingDedupMessageId\",\n { data }\n );\n\n if (typeof meta.mid !== \"string\" || meta.mid.trim() === \"\")\n throw new BadRequestError(\n \"Invalid data._meta.mid, it must be a non-empty string\",\n \"InvalidMessageId\"\n );\n\n const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;\n const ttl = dedupOpt?.ttl ?? 3600;\n\n const acquired = await store.setIfNotExists(key, ttl);\n\n if (acquired === false)\n return wrappedAck?.({\n success: true,\n duplicate: true,\n });\n\n const { _meta, ...payload } = data;\n data = payload;\n\n socket.meta = meta;\n }\n\n const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;\n if (rateLimitOptions !== false) {\n const { allowed, retryAfter } = await checkRateLimit(\n socket.id,\n eventConfig.event,\n rateLimitOptions || {},\n options.store!\n );\n if (!allowed) {\n throw new TooManyRequestsError(undefined, undefined, {\n retryAfter,\n });\n }\n }\n\n if (\n typeof eventConfig.authorization === \"object\" &&\n resolvedAuth &&\n isAuthenticationEnabled()\n ) {\n await authHookManager.runAuthorize(\n { context: socket, done: () => { } },\n (eventConfig?.authorization as any)?._authAction,\n \"currentUser\"\n );\n }\n\n if (eventConfig.validation) {\n const arkosConfig = getArkosConfig();\n const {\n validationFn,\n isValidValidator,\n validatorName,\n validatorNameType,\n } = validationManager;\n\n if (!isValidValidator(eventConfig.validation))\n throw new Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, ` +\n `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +\n `under event handler \"${eventConfig.event}\" in \"${this.config.name}\" gateway.`\n );\n\n const shouldValidate = validationManager.shouldValidate(\n eventConfig.validation,\n data\n );\n\n if (shouldValidate === \"prohibit\")\n throw new BadRequestError(\n \"Event data is not allowed for this event.\",\n \"EventDataNotAllowed\",\n { data }\n );\n else if (shouldValidate === \"passthrough\") data = data;\n else {\n try {\n data = await (validationFn as any)(\n eventConfig.validation,\n data\n );\n } catch (err: any) {\n const { validationConfig } = validationManager;\n\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n\n throw new BadRequestError(\n error.message,\n `InvalidData`,\n isZod ? err.format() : err\n );\n }\n }\n }\n\n socket.data = data;\n\n await runArkosGatewayPipes(\n [...inheritedPipes, ...eventPipes],\n socket,\n data\n );\n\n await handler(socket, data, wrappedAck);\n\n handleGatewayEventLog(\n this.config.name,\n eventConfig.event,\n 200,\n startTime\n );\n\n if (eventConfig.ack && ack && !ackCalled) {\n ack({ success: true });\n }\n } catch (err: any) {\n handleArkosGatewayErrors(\n err,\n socket,\n errorHandlers,\n {\n startTime,\n namespace: this.config.name,\n event: eventConfig.event,\n },\n ack\n );\n }\n });\n }\n });\n\n for (const child of this.gateways) {\n child._register(\n io,\n {\n name: namespaceName,\n authentication: resolvedAuth,\n rateLimit: resolvedRateLimit,\n },\n resolvedHooks,\n inheritedPipes,\n options,\n resolvedMiddlewares\n );\n }\n }\n}\n\n/**\n * Creates an Arkos WebSocket Gateway backed by Socket.io.\n *\n * Handles authentication, validation, rate limiting, pipes,\n * error handling, and nested gateways — all declaratively.\n * Enhances every connected socket with `socket.user()`, `socket.peer()`,\n * `socket.retry()`, and automatic `_meta` injection on outgoing emits.\n *\n * @example\n * ```ts\n * const chatGateway = ArkosGateway({\n * name: \"chat\",\n * authentication: true,\n * rateLimit: { windowMs: 60_000, max: 200 },\n * })\n *\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n * ```\n * @since 1.7.0-canary.18\n * @see {@link https://www.arkosjs.com/docs/core-concepts/components/gateways}\n */\nfunction ArkosGateway(config: ArkosGatewayConfig) {\n return new IArkosGateway(config);\n}\n\nexport default ArkosGateway;\n"]}
@@ -19,6 +19,6 @@ function killServerChildProcess() {
19
19
  (0, start_1.killProductionServerChildProcess)();
20
20
  }
21
21
  function getVersion() {
22
- return "1.7.5-rc";
22
+ return "1.7.6-rc";
23
23
  }
24
24
  //# sourceMappingURL=cli.helpers.js.map
@@ -130,9 +130,6 @@ export class IArkosGateway {
130
130
  const errorHandlers = resolvedHooks
131
131
  .filter((h) => h.type === "error")
132
132
  .map((h) => h.handler);
133
- for (const middleware of resolvedMiddlewares) {
134
- ns.use((socket, next) => middleware(socket, next));
135
- }
136
133
  if (resolvedAuth && isAuthenticationEnabled()) {
137
134
  ns.use(async (socket, next) => {
138
135
  socket = socket;
@@ -167,6 +164,9 @@ export class IArkosGateway {
167
164
  throw ExitError(`Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : ""} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.
168
165
 
169
166
  For further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`);
167
+ for (const middleware of resolvedMiddlewares) {
168
+ ns.use((socket, next) => middleware(socket, next));
169
+ }
170
170
  ns.on("connection", async (s) => {
171
171
  const socket = s;
172
172
  socket.locals = {};
@@ -1 +1 @@
1
- {"version":3,"file":"arkos-gateway.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/arkos-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArkosGatewayConfig,\n ArkosGatewayErrorHandler,\n ArkosGatewayEventConfig,\n ArkosGatewayEventEntry,\n ArkosGatewayHandler,\n ArkosGatewayHookHandler,\n ArkosGatewayHookType,\n ArkosGatewayPipe,\n ArkosGatewayMiddleware,\n ArkosGatewayConnectionHandler,\n ArkosSocket,\n ArkosGatewayRegisterOptions,\n ArkosBroadcastOperator,\n ArkosEmitTarget,\n} from \"./types\";\nimport { Validator } from \"../../types/validation/validator\";\nimport { BroadcastOperator, Namespace, Server } from \"socket.io\";\nimport { authActionService, authService } from \"../../exports/services\";\nimport { checkRateLimit, clearRateLimitForSocket } from \"./utils/rate-limiter\";\nimport {\n handleArkosGatewayErrors,\n runArkosGatewayPipes,\n handleGatewayEventLog,\n handleGatewayLifecycleLog,\n} from \"./utils/helpers\";\nimport authHookManager from \"../../modules/auth/utils/auth-hooks-manager\";\nimport { getArkosConfig } from \"../../server\";\nimport validationManager from \"../../types/validation/validation-manager\";\nimport { loginRequiredError } from \"../../modules/auth/utils/auth-error-objects\";\nimport errorPrettifier from \"../../modules/base/utils/error-prettifier\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { defaultGatewayStore } from \"./utils/memory-gateway-store\";\nimport { ArkosBroadcastOperatorImpl, mountArkosSocketExtensions } from \"./socket-extensions\";\nimport {\n isAuthenticationEnabled,\n isUsingAuthentication,\n} from \"../../utils/helpers/arkos-config.helpers\";\nimport ExitError from \"../../utils/helpers/exit-error\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport {\n BadRequestError,\n TooManyRequestsError,\n} from \"../../modules/error-handler/utils/errors\";\n\nexport class IArkosGateway {\n private config: ArkosGatewayConfig;\n private events: ArkosGatewayEventEntry[] = [];\n private pipes: ArkosGatewayPipe[] = [];\n private middlewares: ArkosGatewayMiddleware[] = [];\n private gateways: IArkosGateway[] = [];\n private hooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [];\n private _nsp!: Namespace\n\n constructor(config: ArkosGatewayConfig) {\n this.config = config;\n this.config.name = config.name ?? \"web-socket\";\n }\n\n get nsp(): Omit<Namespace, keyof ArkosEmitTarget | keyof BroadcastOperator<any, any>> & ArkosBroadcastOperator {\n if (!this._nsp) throw new Error(`gateway.nsp accessed before register()`);\n return new ArkosBroadcastOperatorImpl(this._nsp.sockets, this._nsp) as any;\n }\n\n /**\n * Register a Socket.io connection-level middleware — runs before a socket\n * is accepted into this gateway's namespace, and before authentication.\n * Also accepts a child `ArkosGateway` which will inherit this gateway's\n * name as prefix along with its auth, rateLimit, and pipes.\n *\n * @example\n * chatGateway.use((socket, next) => {\n * console.log(\"incoming connection\", socket.id)\n * })\n *\n * // nested gateway\n * chatGateway.use(notificationsGateway)\n */\n use(...middlewareOrGateway: Array<ArkosGatewayMiddleware | IArkosGateway>): this {\n for (const item of middlewareOrGateway) {\n if (item instanceof IArkosGateway) {\n this.gateways.push(item);\n } else if (typeof item === \"function\") {\n this.middlewares.push(item as ArkosGatewayMiddleware);\n } else {\n throw new Error(\n `Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received \"${typeof item}\".`\n );\n }\n }\n return this;\n }\n\n /**\n * Register a pipe — middleware that runs before event handlers.\n *\n * When called with a function only, the pipe runs before every event\n * handler in this gateway and drills down to child gateways.\n *\n * When called with an event config object, the pipe runs only for that\n * specific event.\n *\n * @example\n * // runs before every event in this gateway\n * chatGateway.pipe((socket, data) => {\n * })\n *\n * // runs only before \"send_message\"\n * chatGateway.pipe({ event: \"send_message\" }, (socket, data) => {\n * })\n */\n pipe(fn: ArkosGatewayPipe): this;\n pipe<TSchema extends Validator = any>(\n eventConfig: { event: string },\n fn: ArkosGatewayPipe\n ): this;\n pipe<TSchema extends Validator = any>(\n fnOrConfig: ArkosGatewayPipe | ArkosGatewayEventConfig<TSchema>,\n fn?: ArkosGatewayPipe\n ): this {\n if (typeof fnOrConfig === \"function\") {\n this.pipes.push(fnOrConfig);\n } else if (fnOrConfig && typeof fnOrConfig === \"object\" && fn) {\n const entry = this.events.find(\n (e) => e.config.event === fnOrConfig.event\n );\n if (entry) {\n entry.pipes = entry.pipes ?? [];\n entry.pipes.push(fn);\n } else {\n this.events.push({\n config: { event: fnOrConfig.event, _pipeOnly: true } as any,\n handler: null as any,\n pipes: [fn],\n });\n }\n } else {\n throw new Error(\n `Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`\n );\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * @example\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n */\n on<TSchema extends Validator = any>(\n eventConfig: ArkosGatewayEventConfig<TSchema>,\n handler: ArkosGatewayHandler\n ): this {\n if (eventConfig.disabled) return this;\n\n if (eventConfig.authorization && this.config.authentication === false) {\n throw new Error(\n `Event \"${eventConfig.event}\" on \"${this.config.name}\" gateway defines authorization rules ` +\n `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`\n );\n }\n\n const deferred = this.events.find(\n (e) => (e.config as any)._pipeOnly && e.config.event === eventConfig.event\n );\n\n const entry: ArkosGatewayEventEntry = {\n config: eventConfig,\n handler,\n pipes: [...this.pipes, ...(deferred?.pipes ?? [])],\n };\n\n if (deferred) {\n const idx = this.events.indexOf(deferred);\n this.events.splice(idx, 1, entry);\n } else {\n this.events.push(entry);\n }\n\n if (typeof eventConfig?.authorization == \"object\")\n // To reuse later on\n (eventConfig.authorization as any)._authAction = authActionService.add(\n eventConfig.authorization!.action,\n eventConfig.authorization!.resource,\n {\n [eventConfig.authorization!.action]: eventConfig.authorization?.rule,\n }\n );\n\n return this;\n }\n\n /**\n * Register a lifecycle hook.\n *\n * - `\"connection\"` — called after a socket successfully connects and passes authentication.\n * - `\"disconnect\"` — called when a socket disconnects.\n * - `\"error\"` — called when an error is thrown inside any event handler.\n * If not registered, Arkos emits a default `\"error\"` event to the socket.\n *\n * @example\n * chatGateway.hook(\"connection\", (socket) => {\n * console.log(\"connected\", socket.user.id)\n * })\n *\n * chatGateway.hook(\"error\", (err, socket) => {\n * socket.emit(\"error\", { message: err.message })\n * })\n */\n hook(type: \"connection\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"disconnect\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"error\", handler: ArkosGatewayErrorHandler): this;\n hook(\n type: ArkosGatewayHookType,\n handler: ArkosGatewayConnectionHandler | ArkosGatewayErrorHandler\n ): this {\n this.hooks.push({ type, handler });\n return this;\n }\n\n /**\n * Wire this gateway into a Socket.io `Server` instance.\n * Registers the namespace, auth middleware, rate limiting, pipes,\n * and all event handlers — then recurses into child gateways.\n *\n * @example\n * const io = new Server(server)\n * chatGateway.register(io)\n */\n register(io: Server, options: ArkosGatewayRegisterOptions = {}): void {\n if ((io as any)._arkosGatewayRegistered)\n throw new Error(\n `The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/guides/web-sockets/setup.`\n );\n (io as any)._arkosGatewayRegistered = true;\n this._register(io, undefined, this.hooks || [], this.pipes || [], options);\n }\n\n private _register(\n io: Server,\n parentConfig?: ArkosGatewayConfig,\n inheritedHooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [],\n inheritedPipes: ArkosGatewayPipe[] = [],\n options: ArkosGatewayRegisterOptions = {},\n inheritedMiddlewares: ArkosGatewayMiddleware[] = []\n ): void {\n options.store = options.store ?? defaultGatewayStore;\n const { store } = options;\n\n const parentName = parentConfig?.name;\n const ownName = this.config.name;\n this.config = deepmerge(parentConfig || {}, this.config, {\n arrayMerge: (_, sourceArray) => sourceArray,\n });\n this.config.name = ownName;\n const localConfig = this.config;\n\n const namespaceName = parentName\n ? `${parentName.replace(/\\/$/, \"\")}/${ownName.replace(/^\\//, \"\")}`\n : (ownName ?? \"\");\n\n const ns = io.of(namespaceName);\n this._nsp = ns;\n\n const resolvedAuth =\n this.config.authentication !== false &&\n parentConfig?.authentication !== false;\n\n const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;\n const resolvedHooks = [...inheritedHooks, ...this.hooks];\n const resolvedMiddlewares = [...inheritedMiddlewares, ...this.middlewares];\n\n const connectHandlers = resolvedHooks\n .filter((h) => h.type === \"connection\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const disconnectHandlers = resolvedHooks\n .filter((h) => h.type === \"disconnect\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const errorHandlers = resolvedHooks\n .filter((h) => h.type === \"error\")\n .map((h) => h.handler as ArkosGatewayErrorHandler);\n\n for (const middleware of resolvedMiddlewares) {\n ns.use((socket, next) => middleware(socket as ArkosSocket, next));\n }\n\n if (resolvedAuth && isAuthenticationEnabled()) {\n ns.use(async (socket: any, next) => {\n socket = socket as ArkosSocket;\n const startTime = new Date().getTime();\n try {\n await authHookManager.runAuthenticate(\n {\n context: socket,\n done: (err?: any) => {\n if (err) throw err;\n next();\n },\n },\n async (socket) => {\n const user = await authService.getAuthenticatedUser(socket);\n if (!user) throw loginRequiredError;\n return user;\n },\n \"currentUser\"\n );\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, errorHandlers, {\n startTime,\n namespace: this.config.name,\n event: \"authentication\",\n });\n next(err);\n }\n });\n } else if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n ns.on(\"connection\", async (s) => {\n const socket = s as ArkosSocket;\n socket.locals = {};\n\n socket._arkos = { store, gatewayConfig: localConfig };\n mountArkosSocketExtensions(socket);\n\n handleGatewayLifecycleLog(this.config.name, \"connected\", socket.id);\n const connectionStartTime = new Date().getTime();\n\n if (socket.currentUser?.id)\n socket.join(`arkos::user:${socket.currentUser.id}`);\n\n try {\n for (const handler of connectHandlers) await handler(socket);\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"connection\",\n });\n return;\n }\n\n socket.on(\"disconnect\", async () => {\n handleGatewayLifecycleLog(this.config.name, \"disconnected\", socket.id);\n\n await clearRateLimitForSocket(socket.id, store);\n try {\n for (const handler of disconnectHandlers) await handler(socket);\n } catch (err) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"disconnection\",\n });\n }\n });\n\n for (const entry of this.events) {\n if ((entry.config as any)._pipeOnly || !entry.handler) continue;\n\n const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;\n\n if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to use authorization gateway.on(\"${eventConfig.event}\") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n socket.on(eventConfig.event, async (...args: any[]) => {\n socket.locals = {};\n const startTime = new Date().getTime();\n let data = args[0];\n\n const ack =\n typeof args[args.length - 1] === \"function\"\n ? args[args.length - 1]\n : undefined;\n\n let ackCalled = false;\n const wrappedAck = ack\n ? (...response: any) => {\n ackCalled = true;\n ack(...response);\n }\n : undefined;\n\n function resolveDedup() {\n if (\n eventConfig.dedup === false ||\n localConfig.dedup === false ||\n parentConfig?.dedup === false\n )\n return null;\n\n return {\n enabled: true,\n ttl: 3600,\n ...parentConfig?.dedup,\n ...localConfig?.dedup,\n ...eventConfig?.dedup,\n };\n }\n\n const dedupOpt = resolveDedup();\n\n try {\n const meta = data?._meta || {};\n const resolvedMaxAge =\n eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;\n\n if (resolvedMaxAge && !meta.timestamp)\n throw new BadRequestError(\n \"Missing _meta.timestamp for maxAge deduplication\"\n );\n\n if (meta.timestamp !== undefined) {\n const timestamp = new Date(meta.timestamp);\n\n if (isNaN(timestamp.getTime())) {\n throw new BadRequestError(\n \"Invalid data._meta.timestamp\",\n \"InvalidTimestamp\"\n );\n }\n\n const age = Date.now() - timestamp.getTime();\n\n if (age + 1000 < 0)\n throw new BadRequestError(\n \"Timestamp is in the future\",\n \"FutureTimestamp\"\n );\n\n if (resolvedMaxAge && age > resolvedMaxAge) {\n throw new BadRequestError(\"Message is too old\", \"StaleMessage\");\n }\n }\n\n if (dedupOpt && dedupOpt?.enabled !== false) {\n if (!meta?.mid)\n throw new BadRequestError(\n \"Missing data._meta.mid in your payload for deduplication\",\n \"MissingDedupMessageId\",\n { data }\n );\n\n if (typeof meta.mid !== \"string\" || meta.mid.trim() === \"\")\n throw new BadRequestError(\n \"Invalid data._meta.mid, it must be a non-empty string\",\n \"InvalidMessageId\"\n );\n\n const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;\n const ttl = dedupOpt?.ttl ?? 3600;\n\n const acquired = await store.setIfNotExists(key, ttl);\n\n if (acquired === false)\n return wrappedAck?.({\n success: true,\n duplicate: true,\n });\n\n const { _meta, ...payload } = data;\n data = payload;\n\n socket.meta = meta;\n }\n\n const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;\n if (rateLimitOptions !== false) {\n const { allowed, retryAfter } = await checkRateLimit(\n socket.id,\n eventConfig.event,\n rateLimitOptions || {},\n options.store!\n );\n if (!allowed) {\n throw new TooManyRequestsError(undefined, undefined, {\n retryAfter,\n });\n }\n }\n\n if (\n typeof eventConfig.authorization === \"object\" &&\n resolvedAuth &&\n isAuthenticationEnabled()\n ) {\n await authHookManager.runAuthorize(\n { context: socket, done: () => { } },\n (eventConfig?.authorization as any)?._authAction,\n \"currentUser\"\n );\n }\n\n if (eventConfig.validation) {\n const arkosConfig = getArkosConfig();\n const {\n validationFn,\n isValidValidator,\n validatorName,\n validatorNameType,\n } = validationManager;\n\n if (!isValidValidator(eventConfig.validation))\n throw new Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, ` +\n `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +\n `under event handler \"${eventConfig.event}\" in \"${this.config.name}\" gateway.`\n );\n\n const shouldValidate = validationManager.shouldValidate(\n eventConfig.validation,\n data\n );\n\n if (shouldValidate === \"prohibit\")\n throw new BadRequestError(\n \"Event data is not allowed for this event.\",\n \"EventDataNotAllowed\",\n { data }\n );\n else if (shouldValidate === \"passthrough\") data = data;\n else {\n try {\n data = await (validationFn as any)(\n eventConfig.validation,\n data\n );\n } catch (err: any) {\n const { validationConfig } = validationManager;\n\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n\n throw new BadRequestError(\n error.message,\n `InvalidData`,\n isZod ? err.format() : err\n );\n }\n }\n }\n\n socket.data = data;\n\n await runArkosGatewayPipes(\n [...inheritedPipes, ...eventPipes],\n socket,\n data\n );\n\n await handler(socket, data, wrappedAck);\n\n handleGatewayEventLog(\n this.config.name,\n eventConfig.event,\n 200,\n startTime\n );\n\n if (eventConfig.ack && ack && !ackCalled) {\n ack({ success: true });\n }\n } catch (err: any) {\n handleArkosGatewayErrors(\n err,\n socket,\n errorHandlers,\n {\n startTime,\n namespace: this.config.name,\n event: eventConfig.event,\n },\n ack\n );\n }\n });\n }\n });\n\n for (const child of this.gateways) {\n child._register(\n io,\n {\n name: namespaceName,\n authentication: resolvedAuth,\n rateLimit: resolvedRateLimit,\n },\n resolvedHooks,\n inheritedPipes,\n options,\n resolvedMiddlewares\n );\n }\n }\n}\n\n/**\n * Creates an Arkos WebSocket Gateway backed by Socket.io.\n *\n * Handles authentication, validation, rate limiting, pipes,\n * error handling, and nested gateways — all declaratively.\n * Enhances every connected socket with `socket.user()`, `socket.peer()`,\n * `socket.retry()`, and automatic `_meta` injection on outgoing emits.\n *\n * @example\n * ```ts\n * const chatGateway = ArkosGateway({\n * name: \"chat\",\n * authentication: true,\n * rateLimit: { windowMs: 60_000, max: 200 },\n * })\n *\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n * ```\n * @since 1.7.0-canary.18\n * @see {@link https://www.arkosjs.com/docs/core-concepts/components/gateways}\n */\nfunction ArkosGateway(config: ArkosGatewayConfig) {\n return new IArkosGateway(config);\n}\n\nexport default ArkosGateway;\n"]}
1
+ {"version":3,"file":"arkos-gateway.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/arkos-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArkosGatewayConfig,\n ArkosGatewayErrorHandler,\n ArkosGatewayEventConfig,\n ArkosGatewayEventEntry,\n ArkosGatewayHandler,\n ArkosGatewayHookHandler,\n ArkosGatewayHookType,\n ArkosGatewayPipe,\n ArkosGatewayMiddleware,\n ArkosGatewayConnectionHandler,\n ArkosSocket,\n ArkosGatewayRegisterOptions,\n ArkosBroadcastOperator,\n ArkosEmitTarget,\n} from \"./types\";\nimport { Validator } from \"../../types/validation/validator\";\nimport { BroadcastOperator, Namespace, Server } from \"socket.io\";\nimport { authActionService, authService } from \"../../exports/services\";\nimport { checkRateLimit, clearRateLimitForSocket } from \"./utils/rate-limiter\";\nimport {\n handleArkosGatewayErrors,\n runArkosGatewayPipes,\n handleGatewayEventLog,\n handleGatewayLifecycleLog,\n} from \"./utils/helpers\";\nimport authHookManager from \"../../modules/auth/utils/auth-hooks-manager\";\nimport { getArkosConfig } from \"../../server\";\nimport validationManager from \"../../types/validation/validation-manager\";\nimport { loginRequiredError } from \"../../modules/auth/utils/auth-error-objects\";\nimport errorPrettifier from \"../../modules/base/utils/error-prettifier\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { defaultGatewayStore } from \"./utils/memory-gateway-store\";\nimport { ArkosBroadcastOperatorImpl, mountArkosSocketExtensions } from \"./socket-extensions\";\nimport {\n isAuthenticationEnabled,\n isUsingAuthentication,\n} from \"../../utils/helpers/arkos-config.helpers\";\nimport ExitError from \"../../utils/helpers/exit-error\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport {\n BadRequestError,\n TooManyRequestsError,\n} from \"../../modules/error-handler/utils/errors\";\n\nexport class IArkosGateway {\n private config: ArkosGatewayConfig;\n private events: ArkosGatewayEventEntry[] = [];\n private pipes: ArkosGatewayPipe[] = [];\n private middlewares: ArkosGatewayMiddleware[] = [];\n private gateways: IArkosGateway[] = [];\n private hooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [];\n private _nsp!: Namespace\n\n constructor(config: ArkosGatewayConfig) {\n this.config = config;\n this.config.name = config.name ?? \"web-socket\";\n }\n\n get nsp(): Omit<Namespace, keyof ArkosEmitTarget | keyof BroadcastOperator<any, any>> & ArkosBroadcastOperator {\n if (!this._nsp) throw new Error(`gateway.nsp accessed before register()`);\n return new ArkosBroadcastOperatorImpl(this._nsp.sockets, this._nsp) as any;\n }\n\n /**\n * Register a Socket.io connection-level middleware — runs before a socket\n * is accepted into this gateway's namespace, and after authentication\n * (so `socket.currentUser` is available).\n * Also accepts a child `ArkosGateway` which will inherit this gateway's\n * name as prefix along with its auth, rateLimit, and pipes.\n *\n * @example\n * chatGateway.use((socket, next) => {\n * console.log(\"incoming connection\", socket.id)\n * })\n *\n * // nested gateway\n * chatGateway.use(notificationsGateway)\n */\n use(...middlewareOrGateway: Array<ArkosGatewayMiddleware | IArkosGateway>): this {\n for (const item of middlewareOrGateway) {\n if (item instanceof IArkosGateway) {\n this.gateways.push(item);\n } else if (typeof item === \"function\") {\n this.middlewares.push(item as ArkosGatewayMiddleware);\n } else {\n throw new Error(\n `Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received \"${typeof item}\".`\n );\n }\n }\n return this;\n }\n\n /**\n * Register a pipe — middleware that runs before event handlers.\n *\n * When called with a function only, the pipe runs before every event\n * handler in this gateway and drills down to child gateways.\n *\n * When called with an event config object, the pipe runs only for that\n * specific event.\n *\n * @example\n * // runs before every event in this gateway\n * chatGateway.pipe((socket, data) => {\n * })\n *\n * // runs only before \"send_message\"\n * chatGateway.pipe({ event: \"send_message\" }, (socket, data) => {\n * })\n */\n pipe(fn: ArkosGatewayPipe): this;\n pipe<TSchema extends Validator = any>(\n eventConfig: { event: string },\n fn: ArkosGatewayPipe\n ): this;\n pipe<TSchema extends Validator = any>(\n fnOrConfig: ArkosGatewayPipe | ArkosGatewayEventConfig<TSchema>,\n fn?: ArkosGatewayPipe\n ): this {\n if (typeof fnOrConfig === \"function\") {\n this.pipes.push(fnOrConfig);\n } else if (fnOrConfig && typeof fnOrConfig === \"object\" && fn) {\n const entry = this.events.find(\n (e) => e.config.event === fnOrConfig.event\n );\n if (entry) {\n entry.pipes = entry.pipes ?? [];\n entry.pipes.push(fn);\n } else {\n this.events.push({\n config: { event: fnOrConfig.event, _pipeOnly: true } as any,\n handler: null as any,\n pipes: [fn],\n });\n }\n } else {\n throw new Error(\n `Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`\n );\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * @example\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n */\n on<TSchema extends Validator = any>(\n eventConfig: ArkosGatewayEventConfig<TSchema>,\n handler: ArkosGatewayHandler\n ): this {\n if (eventConfig.disabled) return this;\n\n if (eventConfig.authorization && this.config.authentication === false) {\n throw new Error(\n `Event \"${eventConfig.event}\" on \"${this.config.name}\" gateway defines authorization rules ` +\n `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`\n );\n }\n\n const deferred = this.events.find(\n (e) => (e.config as any)._pipeOnly && e.config.event === eventConfig.event\n );\n\n const entry: ArkosGatewayEventEntry = {\n config: eventConfig,\n handler,\n pipes: [...this.pipes, ...(deferred?.pipes ?? [])],\n };\n\n if (deferred) {\n const idx = this.events.indexOf(deferred);\n this.events.splice(idx, 1, entry);\n } else {\n this.events.push(entry);\n }\n\n if (typeof eventConfig?.authorization == \"object\")\n // To reuse later on\n (eventConfig.authorization as any)._authAction = authActionService.add(\n eventConfig.authorization!.action,\n eventConfig.authorization!.resource,\n {\n [eventConfig.authorization!.action]: eventConfig.authorization?.rule,\n }\n );\n\n return this;\n }\n\n /**\n * Register a lifecycle hook.\n *\n * - `\"connection\"` — called after a socket successfully connects and passes authentication.\n * - `\"disconnect\"` — called when a socket disconnects.\n * - `\"error\"` — called when an error is thrown inside any event handler.\n * If not registered, Arkos emits a default `\"error\"` event to the socket.\n *\n * @example\n * chatGateway.hook(\"connection\", (socket) => {\n * console.log(\"connected\", socket.user.id)\n * })\n *\n * chatGateway.hook(\"error\", (err, socket) => {\n * socket.emit(\"error\", { message: err.message })\n * })\n */\n hook(type: \"connection\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"disconnect\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"error\", handler: ArkosGatewayErrorHandler): this;\n hook(\n type: ArkosGatewayHookType,\n handler: ArkosGatewayConnectionHandler | ArkosGatewayErrorHandler\n ): this {\n this.hooks.push({ type, handler });\n return this;\n }\n\n /**\n * Wire this gateway into a Socket.io `Server` instance.\n * Registers the namespace, auth middleware, rate limiting, pipes,\n * and all event handlers — then recurses into child gateways.\n *\n * @example\n * const io = new Server(server)\n * chatGateway.register(io)\n */\n register(io: Server, options: ArkosGatewayRegisterOptions = {}): void {\n if ((io as any)._arkosGatewayRegistered)\n throw new Error(\n `The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/guides/web-sockets/setup.`\n );\n (io as any)._arkosGatewayRegistered = true;\n this._register(io, undefined, this.hooks || [], this.pipes || [], options);\n }\n\n private _register(\n io: Server,\n parentConfig?: ArkosGatewayConfig,\n inheritedHooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [],\n inheritedPipes: ArkosGatewayPipe[] = [],\n options: ArkosGatewayRegisterOptions = {},\n inheritedMiddlewares: ArkosGatewayMiddleware[] = []\n ): void {\n options.store = options.store ?? defaultGatewayStore;\n const { store } = options;\n\n const parentName = parentConfig?.name;\n const ownName = this.config.name;\n this.config = deepmerge(parentConfig || {}, this.config, {\n arrayMerge: (_, sourceArray) => sourceArray,\n });\n this.config.name = ownName;\n const localConfig = this.config;\n\n const namespaceName = parentName\n ? `${parentName.replace(/\\/$/, \"\")}/${ownName.replace(/^\\//, \"\")}`\n : (ownName ?? \"\");\n\n const ns = io.of(namespaceName);\n this._nsp = ns;\n\n const resolvedAuth =\n this.config.authentication !== false &&\n parentConfig?.authentication !== false;\n\n const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;\n const resolvedHooks = [...inheritedHooks, ...this.hooks];\n const resolvedMiddlewares = [...inheritedMiddlewares, ...this.middlewares];\n\n const connectHandlers = resolvedHooks\n .filter((h) => h.type === \"connection\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const disconnectHandlers = resolvedHooks\n .filter((h) => h.type === \"disconnect\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const errorHandlers = resolvedHooks\n .filter((h) => h.type === \"error\")\n .map((h) => h.handler as ArkosGatewayErrorHandler);\n\n if (resolvedAuth && isAuthenticationEnabled()) {\n ns.use(async (socket: any, next) => {\n socket = socket as ArkosSocket;\n const startTime = new Date().getTime();\n try {\n await authHookManager.runAuthenticate(\n {\n context: socket,\n done: (err?: any) => {\n if (err) throw err;\n next();\n },\n },\n async (socket) => {\n const user = await authService.getAuthenticatedUser(socket);\n if (!user) throw loginRequiredError;\n return user;\n },\n \"currentUser\"\n );\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, errorHandlers, {\n startTime,\n namespace: this.config.name,\n event: \"authentication\",\n });\n next(err);\n }\n });\n } else if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n for (const middleware of resolvedMiddlewares) {\n ns.use((socket, next) => middleware(socket as ArkosSocket, next));\n }\n\n ns.on(\"connection\", async (s) => {\n const socket = s as ArkosSocket;\n socket.locals = {};\n\n socket._arkos = { store, gatewayConfig: localConfig };\n mountArkosSocketExtensions(socket);\n\n handleGatewayLifecycleLog(this.config.name, \"connected\", socket.id);\n const connectionStartTime = new Date().getTime();\n\n if (socket.currentUser?.id)\n socket.join(`arkos::user:${socket.currentUser.id}`);\n\n try {\n for (const handler of connectHandlers) await handler(socket);\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"connection\",\n });\n return;\n }\n\n socket.on(\"disconnect\", async () => {\n handleGatewayLifecycleLog(this.config.name, \"disconnected\", socket.id);\n\n await clearRateLimitForSocket(socket.id, store);\n try {\n for (const handler of disconnectHandlers) await handler(socket);\n } catch (err) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"disconnection\",\n });\n }\n });\n\n for (const entry of this.events) {\n if ((entry.config as any)._pipeOnly || !entry.handler) continue;\n\n const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;\n\n if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to use authorization gateway.on(\"${eventConfig.event}\") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n socket.on(eventConfig.event, async (...args: any[]) => {\n socket.locals = {};\n const startTime = new Date().getTime();\n let data = args[0];\n\n const ack =\n typeof args[args.length - 1] === \"function\"\n ? args[args.length - 1]\n : undefined;\n\n let ackCalled = false;\n const wrappedAck = ack\n ? (...response: any) => {\n ackCalled = true;\n ack(...response);\n }\n : undefined;\n\n function resolveDedup() {\n if (\n eventConfig.dedup === false ||\n localConfig.dedup === false ||\n parentConfig?.dedup === false\n )\n return null;\n\n return {\n enabled: true,\n ttl: 3600,\n ...parentConfig?.dedup,\n ...localConfig?.dedup,\n ...eventConfig?.dedup,\n };\n }\n\n const dedupOpt = resolveDedup();\n\n try {\n const meta = data?._meta || {};\n const resolvedMaxAge =\n eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;\n\n if (resolvedMaxAge && !meta.timestamp)\n throw new BadRequestError(\n \"Missing _meta.timestamp for maxAge deduplication\"\n );\n\n if (meta.timestamp !== undefined) {\n const timestamp = new Date(meta.timestamp);\n\n if (isNaN(timestamp.getTime())) {\n throw new BadRequestError(\n \"Invalid data._meta.timestamp\",\n \"InvalidTimestamp\"\n );\n }\n\n const age = Date.now() - timestamp.getTime();\n\n if (age + 1000 < 0)\n throw new BadRequestError(\n \"Timestamp is in the future\",\n \"FutureTimestamp\"\n );\n\n if (resolvedMaxAge && age > resolvedMaxAge) {\n throw new BadRequestError(\"Message is too old\", \"StaleMessage\");\n }\n }\n\n if (dedupOpt && dedupOpt?.enabled !== false) {\n if (!meta?.mid)\n throw new BadRequestError(\n \"Missing data._meta.mid in your payload for deduplication\",\n \"MissingDedupMessageId\",\n { data }\n );\n\n if (typeof meta.mid !== \"string\" || meta.mid.trim() === \"\")\n throw new BadRequestError(\n \"Invalid data._meta.mid, it must be a non-empty string\",\n \"InvalidMessageId\"\n );\n\n const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;\n const ttl = dedupOpt?.ttl ?? 3600;\n\n const acquired = await store.setIfNotExists(key, ttl);\n\n if (acquired === false)\n return wrappedAck?.({\n success: true,\n duplicate: true,\n });\n\n const { _meta, ...payload } = data;\n data = payload;\n\n socket.meta = meta;\n }\n\n const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;\n if (rateLimitOptions !== false) {\n const { allowed, retryAfter } = await checkRateLimit(\n socket.id,\n eventConfig.event,\n rateLimitOptions || {},\n options.store!\n );\n if (!allowed) {\n throw new TooManyRequestsError(undefined, undefined, {\n retryAfter,\n });\n }\n }\n\n if (\n typeof eventConfig.authorization === \"object\" &&\n resolvedAuth &&\n isAuthenticationEnabled()\n ) {\n await authHookManager.runAuthorize(\n { context: socket, done: () => { } },\n (eventConfig?.authorization as any)?._authAction,\n \"currentUser\"\n );\n }\n\n if (eventConfig.validation) {\n const arkosConfig = getArkosConfig();\n const {\n validationFn,\n isValidValidator,\n validatorName,\n validatorNameType,\n } = validationManager;\n\n if (!isValidValidator(eventConfig.validation))\n throw new Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, ` +\n `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +\n `under event handler \"${eventConfig.event}\" in \"${this.config.name}\" gateway.`\n );\n\n const shouldValidate = validationManager.shouldValidate(\n eventConfig.validation,\n data\n );\n\n if (shouldValidate === \"prohibit\")\n throw new BadRequestError(\n \"Event data is not allowed for this event.\",\n \"EventDataNotAllowed\",\n { data }\n );\n else if (shouldValidate === \"passthrough\") data = data;\n else {\n try {\n data = await (validationFn as any)(\n eventConfig.validation,\n data\n );\n } catch (err: any) {\n const { validationConfig } = validationManager;\n\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n\n throw new BadRequestError(\n error.message,\n `InvalidData`,\n isZod ? err.format() : err\n );\n }\n }\n }\n\n socket.data = data;\n\n await runArkosGatewayPipes(\n [...inheritedPipes, ...eventPipes],\n socket,\n data\n );\n\n await handler(socket, data, wrappedAck);\n\n handleGatewayEventLog(\n this.config.name,\n eventConfig.event,\n 200,\n startTime\n );\n\n if (eventConfig.ack && ack && !ackCalled) {\n ack({ success: true });\n }\n } catch (err: any) {\n handleArkosGatewayErrors(\n err,\n socket,\n errorHandlers,\n {\n startTime,\n namespace: this.config.name,\n event: eventConfig.event,\n },\n ack\n );\n }\n });\n }\n });\n\n for (const child of this.gateways) {\n child._register(\n io,\n {\n name: namespaceName,\n authentication: resolvedAuth,\n rateLimit: resolvedRateLimit,\n },\n resolvedHooks,\n inheritedPipes,\n options,\n resolvedMiddlewares\n );\n }\n }\n}\n\n/**\n * Creates an Arkos WebSocket Gateway backed by Socket.io.\n *\n * Handles authentication, validation, rate limiting, pipes,\n * error handling, and nested gateways — all declaratively.\n * Enhances every connected socket with `socket.user()`, `socket.peer()`,\n * `socket.retry()`, and automatic `_meta` injection on outgoing emits.\n *\n * @example\n * ```ts\n * const chatGateway = ArkosGateway({\n * name: \"chat\",\n * authentication: true,\n * rateLimit: { windowMs: 60_000, max: 200 },\n * })\n *\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n * ```\n * @since 1.7.0-canary.18\n * @see {@link https://www.arkosjs.com/docs/core-concepts/components/gateways}\n */\nfunction ArkosGateway(config: ArkosGatewayConfig) {\n return new IArkosGateway(config);\n}\n\nexport default ArkosGateway;\n"]}
@@ -11,6 +11,6 @@ export function killServerChildProcess() {
11
11
  killProductionServerChildProcess();
12
12
  }
13
13
  export function getVersion() {
14
- return "1.7.5-rc";
14
+ return "1.7.6-rc";
15
15
  }
16
16
  //# sourceMappingURL=cli.helpers.js.map
@@ -13,7 +13,8 @@ export declare class IArkosGateway {
13
13
  get nsp(): Omit<Namespace, keyof ArkosEmitTarget | keyof BroadcastOperator<any, any>> & ArkosBroadcastOperator;
14
14
  /**
15
15
  * Register a Socket.io connection-level middleware — runs before a socket
16
- * is accepted into this gateway's namespace, and before authentication.
16
+ * is accepted into this gateway's namespace, and after authentication
17
+ * (so `socket.currentUser` is available).
17
18
  * Also accepts a child `ArkosGateway` which will inherit this gateway's
18
19
  * name as prefix along with its auth, rateLimit, and pipes.
19
20
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.7.5-rc",
3
+ "version": "1.7.6-rc",
4
4
  "description": "The Express & Prisma RESTful Framework",
5
5
  "main": "dist/cjs/exports/index.js",
6
6
  "module": "dist/esm/exports/index.js",