bitchat-node 0.1.0 → 0.1.2

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.
Files changed (45) hide show
  1. package/README.md +94 -23
  2. package/dist/client.d.ts +1 -0
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +143 -28
  5. package/dist/client.js.map +1 -1
  6. package/dist/debug.d.ts +39 -0
  7. package/dist/debug.d.ts.map +1 -0
  8. package/dist/debug.js +89 -0
  9. package/dist/debug.js.map +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/mesh/router.d.ts.map +1 -1
  15. package/dist/mesh/router.js +9 -1
  16. package/dist/mesh/router.js.map +1 -1
  17. package/dist/protocol/binary.d.ts +1 -1
  18. package/dist/protocol/binary.d.ts.map +1 -1
  19. package/dist/protocol/binary.js +2 -2
  20. package/dist/protocol/binary.js.map +1 -1
  21. package/dist/session/manager.d.ts.map +1 -1
  22. package/dist/session/manager.js +18 -1
  23. package/dist/session/manager.js.map +1 -1
  24. package/dist/transport/ble.d.ts +15 -0
  25. package/dist/transport/ble.d.ts.map +1 -1
  26. package/dist/transport/ble.js +63 -16
  27. package/dist/transport/ble.js.map +1 -1
  28. package/dist/ui/html.d.ts +5 -0
  29. package/dist/ui/html.d.ts.map +1 -0
  30. package/dist/ui/html.js +506 -0
  31. package/dist/ui/html.js.map +1 -0
  32. package/dist/ui/server.d.ts +5 -1
  33. package/dist/ui/server.d.ts.map +1 -1
  34. package/dist/ui/server.js +61 -255
  35. package/dist/ui/server.js.map +1 -1
  36. package/package.json +3 -2
  37. package/src/client.ts +159 -34
  38. package/src/debug.ts +119 -0
  39. package/src/index.ts +11 -0
  40. package/src/mesh/router.ts +11 -1
  41. package/src/protocol/binary.ts +2 -2
  42. package/src/session/manager.ts +19 -1
  43. package/src/transport/ble.ts +70 -16
  44. package/src/ui/html.ts +506 -0
  45. package/src/ui/server.ts +78 -258
