@rapidmx/meet-plugin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +382 -0
- package/README.md +38 -0
- package/apps/meet/[token].tsx +144 -0
- package/apps/meet/_CallControls.tsx +69 -0
- package/apps/meet/_CallView.tsx +338 -0
- package/apps/meet/_MeetChrome.tsx +30 -0
- package/apps/meet/_MeetLobby.tsx +223 -0
- package/apps/meet/_ParticipantTile.tsx +66 -0
- package/apps/meet/_layout.tsx +34 -0
- package/apps/meet/_meetApi.ts +66 -0
- package/apps/meet/index.tsx +22 -0
- package/apps/settings-video-conferencing/_PersonalRoomCard.tsx +140 -0
- package/apps/settings-video-conferencing/_layout.tsx +47 -0
- package/apps/settings-video-conferencing/index.tsx +192 -0
- package/apps/shared/media/activeSpeaker.ts +45 -0
- package/apps/shared/media/deviceMedia.ts +141 -0
- package/apps/shared/media/levelMeter.ts +91 -0
- package/apps/shared/push/GuestSignalingClient.ts +338 -0
- package/apps/shared/webrtc/MeshConnectionManager.ts +350 -0
- package/apps/shared/webrtc/realPeerConnection.ts +37 -0
- package/apps/shared/webrtc/types.ts +90 -0
- package/dist/apps/meet/[token].d.ts +33 -0
- package/dist/apps/meet/[token].js +101 -0
- package/dist/apps/meet/_CallControls.d.ts +18 -0
- package/dist/apps/meet/_CallControls.js +6 -0
- package/dist/apps/meet/_CallView.d.ts +41 -0
- package/dist/apps/meet/_CallView.js +225 -0
- package/dist/apps/meet/_MeetChrome.d.ts +13 -0
- package/dist/apps/meet/_MeetChrome.js +10 -0
- package/dist/apps/meet/_MeetLobby.d.ts +29 -0
- package/dist/apps/meet/_MeetLobby.js +120 -0
- package/dist/apps/meet/_ParticipantTile.d.ts +18 -0
- package/dist/apps/meet/_ParticipantTile.js +25 -0
- package/dist/apps/meet/_layout.d.ts +9 -0
- package/dist/apps/meet/_layout.js +8 -0
- package/dist/apps/meet/_meetApi.d.ts +47 -0
- package/dist/apps/meet/_meetApi.js +23 -0
- package/dist/apps/meet/index.d.ts +5 -0
- package/dist/apps/meet/index.js +8 -0
- package/dist/apps/settings-video-conferencing/_PersonalRoomCard.d.ts +24 -0
- package/dist/apps/settings-video-conferencing/_PersonalRoomCard.js +77 -0
- package/dist/apps/settings-video-conferencing/_layout.d.ts +16 -0
- package/dist/apps/settings-video-conferencing/_layout.js +8 -0
- package/dist/apps/settings-video-conferencing/index.d.ts +16 -0
- package/dist/apps/settings-video-conferencing/index.js +92 -0
- package/dist/apps/shared/media/activeSpeaker.d.ts +20 -0
- package/dist/apps/shared/media/activeSpeaker.js +39 -0
- package/dist/apps/shared/media/deviceMedia.d.ts +65 -0
- package/dist/apps/shared/media/deviceMedia.js +110 -0
- package/dist/apps/shared/media/levelMeter.d.ts +40 -0
- package/dist/apps/shared/media/levelMeter.js +61 -0
- package/dist/apps/shared/push/GuestSignalingClient.d.ts +89 -0
- package/dist/apps/shared/push/GuestSignalingClient.js +291 -0
- package/dist/apps/shared/webrtc/MeshConnectionManager.d.ts +97 -0
- package/dist/apps/shared/webrtc/MeshConnectionManager.js +262 -0
- package/dist/apps/shared/webrtc/realPeerConnection.d.ts +7 -0
- package/dist/apps/shared/webrtc/realPeerConnection.js +26 -0
- package/dist/apps/shared/webrtc/types.d.ts +94 -0
- package/dist/apps/shared/webrtc/types.js +9 -0
- package/dist/lib/index.js +25 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/models/mongo/VideoMeetingInviteeMongo.js +87 -0
- package/dist/lib/models/mongo/VideoMeetingInviteeMongo.js.map +1 -0
- package/dist/lib/models/mongo/VideoMeetingMongo.js +126 -0
- package/dist/lib/models/mongo/VideoMeetingMongo.js.map +1 -0
- package/dist/lib/models/sql/VideoMeetingInviteeSQL.js +87 -0
- package/dist/lib/models/sql/VideoMeetingInviteeSQL.js.map +1 -0
- package/dist/lib/models/sql/VideoMeetingSQL.js +127 -0
- package/dist/lib/models/sql/VideoMeetingSQL.js.map +1 -0
- package/dist/lib/models/types.js +19 -0
- package/dist/lib/models/types.js.map +1 -0
- package/dist/lib/mongo.js +13 -0
- package/dist/lib/mongo.js.map +1 -0
- package/dist/lib/routes/BaseVideoMeetingRoute.js +743 -0
- package/dist/lib/routes/BaseVideoMeetingRoute.js.map +1 -0
- package/dist/lib/routes/mongo/VideoMeetingRouteMongo.js +31 -0
- package/dist/lib/routes/mongo/VideoMeetingRouteMongo.js.map +1 -0
- package/dist/lib/routes/sql/VideoMeetingRouteSQL.js +31 -0
- package/dist/lib/routes/sql/VideoMeetingRouteSQL.js.map +1 -0
- package/dist/lib/sql.js +13 -0
- package/dist/lib/sql.js.map +1 -0
- package/dist/lib/util/BookingIntegrationUtils.js +115 -0
- package/dist/lib/util/BookingIntegrationUtils.js.map +1 -0
- package/dist/lib/util/IceServerUtils.js +68 -0
- package/dist/lib/util/IceServerUtils.js.map +1 -0
- package/dist/lib/util/PublicUrlUtils.js +37 -0
- package/dist/lib/util/PublicUrlUtils.js.map +1 -0
- package/dist/lib/util/RouteAccessUtils.js +32 -0
- package/dist/lib/util/RouteAccessUtils.js.map +1 -0
- package/dist/lib/util/TokenUtils.js +33 -0
- package/dist/lib/util/TokenUtils.js.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/models/mongo/VideoMeetingInviteeMongo.d.ts +16 -0
- package/dist/types/models/mongo/VideoMeetingMongo.d.ts +23 -0
- package/dist/types/models/sql/VideoMeetingInviteeSQL.d.ts +16 -0
- package/dist/types/models/sql/VideoMeetingSQL.d.ts +23 -0
- package/dist/types/models/types.d.ts +131 -0
- package/dist/types/mongo.d.ts +8 -0
- package/dist/types/routes/BaseVideoMeetingRoute.d.ts +368 -0
- package/dist/types/routes/mongo/VideoMeetingRouteMongo.d.ts +10 -0
- package/dist/types/routes/sql/VideoMeetingRouteSQL.d.ts +10 -0
- package/dist/types/sql.d.ts +8 -0
- package/dist/types/util/BookingIntegrationUtils.d.ts +51 -0
- package/dist/types/util/IceServerUtils.d.ts +57 -0
- package/dist/types/util/PublicUrlUtils.d.ts +11 -0
- package/dist/types/util/RouteAccessUtils.d.ts +8 -0
- package/dist/types/util/TokenUtils.d.ts +23 -0
- package/package.json +181 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseVideoMeetingRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseVideoMeetingRoute.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAgB,MAAM,iBAAiB,CAAC;AACrF,OAAO,EACH,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,kBAAkB,EAClB,aAAa,EAEb,UAAU,EAEV,SAAS,EACT,eAAe,GAElB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAmB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAqC,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACnH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;AACpD,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;AAC/C,MAAM,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC;AAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC;AAErG;oCACoC;AACpC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B;;qGAEqG;AACrG,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB;qDACqD;AACrD,MAAM,aAAa,GAAG,6BAA6B,CAAC;AAEpD;;4FAE4F;AAC5F,MAAM,CAAC,MAAM,qBAAqB,GAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAEzD;;;kFAGkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAEzC;gDACgD;AAChD,MAAM,wBAAwB,GAAG,CAAC,CAAC;AA4FnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwIG;AACH,MAAM,OAAgB,qBAAqB;IAA3C;QAgBY,iBAAY,GAAa,CAAC,OAAO,CAAC,CAAC;QAO3C;;wHAEgH;QAExG,cAAS,GAAW,EAAE,CAAC;QAGvB,YAAO,GAAW,EAAE,CAAC;QAGrB,iBAAY,GAAW,EAAE,CAAC;QAG1B,mBAAc,GAAW,EAAE,CAAC;QAG5B,qBAAgB,GAAW,EAAE,CAAC;IAshB1C,CAAC;IAjhBG;;;;;OAKG;IACH,IAAW,UAAU;QACjB,OAAQ,IAAI,CAAC,WAAmB,CAAC,UAAU,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,IAAI;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,cAAe,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtI,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,cAAe,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtI,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,cAAe,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtI,CAAC;IACL,CAAC;IAED;0EACsE;IAC9D,KAAK,CAAC,oBAAoB,CAAC,UAAkB,EAAE,IAAyB,EAAE,MAAc;QAC5F,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACvH,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,uBAAuB,EAAE,GAAG,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;QACzG,CAAC;IACL,CAAC;IAED;+FAC2F;IACnF,KAAK,CAAC,mBAAmB,CAAC,EAAU,EAAE,IAAyB,EAAE,MAAc;QACnF,MAAM,OAAO,GAAmB,MAAM,IAAI,CAAC,WAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;qEAEiE;IACzD,kBAAkB,CAAC,IAAwC;QAC/D,IAAI,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3D,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAC9C,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,2BAA2B,gBAAgB,cAAc,CAAC,CAAC;QAClH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,sBAAsB,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,KAAK,sBAAsB,CAAC,MAAM,EAAE,CAAC;YAC1G,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,6CAA6C,CAAC,CAAC;QACtG,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,sBAAsB,CAAC,OAAO,EAAE,CAAC;YACrD,MAAM,QAAQ,GAA+C,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;YACjF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,kDAAkD,CAAC,CAAC;YAC3G,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;gBACjC,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,8BAA8B,YAAY,YAAY,CAAC,CAAC;YAC/G,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IACI,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ;oBAClC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,gBAAgB;oBAC9C,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAC3C,CAAC;oBACC,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,wCAAwC,CAAC,CAAC;gBACjG,CAAC;gBACD,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,uBAAuB,CAAC,EAAE,CAAC;oBACnI,MAAM,IAAI,QAAQ,CACd,SAAS,CAAC,eAAe,EACzB,GAAG,EACH,6CAA6C,uBAAuB,cAAc,CACrF,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACxE,CAAC;IAED;oHACgH;IACxG,mBAAmB,CAAC,KAAyB,EAAE,SAAiB;QACpE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAS,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,SAAS,uCAAuC,CAAC,CAAC;QAC7G,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IAEa,AAAN,KAAK,CAAC,cAAc,CAC1B,UAAkB,EAClB,IAA4B,EAC5B,UAAkC,EAClC,SAA2B,EAC3B,OAAyB,EACzB,IAAyB;QAEzB,MAAM,YAAY,GAAwB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACrF,MAAM,UAAU,GAAuB,UAAU,KAAK,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACnH,yFAAyF;QACzF,4GAA4G;QAC5G,6GAA6G;QAC7G,gFAAgF;QAChF,MAAM,aAAa,GAAuB,UAAU,KAAK,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvH,wGAAwG;QACxG,kGAAkG;QAClG,4GAA4G;QAC5G,mBAAmB;QACnB,MAAM,QAAQ,GAAO,IAAI,IAAI,CAAC,YAAY,CAAC;YACvC,UAAU;YACV,KAAK,EAAE,IAAI,CAAC,KAAM,CAAC,IAAI,EAAE;YACzB,UAAU;YACV,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,SAAS;YAC5D,MAAM,EAAE,kBAAkB,CAAC,SAAS;YACpC,SAAS;YACT,OAAO;YACP,UAAU;YACV,aAAa;SAChB,CAAC,CAAC;QACH,MAAM,OAAO,GAAO,MAAM,IAAI,CAAC,WAAY,CAAC,MAAM,CAAC,QAAQ,EAAE;YACzD,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;SACjE,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,KAAK,sBAAsB,CAAC,OAAO,EAAE,CAAC;YAChD,0FAA0F;YAC1F,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAS,EAAE,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CACT,MAAM,IAAI,CAAC,WAAY,CAAC,MAAM,CAC1B,IAAI,IAAI,CAAC,YAAY,CAAC;oBAClB,UAAU,EAAE,OAAO,CAAC,GAAG;oBACvB,UAAU;oBACV,KAAK,EAAE,GAAG,CAAC,KAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;oBACtC,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,SAAS;oBACjD,SAAS,EAAE,aAAa,EAAE;iBAC7B,CAAC,EACF,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAC1C,CACJ,CAAC;YACN,CAAC;QACL,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED;iDAC6C;IACrC,OAAO,CAAC,WAAmB;QAC/B,MAAM,IAAI,GAAuB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IASY,AAAN,KAAK,CAAC,MAAM,CACf,OAA2C,EAClC,GAAgB,EACf,IAAc;QAExB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACpE,MAAM,IAAI,GAA2B,OAAQ,CAAC;QAC9C,MAAM,SAAS,GAAqB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAqB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpF,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAEpE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEhH,MAAM,MAAM,GAAiC,EAAE,OAAO,EAAE,CAAC;QACzD,IAAI,UAAU,KAAK,sBAAsB,CAAC,OAAO,EAAE,CAAC;YAChD,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACzC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;aAC3C,CAAC,CAAC,CAAC;QACR,CAAC;aAAM,CAAC;YACJ,qEAAqE;YACrE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAW,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;;;;OASG;IACK,YAAY,CAAe,OAAU;QACzC,MAAM,MAAM,GAA8D,EAAE,GAAG,OAAO,EAAE,CAAC;QACzF,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAQY,AAAN,KAAK,CAAC,IAAI,CACQ,UAA8B,EACnC,KAAyB,EAC1B,IAAwB,EAC7B,IAAc;QAExB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,WAAW,GAAuB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,MAAM,UAAU,GAAuB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,sGAAsG;QACtG,uGAAuG;QACvG,wGAAwG;QACxG,MAAM,QAAQ,GAAS,MAAM,IAAI,CAAC,WAAY,CAAC,IAAI,CAC/C,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAS,EAC3F,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAC5D,CAAC;QACF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAUY,AAAN,KAAK,CAAC,QAAQ,CAAc,EAAU,EAAY,IAAc;QACnE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,GAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAQY,AAAN,KAAK,CAAC,MAAM,CACF,EAAU,EACvB,IAAqD,EAC3C,IAAc;QAExB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,GAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAwB,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAG,OAAe,CAAC,OAAO,EAAE,CAAC;QAC3F,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBACtG,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,iDAAiD,gBAAgB,cAAc,CAAC,CAAC;YACxI,CAAC;YACD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,kBAAkB,CAAC,SAAS,EAAE,CAAC;gBAC/C,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,0CAA0C,CAAC,CAAC;YACnG,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC;QAChD,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1D,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,oDAAoD,CAAC,CAAC;QAC7G,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,WAAY,CAAC,MAAM,CAAC,KAAY,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxI,CAAC;IAUY,AAAN,KAAK,CAAC,MAAM,CAAc,EAAU,EAAY,IAAc;QACjE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,GAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAwB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAU,MAAM,IAAI,CAAC,WAAY,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClI,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,WAAY,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,IAAI,CAAC,WAAY,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACK,KAAK,CAAC,qBAAqB,CAAC,KAAa;QAC7C;kGAC0F;QAC1F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,OAAO,GAAU,MAAM,IAAI,CAAC,WAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAS,EAAE;gBACjG,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,MAAM,OAAO,GAAoB,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,OAAO,GAAmB,MAAM,IAAI,CAAC,WAAY,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,sBAAsB,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,kBAAkB,CAAC,SAAS,EAAE,CAAC;gBACvH,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,aAAa,GAAS,MAAM,IAAI,CAAC,WAAY,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAS,EAAE;gBACvG,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,MAAM,aAAa,GAAmB,aAAa,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,aAAa,EAAE,CAAC;gBAChB,IAAI,aAAa,CAAC,UAAU,KAAK,sBAAsB,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,KAAK,kBAAkB,CAAC,SAAS,EAAE,CAAC;oBACtH,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;YACjE,CAAC;YACD,MAAM,gBAAgB,GAAS,MAAM,IAAI,CAAC,WAAY,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAS,EAAE;gBAC7G,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,MAAM,gBAAgB,GAAmB,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,UAAU,KAAK,sBAAsB,CAAC,OAAO,IAAI,gBAAgB,CAAC,MAAM,KAAK,kBAAkB,CAAC,SAAS,EAAE,CAAC;gBAClJ,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;QACvE,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,GAAW;QAC5D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,wBAAwB,EAAE,OAAO,EAAE,EAAE,CAAC;YAClE,MAAM,GAAG,GAAkC,MAAM,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAChI;;mHAEuG;YACvG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,GAAG,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC5D,OAAO;YACX,CAAC;YACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrF,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClC,OAAO;YACX,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,OAAO,KAAK,wBAAwB,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;oBACtG,MAAM,GAAG,CAAC;gBACd,CAAC;gBACD,gGAAgG;gBAChG,wDAAwD;YAC5D,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACK,cAAc;QAClB,MAAM,QAAQ,GAAW,GAAG,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9F,MAAM,SAAS,GAAS,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,GAAG,IAAI,CAAC,CAAC;QAC5E,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;QAClF,MAAM,eAAe,GAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAW,QAAQ,CAAC,eAAe,CAC1C,eAAe,EACf,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EACxC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE,CACnF,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1C,CAAC;IAED;uFACmF;IAC3E,KAAK,CAAC,eAAe,CAAC,UAAkB;QAC5C,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,WAAY,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChG,OAAO,OAAO,EAAE,WAAW,IAAI,SAAS,CAAC;IAC7C,CAAC;IAiBY,AAAN,KAAK,CAAC,IAAI,CAAiB,KAAa,EAAY,IAAc;QACrE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAEzE,0GAA0G;QAC1G,yGAAyG;QACzG,wGAAwG;QACxG,wGAAwG;QACxG,uGAAuG;QACvG,sGAAsG;QACtG,0FAA0F;QAC1F,0GAA0G;QAC1G,4GAA4G;QAC5G,sEAAsE;QACtE,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;YAClC,MAAM,YAAY,GAAY,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;YAC/E,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACzI,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC7E,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAuB;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,eAAe,EAAE,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC;SAClE,CAAC;QACF,MAAM,UAAU,GAAsB,eAAe,CAAC;YAClD,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,YAAY,EAAE,IAAI,CAAC,gBAAgB;SACtC,CAAC,CAAC;QAEH,iGAAiG;QACjG,0GAA0G;QAC1G,oGAAoG;QACpG,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1F,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACzE,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrD,OAAO;YACH,OAAO,EAAE,aAAa;YACtB,UAAU;YACV,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;SACrC,CAAC;IACN,CAAC;CACJ;AAhjBW;IADP,MAAM,CAAC,QAAQ,CAAC;8BACE,QAAQ;uDAAC;AAGpB;IADP,MAAM,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;;2DACQ;AAKnC;IADP,MAAM,CAAC,MAAM,CAAC;;yDACS;AAMhB;IADP,MAAM,CAAC,2BAA2B,EAAE,EAAE,CAAC;;wDACT;AAGvB;IADP,MAAM,CAAC,yBAAyB,EAAE,EAAE,CAAC;;sDACT;AAGrB;IADP,MAAM,CAAC,8BAA8B,EAAE,EAAE,CAAC;;2DACT;AAG1B;IADP,MAAM,CAAC,gCAAgC,EAAE,EAAE,CAAC;;6DACT;AAG5B;IADP,MAAM,CAAC,mCAAmC,EAAE,EAAE,CAAC;;+DACV;AAG9B;IADP,MAAM;;qDACa;AA0GJ;IADf,aAAa,EAAE;;;;2DAyDf;AAgBY;IAPZ,OAAO,CAAC,0BAA0B,CAAC;IACnC,WAAW,CACR,yGAAyG;QACrG,mGAAmG;QACnG,+BAA+B,CACtC;IACA,IAAI,EAAE;IAGF,WAAA,OAAO,CAAA;IACP,WAAA,QAAQ,CAAA;;;;mDA2BZ;AA6BY;IANZ,OAAO,CAAC,mCAAmC,CAAC;IAC5C,WAAW,CACR,oGAAoG;QAChG,mGAAmG,CAC1G;IACA,GAAG,EAAE;IAED,WAAA,KAAK,CAAC,YAAY,CAAC,CAAA;IACnB,WAAA,KAAK,CAAC,OAAO,CAAC,CAAA;IACd,WAAA,KAAK,CAAC,MAAM,CAAC,CAAA;IACb,WAAA,QAAQ,CAAA;;;;iDAiBZ;AAUY;IARZ,OAAO,CAAC,8CAA8C,CAAC;IACvD,WAAW,CACR,wGAAwG;QACpG,mGAAmG;QACnG,qGAAqG;QACrG,+BAA+B,CACtC;IACA,GAAG,CAAC,MAAM,CAAC;IACW,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;IAAc,WAAA,QAAQ,CAAA;;;;qDAIvD;AAQY;IANZ,OAAO,CAAC,iDAAiD,CAAC;IAC1D,WAAW,CACR,0GAA0G;QACtG,kDAAkD,CACzD;IACA,GAAG,CAAC,MAAM,CAAC;IAEP,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;IAEX,WAAA,QAAQ,CAAA;;;;mDAqBZ;AAUY;IARZ,OAAO,CAAC,0BAA0B,CAAC;IACnC,WAAW,CACR,+FAA+F;QAC3F,uGAAuG;QACvG,uGAAuG;QACvG,+BAA+B,CACtC;IACA,MAAM,CAAC,MAAM,CAAC;IACM,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;IAAc,WAAA,QAAQ,CAAA;;;;mDASrD;AA0JY;IAfZ,OAAO,CAAC,wBAAwB,CAAC;IACjC,WAAW,CACR,sGAAsG;QAClG,oGAAoG;QACpG,oGAAoG;QACpG,mGAAmG;QACnG,qFAAqF;QACrF,qGAAqG;QACrG,+FAA+F;QAC/F,oGAAoG;QACpG,uGAAuG;QACvG,8EAA8E,CACrF;IACA,SAAS,EAAE;IACX,GAAG,CAAC,cAAc,CAAC;IACD,WAAA,KAAK,CAAC,OAAO,CAAC,CAAA;IAAiB,WAAA,QAAQ,CAAA;;;;iDAqDzD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
9
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
10
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
import { RouteDecorators } from "@rapidrest/service-core";
|
|
12
|
+
import { MailboxMongo } from "@rapidmx/restapi/mongo";
|
|
13
|
+
import { VideoMeetingMongo } from "../../models/mongo/VideoMeetingMongo.js";
|
|
14
|
+
import { VideoMeetingInviteeMongo } from "../../models/mongo/VideoMeetingInviteeMongo.js";
|
|
15
|
+
import { BaseVideoMeetingRoute } from "../BaseVideoMeetingRoute.js";
|
|
16
|
+
const { ApiRoute, Model } = RouteDecorators;
|
|
17
|
+
/** The owner's video meeting management endpoints and the anonymous join endpoint (`/api/mail/video-meetings`). */
|
|
18
|
+
let VideoMeetingRouteMongo = class VideoMeetingRouteMongo extends BaseVideoMeetingRoute {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.meetingClass = VideoMeetingMongo;
|
|
22
|
+
this.inviteeClass = VideoMeetingInviteeMongo;
|
|
23
|
+
this.mailboxClass = MailboxMongo;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
VideoMeetingRouteMongo = __decorate([
|
|
27
|
+
ApiRoute("mail/video-meetings"),
|
|
28
|
+
Model(VideoMeetingMongo)
|
|
29
|
+
], VideoMeetingRouteMongo);
|
|
30
|
+
export { VideoMeetingRouteMongo };
|
|
31
|
+
//# sourceMappingURL=VideoMeetingRouteMongo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoMeetingRouteMongo.js","sourceRoot":"","sources":["../../../../src/routes/mongo/VideoMeetingRouteMongo.ts"],"names":[],"mappings":";;;;;;AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC;AAE5C,mHAAmH;AAG5G,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,qBAAgF;IAArH;;QACO,iBAAY,GAAQ,iBAAiB,CAAC;QACtC,iBAAY,GAAQ,wBAAwB,CAAC;QAC7C,iBAAY,GAAQ,YAAY,CAAC;IAC/C,CAAC;CAAA,CAAA;AAJY,sBAAsB;IAFlC,QAAQ,CAAC,qBAAqB,CAAC;IAC/B,KAAK,CAAC,iBAAiB,CAAC;GACZ,sBAAsB,CAIlC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
9
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
10
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
import { RouteDecorators } from "@rapidrest/service-core";
|
|
12
|
+
import { MailboxSQL } from "@rapidmx/restapi/sql";
|
|
13
|
+
import { VideoMeetingSQL } from "../../models/sql/VideoMeetingSQL.js";
|
|
14
|
+
import { VideoMeetingInviteeSQL } from "../../models/sql/VideoMeetingInviteeSQL.js";
|
|
15
|
+
import { BaseVideoMeetingRoute } from "../BaseVideoMeetingRoute.js";
|
|
16
|
+
const { ApiRoute, Model } = RouteDecorators;
|
|
17
|
+
/** The owner's video meeting management endpoints and the anonymous join endpoint (`/api/mail/video-meetings`). */
|
|
18
|
+
let VideoMeetingRouteSQL = class VideoMeetingRouteSQL extends BaseVideoMeetingRoute {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.meetingClass = VideoMeetingSQL;
|
|
22
|
+
this.inviteeClass = VideoMeetingInviteeSQL;
|
|
23
|
+
this.mailboxClass = MailboxSQL;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
VideoMeetingRouteSQL = __decorate([
|
|
27
|
+
ApiRoute("mail/video-meetings"),
|
|
28
|
+
Model(VideoMeetingSQL)
|
|
29
|
+
], VideoMeetingRouteSQL);
|
|
30
|
+
export { VideoMeetingRouteSQL };
|
|
31
|
+
//# sourceMappingURL=VideoMeetingRouteSQL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoMeetingRouteSQL.js","sourceRoot":"","sources":["../../../../src/routes/sql/VideoMeetingRouteSQL.ts"],"names":[],"mappings":";;;;;;AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC;AAE5C,mHAAmH;AAG5G,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,qBAA0E;IAA7G;;QACO,iBAAY,GAAQ,eAAe,CAAC;QACpC,iBAAY,GAAQ,sBAAsB,CAAC;QAC3C,iBAAY,GAAQ,UAAU,CAAC;IAC7C,CAAC;CAAA,CAAA;AAJY,oBAAoB;IAFhC,QAAQ,CAAC,qBAAqB,CAAC;IAC/B,KAAK,CAAC,eAAe,CAAC;GACV,oBAAoB,CAIhC"}
|
package/dist/lib/sql.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* This plugin's `./sql` entry point: exactly the classes a server host loads for a SQL deployment - the video
|
|
7
|
+
* meeting models and the route mounted at `/api/mail/video-meetings`. Anything else exported here would be
|
|
8
|
+
* registered by the host too, so the abstract route and utilities stay in the package root.
|
|
9
|
+
*/
|
|
10
|
+
export { VideoMeetingSQL } from "./models/sql/VideoMeetingSQL.js";
|
|
11
|
+
export { VideoMeetingInviteeSQL } from "./models/sql/VideoMeetingInviteeSQL.js";
|
|
12
|
+
export { VideoMeetingRouteSQL } from "./routes/sql/VideoMeetingRouteSQL.js";
|
|
13
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/sql.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
12
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
13
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
14
|
+
import { ObjectDecorators } from "@rapidrest/core";
|
|
15
|
+
import { RepoUtils } from "@rapidrest/service-core";
|
|
16
|
+
import { buildBaseUrl } from "./PublicUrlUtils.js";
|
|
17
|
+
import { mintJoinToken } from "./TokenUtils.js";
|
|
18
|
+
import { VideoMeetingStatus, VideoMeetingVisibility } from "../models/types.js";
|
|
19
|
+
const { Config } = ObjectDecorators;
|
|
20
|
+
/**
|
|
21
|
+
* Mirrors `BaseVideoMeetingRoute`'s own `MAX_TITLE_LENGTH`/`MAX_DISPLAY_NAME_LENGTH` bounds. This function has no
|
|
22
|
+
* HTTP request of its own to reject with a `400` (see the function doc comment below on why a bound is silently
|
|
23
|
+
* clamped here instead), but a caller-supplied title/invitee name is still free text that ends up on a stored row,
|
|
24
|
+
* so the same limits apply.
|
|
25
|
+
*/
|
|
26
|
+
const MAX_TITLE_LENGTH = 200;
|
|
27
|
+
const MAX_DISPLAY_NAME_LENGTH = 200;
|
|
28
|
+
/**
|
|
29
|
+
* Resolves `mail:videoconf:public_url` the same way `BaseVideoMeetingRoute` resolves it for its own `publicUrl`
|
|
30
|
+
* field. `createSingleInviteeVideoMeeting()` is a plain function, not a route/injectable class, so it has no
|
|
31
|
+
* `@Config`-decorated field of its own for `ObjectFactory` to populate at construction time - this tiny,
|
|
32
|
+
* `ObjectFactory.initialize()`-able holder exists solely to get the same config resolution `@Config` normally
|
|
33
|
+
* provides. Not exported: nothing outside this file needs it.
|
|
34
|
+
*/
|
|
35
|
+
class PublicUrlConfigHolder {
|
|
36
|
+
constructor() {
|
|
37
|
+
this.publicUrl = "";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
__decorate([
|
|
41
|
+
Config("mail:videoconf:public_url", ""),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], PublicUrlConfigHolder.prototype, "publicUrl", void 0);
|
|
44
|
+
/**
|
|
45
|
+
* **The integration surface other plugins call.** This is the one thing `@rapidmx/videoconf-plugin` exposes for
|
|
46
|
+
* another, independently-installed plugin to use in-process: mints a private `VideoMeeting` for exactly one
|
|
47
|
+
* invitee and returns just that invitee's join URL. `booking-plugin` is today's only caller - a video-location
|
|
48
|
+
* booking with no host-preset URL mints one of these automatically (the booker as the sole invitee, matching this
|
|
49
|
+
* plugin's own "one link per invitee" private-meeting design) - see that package's `BaseBookingRoute`/`.claude/
|
|
50
|
+
* NOTES.md` for the calling side, and this plugin's own `.claude/NOTES.md` for the design this integration was
|
|
51
|
+
* built against.
|
|
52
|
+
*
|
|
53
|
+
* This is deliberately the ONLY integration point this package exposes: everything else about `VideoMeeting`/
|
|
54
|
+
* `VideoMeetingInvitee` (routes, signaling, the join flow, cancellation, ...) is reached only through this
|
|
55
|
+
* package's own HTTP API. A caller never gets a `VideoMeeting`/`VideoMeetingInvitee` instance back, only the one
|
|
56
|
+
* value it actually needs, so this package stays free to change anything else about their shape without breaking
|
|
57
|
+
* a caller compiled against an older version.
|
|
58
|
+
*
|
|
59
|
+
* Mirrors `BaseVideoMeetingRoute.create()`'s own private-meeting-plus-single-invitee path exactly, including its
|
|
60
|
+
* `acl: { uid: instance.uid, parentUid: mailboxUid, records: [] }` claim (see that class's doc comment on why
|
|
61
|
+
* `VideoMeeting` needs its own per-record `AccessControlList`) - but skips everything about validating an HTTP
|
|
62
|
+
* request body or checking a caller's own permission on the mailbox: this is an in-process call from code that has
|
|
63
|
+
* already established both by its own means (e.g. `booking-plugin`'s already-authorized, already-validated
|
|
64
|
+
* booking flow).
|
|
65
|
+
*
|
|
66
|
+
* A caller-supplied `title`/`invitee.displayName` longer than this package's own route-level limits is silently
|
|
67
|
+
* truncated rather than rejected - there is no request here to answer with a `400`, and a slightly-shortened title
|
|
68
|
+
* is a far better outcome than throwing back into whatever the caller's own flow was doing. (`booking-plugin`'s own
|
|
69
|
+
* call site additionally wraps this whole function in a `try`/`catch` so even a genuine failure here - a database
|
|
70
|
+
* error, a stale/misconfigured deployment - never blocks the caller's own operation; see its doc comment.)
|
|
71
|
+
*
|
|
72
|
+
* @param objectFactory The caller's own `ObjectFactory` - used exactly as `BaseVideoMeetingRoute` uses its own, to
|
|
73
|
+
* build the repos this needs and to resolve `mail:videoconf:public_url`.
|
|
74
|
+
* @param meetingClass The concrete `VideoMeeting` model class for the caller's own backend (`VideoMeetingMongo`/
|
|
75
|
+
* `VideoMeetingSQL`, from this package's `./mongo`/`./sql` entry points) - this package has no notion of "Mongo" vs.
|
|
76
|
+
* "SQL" itself (see `BaseVideoMeetingRoute`'s identical `meetingClass` constructor parameter), so the caller
|
|
77
|
+
* supplies it, the same way `booking-plugin`'s own `BookingRouteMongo`/`BookingRouteSQL` supply their own concrete
|
|
78
|
+
* classes to `BaseBookingRoute`.
|
|
79
|
+
* @param inviteeClass The concrete `VideoMeetingInvitee` model class for the same backend.
|
|
80
|
+
* @param mailboxUid The mailbox the meeting is minted under - the caller's own already-authorized mailbox.
|
|
81
|
+
* @param title A short, human-readable meeting title (e.g. the caller's own meeting/event name).
|
|
82
|
+
* @param invitee The sole invitee of the new private meeting.
|
|
83
|
+
* @returns The invitee's join URL, or `undefined` when `mail:videoconf:public_url` isn't configured on this
|
|
84
|
+
* deployment - mirroring `VideoMeetingInviteeJoinInfo.joinUrl`'s identical semantics exactly. Never throws for
|
|
85
|
+
* that reason alone; a genuine failure (a bad `objectFactory`, a database error, ...) still propagates.
|
|
86
|
+
*/
|
|
87
|
+
export async function createSingleInviteeVideoMeeting(objectFactory, meetingClass, inviteeClass, mailboxUid, title, invitee) {
|
|
88
|
+
const meetingRepo = await objectFactory.newInstance(RepoUtils, { name: meetingClass.name, args: [meetingClass] });
|
|
89
|
+
const inviteeRepo = await objectFactory.newInstance(RepoUtils, { name: inviteeClass.name, args: [inviteeClass] });
|
|
90
|
+
const configHolder = await objectFactory.initialize(new PublicUrlConfigHolder());
|
|
91
|
+
const safeTitle = title.trim().slice(0, MAX_TITLE_LENGTH) || "Video meeting";
|
|
92
|
+
// Constructed before `create()` is called (rather than inline), so its own, already-generated `uid` (every
|
|
93
|
+
// `BaseEntity` mints one on construction) is what `acl.uid` below claims the meeting's own per-record ACL
|
|
94
|
+
// under - see `BaseVideoMeetingRoute.persistMeeting()`'s identical reasoning.
|
|
95
|
+
const meetingInstance = new meetingClass({
|
|
96
|
+
mailboxUid,
|
|
97
|
+
title: safeTitle,
|
|
98
|
+
visibility: VideoMeetingVisibility.PRIVATE,
|
|
99
|
+
status: VideoMeetingStatus.SCHEDULED,
|
|
100
|
+
});
|
|
101
|
+
const meeting = await meetingRepo.create(meetingInstance, {
|
|
102
|
+
ignoreACL: true,
|
|
103
|
+
acl: { uid: meetingInstance.uid, parentUid: mailboxUid, records: [] },
|
|
104
|
+
});
|
|
105
|
+
const inviteeRow = await inviteeRepo.create(new inviteeClass({
|
|
106
|
+
meetingUid: meeting.uid,
|
|
107
|
+
mailboxUid,
|
|
108
|
+
email: invitee.email.trim().toLowerCase(),
|
|
109
|
+
displayName: invitee.displayName?.trim().slice(0, MAX_DISPLAY_NAME_LENGTH) || undefined,
|
|
110
|
+
joinToken: mintJoinToken(),
|
|
111
|
+
}), { ignoreACL: true });
|
|
112
|
+
const base = buildBaseUrl(configHolder.publicUrl);
|
|
113
|
+
return base ? `${base}/${inviteeRow.joinToken}` : undefined;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=BookingIntegrationUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BookingIntegrationUtils.js","sourceRoot":"","sources":["../../../src/util/BookingIntegrationUtils.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAiB,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAqC,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACnH,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAQpC;;;;;;GAMG;AACH,MAAM,qBAAqB;IAA3B;QAEW,cAAS,GAAW,EAAE,CAAC;IAClC,CAAC;CAAA;AADU;IADN,MAAM,CAAC,2BAA2B,EAAE,EAAE,CAAC;;wDACV;AAGlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACjD,aAA4B,EAC5B,YAAwC,EACxC,YAAyC,EACzC,UAAkB,EAClB,KAAa,EACb,OAA6B;IAE7B,MAAM,WAAW,GAAkB,MAAM,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACjI,MAAM,WAAW,GAAmB,MAAM,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAClI,MAAM,YAAY,GAA0B,MAAM,aAAa,CAAC,UAAU,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IAExG,MAAM,SAAS,GAAW,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,IAAI,eAAe,CAAC;IAErF,2GAA2G;IAC3G,0GAA0G;IAC1G,8EAA8E;IAC9E,MAAM,eAAe,GAAO,IAAI,YAAY,CAAC;QACzC,UAAU;QACV,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,sBAAsB,CAAC,OAAO;QAC1C,MAAM,EAAE,kBAAkB,CAAC,SAAS;KACvC,CAAC,CAAC;IACH,MAAM,OAAO,GAAO,MAAM,WAAW,CAAC,MAAM,CAAC,eAAe,EAAE;QAC1D,SAAS,EAAE,IAAI;QACf,GAAG,EAAE,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;KACxE,CAAC,CAAC;IAEH,MAAM,UAAU,GAAQ,MAAM,WAAW,CAAC,MAAM,CAC5C,IAAI,YAAY,CAAC;QACb,UAAU,EAAE,OAAO,CAAC,GAAG;QACvB,UAAU;QACV,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QACzC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,IAAI,SAAS;QACvF,SAAS,EAAE,aAAa,EAAE;KAC7B,CAAC,EACF,EAAE,SAAS,EAAE,IAAI,EAAE,CACtB,CAAC;IAEF,MAAM,IAAI,GAAuB,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import * as crypto from "crypto";
|
|
6
|
+
/** Always-available, free public STUN servers - discovery only, no media relay. Two independent providers, so a
|
|
7
|
+
* call still has STUN available if one of them is ever unreachable. */
|
|
8
|
+
export const DEFAULT_STUN_SERVERS = [
|
|
9
|
+
{ urls: "stun:stun.l.google.com:19302" },
|
|
10
|
+
{ urls: "stun:stun.cloudflare.com:3478" },
|
|
11
|
+
];
|
|
12
|
+
/** How long a minted TURN REST credential remains valid for, in seconds. One hour comfortably covers ICE
|
|
13
|
+
* negotiation and reconnection attempts for the length of a typical call without minting a fresh credential on
|
|
14
|
+
* every join. */
|
|
15
|
+
export const DEFAULT_TURN_CREDENTIAL_TTL_SECONDS = 60 * 60;
|
|
16
|
+
/**
|
|
17
|
+
* Generates a coturn-style time-limited REST API credential: `username` is `<unix-expiry-timestamp>:<userPart>`,
|
|
18
|
+
* and `credential` is `base64(HMAC-SHA1(sharedSecret, username))`. This is coturn's own documented
|
|
19
|
+
* `static-auth-secret` mechanism (the `turnserver -a -X` REST credential algorithm) - implemented here exactly,
|
|
20
|
+
* not guessed at: the TURN server derives the same HMAC independently at connection time using the timestamp
|
|
21
|
+
* embedded in the username it's handed, so no round trip to the TURN server is needed to mint one.
|
|
22
|
+
*
|
|
23
|
+
* @param sharedSecret The operator's `mail:videoconf:turn:shared_secret`.
|
|
24
|
+
* @param userPart The identity portion of the username - the configured `mail:videoconf:turn:username`, or a
|
|
25
|
+
* generated one when that's unset (see `buildIceServers()`).
|
|
26
|
+
* @param ttlSeconds How long the credential remains valid for, from `now`.
|
|
27
|
+
* @param now The time to compute the expiry from. Defaults to the real current time; a test may pass a fixed
|
|
28
|
+
* value for a deterministic assertion.
|
|
29
|
+
*/
|
|
30
|
+
export function turnRestCredential(sharedSecret, userPart, ttlSeconds = DEFAULT_TURN_CREDENTIAL_TTL_SECONDS, now = new Date()) {
|
|
31
|
+
const expiry = Math.floor(now.getTime() / 1000) + Math.max(0, Math.floor(ttlSeconds));
|
|
32
|
+
const username = `${expiry}:${userPart}`;
|
|
33
|
+
const credential = crypto.createHmac("sha1", sharedSecret).update(username).digest("base64");
|
|
34
|
+
return { username, credential };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Builds the full ICE server list for a join response: the hardcoded public STUN servers, plus a TURN entry when
|
|
38
|
+
* `settings.url` is configured. When a `sharedSecret` is also configured, the TURN entry carries a fresh,
|
|
39
|
+
* time-limited credential (`turnRestCredential()`) rather than the static `username`/`credential` pair, which is
|
|
40
|
+
* used verbatim only when no shared secret is set. A TURN url with neither a shared secret nor a static
|
|
41
|
+
* credential is still included with no credentials at all - some self-hosted TURN servers are deliberately run
|
|
42
|
+
* without authentication for testing, and it costs nothing to pass the url through as configured.
|
|
43
|
+
*
|
|
44
|
+
* @param settings The `mail:videoconf:turn:*` settings, exactly as configured.
|
|
45
|
+
* @param options `ttlSeconds`/`now` are forwarded to `turnRestCredential()`. `randomUserPart` supplies the
|
|
46
|
+
* generated identity portion of a shared-secret credential's username when `settings.username` is unset -
|
|
47
|
+
* defaults to a fresh random hex string; a test may override it for a deterministic assertion.
|
|
48
|
+
*/
|
|
49
|
+
export function buildIceServers(settings, options) {
|
|
50
|
+
const servers = [...DEFAULT_STUN_SERVERS];
|
|
51
|
+
const url = settings.url.trim();
|
|
52
|
+
if (!url) {
|
|
53
|
+
return servers;
|
|
54
|
+
}
|
|
55
|
+
if (settings.sharedSecret.trim()) {
|
|
56
|
+
const userPart = settings.username.trim() || (options?.randomUserPart ?? (() => crypto.randomBytes(8).toString("hex")))();
|
|
57
|
+
const { username, credential } = turnRestCredential(settings.sharedSecret.trim(), userPart, options?.ttlSeconds, options?.now);
|
|
58
|
+
servers.push({ urls: url, username, credential });
|
|
59
|
+
}
|
|
60
|
+
else if (settings.username.trim() && settings.credential.trim()) {
|
|
61
|
+
servers.push({ urls: url, username: settings.username.trim(), credential: settings.credential.trim() });
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
servers.push({ urls: url });
|
|
65
|
+
}
|
|
66
|
+
return servers;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=IceServerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IceServerUtils.js","sourceRoot":"","sources":["../../../src/util/IceServerUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAkBjC;uEACuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAA+B;IAC5D,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACxC,EAAE,IAAI,EAAE,+BAA+B,EAAE;CAC5C,CAAC;AAEF;;iBAEiB;AACjB,MAAM,CAAC,MAAM,mCAAmC,GAAW,EAAE,GAAG,EAAE,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAC9B,YAAoB,EACpB,QAAgB,EAChB,aAAqB,mCAAmC,EACxD,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAW,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;IACjD,MAAM,UAAU,GAAW,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC3B,QAAsB,EACtB,OAA4E;IAE5E,MAAM,OAAO,GAAsB,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAW,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAW,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClI,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/H,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5G,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Normalizes a `mail:videoconf:public_url`-shaped setting into a base URL (origin plus path, no trailing slash),
|
|
7
|
+
* or `undefined` when it's unset or unsafe to advertise - mirroring `@rapidmx/autodiscover`'s `BaseAutodiscoverRoute`
|
|
8
|
+
* private `baseUrl` getter exactly (that helper isn't exported from `@rapidmx/restapi` for reuse, so this is a
|
|
9
|
+
* small, independent copy of the same validation): the value must parse as a URL, use `https:` (plain `http:` is
|
|
10
|
+
* only tolerated for a loopback host, for local development), and carry no credentials, query string or fragment -
|
|
11
|
+
* any of which would produce a broken or insecure join link once a token is appended.
|
|
12
|
+
*
|
|
13
|
+
* @param rawUrl The configured setting value, e.g. `https://mail.example.com/meet`.
|
|
14
|
+
*/
|
|
15
|
+
export function buildBaseUrl(rawUrl) {
|
|
16
|
+
const value = (rawUrl ?? "").trim();
|
|
17
|
+
if (!value) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
let url;
|
|
21
|
+
try {
|
|
22
|
+
url = new URL(value);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const loopback = ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname);
|
|
28
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
// Checked on the raw string: `URL.search`/`hash` are empty for a bare trailing `?`/`#`.
|
|
32
|
+
if (value.includes("?") || value.includes("#") || url.username || url.password) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
return `${url.origin}${url.pathname.replace(/\/+$/, "")}`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=PublicUrlUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicUrlUtils.js","sourceRoot":"","sources":["../../../src/util/PublicUrlUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACnD,MAAM,KAAK,GAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACD,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,QAAQ,GAAY,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC;QACvE,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,wFAAwF;IACxF,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7E,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small, self-contained copy of `@rapidmx/restapi`'s internal `util/MailAccessUtils.ts` (`stripTrustedRoles()`/
|
|
3
|
+
* `isTrustedRole()`) - that module is not exported from `@rapidmx/restapi`'s public surface (a plugin can only
|
|
4
|
+
* import what the package's own `src/index.ts` re-exports), so a plugin that wants the same "no role widens
|
|
5
|
+
* access" posture for a mailbox-scoped entity has to reimplement it rather than reuse it.
|
|
6
|
+
*
|
|
7
|
+
* **Why this exists.** `@rapidrest/service-core`'s `ACLUtils.hasPermission()` answers `true` for any caller
|
|
8
|
+
* holding a trusted role ("trusted users always have permission") - the right behavior for administering the
|
|
9
|
+
* platform, the wrong one for a person's private mail data, video meetings included. `BaseVideoMeetingRoute`
|
|
10
|
+
* therefore never hands `aclUtils.hasPermission()` (or `RepoUtils` with `{ user }` and no `ignoreACL`) the caller
|
|
11
|
+
* as given; it always strips trusted roles first via `stripTrustedRoles()` below, so a mailbox is reachable only
|
|
12
|
+
* by its owner or an explicit delegate - the same rule this session's other work established for `/api/acls` and
|
|
13
|
+
* every other mailbox-scoped route in `@rapidmx/restapi` itself.
|
|
14
|
+
*/
|
|
15
|
+
/** Whether `role` is one of `trustedRoles` - as itself or org-prefixed (`<orgUid>.<role>`), the form
|
|
16
|
+
* `UserUtils.hasRole()` also accepts. */
|
|
17
|
+
function isTrustedRole(role, trustedRoles) {
|
|
18
|
+
return trustedRoles.some((trusted) => role === trusted || role.endsWith(`.${trusted}`));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* `user` without its trusted roles (and without its elevation), for handing to code that would otherwise treat
|
|
22
|
+
* the caller as a superuser: `ACLUtils.hasPermission()`, `RepoUtils` with `{ user }` and no `ignoreACL`. Everything
|
|
23
|
+
* else about the identity - uid, other roles, scopes - is unchanged, so an owner or delegate record still
|
|
24
|
+
* matches. Returns `user` itself when it has nothing to strip.
|
|
25
|
+
*/
|
|
26
|
+
export function stripTrustedRoles(user, trustedRoles) {
|
|
27
|
+
if (!user || !Array.isArray(user.roles) || !user.roles.some((role) => isTrustedRole(role, trustedRoles))) {
|
|
28
|
+
return user;
|
|
29
|
+
}
|
|
30
|
+
return { ...user, roles: user.roles.filter((role) => !isTrustedRole(role, trustedRoles)), elevated: -1 };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=RouteAccessUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteAccessUtils.js","sourceRoot":"","sources":["../../../src/util/RouteAccessUtils.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AAEH;yCACyC;AACzC,SAAS,aAAa,CAAC,IAAY,EAAE,YAA+B;IAChE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAyB,EAAE,YAA+B;IACxF,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACvG,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;AAC7G,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import * as crypto from "crypto";
|
|
6
|
+
/**
|
|
7
|
+
* The exact shape `mintJoinToken()` produces: 32 random bytes, base64url without padding - mirroring
|
|
8
|
+
* `booking-plugin`'s `Booking.manageToken` shape/entropy exactly (see its `BaseBookingRoute.MANAGE_TOKEN_PATTERN`).
|
|
9
|
+
* Checked before any lookup, so a candidate value is always a plain literal by the time it reaches a query.
|
|
10
|
+
*/
|
|
11
|
+
export const JOIN_TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
|
12
|
+
/**
|
|
13
|
+
* The exact shape `mintPublicSlug()` produces: 8 random bytes, base64url without padding - deliberately a
|
|
14
|
+
* different length than `JOIN_TOKEN_PATTERN` (11 characters vs. 43), so the two can never collide and
|
|
15
|
+
* `BaseVideoMeetingRoute.join()` can tell which kind of value it was handed from its length alone, without
|
|
16
|
+
* ambiguity, rather than trying both lookups against a value that only matched one of them (see that method's
|
|
17
|
+
* doc comment for the disambiguation this enables).
|
|
18
|
+
*/
|
|
19
|
+
export const PUBLIC_SLUG_PATTERN = /^[A-Za-z0-9_-]{11}$/;
|
|
20
|
+
/** Mints a private meeting invitee's `joinToken`: 32 random bytes, base64url. Matches `JOIN_TOKEN_PATTERN`. */
|
|
21
|
+
export function mintJoinToken() {
|
|
22
|
+
return crypto.randomBytes(32).toString("base64url");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Mints a public meeting's `publicSlug`: 8 random bytes, base64url (~48 bits of entropy). Matches
|
|
26
|
+
* `PUBLIC_SLUG_PATTERN`. Random rather than name-derived (unlike `booking-plugin`'s human-authored
|
|
27
|
+
* `BookingType.slug`) since nothing about a video meeting is memorable or worth choosing by hand - it only ever
|
|
28
|
+
* appears embedded in a link.
|
|
29
|
+
*/
|
|
30
|
+
export function mintPublicSlug() {
|
|
31
|
+
return crypto.randomBytes(8).toString("base64url");
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=TokenUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenUtils.js","sourceRoot":"","sources":["../../../src/util/TokenUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAW,qBAAqB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAW,qBAAqB,CAAC;AAEjE,+GAA+G;AAC/G,MAAM,UAAU,aAAa;IACzB,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC1B,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Private and public WebRTC video conferencing for a `@rapidmx/restapi`-based mail server: a mailbox owner creates
|
|
3
|
+
* a `VideoMeeting` (private, with one join link per invitee, or public, with a single shareable link), and a
|
|
4
|
+
* participant - the owner or an anonymous guest holding a valid link - joins it and exchanges WebRTC signaling
|
|
5
|
+
* over the server's existing `/push` channel (see `BaseVideoMeetingRoute`'s class doc comment).
|
|
6
|
+
*
|
|
7
|
+
* This module exports only the backend-agnostic surface: the entity interfaces, the pure ICE-server/public-URL/
|
|
8
|
+
* token utilities, the abstract route, and `createSingleInviteeVideoMeeting()` - the small integration function
|
|
9
|
+
* another plugin (`booking-plugin`, today) calls in-process to mint a private meeting without either package
|
|
10
|
+
* taking a hard dependency on the other (see `util/BookingIntegrationUtils.ts`'s doc comment). The concrete
|
|
11
|
+
* Mongo/SQL classes a server loads (models and the route mounted at `/api/mail/video-meetings`) come from this
|
|
12
|
+
* package's `./mongo` and `./sql` entry points.
|
|
13
|
+
*/
|
|
14
|
+
export * from "./models/types.js";
|
|
15
|
+
export * from "./util/BookingIntegrationUtils.js";
|
|
16
|
+
export * from "./util/IceServerUtils.js";
|
|
17
|
+
export * from "./util/PublicUrlUtils.js";
|
|
18
|
+
export * from "./util/RouteAccessUtils.js";
|
|
19
|
+
export * from "./util/TokenUtils.js";
|
|
20
|
+
export * from "./routes/BaseVideoMeetingRoute.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseMongoEntity } from "@rapidrest/service-core";
|
|
2
|
+
import { VideoMeetingInvitee } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of the `VideoMeetingInvitee` interface for storage in a MongoDB database. If SQL is desired,
|
|
5
|
+
* please use `models.sql.VideoMeetingInviteeSQL` instead.
|
|
6
|
+
*
|
|
7
|
+
* @author Jean-Philippe Steinmetz
|
|
8
|
+
*/
|
|
9
|
+
export declare class VideoMeetingInviteeMongo extends BaseMongoEntity implements VideoMeetingInvitee {
|
|
10
|
+
meetingUid: string;
|
|
11
|
+
mailboxUid: string;
|
|
12
|
+
email: string;
|
|
13
|
+
displayName?: string;
|
|
14
|
+
joinToken: string;
|
|
15
|
+
constructor(other?: Partial<VideoMeetingInviteeMongo>);
|
|
16
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseMongoEntity } from "@rapidrest/service-core";
|
|
2
|
+
import { VideoMeeting, VideoMeetingStatus, VideoMeetingVisibility } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of the `VideoMeeting` interface for storage in a MongoDB database. If SQL is desired, please use
|
|
5
|
+
* `models.sql.VideoMeetingSQL` instead.
|
|
6
|
+
*
|
|
7
|
+
* `recordACL: true` - see the `VideoMeeting` interface's own doc comment for why this entity, unlike most of this
|
|
8
|
+
* codebase's mailbox-scoped data, gets its own per-record `AccessControlList`.
|
|
9
|
+
*
|
|
10
|
+
* @author Jean-Philippe Steinmetz
|
|
11
|
+
*/
|
|
12
|
+
export declare class VideoMeetingMongo extends BaseMongoEntity implements VideoMeeting {
|
|
13
|
+
mailboxUid: string;
|
|
14
|
+
calendarEventUid?: string;
|
|
15
|
+
title: string;
|
|
16
|
+
visibility: VideoMeetingVisibility;
|
|
17
|
+
publicSlug?: string;
|
|
18
|
+
organizerSlug?: string;
|
|
19
|
+
status: VideoMeetingStatus;
|
|
20
|
+
startTime?: Date;
|
|
21
|
+
endTime?: Date;
|
|
22
|
+
constructor(other?: Partial<VideoMeetingMongo>);
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseEntity } from "@rapidrest/service-core";
|
|
2
|
+
import { VideoMeetingInvitee } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of the `VideoMeetingInvitee` interface for storage in a SQL database. If MongoDB is desired,
|
|
5
|
+
* please use `models.mongo.VideoMeetingInviteeMongo` instead.
|
|
6
|
+
*
|
|
7
|
+
* @author Jean-Philippe Steinmetz
|
|
8
|
+
*/
|
|
9
|
+
export declare class VideoMeetingInviteeSQL extends BaseEntity implements VideoMeetingInvitee {
|
|
10
|
+
meetingUid: string;
|
|
11
|
+
mailboxUid: string;
|
|
12
|
+
email: string;
|
|
13
|
+
displayName?: string;
|
|
14
|
+
joinToken: string;
|
|
15
|
+
constructor(other?: Partial<VideoMeetingInviteeSQL>);
|
|
16
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseEntity } from "@rapidrest/service-core";
|
|
2
|
+
import { VideoMeeting, VideoMeetingStatus, VideoMeetingVisibility } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of the `VideoMeeting` interface for storage in a SQL database. If MongoDB is desired, please use
|
|
5
|
+
* `models.mongo.VideoMeetingMongo` instead.
|
|
6
|
+
*
|
|
7
|
+
* `recordACL: true` - see the `VideoMeeting` interface's own doc comment for why this entity, unlike most of this
|
|
8
|
+
* codebase's mailbox-scoped data, gets its own per-record `AccessControlList`.
|
|
9
|
+
*
|
|
10
|
+
* @author Jean-Philippe Steinmetz
|
|
11
|
+
*/
|
|
12
|
+
export declare class VideoMeetingSQL extends BaseEntity implements VideoMeeting {
|
|
13
|
+
mailboxUid: string;
|
|
14
|
+
calendarEventUid?: string;
|
|
15
|
+
title: string;
|
|
16
|
+
visibility: VideoMeetingVisibility;
|
|
17
|
+
publicSlug?: string;
|
|
18
|
+
organizerSlug?: string;
|
|
19
|
+
status: VideoMeetingStatus;
|
|
20
|
+
startTime?: Date;
|
|
21
|
+
endTime?: Date;
|
|
22
|
+
constructor(other?: Partial<VideoMeetingSQL>);
|
|
23
|
+
}
|