@@ -1 +1 @@
1
- {"version":3,"file":"ble.js","sourceRoot":"","sources":["../../src/transport/ble.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAqBlC,MAAM,cAAc,GAAuB;IACzC,WAAW,EAAE,YAAY;IACzB,kBAAkB,EAAE,mBAAmB;IACvC,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,IAAI,EAAE,wCAAwC;CAC/D,CAAC;AAkBF;;GAEG;AACH,MAAM,OAAO,OAAO;IACT,EAAE,CAAS;IACZ,UAAU,CAAa;IACvB,cAAc,CAAiB;IAC/B,OAAO,CAAU;IACjB,GAAG,CAAS;IAEpB,YAAY,UAAsB,EAAE,cAA8B,EAAE,MAAc,WAAW;QAC3F,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAgB;QACzB,wBAAwB;QACxB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,gCAAgC;YAChC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAElF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAE5F,sDAAsD;QACtD,8DAA8D;QAC9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC7C,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;oBAC1C,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;oBACrD,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,WAAW,CAAC;IAC/C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IACpC,MAAM,CAAqB;IAC3B,KAAK,CAAe;IACpB,KAAK,CAAe;IACpB,OAAO,GAAG,KAAK,CAAC;IAExB,uCAAuC;IAC/B,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE3C,wCAAwC;IAChC,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,cAAc,CAA0B;IAEhD,YAAY,SAAsC,EAAE;QAClD,KAAK,EAAE,CAAC;QACR,MAAM,UAAU,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QACpD,+EAA+E;QAC/E,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC9C,UAAU,CAAC,WAAW,GAAG,oBAAoB,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QACzB,OAAO,CAAC,GAAG,CACT,yBAAyB,EACzB,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,iBAAiB,EACjB,IAAI,CAAC,MAAM,CAAC,WAAW,CACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,IAAI,CAAC;YACH,kCAAkC;YAClC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3B,CAAC;YAED,qCAAqC;YACrC,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACjC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,CAAC;YACH,gBAAgB;YAChB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;YACvC,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;YAED,6BAA6B;YAC7B,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;gBAC1C,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,IAAgB;QAC9B,sCAAsC;QACtC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACtE,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,EAAE,gBAAgB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,iDAAiD;QACjD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC1E,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,+BAA+B;IAEvB,KAAK,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAG,IAAI,CAAC,KAAa,CAAC,KAAK,CAAC,CAAC;QAEvE,sBAAsB;QACtB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEtC,wBAAwB;QACxB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAEnE,iBAAiB;QACjB,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAY,CAAC;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAExC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACjD,CAAC,EAAE,KAAK,CAAC,CAAC;YAEV,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;gBAChC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;oBAC1B,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAC7C,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;oBAC9D,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC;YAEF,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mDAAmD;IAC3C,iBAAiB,GAAG,IAAI,GAAG,EAAgD,CAAC;IACpF,8EAA8E;IACtE,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,CAAC,UAAU,CAAC,UAAsB;QAC7C,gDAAgD;QAChD,MAAM,mBAAmB,GACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YACrC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CACT,8BAA8B,EAC9B,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,aAAa,EAAE,SAAS,CACpC,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QAElD,qEAAqE;QACrE,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QAE5D,yEAAyE;QACzE,oFAAoF;QACpF,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjD,4DAA4D;YAC5D,OAAO;QACT,CAAC;QAED,qCAAqC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB;YAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;gBACxB,mCAAmC;gBACnC,OAAO;YACT,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YAEnD,kCAAkC;YAClC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE/C,wCAAwC;YACxC,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,UAAU,CAAC,2CAA2C,CACtF,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EACzB,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CACjC,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAEtE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;gBAC7D,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAE1C,UAAU;YACV,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,IAAI,WAAW,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YAE3E,mBAAmB;YACnB,MAAM,IAAI,GAAwB;gBAChC,UAAU;gBACV,cAAc;gBACd,GAAG;aACJ,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAE5C,cAAc;YACd,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAEtC,6BAA6B;YAC7B,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC;YACtC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,oBAAoB;YACpB,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;gBACjC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yBAAyB;YACzB,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEnD,MAAM,GAAG,GAAG,KAAc,CAAC;YAE3B,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI;gBAC5D,KAAK,EAAE,CAAC;gBACR,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC;YACF,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAEpD,6CAA6C;YAC7C,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CACX,0BAA0B,EAC1B,GAAG,EAAE,OAAO,IAAI,eAAe,EAC/B,YAAY,MAAM,CAAC,KAAK,GAAG,CAC5B,CAAC;YACJ,CAAC;YAED,uCAAuC;YACvC,IAAI,CAAC;gBACH,IAAI,UAAU,CAAC,KAAK,KAAK,WAAW,IAAI,UAAU,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;oBAC1E,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC;gBACrC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,oCAAoC;YACpC,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,4BAA4B,CAAC,EAAE,UAAU,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,cAAsB;QACzC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACjD,CAAC;IAED,kCAAkC;IAE1B,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC;YAEjC,sBAAsB;YACtB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAEnC,wBAAwB;YACxB,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,mBAAmB,CAAC;gBAC7C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,CAAC;gBAC/D,cAAc,EAAE,CACd,IAAY,EACZ,OAAe,EACf,gBAAyB,EACzB,QAAkC,EAClC,EAAE;oBACF,oCAAoC;oBACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,IAAW,CAAC,CAAC;oBACrD,QAAQ,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;gBAC/C,CAAC;gBACD,WAAW,EAAE,CAAC,aAAqB,EAAE,mBAA2C,EAAE,EAAE;oBAClF,uDAAuD;oBACvD,IAAI,CAAC,cAAc,GAAG,mBAAmB,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACrD,CAAC;gBACD,aAAa,EAAE,GAAG,EAAE;oBAClB,uBAAuB;oBACvB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBACtC,CAAC;aACF,CAAC,CAAC;YAEH,iBAAiB;YACjB,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;YACtD,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC;gBACtC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC/C,eAAe,EAAE,CAAC,cAAc,CAAC;aAClC,CAAC,CAAC;YAEH,eAAe;YACf,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAElC,uCAAuC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAY,CAAC;YAChC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,aAAqB,EAAE,EAAE;gBAC3C,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,aAAa,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,aAAqB,EAAE,EAAE;gBAC/C,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,aAAa,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC7C,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,oBAAoB;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gDAAgD;YAChD,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAY,CAAC;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAExC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YACrC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEV,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;gBAChC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;oBAC1B,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAC7C,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;oBAC9D,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC;YAEF,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"ble.js","sourceRoot":"","sources":["../../src/transport/ble.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Enhanced Bitchat Web UI with Debug Panel
3
+ */
4
+ export declare const HTML = "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Bitchat Node</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { \n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0f0f1a; color: #eee; height: 100vh; display: flex; flex-direction: column;\n }\n \n /* Header */\n header { \n background: #1a1a2e; padding: 12px 20px; border-bottom: 1px solid #2a2a4a;\n display: flex; justify-content: space-between; align-items: center;\n }\n header h1 { font-size: 16px; font-weight: 600; display: flex; align-items: center; gap: 8px; }\n header h1 .logo { font-size: 20px; }\n .header-info { display: flex; align-items: center; gap: 16px; }\n .status { \n font-size: 11px; padding: 4px 10px; border-radius: 12px;\n background: #2a2a4a; color: #888;\n }\n .status.connected { background: #064e3b; color: #34d399; }\n .peer-count { font-size: 11px; color: #60a5fa; }\n .my-info { font-size: 11px; color: #888; font-family: monospace; }\n \n /* Tab Navigation */\n .tabs {\n background: #1a1a2e; display: flex; border-bottom: 1px solid #2a2a4a;\n }\n .tab {\n padding: 10px 20px; cursor: pointer; font-size: 13px; color: #888;\n border-bottom: 2px solid transparent; transition: all 0.2s;\n }\n .tab:hover { color: #ccc; }\n .tab.active { color: #60a5fa; border-bottom-color: #60a5fa; }\n .tab .badge {\n background: #dc2626; color: white; font-size: 10px; padding: 2px 6px;\n border-radius: 10px; margin-left: 6px;\n }\n \n /* Main Layout */\n main { flex: 1; display: flex; overflow: hidden; }\n .panel { display: none; flex: 1; flex-direction: column; overflow: hidden; }\n .panel.active { display: flex; }\n \n /* Chat Panel */\n .chat-container { display: flex; flex: 1; overflow: hidden; }\n .messages-area { flex: 1; display: flex; flex-direction: column; }\n .messages { \n flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 8px;\n }\n .message { \n background: #1a1a2e; padding: 10px 14px; border-radius: 12px; max-width: 75%;\n animation: fadeIn 0.15s ease;\n }\n @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } }\n .message.mine { background: #1e3a5f; align-self: flex-end; }\n .message.private { border-left: 3px solid #ec4899; }\n .message .meta { font-size: 10px; color: #666; margin-bottom: 4px; }\n .message .meta .nickname { color: #60a5fa; font-weight: 500; }\n .message .meta .private-tag { color: #ec4899; margin-left: 6px; }\n .message .content { line-height: 1.4; word-wrap: break-word; font-size: 14px; }\n .system { text-align: center; font-size: 11px; color: #555; padding: 6px; }\n \n /* Input Area */\n .input-area { background: #1a1a2e; padding: 12px 16px; border-top: 1px solid #2a2a4a; }\n .dm-indicator { \n font-size: 11px; color: #ec4899; margin-bottom: 8px; \n display: flex; align-items: center; gap: 8px;\n }\n .dm-indicator .clear { cursor: pointer; color: #888; }\n .dm-indicator .clear:hover { color: #fff; }\n .input-row { display: flex; gap: 8px; }\n input[type=\"text\"] { \n flex: 1; background: #0f0f1a; border: 1px solid #2a2a4a; border-radius: 8px;\n padding: 10px 14px; color: #eee; font-size: 14px; outline: none;\n }\n input[type=\"text\"]:focus { border-color: #3b82f6; }\n input[type=\"text\"]::placeholder { color: #444; }\n button { \n background: #3b82f6; color: white; border: none; border-radius: 8px;\n padding: 10px 20px; font-size: 13px; font-weight: 500; cursor: pointer;\n }\n button:hover { background: #2563eb; }\n button:disabled { background: #374151; cursor: not-allowed; }\n button.secondary { background: #2a2a4a; }\n button.secondary:hover { background: #3a3a5a; }\n \n /* Peers Sidebar */\n .peers-panel {\n width: 180px; background: #1a1a2e; border-left: 1px solid #2a2a4a;\n padding: 12px; overflow-y: auto;\n }\n .peers-panel h3 { \n font-size: 10px; color: #666; margin-bottom: 10px; \n text-transform: uppercase; letter-spacing: 1px;\n }\n .peer { \n padding: 8px 10px; background: #0f0f1a; border-radius: 6px; margin-bottom: 6px;\n font-size: 12px; cursor: pointer; transition: all 0.15s;\n }\n .peer:hover { background: #1e3a5f; }\n .peer.selected { background: #3b82f6; }\n .peer .peer-nick { font-weight: 500; }\n .peer .peer-id { font-size: 9px; color: #555; margin-top: 2px; font-family: monospace; }\n \n /* Debug Panel */\n .debug-panel { padding: 0; display: flex; flex-direction: column; }\n .debug-toolbar {\n background: #1a1a2e; padding: 10px 16px; border-bottom: 1px solid #2a2a4a;\n display: flex; gap: 8px; align-items: center;\n }\n .debug-toolbar label { font-size: 11px; color: #888; display: flex; align-items: center; gap: 4px; }\n .debug-toolbar input[type=\"checkbox\"] { accent-color: #3b82f6; }\n .debug-toolbar select {\n background: #0f0f1a; border: 1px solid #2a2a4a; border-radius: 4px;\n padding: 4px 8px; color: #eee; font-size: 11px;\n }\n .debug-log {\n flex: 1; overflow-y: auto; padding: 8px; font-family: 'SF Mono', Monaco, monospace;\n font-size: 11px; line-height: 1.6; background: #0a0a12;\n }\n .debug-entry { padding: 4px 8px; border-radius: 4px; margin-bottom: 2px; }\n .debug-entry.ble-rx { background: #1e293b; border-left: 3px solid #3b82f6; }\n .debug-entry.ble-tx { background: #1e2d1e; border-left: 3px solid #22c55e; }\n .debug-entry.session { background: #2d1e2d; border-left: 3px solid #a855f7; }\n .debug-entry.error { background: #2d1e1e; border-left: 3px solid #ef4444; }\n .debug-entry .time { color: #555; }\n .debug-entry .tag { \n font-weight: 600; padding: 1px 4px; border-radius: 3px; margin: 0 4px;\n }\n .debug-entry.ble-rx .tag { color: #60a5fa; }\n .debug-entry.ble-tx .tag { color: #4ade80; }\n .debug-entry.session .tag { color: #c084fc; }\n .debug-entry.error .tag { color: #f87171; }\n .debug-entry .hex { color: #fbbf24; word-break: break-all; }\n .debug-entry .decoded { color: #94a3b8; margin-top: 2px; font-size: 10px; }\n \n /* Sessions Panel */\n .sessions-panel { padding: 16px; }\n .session-card {\n background: #1a1a2e; border-radius: 8px; padding: 12px 16px; margin-bottom: 12px;\n }\n .session-card h4 { font-size: 13px; color: #60a5fa; margin-bottom: 8px; font-family: monospace; }\n .session-card .status-row { \n display: flex; justify-content: space-between; font-size: 11px; \n color: #888; margin-bottom: 4px;\n }\n .session-card .status-value { color: #eee; }\n .session-card .status-value.success { color: #4ade80; }\n .session-card .status-value.pending { color: #fbbf24; }\n .session-card .status-value.error { color: #f87171; }\n </style>\n</head>\n<body>\n <header>\n <div>\n <h1><span class=\"logo\">\u26A1</span> Bitchat Node</h1>\n </div>\n <div class=\"header-info\">\n <span class=\"peer-count\" id=\"peer-count\">0 peers</span>\n <span class=\"status\" id=\"status\">Connecting...</span>\n <span class=\"my-info\" id=\"my-info\"></span>\n </div>\n </header>\n \n <div class=\"tabs\">\n <div class=\"tab active\" data-panel=\"chat\">\uD83D\uDCAC Chat</div>\n <div class=\"tab\" data-panel=\"debug\">\uD83D\uDD0D Debug <span class=\"badge\" id=\"debug-count\" style=\"display:none\">0</span></div>\n <div class=\"tab\" data-panel=\"sessions\">\uD83D\uDD10 Sessions</div>\n </div>\n \n <main>\n <!-- Chat Panel -->\n <div class=\"panel active\" id=\"panel-chat\">\n <div class=\"chat-container\">\n <div class=\"messages-area\">\n <div class=\"messages\" id=\"messages\"></div>\n <div class=\"input-area\">\n <div class=\"dm-indicator\" id=\"dm-indicator\" style=\"display:none\">\n Sending to: <strong id=\"dm-target\"></strong>\n <span class=\"clear\" onclick=\"clearDM()\">\u2715 clear</span>\n </div>\n <div class=\"input-row\">\n <input type=\"text\" id=\"input\" placeholder=\"Type a message...\" autocomplete=\"off\">\n <button id=\"send\">Send</button>\n </div>\n </div>\n </div>\n <div class=\"peers-panel\">\n <h3>Peers</h3>\n <div id=\"peers-list\"></div>\n </div>\n </div>\n </div>\n \n <!-- Debug Panel -->\n <div class=\"panel\" id=\"panel-debug\">\n <div class=\"debug-panel\">\n <div class=\"debug-toolbar\">\n <label><input type=\"checkbox\" id=\"filter-ble\" checked> BLE</label>\n <label><input type=\"checkbox\" id=\"filter-session\" checked> Session</label>\n <label><input type=\"checkbox\" id=\"filter-error\" checked> Errors</label>\n <select id=\"filter-direction\">\n <option value=\"all\">All directions</option>\n <option value=\"rx\">RX only</option>\n <option value=\"tx\">TX only</option>\n </select>\n <button class=\"secondary\" onclick=\"clearDebug()\">Clear</button>\n <label style=\"margin-left:auto\"><input type=\"checkbox\" id=\"auto-scroll\" checked> Auto-scroll</label>\n </div>\n <div class=\"debug-log\" id=\"debug-log\"></div>\n </div>\n </div>\n \n <!-- Sessions Panel -->\n <div class=\"panel\" id=\"panel-sessions\">\n <div class=\"sessions-panel\" id=\"sessions-list\">\n <p style=\"color:#666;font-size:12px\">No active sessions</p>\n </div>\n </div>\n </main>\n \n <script>\n const messagesEl = document.getElementById('messages');\n const inputEl = document.getElementById('input');\n const sendBtn = document.getElementById('send');\n const statusEl = document.getElementById('status');\n const peerCountEl = document.getElementById('peer-count');\n const peersListEl = document.getElementById('peers-list');\n const myInfoEl = document.getElementById('my-info');\n const debugLogEl = document.getElementById('debug-log');\n const debugCountEl = document.getElementById('debug-count');\n const dmIndicatorEl = document.getElementById('dm-indicator');\n const dmTargetEl = document.getElementById('dm-target');\n const sessionsListEl = document.getElementById('sessions-list');\n \n let ws;\n let myPeerID = '';\n let selectedPeer = null;\n let debugCount = 0;\n const peers = new Map();\n const sessions = new Map();\n \n // Tab switching\n document.querySelectorAll('.tab').forEach(tab => {\n tab.addEventListener('click', () => {\n document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));\n document.querySelectorAll('.panel').forEach(p => p.classList.remove('active'));\n tab.classList.add('active');\n document.getElementById('panel-' + tab.dataset.panel).classList.add('active');\n if (tab.dataset.panel === 'debug') {\n debugCount = 0;\n debugCountEl.style.display = 'none';\n }\n });\n });\n \n function connect() {\n ws = new WebSocket('ws://' + location.host + '/ws');\n \n ws.onopen = () => {\n statusEl.textContent = 'Connected';\n statusEl.className = 'status connected';\n };\n \n ws.onclose = () => {\n statusEl.textContent = 'Disconnected';\n statusEl.className = 'status';\n setTimeout(connect, 2000);\n };\n \n ws.onmessage = (e) => {\n const msg = JSON.parse(e.data);\n handleMessage(msg);\n };\n }\n \n function handleMessage(msg) {\n switch (msg.type) {\n case 'init':\n myPeerID = msg.peerID;\n myInfoEl.textContent = msg.nickname + ' \u00B7 ' + msg.peerID.slice(0, 8) + '...';\n break;\n \n case 'message':\n addMessage(msg.message);\n break;\n \n case 'peer:connected':\n peers.set(msg.peer.peerID, msg.peer);\n updatePeersList();\n addSystem(msg.peer.nickname + ' joined');\n break;\n \n case 'peer:disconnected':\n const peer = peers.get(msg.peerID);\n peers.delete(msg.peerID);\n updatePeersList();\n if (peer) addSystem(peer.nickname + ' left');\n break;\n \n case 'peers':\n peers.clear();\n msg.peers.forEach(p => peers.set(p.peerID, p));\n updatePeersList();\n break;\n \n case 'debug':\n addDebugEntry(msg);\n break;\n \n case 'session':\n updateSession(msg);\n break;\n \n case 'error':\n addSystem('Error: ' + msg.error);\n addDebugEntry({ category: 'error', text: msg.error, time: Date.now() });\n break;\n }\n }\n \n function addMessage(msg) {\n const div = document.createElement('div');\n div.className = 'message' + (msg.sender === myPeerID ? ' mine' : '') + (msg.isPrivate ? ' private' : '');\n div.innerHTML = \n '<div class=\"meta\">' +\n '<span class=\"nickname\">' + escapeHtml(msg.senderNickname || 'unknown') + '</span> \u00B7 ' +\n new Date(msg.timestamp).toLocaleTimeString() +\n (msg.isPrivate ? '<span class=\"private-tag\">\uD83D\uDD12 private</span>' : '') +\n '</div>' +\n '<div class=\"content\">' + escapeHtml(msg.content || msg.text) + '</div>';\n messagesEl.appendChild(div);\n messagesEl.scrollTop = messagesEl.scrollHeight;\n }\n \n function addSystem(text) {\n const div = document.createElement('div');\n div.className = 'system';\n div.textContent = '\u2014 ' + text + ' \u2014';\n messagesEl.appendChild(div);\n messagesEl.scrollTop = messagesEl.scrollHeight;\n }\n \n function addDebugEntry(entry) {\n const categoryClass = entry.category || 'ble-rx';\n const filterCheckbox = document.getElementById('filter-' + (categoryClass.split('-')[0] || 'ble'));\n const directionFilter = document.getElementById('filter-direction').value;\n \n // Apply filters\n if (filterCheckbox && !filterCheckbox.checked) return;\n if (directionFilter === 'rx' && categoryClass === 'ble-tx') return;\n if (directionFilter === 'tx' && categoryClass === 'ble-rx') return;\n \n const div = document.createElement('div');\n div.className = 'debug-entry ' + categoryClass;\n \n const time = new Date(entry.time || Date.now()).toLocaleTimeString();\n const tag = entry.tag || categoryClass.toUpperCase();\n \n let content = '<span class=\"time\">' + time + '</span>' +\n '<span class=\"tag\">[' + tag + ']</span> ';\n \n if (entry.hex) {\n content += '<span class=\"hex\">' + entry.hex + '</span>';\n }\n if (entry.text) {\n content += escapeHtml(entry.text);\n }\n if (entry.decoded) {\n content += '<div class=\"decoded\">\u21B3 ' + escapeHtml(entry.decoded) + '</div>';\n }\n \n div.innerHTML = content;\n debugLogEl.appendChild(div);\n \n // Update badge if not viewing debug\n if (!document.getElementById('panel-debug').classList.contains('active')) {\n debugCount++;\n debugCountEl.textContent = debugCount > 99 ? '99+' : debugCount;\n debugCountEl.style.display = 'inline';\n }\n \n if (document.getElementById('auto-scroll').checked) {\n debugLogEl.scrollTop = debugLogEl.scrollHeight;\n }\n }\n \n function clearDebug() {\n debugLogEl.innerHTML = '';\n }\n \n function updateSession(msg) {\n sessions.set(msg.peerID, msg);\n renderSessions();\n }\n \n function renderSessions() {\n if (sessions.size === 0) {\n sessionsListEl.innerHTML = '<p style=\"color:#666;font-size:12px\">No active sessions</p>';\n return;\n }\n \n sessionsListEl.innerHTML = '';\n sessions.forEach((session, peerID) => {\n const card = document.createElement('div');\n card.className = 'session-card';\n \n const statusClass = session.established ? 'success' : (session.error ? 'error' : 'pending');\n const statusText = session.established ? 'Established' : (session.error || 'Handshaking...');\n \n card.innerHTML = \n '<h4>' + peerID.slice(0, 16) + '...</h4>' +\n '<div class=\"status-row\"><span>Status:</span><span class=\"status-value ' + statusClass + '\">' + statusText + '</span></div>' +\n '<div class=\"status-row\"><span>Direction:</span><span class=\"status-value\">' + (session.initiator ? 'Initiator' : 'Responder') + '</span></div>' +\n '<div class=\"status-row\"><span>TX Nonce:</span><span class=\"status-value\">' + (session.txNonce ?? '\u2014') + '</span></div>' +\n '<div class=\"status-row\"><span>RX Nonce:</span><span class=\"status-value\">' + (session.rxNonce ?? '\u2014') + '</span></div>';\n \n sessionsListEl.appendChild(card);\n });\n }\n \n function updatePeersList() {\n peerCountEl.textContent = peers.size + ' peer' + (peers.size !== 1 ? 's' : '');\n peersListEl.innerHTML = '';\n \n if (peers.size === 0) {\n peersListEl.innerHTML = '<p style=\"color:#555;font-size:11px;padding:8px\">No peers nearby</p>';\n return;\n }\n \n peers.forEach((peer, id) => {\n const div = document.createElement('div');\n div.className = 'peer' + (selectedPeer === id ? ' selected' : '');\n div.innerHTML = \n '<div class=\"peer-nick\">' + escapeHtml(peer.nickname) + '</div>' +\n '<div class=\"peer-id\">' + id.slice(0, 12) + '...</div>';\n div.onclick = () => selectPeer(id, peer.nickname);\n peersListEl.appendChild(div);\n });\n }\n \n function selectPeer(id, nickname) {\n if (selectedPeer === id) {\n clearDM();\n } else {\n selectedPeer = id;\n dmTargetEl.textContent = nickname;\n dmIndicatorEl.style.display = 'flex';\n inputEl.placeholder = 'Private message to ' + nickname + '...';\n updatePeersList();\n }\n }\n \n function clearDM() {\n selectedPeer = null;\n dmIndicatorEl.style.display = 'none';\n inputEl.placeholder = 'Type a message...';\n updatePeersList();\n }\n window.clearDM = clearDM;\n \n function send() {\n const text = inputEl.value.trim();\n if (!text || !ws || ws.readyState !== WebSocket.OPEN) return;\n \n addMessage({\n id: Date.now().toString(),\n sender: myPeerID,\n senderNickname: 'me',\n content: text,\n timestamp: new Date().toISOString(),\n isPrivate: !!selectedPeer\n });\n \n ws.send(JSON.stringify({\n type: 'send',\n text: text,\n to: selectedPeer || null\n }));\n \n inputEl.value = '';\n }\n \n function escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n \n sendBtn.onclick = send;\n inputEl.onkeydown = (e) => { if (e.key === 'Enter') send(); };\n \n connect();\n </script>\n</body>\n</html>";
5
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/ui/html.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,IAAI,izmBAqfT,CAAC"}
@@ -0,0 +1,506 @@
1
+ /**
2
+ * Enhanced Bitchat Web UI with Debug Panel
3
+ */
4
+ export const HTML = `<!DOCTYPE html>
5
+ <html>
6
+ <head>
7
+ <meta charset="UTF-8">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
+ <title>Bitchat Node</title>
10
+ <style>
11
+ * { box-sizing: border-box; margin: 0; padding: 0; }
12
+ body {
13
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14
+ background: #0f0f1a; color: #eee; height: 100vh; display: flex; flex-direction: column;
15
+ }
16
+
17
+ /* Header */
18
+ header {
19
+ background: #1a1a2e; padding: 12px 20px; border-bottom: 1px solid #2a2a4a;
20
+ display: flex; justify-content: space-between; align-items: center;
21
+ }
22
+ header h1 { font-size: 16px; font-weight: 600; display: flex; align-items: center; gap: 8px; }
23
+ header h1 .logo { font-size: 20px; }
24
+ .header-info { display: flex; align-items: center; gap: 16px; }
25
+ .status {
26
+ font-size: 11px; padding: 4px 10px; border-radius: 12px;
27
+ background: #2a2a4a; color: #888;
28
+ }
29
+ .status.connected { background: #064e3b; color: #34d399; }
30
+ .peer-count { font-size: 11px; color: #60a5fa; }
31
+ .my-info { font-size: 11px; color: #888; font-family: monospace; }
32
+
33
+ /* Tab Navigation */
34
+ .tabs {
35
+ background: #1a1a2e; display: flex; border-bottom: 1px solid #2a2a4a;
36
+ }
37
+ .tab {
38
+ padding: 10px 20px; cursor: pointer; font-size: 13px; color: #888;
39
+ border-bottom: 2px solid transparent; transition: all 0.2s;
40
+ }
41
+ .tab:hover { color: #ccc; }
42
+ .tab.active { color: #60a5fa; border-bottom-color: #60a5fa; }
43
+ .tab .badge {
44
+ background: #dc2626; color: white; font-size: 10px; padding: 2px 6px;
45
+ border-radius: 10px; margin-left: 6px;
46
+ }
47
+
48
+ /* Main Layout */
49
+ main { flex: 1; display: flex; overflow: hidden; }
50
+ .panel { display: none; flex: 1; flex-direction: column; overflow: hidden; }
51
+ .panel.active { display: flex; }
52
+
53
+ /* Chat Panel */
54
+ .chat-container { display: flex; flex: 1; overflow: hidden; }
55
+ .messages-area { flex: 1; display: flex; flex-direction: column; }
56
+ .messages {
57
+ flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 8px;
58
+ }
59
+ .message {
60
+ background: #1a1a2e; padding: 10px 14px; border-radius: 12px; max-width: 75%;
61
+ animation: fadeIn 0.15s ease;
62
+ }
63
+ @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } }
64
+ .message.mine { background: #1e3a5f; align-self: flex-end; }
65
+ .message.private { border-left: 3px solid #ec4899; }
66
+ .message .meta { font-size: 10px; color: #666; margin-bottom: 4px; }
67
+ .message .meta .nickname { color: #60a5fa; font-weight: 500; }
68
+ .message .meta .private-tag { color: #ec4899; margin-left: 6px; }
69
+ .message .content { line-height: 1.4; word-wrap: break-word; font-size: 14px; }
70
+ .system { text-align: center; font-size: 11px; color: #555; padding: 6px; }
71
+
72
+ /* Input Area */
73
+ .input-area { background: #1a1a2e; padding: 12px 16px; border-top: 1px solid #2a2a4a; }
74
+ .dm-indicator {
75
+ font-size: 11px; color: #ec4899; margin-bottom: 8px;
76
+ display: flex; align-items: center; gap: 8px;
77
+ }
78
+ .dm-indicator .clear { cursor: pointer; color: #888; }
79
+ .dm-indicator .clear:hover { color: #fff; }
80
+ .input-row { display: flex; gap: 8px; }
81
+ input[type="text"] {
82
+ flex: 1; background: #0f0f1a; border: 1px solid #2a2a4a; border-radius: 8px;
83
+ padding: 10px 14px; color: #eee; font-size: 14px; outline: none;
84
+ }
85
+ input[type="text"]:focus { border-color: #3b82f6; }
86
+ input[type="text"]::placeholder { color: #444; }
87
+ button {
88
+ background: #3b82f6; color: white; border: none; border-radius: 8px;
89
+ padding: 10px 20px; font-size: 13px; font-weight: 500; cursor: pointer;
90
+ }
91
+ button:hover { background: #2563eb; }
92
+ button:disabled { background: #374151; cursor: not-allowed; }
93
+ button.secondary { background: #2a2a4a; }
94
+ button.secondary:hover { background: #3a3a5a; }
95
+
96
+ /* Peers Sidebar */
97
+ .peers-panel {
98
+ width: 180px; background: #1a1a2e; border-left: 1px solid #2a2a4a;
99
+ padding: 12px; overflow-y: auto;
100
+ }
101
+ .peers-panel h3 {
102
+ font-size: 10px; color: #666; margin-bottom: 10px;
103
+ text-transform: uppercase; letter-spacing: 1px;
104
+ }
105
+ .peer {
106
+ padding: 8px 10px; background: #0f0f1a; border-radius: 6px; margin-bottom: 6px;
107
+ font-size: 12px; cursor: pointer; transition: all 0.15s;
108
+ }
109
+ .peer:hover { background: #1e3a5f; }
110
+ .peer.selected { background: #3b82f6; }
111
+ .peer .peer-nick { font-weight: 500; }
112
+ .peer .peer-id { font-size: 9px; color: #555; margin-top: 2px; font-family: monospace; }
113
+
114
+ /* Debug Panel */
115
+ .debug-panel { padding: 0; display: flex; flex-direction: column; }
116
+ .debug-toolbar {
117
+ background: #1a1a2e; padding: 10px 16px; border-bottom: 1px solid #2a2a4a;
118
+ display: flex; gap: 8px; align-items: center;
119
+ }
120
+ .debug-toolbar label { font-size: 11px; color: #888; display: flex; align-items: center; gap: 4px; }
121
+ .debug-toolbar input[type="checkbox"] { accent-color: #3b82f6; }
122
+ .debug-toolbar select {
123
+ background: #0f0f1a; border: 1px solid #2a2a4a; border-radius: 4px;
124
+ padding: 4px 8px; color: #eee; font-size: 11px;
125
+ }
126
+ .debug-log {
127
+ flex: 1; overflow-y: auto; padding: 8px; font-family: 'SF Mono', Monaco, monospace;
128
+ font-size: 11px; line-height: 1.6; background: #0a0a12;
129
+ }
130
+ .debug-entry { padding: 4px 8px; border-radius: 4px; margin-bottom: 2px; }
131
+ .debug-entry.ble-rx { background: #1e293b; border-left: 3px solid #3b82f6; }
132
+ .debug-entry.ble-tx { background: #1e2d1e; border-left: 3px solid #22c55e; }
133
+ .debug-entry.session { background: #2d1e2d; border-left: 3px solid #a855f7; }
134
+ .debug-entry.error { background: #2d1e1e; border-left: 3px solid #ef4444; }
135
+ .debug-entry .time { color: #555; }
136
+ .debug-entry .tag {
137
+ font-weight: 600; padding: 1px 4px; border-radius: 3px; margin: 0 4px;
138
+ }
139
+ .debug-entry.ble-rx .tag { color: #60a5fa; }
140
+ .debug-entry.ble-tx .tag { color: #4ade80; }
141
+ .debug-entry.session .tag { color: #c084fc; }
142
+ .debug-entry.error .tag { color: #f87171; }
143
+ .debug-entry .hex { color: #fbbf24; word-break: break-all; }
144
+ .debug-entry .decoded { color: #94a3b8; margin-top: 2px; font-size: 10px; }
145
+
146
+ /* Sessions Panel */
147
+ .sessions-panel { padding: 16px; }
148
+ .session-card {
149
+ background: #1a1a2e; border-radius: 8px; padding: 12px 16px; margin-bottom: 12px;
150
+ }
151
+ .session-card h4 { font-size: 13px; color: #60a5fa; margin-bottom: 8px; font-family: monospace; }
152
+ .session-card .status-row {
153
+ display: flex; justify-content: space-between; font-size: 11px;
154
+ color: #888; margin-bottom: 4px;
155
+ }
156
+ .session-card .status-value { color: #eee; }
157
+ .session-card .status-value.success { color: #4ade80; }
158
+ .session-card .status-value.pending { color: #fbbf24; }
159
+ .session-card .status-value.error { color: #f87171; }
160
+ </style>
161
+ </head>
162
+ <body>
163
+ <header>
164
+ <div>
165
+ <h1><span class="logo">⚡</span> Bitchat Node</h1>
166
+ </div>
167
+ <div class="header-info">
168
+ <span class="peer-count" id="peer-count">0 peers</span>
169
+ <span class="status" id="status">Connecting...</span>
170
+ <span class="my-info" id="my-info"></span>
171
+ </div>
172
+ </header>
173
+
174
+ <div class="tabs">
175
+ <div class="tab active" data-panel="chat">💬 Chat</div>
176
+ <div class="tab" data-panel="debug">🔍 Debug <span class="badge" id="debug-count" style="display:none">0</span></div>
177
+ <div class="tab" data-panel="sessions">🔐 Sessions</div>
178
+ </div>
179
+
180
+ <main>
181
+ <!-- Chat Panel -->
182
+ <div class="panel active" id="panel-chat">
183
+ <div class="chat-container">
184
+ <div class="messages-area">
185
+ <div class="messages" id="messages"></div>
186
+ <div class="input-area">
187
+ <div class="dm-indicator" id="dm-indicator" style="display:none">
188
+ Sending to: <strong id="dm-target"></strong>
189
+ <span class="clear" onclick="clearDM()">✕ clear</span>
190
+ </div>
191
+ <div class="input-row">
192
+ <input type="text" id="input" placeholder="Type a message..." autocomplete="off">
193
+ <button id="send">Send</button>
194
+ </div>
195
+ </div>
196
+ </div>
197
+ <div class="peers-panel">
198
+ <h3>Peers</h3>
199
+ <div id="peers-list"></div>
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <!-- Debug Panel -->
205
+ <div class="panel" id="panel-debug">
206
+ <div class="debug-panel">
207
+ <div class="debug-toolbar">
208
+ <label><input type="checkbox" id="filter-ble" checked> BLE</label>
209
+ <label><input type="checkbox" id="filter-session" checked> Session</label>
210
+ <label><input type="checkbox" id="filter-error" checked> Errors</label>
211
+ <select id="filter-direction">
212
+ <option value="all">All directions</option>
213
+ <option value="rx">RX only</option>
214
+ <option value="tx">TX only</option>
215
+ </select>
216
+ <button class="secondary" onclick="clearDebug()">Clear</button>
217
+ <label style="margin-left:auto"><input type="checkbox" id="auto-scroll" checked> Auto-scroll</label>
218
+ </div>
219
+ <div class="debug-log" id="debug-log"></div>
220
+ </div>
221
+ </div>
222
+
223
+ <!-- Sessions Panel -->
224
+ <div class="panel" id="panel-sessions">
225
+ <div class="sessions-panel" id="sessions-list">
226
+ <p style="color:#666;font-size:12px">No active sessions</p>
227
+ </div>
228
+ </div>
229
+ </main>
230
+
231
+ <script>
232
+ const messagesEl = document.getElementById('messages');
233
+ const inputEl = document.getElementById('input');
234
+ const sendBtn = document.getElementById('send');
235
+ const statusEl = document.getElementById('status');
236
+ const peerCountEl = document.getElementById('peer-count');
237
+ const peersListEl = document.getElementById('peers-list');
238
+ const myInfoEl = document.getElementById('my-info');
239
+ const debugLogEl = document.getElementById('debug-log');
240
+ const debugCountEl = document.getElementById('debug-count');
241
+ const dmIndicatorEl = document.getElementById('dm-indicator');
242
+ const dmTargetEl = document.getElementById('dm-target');
243
+ const sessionsListEl = document.getElementById('sessions-list');
244
+
245
+ let ws;
246
+ let myPeerID = '';
247
+ let selectedPeer = null;
248
+ let debugCount = 0;
249
+ const peers = new Map();
250
+ const sessions = new Map();
251
+
252
+ // Tab switching
253
+ document.querySelectorAll('.tab').forEach(tab => {
254
+ tab.addEventListener('click', () => {
255
+ document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
256
+ document.querySelectorAll('.panel').forEach(p => p.classList.remove('active'));
257
+ tab.classList.add('active');
258
+ document.getElementById('panel-' + tab.dataset.panel).classList.add('active');
259
+ if (tab.dataset.panel === 'debug') {
260
+ debugCount = 0;
261
+ debugCountEl.style.display = 'none';
262
+ }
263
+ });
264
+ });
265
+
266
+ function connect() {
267
+ ws = new WebSocket('ws://' + location.host + '/ws');
268
+
269
+ ws.onopen = () => {
270
+ statusEl.textContent = 'Connected';
271
+ statusEl.className = 'status connected';
272
+ };
273
+
274
+ ws.onclose = () => {
275
+ statusEl.textContent = 'Disconnected';
276
+ statusEl.className = 'status';
277
+ setTimeout(connect, 2000);
278
+ };
279
+
280
+ ws.onmessage = (e) => {
281
+ const msg = JSON.parse(e.data);
282
+ handleMessage(msg);
283
+ };
284
+ }
285
+
286
+ function handleMessage(msg) {
287
+ switch (msg.type) {
288
+ case 'init':
289
+ myPeerID = msg.peerID;
290
+ myInfoEl.textContent = msg.nickname + ' · ' + msg.peerID.slice(0, 8) + '...';
291
+ break;
292
+
293
+ case 'message':
294
+ addMessage(msg.message);
295
+ break;
296
+
297
+ case 'peer:connected':
298
+ peers.set(msg.peer.peerID, msg.peer);
299
+ updatePeersList();
300
+ addSystem(msg.peer.nickname + ' joined');
301
+ break;
302
+
303
+ case 'peer:disconnected':
304
+ const peer = peers.get(msg.peerID);
305
+ peers.delete(msg.peerID);
306
+ updatePeersList();
307
+ if (peer) addSystem(peer.nickname + ' left');
308
+ break;
309
+
310
+ case 'peers':
311
+ peers.clear();
312
+ msg.peers.forEach(p => peers.set(p.peerID, p));
313
+ updatePeersList();
314
+ break;
315
+
316
+ case 'debug':
317
+ addDebugEntry(msg);
318
+ break;
319
+
320
+ case 'session':
321
+ updateSession(msg);
322
+ break;
323
+
324
+ case 'error':
325
+ addSystem('Error: ' + msg.error);
326
+ addDebugEntry({ category: 'error', text: msg.error, time: Date.now() });
327
+ break;
328
+ }
329
+ }
330
+
331
+ function addMessage(msg) {
332
+ const div = document.createElement('div');
333
+ div.className = 'message' + (msg.sender === myPeerID ? ' mine' : '') + (msg.isPrivate ? ' private' : '');
334
+ div.innerHTML =
335
+ '<div class="meta">' +
336
+ '<span class="nickname">' + escapeHtml(msg.senderNickname || 'unknown') + '</span> · ' +
337
+ new Date(msg.timestamp).toLocaleTimeString() +
338
+ (msg.isPrivate ? '<span class="private-tag">🔒 private</span>' : '') +
339
+ '</div>' +
340
+ '<div class="content">' + escapeHtml(msg.content || msg.text) + '</div>';
341
+ messagesEl.appendChild(div);
342
+ messagesEl.scrollTop = messagesEl.scrollHeight;
343
+ }
344
+
345
+ function addSystem(text) {
346
+ const div = document.createElement('div');
347
+ div.className = 'system';
348
+ div.textContent = '— ' + text + ' —';
349
+ messagesEl.appendChild(div);
350
+ messagesEl.scrollTop = messagesEl.scrollHeight;
351
+ }
352
+
353
+ function addDebugEntry(entry) {
354
+ const categoryClass = entry.category || 'ble-rx';
355
+ const filterCheckbox = document.getElementById('filter-' + (categoryClass.split('-')[0] || 'ble'));
356
+ const directionFilter = document.getElementById('filter-direction').value;
357
+
358
+ // Apply filters
359
+ if (filterCheckbox && !filterCheckbox.checked) return;
360
+ if (directionFilter === 'rx' && categoryClass === 'ble-tx') return;
361
+ if (directionFilter === 'tx' && categoryClass === 'ble-rx') return;
362
+
363
+ const div = document.createElement('div');
364
+ div.className = 'debug-entry ' + categoryClass;
365
+
366
+ const time = new Date(entry.time || Date.now()).toLocaleTimeString();
367
+ const tag = entry.tag || categoryClass.toUpperCase();
368
+
369
+ let content = '<span class="time">' + time + '</span>' +
370
+ '<span class="tag">[' + tag + ']</span> ';
371
+
372
+ if (entry.hex) {
373
+ content += '<span class="hex">' + entry.hex + '</span>';
374
+ }
375
+ if (entry.text) {
376
+ content += escapeHtml(entry.text);
377
+ }
378
+ if (entry.decoded) {
379
+ content += '<div class="decoded">↳ ' + escapeHtml(entry.decoded) + '</div>';
380
+ }
381
+
382
+ div.innerHTML = content;
383
+ debugLogEl.appendChild(div);
384
+
385
+ // Update badge if not viewing debug
386
+ if (!document.getElementById('panel-debug').classList.contains('active')) {
387
+ debugCount++;
388
+ debugCountEl.textContent = debugCount > 99 ? '99+' : debugCount;
389
+ debugCountEl.style.display = 'inline';
390
+ }
391
+
392
+ if (document.getElementById('auto-scroll').checked) {
393
+ debugLogEl.scrollTop = debugLogEl.scrollHeight;
394
+ }
395
+ }
396
+
397
+ function clearDebug() {
398
+ debugLogEl.innerHTML = '';
399
+ }
400
+
401
+ function updateSession(msg) {
402
+ sessions.set(msg.peerID, msg);
403
+ renderSessions();
404
+ }
405
+
406
+ function renderSessions() {
407
+ if (sessions.size === 0) {
408
+ sessionsListEl.innerHTML = '<p style="color:#666;font-size:12px">No active sessions</p>';
409
+ return;
410
+ }
411
+
412
+ sessionsListEl.innerHTML = '';
413
+ sessions.forEach((session, peerID) => {
414
+ const card = document.createElement('div');
415
+ card.className = 'session-card';
416
+
417
+ const statusClass = session.established ? 'success' : (session.error ? 'error' : 'pending');
418
+ const statusText = session.established ? 'Established' : (session.error || 'Handshaking...');
419
+
420
+ card.innerHTML =
421
+ '<h4>' + peerID.slice(0, 16) + '...</h4>' +
422
+ '<div class="status-row"><span>Status:</span><span class="status-value ' + statusClass + '">' + statusText + '</span></div>' +
423
+ '<div class="status-row"><span>Direction:</span><span class="status-value">' + (session.initiator ? 'Initiator' : 'Responder') + '</span></div>' +
424
+ '<div class="status-row"><span>TX Nonce:</span><span class="status-value">' + (session.txNonce ?? '—') + '</span></div>' +
425
+ '<div class="status-row"><span>RX Nonce:</span><span class="status-value">' + (session.rxNonce ?? '—') + '</span></div>';
426
+
427
+ sessionsListEl.appendChild(card);
428
+ });
429
+ }
430
+
431
+ function updatePeersList() {
432
+ peerCountEl.textContent = peers.size + ' peer' + (peers.size !== 1 ? 's' : '');
433
+ peersListEl.innerHTML = '';
434
+
435
+ if (peers.size === 0) {
436
+ peersListEl.innerHTML = '<p style="color:#555;font-size:11px;padding:8px">No peers nearby</p>';
437
+ return;
438
+ }
439
+
440
+ peers.forEach((peer, id) => {
441
+ const div = document.createElement('div');
442
+ div.className = 'peer' + (selectedPeer === id ? ' selected' : '');
443
+ div.innerHTML =
444
+ '<div class="peer-nick">' + escapeHtml(peer.nickname) + '</div>' +
445
+ '<div class="peer-id">' + id.slice(0, 12) + '...</div>';
446
+ div.onclick = () => selectPeer(id, peer.nickname);
447
+ peersListEl.appendChild(div);
448
+ });
449
+ }
450
+
451
+ function selectPeer(id, nickname) {
452
+ if (selectedPeer === id) {
453
+ clearDM();
454
+ } else {
455
+ selectedPeer = id;
456
+ dmTargetEl.textContent = nickname;
457
+ dmIndicatorEl.style.display = 'flex';
458
+ inputEl.placeholder = 'Private message to ' + nickname + '...';
459
+ updatePeersList();
460
+ }
461
+ }
462
+
463
+ function clearDM() {
464
+ selectedPeer = null;
465
+ dmIndicatorEl.style.display = 'none';
466
+ inputEl.placeholder = 'Type a message...';
467
+ updatePeersList();
468
+ }
469
+ window.clearDM = clearDM;
470
+
471
+ function send() {
472
+ const text = inputEl.value.trim();
473
+ if (!text || !ws || ws.readyState !== WebSocket.OPEN) return;
474
+
475
+ addMessage({
476
+ id: Date.now().toString(),
477
+ sender: myPeerID,
478
+ senderNickname: 'me',
479
+ content: text,
480
+ timestamp: new Date().toISOString(),
481
+ isPrivate: !!selectedPeer
482
+ });
483
+
484
+ ws.send(JSON.stringify({
485
+ type: 'send',
486
+ text: text,
487
+ to: selectedPeer || null
488
+ }));
489
+
490
+ inputEl.value = '';
491
+ }
492
+
493
+ function escapeHtml(text) {
494
+ const div = document.createElement('div');
495
+ div.textContent = text;
496
+ return div.innerHTML;
497
+ }
498
+
499
+ sendBtn.onclick = send;
500
+ inputEl.onkeydown = (e) => { if (e.key === 'Enter') send(); };
501
+
502
+ connect();
503
+ </script>
504
+ </body>
505
+ </html>`;
506
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/ui/html.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqfZ,CAAC"}
@@ -1,16 +1,20 @@
1
1
  /**
2
2
  * Bitchat Web UI Server
3
- * Simple HTTP + WebSocket server for testing
3
+ * Enhanced with debug panel and session monitoring
4
4
  */
5
5
  import type { BitchatClient } from '../client.js';
6
+ import { type DebugEvent, type SessionState } from '../debug.js';
6
7
  export interface UIServerConfig {
7
8
  port: number;
8
9
  webhookUrl?: string;
9
10
  }
11
+ export type { DebugEvent, SessionState } from '../debug.js';
10
12
  /**
11
13
  * Start a web UI server for the Bitchat client
12
14
  */
13
15
  export declare function startUIServer(client: BitchatClient, config: UIServerConfig): {
14
16
  stop: () => void;
17
+ emitDebug: (event: DebugEvent) => void;
18
+ updateSession: (state: SessionState) => void;
15
19
  };
16
20
  //# sourceMappingURL=server.d.ts.map