From 89acf780bfe88ce14d3bd871b98850b1927574a6 Mon Sep 17 00:00:00 2001 From: narawat Date: Wed, 4 Mar 2026 20:42:15 +0700 Subject: [PATCH 01/43] update --- package.json | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 package.json diff --git a/package.json b/package.json deleted file mode 100644 index 1b5ccdc..0000000 --- a/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "natsbridge", - "version": "1.0.0", - "description": "Bi-Directional Data Bridge for JavaScript using NATS", - "main": "src/NATSBridge.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "lint": "eslint src/*.js test/*.js" - }, - "keywords": [ - "nats", - "message-broker", - "bridge", - "arrow", - "serialization" - ], - "author": "", - "license": "MIT", - "dependencies": { - "nats": "^2.9.0", - "apache-arrow": "^14.0.0", - "uuid": "^9.0.0" - }, - "devDependencies": { - "eslint": "^8.0.0", - "jest": "^29.0.0" - } -} \ No newline at end of file -- 2.49.1 From c3225a90c70ac1df43c4eb3bfc477844693086ef Mon Sep 17 00:00:00 2001 From: narawat Date: Wed, 4 Mar 2026 20:50:12 +0700 Subject: [PATCH 02/43] update --- testFile_large.zip | Bin 1854563 -> 0 bytes testFile_small.zip | Bin 112610 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 testFile_large.zip delete mode 100644 testFile_small.zip diff --git a/testFile_large.zip b/testFile_large.zip deleted file mode 100644 index 56dfcd1d1ef8990753d8fab68802e7734d42dac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1854563 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

eT57l3 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

|4TawA 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 xOb+b&AEU1*Ao7Qo?{HT#UD|O3K2DKi& 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

NbBN>w^BSb#DerPP+?e6@02tCEruTFYr5_glLF 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

vDqao>F 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 z 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 z z=J2efB`1S?K+M+R=B8XC7=N^7(TTKjw>5Ss<%L5Vr`xhN_DXPe~KjX5WaC~_GL>94~Ju$pTlW^U3oc^vPVO0&7 zI~k}w_Nv(r6QfXUXHb}951|;j5JxUza9(M`*U6MCZ=BU|>yUkHg0|%vrxS;Ckt4QY z>#!)4l+iEE?I&?6T?i(z8#>H#{rJB%16Ov^y6?P5WOQva#(OY?pKdKzwl~|MtN7yT zDcp*eOTEUq7ODj3Jg{=Wk^Ig+q%aMPjwZ2hymPSsYx+FPi2{3A|c|em?YK;!d z*}gB|*7hG?A^H|A&x$8UB9qi0s7F%{cx)2MnM98({b%xc%}2EVn%sgS{CpR;_KkJC zo(*-M{xT;=K(A=VllKZ<1o`cvTV;haDSfQO92*ZePe0q)O7-B06@QLr%`yMC#E-vtx#T3c zQmyM%mGS?N{kPpPd&b@V2#iaB4{W`&-Jz4~;I=B1q2$a|~*+jk}5hqI?8yQcQ${kCto z!!^fvQV9wf`}cP49qrAxC-*J|@*1fYwCFcvq=HKjB0Kk(3kGnb=Gy1|!`>a&1iB1C zr8-6V5_OjG)O~vlB)$GFwom<>&WvTl^x}~{4ooHP>s<~@HO4yj-9mo|d@n{Ji&+S7 z{(l|K{Q+>b{w2@F5WFT;9V{~Y5lT_X?4t4X`H)xT#{M;H%|Lh z<1}U3s8i0}KCbs@%1nz+Q)y*ora(Z*JsB<#a%Tx?2rbiMW{wpy%9NFv$|BmU2^cs9O4}2docj>%k|N3G3e9wem7py+9JnUTYy)V}MQumM7q0X_j;YYL1FI?ok z;u{~|b?Y~5{61h)L?rabpEmEos)av zw~Lo9U&+6E!oVg2T;+i#^GIPSx zx%2+@!~A926Bhh>!gF=lxi6OgQhcxOpM`6}4~=;p&FWm_y>`>!y78IN{wK2ke}SF< zKZ@-C3GDxkO9lCI&Ma{9<}8IoL#&q*@^AEJpBPxzOu$4i^)?pixk58~07wB}!{`_6 z0v#>5)xN9!ASX}TD&W-L`@wR}!wu26A(Hfd$t~r6PTUdP7ccf#<+&j(JxbK-In2th z3O&P~bGbl{54jsw)1if0%FeDsWjR&nd|ITpd-ZqcRvsgYnZ`uyJN!zu3`c72fymvE zw*A^znPXGn>sc*s2)Xcc#FvFXFX8zG~)^kLqw?qT9Qkr{gAuYH%84oF;H+^|50vi#@3q+nU&Hw9yPZUjVvlpF@LDaF=Bqp8c5A zFW`jA9awU;w7^XF9)(CB6;R|(Z7Zyl@CythMhfYFh<(kA`zY`Z!@QyY|U}?-C!y53*kx+zxSg8lfdhYi3z~lP4Cp=?0MI*LnuF^qbD%YHSLDfxePzAL_Fp%Y8wvq zJv<^>k%;_fP57p|?fNj$7@Kb?6K&1=HKlSC5&0LdEiP><5YfeM2n;8ZED{*_xu^W= z%P()z#13z``0MyusK*0*qM*LDxgk;yhv9HGQP4FmU?81Jf7w#%4 zlKy>Pi$*Nugy)%>r9EDrpGi~UJ*2I%W8F`F7co!UiJSh58PH?U(dH7C3uH^ zyf)tr`GR!)Zc802ukcAfa7?>?goY7|=nZ0u+$E!X(Js0Eer?TtHTc`a2y{g`;n5}4 z8FgIE)~AJKp{@SoVImFILNK=tZ`p$z+JE5b(?LELZaf`aS+cGEDQ~?V<}!7FNtl=T zdtSvPFojoqr<5!_4Idqlb5rb*ul}VbE8#eB^042!A^-fciDg>y@~<}|K6+BsZ)(7talu#y$ydq7RtDip{Iz)9UQeMF4J#sWD?} zdZ*`zry-X9LyC$g+zDn?2CPJ~y7~2I^pe>l#c$faZLY0MS0W}x8Vn_oFieNs5!9hB zC5y&`^Dfu}37-A5m!i$tkGZ|mdtVT@did?GEL%rpAtfY0MAGp6tUry39&49vO&HFL zG{IX+Y*mc?za13Rt2Z6zOqF^`u%%?EVj3NmLv*9|e8iFkj-4ede~FIF&iL+z#VB}HBKLhRbDEeW$2`Jw zUypLAJz{B5%bwX)a+e(WMvTxuWalYtfVL)*3TQN#1nX`;0Z`ynku`SU^2vidz&V|p ziC0FAtP@8UbNZv^2gb1j1BnhE6Pp~syzHc#xD%Q=!Q z@yt!@pI*rgzW2}K7~X;sSsgS~*4%nw@E0`yx9mXjqlpJ@2x3i`5eL_Z+>l>LWi8!p zk^7pzjT2CE@G?x%d6Vj;_OKhW*Y1~Bio`_0Y%t)nuleQhaJ=dOtaW^zIY`@_;qxD2 zhx#a%L9ge6OZo8{{b1F1c*eldN(Wu^+=^~N^=ef^3~2ULmJF+K;AiMx$Bb-bVn zO`uA(p)yOEq+MBcrO5;D?@!e$GVY72w*5h3~e z?k^8kD#qVG=6lz+o)Q)JZ!)|Ocz%toMgq+;bEIjC^RY14a`?%F!A3KxoGYLe-$=vq z9ooXGPXQCsb(2Ip;r2M~@~YOV_-}uI7NsCoe{{VXb3+7}Wo`%?RbUDvVq2SAzKQFT zr2koPaw2xvbXk#2%*gaP+H`3TWpjv5(*zWlLfw!QY;be^ZrOxGOCgOT`st1ED=JER z{IbXFS3%w3Va>G~xdn!>i^)#YkOsTLTIlVu=iXr$ncYCdHf!4((;6oWwW)x zliscvlXtapc9=7jH(x|*=Tjve4f#Mlschd}H2q4}5{BM#LNWe(Wz&>G|IKXS638!+TZ zlPM81^;F(mg=6Oyc0E}PjuUEP$-(zqx1SPIGF_o1O?<=V@*}Nj#SFBLOaH+QQPuV| z9lgFGH0KVJor(5Q>u@mApj|PfVsvBhE5gIr##D9k;E;bvaL7oh1RD%yMtN)UmwZV~ zs%t&SyBsYyr|w(rX5naovy3K;1TT;T*W5s)Z{(^5l)Varjjez)P6_!V;NSdnG zvp=~Eah{*>`S{Z;yEuJz4-d#xolmk0!ai3IoLwE8{vZb1!owb-LKS{VV=Z4w*=#mQ zbOND6h7H~DT$XGZ3s1=Sj5MSaol0ncvYbkAT%K3oxi%^WRBETGbw4Azb)tvo*n-x( zA*pw@t?UIIFvbcePq5392~s8D08EoK5CD0_pm6duTBE`zF$I3R>l2oxxfC0qVM7;H1A)YPGunmw2Pc)}9RPslD>12SlC&jnIKe4)pPPbkdTqK2#-l z2|~Ryc+r>n!Rs1@iWPdoVja8~nF8yV%2p}CK_JR3gm?TmY*05vt+HOcH#)FhvG(d> zzY_a8{uuWYn=NxHY%Gdh%=vtB>WMXnFphYu8MqjE7c79R0X23nPxox?Ub&!@X4Lfy z*2N7)t#_W4gtfgb&qoQa-{pa9J5`bTn)}gnx6^?#WK88iiZ_Ix?c_ zNO&rS|5&zXO)AM0>ioh+HF8uMry!sr^!( z$SzgrQ?n~$7ayt&$N!+Ok*zuJEZzF+LkC3Bg3TTxiO>;kaZ~gE!Zlsptzc#~5-ezn zlq+`xC($!GHQD7pAAFU?q!S*3sr;?KkKT03fXRK5LvG0803)^(L2;VJPs*R71m)NG zf?()DR`#90dWn^N=%8L`WQVjv=F5qZvc;vsT9XOU=%8C$2VbqU(s!n}BtY}CD^|)> zeNWPb32Jt`8U@2?nnZy_8%#oC>UjSaR0e&Ej~iN4tgDfE_Rx=#u60^PgH>089@O2y zWO+3;l_#8oq4L;b7}Kr|V;lN;!j>x6LN{cHNN9IMzM*EPabo{FT{sEcrdMmI9cqjO z4p&=5ftgsN8zN4I+P|}&yNQyNjcN}GyMl(r>Bh!CpgErP4Li9Y8^|a4GLc@5aYH`s z8s2~A@A5{Dm2w#Uam#*GWaBQyTc_(y@9{XX6|GZg&lr2D$4>6uaD%2^HA_jIH-z@^ zLo}f;i89{DJxIkdJ8qY<2zeU0ISdq*EIpr$`<~ zxj7NW(pRl9+O@gjH71|uE8f`^oAb2d=KFmU4RmtV1-qC+I|$Y2 zAwcCkP<33BP1GASE_!S7(yH}Jtg}pV)5*GDrmtqH5uGEI3(_O!1X(%wo59k6kVt(UXcqUbmM za?mV7I8-KVF+Z}M8KyX>VUFiwRJ_$Qf~pyU_N}3E%v2tB7xkE`n3HKnlTFqo77^kl z?O*$EL~2VBR$uPRL%N@8Fcc~frT`X?#y$L4(zU6$ovWtwhv&qJb^U6X1j{lJ*@=oI z+dCMRWf!O~GaG7rVn6*EvBu|VLezCDj=iUf0EaHlp29u4vmVjVg!Ez{5msOd=Q7ZW zta0se+>sOEnHki|R5G?jVEf^%N9s?8quuWgD-ZXTEq<5^x3R1&XNiqTq@ANK8sAl@ zypYQK_VunWe+VK5UF!e>Lp!wX05~hJ36qr@hyO~rMcY_@W&FU3K54{~d-wA`h%-v+ zZEX33qfxyOj^3z2XVn|4H@zRYuGQej`fNSWs2`jUTYe&C53fv}*qxFDhuzE)v6@6- z^&&gZ0kdhxBmX%Cc)k>u!HY{vOUdmSymC_^)S@ z6ya2jWZyCyaG4sXF02)qTGTysk z$YT$=-l2uME}+Zgy|-$CZ2Ca$VtA{4C#a_2E!FLx19r<9j=m_1rrJ?ev%266-3vWY zQF*8;xLBH<9NnDMiNg`u9MH;3)xf0|BFH$vRWSJc-245gKJ`<%NT2G4;9KlQqAOr} zQJ22>$iDT@&$xMALuH@Z^e*3}AO!6IWFo@BIRvF-Ub5g4FDGSfN8OQt z`X{2S2KqSc9X6ZODOtX?6W@smIxgk1#Xj`6*xdR#+I9Wq0o@c6{>DewTp*x_{%m`S ze=D4^f;7grN8m0^vb(BeqDfD`K4K3ra+dzIOYdfxoxAoFt#}izJ7m^_{$(m*)5FSX3ChU*w#X4Cnhd<`5O=vqR zDwYvM7A_FRxAP{zbWa6-+PZX1yK5Zy?LXb0{ay$>;M%wXxDa?$Sdp6lpVT}5kcG;0 z7q*mXCHJaPMTO|6pvMoXSkJ^o3ASA?6C$Rrt4m8Fu+WnsTBghfA`S7N&g5T;!WK}s zza<#p&*C3ldWzZG2d88sz3$^u;cy#RfmB{Ha~NAF8{%J@hF!1W?dOb6Z)@1JWV7)w zE@R4e25od1kfKo81dpny9&idr$wgV9Dz~w~J}+@yKyYsw(4|5fSV##pI2dUYo?v|b z=yuxW7Ia<(Ht=+I>V?D>Vfu!2MrkRFY!K7H4_1RhV=Wd_*wGOj22Awo;+R#oAY2`?THsB*K5D0$)ilRR8A8EXlBuW`Nc!%kBd+9gZu7Y#W7{+EWM2ehhtlSGp>2bra`o# zVCeiuxJ5}m*;d)NTUh_HQ_yi^H>Ww&1fm$2b^=lGKKz;f2NU*|XN~lK4hq8a#+S6M zUX0GU-+9Un5xzL34Koz8PVINd{o$+bRGRv{ux7l5r0lS)A)@;BxEa=ceHN48P-;ZZ}S%(P>Gh$l>z*Py; zSsGLtQSB$gWkB;L``KcN8PSnTepj|01LR8nc9snhyMzkd^=L^sRPNL|%N}w3I-~yS zP9$E#esXYvv9%>p9Sa)W@ zKiaQHrn7rIBHl9s!-K{*Es_ZkSwb*}CVKnFrncM=)zyrZuPgsg%9VTasUqc)`TfDY zm$-do2goJ03XY0k&^V&Qse*RLx5_oGW7({{noR0*1%p90V#M^fFg5bw8%n4h`y~1H z=`)+_^Bqq3)`qPwhooDIR-G0qao0~j6c#?nXHsP55ao;k1#5Gv@^$ad@z_2JaRSLW zsum!ew*h1CDCHt1JO1jbKo-SV^5b1BlaQw^1vLD#(V3WKM87A~JYM_B%p16L9Rnr` z9U$^7LL&}ru}oYSs7he?(1YSz2Dz~fPhvJai_W1LwN{T)-pe>ME{9wnazFiHNhF93 zxHNb_&-IZ`=BH~TxE%A$I_dRZeSJ|-Q+)qw9M)0xn;3!bncl?l=B2C&59wRsn%3-B zCgLWbWA!~t1J@RZ@ioP0(C*cu%B2}TSp;zLun^AnWeV(e2GN8M~t4l_&_szWzHIC+xA)wF0AUV!thOT84e^S&b9P;F<2xHdXJdyNlRk*O&#o#5b?O0n z*?oIq6B`41-&yE^ML=0E>Rd|ceONL2C=`^u3rq^byb26T{($s7d{@6#b9V^`KA6cJ zDvQ)KA#@sZs6F_XDp?adI9Q2U|GihmF`Nwpuj&UP_N4eggLg#R1yLp@NmIR!-Xegc z9toMU0hg-#qZGV_i6@~JPE@uVLLhFB!S&+hkNU-u86CbCqXqG9wlc4c{x|37zV|jH z=;(Vr#AKxnkFFuRAp(~oA(bdQ2r;Tfp%%QLE0B|ES8Ut9#Z<`tyX}!}Elxf0y2w&; zIrc;4vo{pN%7D)Yohn#F=Y#kjK#2+?RQ@}CRMiTCXwRPlCi*qaLsfRuE$XU{~> zm4Yd9aVaGemgEYxR6|Z_#Ka?iH6RLW*Wz|p!28QVus*oKu7!>xh+`FxJ%+KKyB;)# z$Ib0*I8aCBb_Rx+SXLTFO;@RrNj1JF^vt$p6+U~9)J4OiW;^Efw0PN}nvu8L z_I3YrLZ69TlWGS&q()=T#4<$iJ2!vL8>BCb`%?C;r`iaQ#TC=7C2UDpm$A`*SzOu) zecYUYSLt2#4V%6c-%nLf7;&l&V4&vn6;a%>dQLb|lbn~~_jE(T-I3s6u4sQ|*WdL) z9w80cX^vLlC;-wdV0N_MJ66uYABz=O(=LzVug-Uj*NnzIXq zVw&kFSP|rbZ@VHwmsy8*b!Phd`5Y6Uk1TQ0d)T4@5Q(yBrtv(L`HxWe_bfdON7Py; zNysB~{3dSqzTV)b7EMQob|95xLd1s#HC+RmY1gQ;&$Z;drC&?vPoJ7jHN zl}kA~S`n%#jT`#rQ;h>V=3An%7*z@s1v{v2Epr-{rZf{xp+cyf54yge@- zFZ1FL*uX33jnPHJuP2`~vgg6fJ`WIutSqC7W1)kxK~f^Q^QgIaQz^A6QmB=>3@}rysrMoLQqw;EYe@>@tc|jBEduU*Y*4XPc z1T_=;5IWan$_LuNZXkUg;I6K>A?O`i@HzpCVz!MnPB)jL4dHkWe*V7VbhFb?|C zISIB@lxI*=5H#Pazc@ZS-}B>Dj}wZgQ|#eZz0aw`_w0c?dEzWoLr_9Ph#r*GARK|9 z_*rq2^Ty~}DX_`xk<{H~^BcO1qKHO(2Um<_o}_AXXt;jufQ^#L?_9Zz1Z^ANEf-t1 zuv|8NSKZ!-@7tF8H_|u1KOD^-ve91XfiKcBs3(R>AK+m2xEL|L)xva|nAud58#3>! zvEjW!irgQRKusV(q49iq^2k_pLK)W2dOnaRNxIn(QyvP+4f?>$0`oJvc#l2NnwS0R z(&phmQO><@zQZDdp<5qNkSp;+cVwPY^k%lf+^M zI#b8PE*?BIH*+@!odOORDhEXK1LkMPu zAI@718d0ZeoI{O0mSQY&`A-2rg5tMx;h9}#huwIpM2iDRh}K1h?jCzfne-`}NfqPMyfx!jui z7?*B4j!Yk{Ug?H7o6AiiHzeiY5$J##q}J-$6%Ihd{m26hun`)W4UMyi=&jphHi>V< zsI*U#jKwsPg?_y@8DOlTHv&)@l6i<7qPHQe>=)r7vhd>swxPlz$b$m`yKtCU6Y}qL&^6B zQ#*(2&ikxZ1PfUF$aTa{5$oGH3lb?YQ?+5W+96(rv7I_FKJn~YOLh%)yD|u!Bx<;d ziJULYH~a_2xZf{^$6zN}Ffs=!H%A&2X)*aFyGvqVsU(K7iN9o*{yA4>kyz{zy}N{g zS4wH4_0DNCA&#Yi=6?dd%4E5gEzVd|3N}>q&Ms>bf)IJuIchF1@D}YqL6v`+J!y!s54x!^8K=njPuoSA-ehaEzL%2cJX;&mrgfl^YJ{-|Jb^v%00Qma4c( z)^uo}fcT&>Cw#r`5u>sTktG_ymffu{cvZ}t5i)E_y!BSS(4Y;Z7FucsR_tOPX}G>$ zjReHvlSCUKH_Ni`!AX?7OQnhP6*_q$qhd>-bArCaY2H7+!=U6dDVp2B+X%*7_RSF8 zfNX|p%wL~ba6v0=&Sz!aH>A5rL-^_8!GJtwyhc!pWYDr-zTIBBl=VW)-=Bl;GTKlYAK)VBeQMbX zMR4b@sp*mllU>S7-m#oVS{D7KI}DlI=hg4{BP|&%$qL}w zAEc{-ITlKYzF+3RQe1P)^jrW=oyAp+mVXsQ3euYm#~R@?hQO(9#a=^2OuxbG>|l5B znkcn8(iFLOr0SD+{43Je)bGUC3Gh1f=?AzBa8k`-B8^&{ou@}%DcP{7CT=L-7Q5mt z&9`$i_9E@ns(<&azu|=@MO0i*B9+A0DD)Kr{elnCOFsdPl2wGS*^T1+{p>=4C=e`_ z7W-piSKOc>ih$v237QRMY8plxPH#;vuTeWWf2+<5^_n>W^^wYcnMgNd#y^~RIXQgL zVP4Ylu;{73U;8UI{^NSx?NkO!2P2iTOhg;~>ZAFoa10QsearukRZwY54(n}Uq~>QL zk!8D5H7*$ES!Pt+CAiC*|Egi*#89Q@G<04Fera)KV2<#U+(I^TiREJ6tvn^i!pfSl z;y%%25LECJYjfx8S%>=X%uQrME;-c zaV3YgRG4DcP6+`J*FQ~GI)B&pqv{^M36%m+#}X?C`-x%B9$(DbQ4_nPjr!{x)W;i< zdeRRtiQ!ki+(O`6FVB8Zax=iu!R5Ijd5Dz`Y*_Dy$u*``LA0e>kfDR)c563-0EJv0 z;cv}&gr5TQrmliKJ?CnJI}Q zQ6#GeWC1%tQh4k5-8m#pWu^UAugePs$;}%rhTo5Gwcs(@V2Hm_5D_&YvL~@DZpirZ z$#|Bt400PyQ=O#VdL!9O8S636dTpIQ^>P3Bx<+MPBbV1y95tmK;y=6*^GI+t6%NPQ zZb%Nj&JHZx0zW^b967GT$n?z)P7`6IXu;?q{GFBO_k@&8z=*tnJdI*m&}+&Ywia~K zd9p*Yrjc5f0&VJ5MV}0}oAAyDaRp42eZ&{l)jv z`L#!dH|50@7_Q759()}8q1YPtOr>Wo4igl1{Iy4KAd1m?P?(5aFI9SKIDHj!C^&4I zDD!IVI4OJrCove3k5u5Xpo#nO=INqmWs>ST*VMG37PXNfF-PicG&7?7P}o#|r*;4E z#tE>W&i!u4`Lq#ipBu7d>yDhoo2F@%G|3Lzm$il8#_0niO$-WD3Vdpydr`l)|7sN- z8HYYG`3R%7Bd4-lZ*7#kAdhNSYWywq0Q;a@Y5WC!Q4Z#Yqu zPYEPqw8oxk&AVbWpDC8ZHFZ8EEiYorVumO8q@GW&Acd{NrIH4S8PR>%DG5oO{9+vO zcHrJ1{o-_xoSlp(L%rn!?>6TVwi=d+Fa?HhVskq>fRIt!#A9^LWI^hUh?2waF*Sja zN}?7N1qPrEOK|M(42d3OP`zr7V3W636IO&Bk&E%qzGb0eZbYW`%bH+lO2@!ar$NAP zJ&@opUi0=RD)2*#(0mkb!;%KD7QBac%(uHYXnl8PCHhj~dmPeFYJ-82nPNpd%Llpd zV$7>y*a*-{N4Ion19~gh6b)|k{9DKgDPzCpvem*0kyP7u#Oo6;xGl8gbwEQvyEc4g zpQZs(ar$4WU6b=N{zZtqoCT`v5JjrXVsrTpQg?XEkLn{_>%m-o#`(svt8B3l4ac^y z#pz@3INq(P9r9(i^6;uLzJ-lGTxx)ok{d!b?0+BV#O{>JCq(iFD<_wF_hd3O|7b7Y z3yHQAHZepYrlFbU{>*nns9cT()l9z<)HUi6W+2L&Sa`nc!jZDQQmG8}`x)lnh>Yxl zM=6gEm&JX*p=3R&1Xc)RAn;C8DT`uPOje!4!N<0G28J^Ha_}s2y=Xj;{x@fcbZ%O} zW9J@Ve!%I!qUM2n=)tQJ(w2~u@zhWBD(Dn<00}t8Bv(xdIM<)TXu!; zV|&y$=C4l+2ai|W8Oqpt38&FN)T<{z*<$seo*DOh!GvEWoXOvi3eQ*tgAvt|DTT}1 zMs`CQlAYt_?JInjTv>C|(6xQ;@0r)XV3PG%Mk!roV`e#3wvR{h`4Q_e@}P;((z+?5 zN(%)QK`l4g|BaFnzByuBWmNi~Ea8ht{(#1j-G6$oD|+3%ez`bPK_7HYo`8<$AeM1L zG(1rX-GgAoCfS2nNSKJINzQ3{qiuFWJW?lYNwT2 zqcm04ym?Oz0BDFLQ>NDBiw|T@&f7g@{;j%tcAmBr^$57Q45X&VcAv7CE+(GdH3U_!b3<|^70%jIKYns;#GgTer2s=)X_M4W`ikk3RIv|2&%g8%5fTt@ zEBdgNUDfzFX1gc7f)5G=c2J>RX_HvAoX#yooLw+y{TrReLhe0(X8x)IR4p}b%!d@B^x-Gi#Fw4I};py zQ>PZ`Ic~^NUUvPku?I+TLyq-6jay32o+uA@Y|lRZsh83rW)V+p1cI}ZH|NPf6F=J( zpd;7UDnNoDSbQ(Pd^R|LKM)K}S=}w_QsTbUI7gwcWxF6zH?1{dAyj@K24Sm)*b62) z9h>MMlISgs5RG`G3LL~A+8VsOJUfF`J?oPS`e+f5K6=(G!5aF%QGr>Ln>NG`S9qS%sVPYQX59jeNktg)Uw*PBAm zZMDDM)&*QN1@|G5$5LmuPxqdO%KvAhfpsPO2=Qdt8I+loRgY$~gkvP48%`o?#TIKgnLYolW3&QVL* z#0d2TB|JQnA3uJJE1Y19#zbrPMb-K82|H*<;r+H7a>kb6MM=tD^%k zR}a&0I3ky4p-tj;j&da_VeERN3TP99KIa*MucU^4b$R&3sis=yzPhqq=_VZf=JP@j zAYe9@Q}y`JwVb0#DN{vV{5O~5#$2uTfKg#?aJjlArt?TGw}dU*%)K^{ga$Ou@+ZVIFFI3SpPFjA`3Xg+)vorC3&=(y@WcU|j(0=mHg>OZLoNmnv7S4g z5qQXoz5pV8*ZFN+o&zn4G#LfdIQyy7iH}`hTPwY;7iFKw;k@vRXGbV?>3(EIAp`V= zM!3C0Oo8p)+W8gf^aTB@pE)UF0$AD-KK;mkqVqf!0x^1C+}7u@CIz_!PEDr ze&pgrL|!1#rnM5}MbO60xUoMZs~A;E9#84rbS7T`SEQtxeOUNfg{@Q+=2ST$&U?m+ z@z_tLZ@2KGQXA?T&U=JF@2pd)h0n5hzHW%O4sH`Vwapze?48_|-Mjc1`#pL}!k$q) zW3xSp>0lNj(RQh@s=noNusiOw>* zRub&>`I~g|4ys>vz^k=fp7>;VX7)p5d;P#Jzer^&R-&fM5=}(Zz!1z_k`2Rj6bL9p z81y9jQ8e}Ir@QcnsF^gzJ{m)^^!JX;N(hWan=3`G`m03e2l0K6Y5~tDPW*> zNBh!!cfPw_y8_>#W-w?IGf;I+5qwG=x=6i0E$u5l(J$gw*66`KetX2^J}(gwj)Vph zNw!qrv6}Fnn5xa>0%!F0YJ){WYDIc^X8q&!2`0g*c$QvcZ%C0j5ZWPCd?-k*c~D>P z;H;3jl%r;5|BX1YT}vl!jLK_C_M8`c|_J84E^eD$xF64kphaSvEJ_( zP3xas4t4#*+5TTOKv^w%u0~1foaNMnDUCm(3$@251$QShCpuqZky@M*XftaHJ?5+*rR#iwRS~Qj>MmE6^g^aG4ODCaLKD-; zo_Hke$G;8_9l*h1E|Z3zW_3gEhvPdVnhkJF2aAb!aKxl>sysPjiY#b>v$ELr!gm;j z8oPAz>YXm^@@pgAg+ETTKOJvnzaboY=089xm0+6{MYt2XJu7Cu3ei8_0cvhV8F3&} z2S=zyIuO-g&Mcyh_5Q2oLkWeGgXhZ4p`av6z(gA4hgIvk0}QEf9uiYp{T=7O0;InV zhi}+S(j-wnrQThLc#j|GPU{m0Yjvs)wImfpvLn;YM%U!=5t6>6qpl&qpb^kb<@V9$ zjdbtz5jdlNHK+;Vuc$r_W)~I&?v%|o#5c3Wv{8pV`Lg$Y$v5LW6CAQt_k3$LVo{hI z@*%=3`c%aUN?xg6VuDq{aEJSlBCyd3gPkoftlHK>pnHv&Lk9{|aAZ3hc!K5I{WI42 z>!WA2zrJ=ND}RDw&<-y7RPOii0b3kW0avlLfmHCcZ<3!#hUl!50W&uPfSmwIysn4( z(?k5y7fnpvF{}lx=f8^0v)riFvIwD$MUo{yR+*k2iazq3ee%~7e_i+xT*XPiL_J~9 z^MUhKv202qXzAi6dS&GYPiem>z4`R_fcjd4tjP`0@b4czhvDd7{q{*VTo9pdqC}cl z&JzAZ29vB6W6Mqi<=|st`4?T^1SJux`0{xE)kE99pl)~}`Jo{1+94v5V?mqpM&Ehb z6>9tyQQ47EZKOgoL2o#+mwtvwb3?vA>HqJq+>kb5(NKk{(^B?eJ|K4_5w!=h(@+G- zQ(N_{=z*H=BM-fvwQG5iQw514_Rw1=Uiaip-aVIIwPE1l>%*+?WqbBW&MpCd0pxMu zi=e9M)*hv6GHw}7hj6k}_yc$6yCJP0k@%7{AOWJzuCvPyB-zN_i6;$Jp)Wgl+fy(| zKV9wcV90%C^KcNsZ@0{{u3yZg%xvaA5*K`=Gh#icrAv`aJ+{>5Jj`6k+8V+qsYny^5G=y&=h-n%%P+(M)5A6r6&Y!*3Vcd{2GdsBnR2gcY z*bNaUkq|nN6wT#VI_fe;wc+8B8jb~UmQ663B&jxse!g|h(8;_zyCp7s9g{ctx;Rpf%Iau6)E@ELDoSD@72iopS@IiQ^U_@AAiQ{HeN^~Y0^(gw zRGQkUunTTgtV)00Fxlo>`0KiVtijwT`kDsU>j7acugRwZmI}9Xd4ice(Qx$flZdJ=x##4bD&VadB3)6Y79qMKQVD+y^$;HvS2*7l1lJ37 zICwwLvA2U`h676%Jd5(NHNGkHQgPV;)B;F*1BVt@mQ2HE)}B^oukv7EcfeBZ^^xy2 zW_m;OBSUJirP~0*!Eu;EF<60K|Lrac-jNfh`CeWB;A$7ujzn@k&$qxY5BY!Mzcs8l z1Rwhh2MB1~)%k^)Y1chCtCScvuZaQzgl9OFE3g?qHjxdQX2}I>%DDJY{Cr_i&7Pc- zUe_iLh~n4Y2xye)Y=sj-1r{v1Rsp?$2w%OmzkX5JwVa}PX&JxXt|+d|XHn#qQW{YV zsH#3tJV+em^ZFdWV;a5C!~j|+6s@a6q49Ti6~Zc1Y!(fMqA`BmG_Aa&{CDF7ujBah zzcyXvHKFw|cq*153gA%1oSmt8oKSeYYr7Zz#0~+^xY}65rmadp`LImaX6PZ z%Jy<9yJR$UUFj5?6Aos#RXDSkHIJG-j^UX;k>1`uVg`~;p{{v> z^d$ornNxcXzTTxw?<3a>mGNScp8IY=t~#v~M#HInMFV!OKz~CVw9SiM=wORNytMY~#*r^9#TTWU4hh$Dji z69EqJFHZJjarAHYS5pah{Hm3TlGLUmLM9Oi1IZb0uu%fRw4{(#(~E~L2=25#q%Ye< zY@!#;Slt~{!Og{!x{T0=$YXGu7Yz=>*;sDKb~P48{m-ubCwCLM+|I_mBThY0VUJn% zfPH3#vwQqYX?e)zgnXS=FpWWuf83UxND88a$3Cz;$3e?Phk z@8dO$vn$5Jidyn&P7Vs56%WUGgKPzLomUtQLlOP#E~4vWq=H}WSSofclX+oTmaBr- z_^6G=5rjYbSUM8ZS!VmQJ9N6gsc6R%blBIuOPu0zyAvBQvG+1Ha97N;AO2$>v`L6E;UhzG?g&mwO-Q@^|ENMH+ZN5b?7Ub$3aw70Lw_SUQie7GK{s!3ovi z)SzyRpok-P%f!asi_}$0R4)n*FC#YWX4fn;YFrklIoTAV{Xr;_YRL`1e;sF`i<2^$ zx>VQZmXBr_`hg8iOij>5dje;CpRzloYRZf^e25uH2@K8^wR@RKcVQXZUR*P^W69YU`!PSc8)n|#HE1jEvlm#e#)q} zgU|TCv!dmR?S{Yr{(u_hhI|gFtE_**MsF$)O3pRffXfs)(mQXB{Tu3bH{`b!&$=21 zR*PN}`3!gt&Q^L9=~W3MwQ!|eATShkG1Jca&qW^AqPNQ8AxvCSiE>LmJVNQsl_H>6@MCBXVB^4P0_+QFjCkLVKEPCEcf+>cMo-=d4YcKuC8MRLAHK!3Lq zUW$lNl9YX|b2n##6IT25m|ZLi{!v!;9Sv<={c>e&T+gRr*!k?n3?FD9%}js}z%-6v z0bRr2tcZSHTY0e*rxL>tvrL)%DvAH;z&6v{E!$4U_XO!Ak__szGvy)rZDIyOhGkHQ z{oIb3TNeWCw$uE!u=t_C=QLQ;Me>VfPo)D#ojMip#7tG(%IotQ-}$chJ>Iz0gM&#| z^SLRwrUsnZYb_4x1+=i$k}0j&sT#hc;J!=O!>__H(rYt!G^o7^Z#9v7GAqjlY+M}< zmvjylLt=kGRlGsAO z+R7a6z4&Wq1aU#q8JWJdX3dQNML@d0z|v#sWk@fkUe#$(sSy;p*vfggn}M1}mcl5J22S!5o@0A+ zi-S#Y z-2SS@4O!j7=F0U{Y5CZ?+J(Kx3NcS>0v?{PV{dO_n<~ zWoqVFAy=KUGBrUYQ6NQO%B@5)7c@a6HLO%XG+AQtcliGP@edzzJbXUy<@x%Y_xpX^ z<4zY9w{A_?Ffjz+#Z44c@srKRUa&A|g1|ccVcSbI6LFToKi1PDpn$o25wQ6RqM}*~ zY|>W1!kj+z% zS|5y!N&30Fwnsn<`aiARkhEtBGUK9>Hwh7o=Nt+fuHVQMPh9hgH7r5?VR(|WrXCK> zTcj21EZjUcSBPjO_$(qG?@^EN@yx!U+hD52pFxPU8(3aEwNmxy`%mZf2X)RLC?Nym z@NKjbIH?-XVDzvAwoh2|<%vn#!m%eP8XS(ag9}l#cL{Qah1eWC@l~EU=(c!YLok2N zst_3$DOW6^&2Un{s)1DNm^6_ku$EfSxR*CpA47FhqV5dnGd0Q9itZ4fu|w%|n(Ryx zHy2()BmFXzx-PQVwd5q4R=OS4I&W8t zI#jz$VBWO5$$r`skfz&4*%JFcZ4J>cH}8Y+0}(W6?y-6TEK!t&MFI=j2d4Nbxdl2q zs9m?~h9F)`T}DaSVeT3YAKz&_AncvU-!RJLr7K!9sE!9Gyo~9zD%9dRLT>C$o$f9 z9L~l9-2*yD5iM)V(^4zoQ@QZ+ zAYIH})fRYK{!!u8D7rT0Sy4+jCwN;ZuYsYFaewtt)*!t58hjPNqsoKpZ~Cb4EG|4` zCXTlawG;Qg;rWi)7FYFySuauHXx>RrczQS6>tt z|Bo4UZ<%enKZfeK$^s35B#%(Lnq%)!5Lbt-i3l1rUqRfX7BQrZ)EqEknz`#|>UkWi?0iGaHMoAP>U1trAc!Hel_i7A0;LEVz&eCtPnNRREl|6?yu zNw!y7KM}W5pGc3#Ckm)}^mjjtBOFrY zd~@Sx^&1AS#GeO(a|pYIi%GeGVS=&@aa^h+pL+3LeT{)1XEtzuET=p?_Kmmu+iJp@ zB?#t0)E(+bO{~Tu{qp5`_5QAiL_pIyF2!N6qRDzQr!3FFQ&B6ZRh;dG|=s? zDEL~hRKQd$+SJ(emM^S-asz!S;Vle~#sCF$O@p6RW**k34>T(CT)(hHkDCiF9)SKb zSe!Uizo+Qwmua50KlkquoGw6~r)Ck=Xj3ugdK0<7(zOv!`rf#LJOTZ3Mn=Cnp4{l_ za6&9NO5@e~$-~4=G$97H7fI-5@r}gccfDm7=rPY8kA`OUXB7!jZ)Co;`Ib=gwceB# z((<9yoTm!RbXVk!#6!<`u}`ZN+c|2%-5>Ogy5~J(CtqyK<_Ad(%!L*0YnLFYncdke z20!SQ=~k5rH3s6FGGj^+>q|WG)K#_LaDrb_QI9D+JIBnrDe(7C1p}}95(H=F_8DU% zOP3%K(o}jBcW{>!5qJlA_OZVohi_Sd^R;}-#7$=WNq_dKf23=Bsp%Zk52*nFLJ4KQ zZVE33HEB|Vc}FHRROg!W4ucd+V7SE_X)l4vcGYE^(Hao znLGMspgF?d-$x-JzA(^L1mkL%(HzG~beY($Drjy9#Zf&wITp}$O8`FJBxf(}?|teS+kH1|mX>bVtu z&&?&Y5+Q(r5nAUN8o=hrcg$ zs2>4<3WkDE_2~u`GKK(m$Rg5ur*oyQWt2>0uO~T+oxy4Fn zEI~Z$rl%I4)72}xnXN*M9NGQ-`BesyAUf!U9j*~iOe550<`RS)x0?2s%iUGORdf2L zWrOGa)UeS(LT~4R;}`&?Z?6Z{}?&fEvfxJe7mo4aCtNNpsT&N*G>56nMmz?iY2Vznfn;;=t$B zDN75KzLpiLM|_K1q%C!@p$xeH4Z6I&S(#^VntilgAxIC{SWJKR)gr4)>xerObs@kqXyrpY(eOx;QM6 z$pv_IGE3tt^nAcK?xTHpG=2%9z*=|At**dP=VCe?i_mhX9yvc10Leic|Nifw*fNDJ z_RSAB%6C=7cu0i%bccsy4z9eJ3M-r`>~)WXx%m) zTLGs43Ind(I8q(ylYg?WtBI$<$PECtVdt?%Y*_gH{}w)0*>qEgKzaVm0XYQ&u*CV> z6Ms^jg2_Z`*p}Rd#FQmSTN8Z=@)JAmmBnwk^va~41_m>M*lMC$OO0ESQe01Dh25IZ z%##~|GayrrA-K9C5_@x!CtKVkG?=B^rR>+1a<>R2ABQA#jR z|9A5e$R~SUCu+()_Gs+uWF@78*^;0a5fWYx3$HT_BzakpakA{HvdJ}dAd&##r6hkOx zo$%;p{Q?I9O?je>^Pa;4wpGnI<%-w*Vy3FIp2^mMS9c_}8IWn9N=`-Sm6v6e9n#vz z&&4XMD$@Qq@&BsW8~%E5(G5Dr2yzXwF2+|T3d)SQeKToHzajM9-*kJWLkZ(WBn4A& zMglJC+aBqA)V~Om5xKtsm^&qW=$x7zjFoM>s%(YfQAR9ZQKP;Hd$<7z3P=GHqiqI{ z=nb__4ArifS1SyUK9?{#hxlgJ&-8ay9R{kbx|v`?8X1t>*i+Q(sTu&<`m?NNet<_+ zqLlZ(u6_|yL3R95Aj+#^eikjn61Bw-K$5F5+Y(tnx(wC!KGY;K>iG(}f%%?2LY?T! zAvwMgIU;6`Nf@IC^|)olUzP5p_vE$|)YrWqDI-o1=r~^m)--%D6U}eBQesC#!rY(^ zrGO*3*UtwPO=YRq@|0z%3bAcSHfcN!|1@A;XA~dTRbRH?#usX$vM~MDs^IOkn27W{ z)a*^iSOOKA0H*O~;VP+Rdpb@xEe|d2O!*a`UM$J$u=M_5HIrgwDj}`DveI&fQlu^mt(CtzZk1z-V$zYUssAhGGf~ zhsmFk+YFM#ck1yoffaM*1E5QU;C4UQWX9 zW^T{dG@g~ygoy$;jaEW!kr*iIi_|6& z(s@*tVK2zZR(lff{R4e1tcb&U)J9cgW^cEJ}kiUt)d>}QUq%4ERPm@+s>8aDF zdA5su1CRlWxfT}gMMbMfVgZgi$-O&M&wSGSO1qsqT3`3t{vg<_%(i_p6*sL4bI+xf zPz-ahwYfF$KvRAbqgy17%h1%26#22P7rq@CDVt*Sj{UEH7FAp}Wf29+9zFkKP@z1w zxwuqapZu52;pGy_z3;<(8Q>7_zXsT4Q3mRluerXkQ zFY#v<7dgdlvVA!-5HUx5ITnigcgxVoTJVm745AVCpKnG%@k;hKA22fJhYv~5N?{2V zSK!e?RI7nG`{ay+^AB}!l1I%57LJ`YkX(d!Gi@YAr@G^b8N*)u;izE-IwtJtZHSrswi>$j)G>^Q;hw?< z)MxXC>$NiR#2y__F@`><``~E73p7k$@e+i@I%@%<+$K6+s>~cvGgO#=LU1yhzd}tE zo~J6kmLMJRjz`S>0sGnL;Lj_Mlo@N37=3Nh+cHj-5ox8FrHEneb~v?kgUuYbp@uh3 z)Sv`MhC*fw;=|HSOuB9vGt}?7$j^R?je8Upk9aAafaBqI@;x7Rg0m0pdf}~sXRosb ziREH}zy-gOHu`(P0Yv4UTRT;3PljmDcj8fz5a0L-Quxlc=5q-&{;v++#|nN+l=^4|3$b`xf;2_>Y1P5UP=!gThCKno zn87y0C6t!RjhguWj{)1V}-N+#TXa{$!PXSO)e@NeBk<(RZ_l z%(t>2!^__7jcw7#;ic!?#+Q?hkDVNhvIOipx&V7fkHvv&dXdK(Fkrh`34I<41+utC z=s2p(P~H2AU>5TVX2E}Qm|b6bV+rzU)sJfc5WBK%rb-i4aEPpKgpfoANw7-31i3Nb zgd13bhF_)9Qum9-32*+t!D33`ftDU+2L8OhuJ7ks z(KBU0y3SJ(#vuuK7Is3M0o{XJ_a5~cw6(kIrR>Hh>F)jao+J+Y?l0mEp_7M>fT57c zO#Q#cem217mCA7nlzk2lxWa(C1JlQv&| z-tv0{)WP<0AHYP8d48DNrKdanWx~JXbh&sokR)6(n1j}xdw+_7Qt zN~hgy`quUyPz#iu_a{%8?Cm9($GcR?bg@k25B_lqb)>d(YsI>z{*Ob=eEDXfG*Lj; zlB8Xk!pYeM^4&l=pQxo9sRGnbnNClmr=cs-4@A6tVjH+ZEA~K*9;ubbPst5Jl;xr@ zS+|nq{n1RL6^Fr;27anZNHDJ2zo{ao+W1pr*2$9!JBZ#`S0~t88Zf7gbhf(q)ZBaiAurzptyMV zrjsY=fqu z2F5?5`6|3Pi9eU8$0eLW?FCMoN&q2-z4<7Sr!s@OfoH3{gpvr>Et=sSBBULVVvd!Kx?Lz!BKdZ8|*7!-vCb@Z9gsCcf=RR&$ zrHw6GK&`B>4s-}Ne_;BsK4*Y1#jn7#>-Ib6I|{&*wm~_;z8kX1NWmRAc=~2QqIkYq z7vGn(K9X0=AZu^KQ-Y*N=o$GRoRIyi?tRzMUg^{`qC z3S|_mRE`lW#Kt8^G7_+j4ahSr4S-?^a(1YtTiG78KUz)nRWQb4hZG&nCIavuukW`h z&0K{|eZVoA;YDUIuTwF1lNBtuOV@<=;c_1}7q%GG#bxw|NEHU26t2w1qv-hacRW0@ zQu|H>f+Q30^_+#vuC3M>s2ip`74^6}=(lY<=AQ>r9YgY>#^rHGd?kjIMwJOFt5TaD zeb#*&`n=J5w_J5^nW8o2V>{>)f4}%~6*kSH)I`s>x_bWdnea+=Q14HbkfdCxlxVN7 z`i;?A{I1ZpEVemN_FtEItE$Qm1l9rDWNKA|v^e%OzBe*bx}Vv~k3;eT4lcV*R>L+h z|C!B`Lg&E1cj@U8BtJu0J>qVD&d1AGf_FC0v^t}VdDsR#V|Rn5d&bQDtUKFqIhCav zAc_C4f)sQ?hMcmPoVZUwR@G&XQ*PBJ$+@h%<>$!j#qYZG2^&i?NCF~b3Bm>SRDA6R z>Swm^Gq2F_B(F!F9IN?}1^m6R41fOE367z_ZQ~KsaMw=#igzur(FPwWN;6y@VJIon z29PUjZO_WrwIB)WLyq673>6S(47+I$3t1(w zzt62Vkw1Lha9j9duA!>K#5f`v8h)?23=;H zq|J}fxB@6_FmMUdi_|A74KHQo?C4xne2v?@YIBCCJwm1N@bH+xl#TJ$B}lOdenIs5 z-J7xE?pMYQFNrXPt!&#(>ifvVs-n3wX|bZuox7<6UCjVr-so_<6WH@2ug5ZOJtn`$HDQp@kTOP4$UFZN%JRClt21M^@9JWo2 zIET+AcJa2O1ogzhi2v9UXp7V-=ms^#!8olCNG7?kBLte+fzt%K&BV%vj&w~F*KB36 z|C{~+Y2?fHP(N*uS#L&+&;UdVRLjVhoIxwxpk_53bO-8%5Vq?S)XkfE+O@zbf(OmH z$Y~%e)Xqzg_c23%qw2#uKg8P(Bd>{G7i&hSdKRUDHCV<^#nLLzpi200U^I>}9h%nJ zPR(EReH}Y_fwctLnzsabV$drs00Lx?uZ?fyNSi}2Rj}ZpzwK%PD9i^0f&tqTWgCdL zR&2Gg*Uc9|e?{Fmy5Re#dW4!|bBBQ+O-&KiyLK`Yh@+X26jbv}_7@~kn+5pvCx?@o zIQa4IVM2>^ZP&5tjS=~E$0AxBdQ4b?oF?Rps~e8K zNksM*2oq?hFld{156h-iVAw-@?uc6CjGkD&L8x}wnsDCsjJ&8cng1+zA% znKKhD3xCKOeqDMLF#-T^Vx1JveIVDQ8()=n*jh$9vvOA-D(N7;>M7b+JhcbgAF*`_vfQe|fc`^mMQt%& zoex$VLtX)LF@)U@qMBJ2lyQ+Vsvzy3tE)V9prGsOg^{xueE*Msc`^ePf|7V^dGQnP zGx~$Z;5uqo*B|PWCSg4H?h*YGM8IX9*o?h^)-F4iRx?+AgVDVN$*_HK93^PNEk=Rn zaVf*%I!J3NOGHKy#xv_I5|N>w`}?O}%eocM_%3A;x+{wfewLc_WDdxWLO5>p#=h$} zT$zKprg7W`Jv+)6j2%web}0aDDxn-UODq8&eLxfYvQr2Ad0iHj*CxbKYAvlKeWZ(0yxuXUiljekf%~%wrRClK+QLnh_t2V>EUN|S=i0`QG{fJRMsO#Ia5ZQ58(o5 z`=0f4n|aDI70Tw>vdVkx) z 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 S009620A2t90B*Md0000a0o?xp -- 2.49.1 From c448811aa9ee7324977ae4bc4aabe6b2cf03145b Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 06:35:48 +0700 Subject: [PATCH 03/43] update --- etc.jl | 31 ++++++++++++++++++++++++++++++- examples/walkthrough.md | 16 ++++++++-------- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/etc.jl b/etc.jl index 878e279..03861f4 100644 --- a/etc.jl +++ b/etc.jl @@ -6,4 +6,33 @@ Requirements: Source of Truth: Treat the updated NATSbridge code as the definitive source. Update README.md to align exactly with these changes. API Consistency: Ensure the Main Package API (e.g., smartsend(), publish_message()) uses consistent naming across all three supported languages. -Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read()) should follow the conventions of the specific language ecosystem and do not require cross-language consistency. \ No newline at end of file +Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read()) should follow the conventions of the specific language ecosystem and do not require cross-language consistency. + + + + + + + + + + + + + +Help me expands this Julia package (NATSBridge) into a cross-platform project by building a JavaScript implementation at src/NATSBridge.js in the current workspace. To ensure accuracy, the Julia src directory will serve as the ground truth, as the documentation may be outdated. + +My goal is to maintain interface parity at the high-level API for a consistent user experience, while ensuring the low-level implementation adheres strictly to the idiomatic conventions of each respective language (e.g., multiple dispatch in Julia vs. asynchronous, prototype, or class-based patterns in JS) + + + + + + + + + + + + + diff --git a/examples/walkthrough.md b/examples/walkthrough.md index 995134f..d4df03d 100644 --- a/examples/walkthrough.md +++ b/examples/walkthrough.md @@ -34,16 +34,16 @@ Each section builds on the previous one, gradually increasing in complexity. ┌─────────────────────────────────────────────────────────────────┐ │ NATSBridge Architecture │ ├─────────────────────────────────────────────────────────────────┤ -│ ┌──────────────┐ ┌──────────────┐ │ +│ ┌──────────────┐ ┌──────────────┐ │ │ │ Julia │ │ NATS │ │ │ │ (NATS.jl) │◄──►│ Server │ │ -│ └──────────────┘ └──────────────┘ │ -│ │ │ │ -│ ▼ ▼ │ -│ ┌──────────────────────────────────────┐ │ -│ │ File Server │ │ -│ │ (HTTP Upload) │ │ -│ └──────────────────────────────────────┘ │ +│ └──────────────┘ └──────────────┘ │ +│ │ │ │ +│ ▼ ▼ │ +│ ┌──────────────────────────────────────┐ │ +│ │ File Server │ │ +│ │ (HTTP Upload) │ │ +│ └──────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` -- 2.49.1 From a98394b9b9533a496f829c87873566f910fa14d1 Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 07:15:33 +0700 Subject: [PATCH 04/43] update --- examples/walkthrough.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/examples/walkthrough.md b/examples/walkthrough.md index d4df03d..3dad9eb 100644 --- a/examples/walkthrough.md +++ b/examples/walkthrough.md @@ -30,21 +30,19 @@ Each section builds on the previous one, gradually increasing in complexity. ### System Components -``` -┌─────────────────────────────────────────────────────────────────┐ -│ NATSBridge Architecture │ -├─────────────────────────────────────────────────────────────────┤ -│ ┌──────────────┐ ┌──────────────┐ │ -│ │ Julia │ │ NATS │ │ -│ │ (NATS.jl) │◄──►│ Server │ │ -│ └──────────────┘ └──────────────┘ │ -│ │ │ │ -│ ▼ ▼ │ -│ ┌──────────────────────────────────────┐ │ -│ │ File Server │ │ -│ │ (HTTP Upload) │ │ -│ └──────────────────────────────────────┘ │ -└─────────────────────────────────────────────────────────────────┘ +```mermaid +flowchart TB + subgraph NATSBridge_Architecture["NATSBridge Architecture"] + direction TB + + Julia["Julia (NATS.jl)"] + NATS["NATS Server"] + FileServer["File Server
(HTTP Upload)"] + + Julia <--> NATS + Julia --> FileServer + NATS --> FileServer + end ``` ### Message Flow -- 2.49.1 From 206467e1fa6739888a260570eeaaf7c04d76d042 Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 07:23:24 +0700 Subject: [PATCH 05/43] update --- docs/architecture.md | 39 ++++++++++++++++++--------- docs/implementation.md | 59 +++++++++++++++++++++++++---------------- examples/walkthrough.md | 41 +++++++++++++++++++++------- 3 files changed, 93 insertions(+), 46 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index 8272384..6cd0afd 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -110,24 +110,37 @@ env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff, max_ret ## Architecture Diagram ```mermaid -flowchart TD - subgraph Client - App[Julia Application] +flowchart TB + subgraph Sender["Julia Application (Sender)"] + SenderApp[App Code] + NATSBridge_Send[NATSBridge] + NATS_Client[NATS.jl] end - subgraph Server - Julia[Julia Service] - NATS[NATS Server] - FileServer[HTTP File Server] + subgraph Receiver["Julia Application (Receiver)"] + ReceiverApp[App Code] + NATSBridge_Recv[NATSBridge] + NATS_Client_Recv[NATS.jl] end - App -->|NATS| NATS - NATS -->|NATS| Julia - Julia -->|NATS| NATS - Julia -->|HTTP POST| FileServer + subgraph Infrastructure["Infrastructure"] + NATS[NATS Server
Message Broker] + FileServer[HTTP File Server
Upload/Download] + end - style App fill:#e8f5e9 - style Julia fill:#e8f5e9 + SenderApp --> NATSBridge_Send + NATSBridge_Send --> NATS_Client + NATS_Client --> NATS + + NATS --> NATS_Client_Recv + NATS_Client_Recv --> NATSBridge_Recv + NATSBridge_Recv --> ReceiverApp + + NATSBridge_Send -.->|HTTP POST upload| FileServer + FileServer -.->|HTTP GET download| NATSBridge_Recv + + style SenderApp fill:#e8f5e9 + style ReceiverApp fill:#e8f5e9 style NATS fill:#fff3e0 style FileServer fill:#f3e5f5 ``` diff --git a/docs/implementation.md b/docs/implementation.md index c9a29e2..304ad44 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -117,29 +117,42 @@ env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff, max_ret The Julia implementation follows the Claim-Check pattern: -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ SmartSend Function │ -└─────────────────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────────┐ -│ Is payload size < 1MB? │ -└─────────────────────────────────────────────────────────────────────────┘ - │ - ┌─────────────────┴─────────────────┐ - ▼ ▼ - ┌─────────────────┐ ┌─────────────────┐ - │ Direct Path │ │ Link Path │ - │ (< 1MB) │ │ (> 1MB) │ - │ │ │ │ - │ • Serialize to │ │ • Serialize to │ - │ Buffer │ │ Buffer │ - │ • Base64 encode │ │ • Upload to │ - │ • Publish to │ │ HTTP Server │ - │ NATS │ │ • Publish to │ - │ │ │ NATS with URL │ - └─────────────────┘ └─────────────────┘ +```mermaid +flowchart TB + subgraph Sender["Julia Application (Sender)"] + App[App Code] + NATSBridge[NATSBridge] + NATS_Client[NATS.jl] + end + + subgraph Receiver["Julia Application (Receiver)"] + App_Recv[App Code] + NATSBridge_Recv[NATSBridge] + NATS_Client_Recv[NATS.jl] + end + + subgraph Infrastructure["Infrastructure"] + NATS[NATS Server
Message Broker] + FileServer[HTTP File Server
Upload/Download] + end + + App --> NATSBridge + NATSBridge --> NATS_Client + NATS_Client --> NATS + + NATS --> NATS_Client_Recv + NATS_Client_Recv --> NATSBridge_Recv + NATSBridge_Recv --> App_Recv + + NATSBridge -.->|HTTP POST upload| FileServer + FileServer -.->|HTTP GET download| NATSBridge_Recv + + style App fill:#e8f5e9 + style App_Recv fill:#e8f5e9 + style NATSBridge fill:#c5e1a5 + style NATSBridge_Recv fill:#c5e1a5 + style NATS fill:#fff3e0 + style FileServer fill:#f3e5f5 ``` ## smartsend Return Value diff --git a/examples/walkthrough.md b/examples/walkthrough.md index 3dad9eb..3e2f213 100644 --- a/examples/walkthrough.md +++ b/examples/walkthrough.md @@ -32,17 +32,38 @@ Each section builds on the previous one, gradually increasing in complexity. ```mermaid flowchart TB - subgraph NATSBridge_Architecture["NATSBridge Architecture"] - direction TB - - Julia["Julia (NATS.jl)"] - NATS["NATS Server"] - FileServer["File Server
(HTTP Upload)"] - - Julia <--> NATS - Julia --> FileServer - NATS --> FileServer + subgraph Sender["Julia Application (Sender)"] + SenderApp[App Code] + NATSBridge_Send[NATSBridge] + NATS_Client[NATS.jl] end + + subgraph Receiver["Julia Application (Receiver)"] + ReceiverApp[App Code] + NATSBridge_Recv[NATSBridge] + NATS_Client_Recv[NATS.jl] + end + + subgraph Infrastructure["Infrastructure"] + NATS[NATS Server
Message Broker] + FileServer[HTTP File Server
Upload/Download] + end + + SenderApp --> NATSBridge_Send + NATSBridge_Send --> NATS_Client + NATS_Client --> NATS + + NATS --> NATS_Client_Recv + NATS_Client_Recv --> NATSBridge_Recv + NATSBridge_Recv --> ReceiverApp + + NATSBridge_Send -.->|HTTP POST upload| FileServer + FileServer -.->|HTTP GET download| NATSBridge_Recv + + style SenderApp fill:#e8f5e9 + style ReceiverApp fill:#e8f5e9 + style NATS fill:#fff3e0 + style FileServer fill:#f3e5f5 ``` ### Message Flow -- 2.49.1 From e85eba4cea00ba3d5c6c250d4f34bebb6f3be66b Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 07:28:28 +0700 Subject: [PATCH 06/43] update --- docs/implementation.md | 60 ++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/docs/implementation.md b/docs/implementation.md index 304ad44..301d430 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -118,43 +118,35 @@ env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff, max_ret The Julia implementation follows the Claim-Check pattern: ```mermaid -flowchart TB - subgraph Sender["Julia Application (Sender)"] - App[App Code] - NATSBridge[NATSBridge] - NATS_Client[NATS.jl] - end - - subgraph Receiver["Julia Application (Receiver)"] - App_Recv[App Code] - NATSBridge_Recv[NATSBridge] - NATS_Client_Recv[NATS.jl] - end - - subgraph Infrastructure["Infrastructure"] - NATS[NATS Server
Message Broker] - FileServer[HTTP File Server
Upload/Download] - end - - App --> NATSBridge - NATSBridge --> NATS_Client - NATS_Client --> NATS +flowchart TD + A[SmartSend Function] --> B{Is payload size < 1MB?} + B -->|Yes | C[Direct Path
< 1MB] + B -->|No | D[Link Path
>= 1MB] - NATS --> NATS_Client_Recv - NATS_Client_Recv --> NATSBridge_Recv - NATSBridge_Recv --> App_Recv - - NATSBridge -.->|HTTP POST upload| FileServer - FileServer -.->|HTTP GET download| NATSBridge_Recv - - style App fill:#e8f5e9 - style App_Recv fill:#e8f5e9 - style NATSBridge fill:#c5e1a5 - style NATSBridge_Recv fill:#c5e1a5 - style NATS fill:#fff3e0 - style FileServer fill:#f3e5f5 + C --> C1[Serialize to Buffer] + C1 --> C2[Base64 encode] + C2 --> C3[Publish to NATS] + + D --> D1[Serialize to Buffer] + D1 --> D2[Upload to HTTP Server] + D2 --> D3[Publish to NATS with URL] + + style A fill:#e1f5ff,stroke:#0066cc,stroke-width:2px + style B fill:#fff4e1,stroke:#cc6600,stroke-width:2px + style C fill:#e8f5e9,stroke:#008000,stroke-width:2px + style D fill:#e8f5e9,stroke:#008000,stroke-width:2px + style C1 fill:#f5f5f5,stroke:#666,stroke-width:1px + style C2 fill:#f5f5f5,stroke:#666,stroke-width:1px + style C3 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D1 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D2 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D3 fill:#f5f5f5,stroke:#666,stroke-width:1px ``` +**Claim-Check Pattern Overview:** +- **Direct Path** (< 1MB): Payload is serialized, Base64-encoded, and published directly to NATS +- **Link Path** (≥ 1MB): Payload is serialized, uploaded to an HTTP file server, and only the URL is published to NATS (claim-check pattern) + ## smartsend Return Value The `smartsend` function now returns a tuple containing both the envelope object and the JSON string representation: -- 2.49.1 From 060c68cd05c1539ebc3d2e9fb92ad6ddd9326116 Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 11:00:46 +0700 Subject: [PATCH 07/43] update --- docs/expanded_architecture.md | 1136 ++++++++++++++++++ docs/expanded_implementation.md | 1986 +++++++++++++++++++++++++++++++ src/natbridge.js | 719 +++++++++++ src/natbridge.py | 784 ++++++++++++ src/natbridge_mpy.py | 728 +++++++++++ 5 files changed, 5353 insertions(+) create mode 100644 docs/expanded_architecture.md create mode 100644 docs/expanded_implementation.md create mode 100644 src/natbridge.js create mode 100644 src/natbridge.py create mode 100644 src/natbridge_mpy.py diff --git a/docs/expanded_architecture.md b/docs/expanded_architecture.md new file mode 100644 index 0000000..6d12eec --- /dev/null +++ b/docs/expanded_architecture.md @@ -0,0 +1,1136 @@ +# Cross-Platform Architecture Documentation: Bi-Directional Data Bridge + +## Overview + +This document describes the architecture for a high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. + +**Supported Platforms:** +- **Julia** - Ground truth implementation with full feature set +- **JavaScript** - Node.js and browser-compatible implementation +- **Python/MicroPython** - Desktop and embedded-compatible implementation + +### Cross-Platform Design Principles + +1. **High-Level API Parity**: All three platforms expose the same `smartsend()` and `smartreceive()` functions with identical signatures and behavior +2. **Idiomatic Implementations**: Each platform uses its native patterns (multiple dispatch in Julia, async/prototype in JS, class-based in Python) +3. **Message Format Consistency**: The `msg_envelope_v1` and `msg_payload_v1` JSON schemas are identical across all platforms +4. **Handler Function Abstraction**: File server operations are abstracted through handler functions for backend flexibility + +--- + +## High-Level API Standard (Cross-Platform) + +### Unified API Signature + +All three platforms expose the same high-level API: + +**Input Format (smartsend):** +``` +[(dataname1, data1, type1), (dataname2, data2, type2), ...] +``` + +**Output Format (smartreceive):** +``` +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + +### Supported Payload Types + +| Type | Julia | JavaScript | Python/MicroPython | +|------|-------|------------|-------------------| +| `text` | `String` | `string` | `str` | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | +| `table` | `DataFrame`, `Arrow.Table` | `Array`, `Buffer` (Arrow) | `pandas.DataFrame`, `bytes` (Arrow) | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray`, `io.BytesIO` | + +### Cross-Platform API Examples + +**Julia:** +```julia +using NATSBridge + +# Send +env, env_json_str = smartsend( + "/chat", + [("message", "Hello!", "text"), ("image", image_bytes, "image")], + broker_url="nats://localhost:4222" +) + +# Receive +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# env["payloads"] = [("message", "Hello!", "text"), ("image", bytes, "image")] +``` + +**JavaScript:** +```javascript +const NATSBridge = require('natbridge'); + +// Send +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat", + [ + ["message", "Hello!", "text"], + ["image", imageBuffer, "image"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Receive +const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: fetchWithBackoff +}); +// env.payloads = [["message", "Hello!", "text"], ["image", bytes, "image"]] +``` + +**Python:** +```python +from natbridge import NATSBridge + +# Send +env, env_json_str = NATSBridge.smartsend( + "/chat", + [("message", "Hello!", "text"), ("image", image_bytes, "image")], + broker_url="nats://localhost:4222" +) + +# Receive +env = NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff +) +# env["payloads"] = [("message", "Hello!", "text"), ("image", bytes, "image")] +``` + +**MicroPython:** +```python +from natbridge import NATSBridge + +# Send (limited to direct transport due to memory constraints) +env, env_json_str = NATSBridge.smartsend( + "/chat", + [("message", "Hello!", "text")], + broker_url="nats://localhost:4222" +) +``` + +--- + +## Architecture Diagram (Cross-Platform) + +```mermaid +flowchart TB + subgraph JuliaApp["Julia Application"] + JuliaAppCode[App Code] + JuliaBridge[NATSBridge.jl] + JuliaNATS[NATS.jl] + end + + subgraph JSApp["JavaScript Application"] + JSAppCode[App Code] + JSBridge[NATSBridge.js] + JSNATS[nats.js] + end + + subgraph PythonApp["Python/MicroPython Application"] + PythonAppCode[App Code] + PythonBridge[NATSBridge.py] + PythonNATS[nats.py] + end + + subgraph Infrastructure["Infrastructure"] + NATS[NATS Server
Message Broker] + FileServer[HTTP File Server
Upload/Download] + end + + JuliaAppCode --> JuliaBridge + JuliaBridge --> JuliaNATS + JSAppCode --> JSBridge + JSBridge --> JSNATS + PythonAppCode --> PythonBridge + PythonBridge --> PythonNATS + + JuliaNATS --> NATS + JSNATS --> NATS + PythonNATS --> NATS + + NATS --> JuliaNATS + NATS --> JSNATS + NATS --> PythonNATS + + JuliaBridge -.->|HTTP POST upload| FileServer + JSBridge -.->|HTTP POST upload| FileServer + PythonBridge -.->|HTTP POST upload| FileServer + + FileServer -.->|HTTP GET download| JuliaBridge + FileServer -.->|HTTP GET download| JSBridge + FileServer -.->|HTTP GET download| PythonBridge + + style JuliaApp fill:#c5e1a5 + style JSApp fill:#bbdefb + style PythonApp fill:#f8bbd0 + style NATS fill:#fff3e0 + style FileServer fill:#f3e5f5 +``` + +--- + +## System Components + +### 1. msg_envelope_v1 - Message Envelope + +**JSON Schema (Identical Across All Platforms):** +```json +{ + "correlation_id": "uuid-v4-string", + "msg_id": "uuid-v4-string", + "timestamp": "2024-01-15T10:30:00Z", + + "send_to": "topic/subject", + "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", + "sender_name": "agent-wine-web-frontend", + "sender_id": "uuid4", + "receiver_name": "agent-backend", + "receiver_id": "uuid4", + "reply_to": "topic", + "reply_to_msg_id": "uuid4", + "broker_url": "nats://localhost:4222", + + "metadata": { + "content_type": "application/octet-stream", + "content_length": 123456 + }, + + "payloads": [ + { + "id": "uuid4", + "dataname": "login_image", + "payload_type": "image", + "transport": "direct", + "encoding": "base64", + "size": 15433, + "data": "base64-encoded-string", + "metadata": { + "checksum": "sha256_hash" + } + }, + { + "id": "uuid4", + "dataname": "large_table", + "payload_type": "table", + "transport": "link", + "encoding": "none", + "size": 524288, + "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow", + "metadata": {} + } + ] +} +``` + +### 2. msg_payload_v1 - Payload Structure + +**JSON Schema (Identical Across All Platforms):** +```json +{ + "id": "uuid4", + "dataname": "login_image", + "payload_type": "image | dictionary | table | text | audio | video | binary", + "transport": "direct | link", + "encoding": "none | json | base64 | arrow-ipc", + "size": 15433, + "data": "base64-encoded-string | http-url", + "metadata": { + "checksum": "sha256_hash" + } +} +``` + +### 3. Transport Strategy Decision Logic (Cross-Platform) + +``` +┌─────────────────────────────────────────────────────────────┐ +│ smartsend Function (All Platforms) │ +│ Accepts: [(dataname1, data1, type1), ...] │ +│ (Type is per payload, not standalone) │ +└─────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────┐ +│ For each payload: │ +│ 1. Extract type from tuple/array │ +│ 2. Serialize based on type │ +│ 3. Check payload size │ +└─────────────────────────────────────────────────────────────┘ + │ + ┌───────────┴────────────┐ + ▼ ▼ + ┌──────────────┐ ┌──────────────┐ + │ Direct Path │ │ Link Path │ + │ (< 1MB) │ │ (>= 1MB) │ + │ │ │ │ + │ • Serialize │ │ • Serialize │ + │ to buffer │ │ to buffer │ + │ • Base64 │ │ • Upload to │ + │ encode │ │ HTTP Server│ + │ • Publish to │ │ • Publish to │ + │ NATS │ │ NATS with │ + │ (in msg) │ │ URL │ + └──────────────┘ └──────────────┘ +``` + +--- + +## Platform-Specific Implementations + +### Julia Implementation + +#### Architecture Patterns + +**Multiple Dispatch:** Julia's core strength is leveraged through function overloading: + +```julia +# publish_message has two overloads based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + conn = NATS.connect(broker_url) + publish_message(conn, subject, message, correlation_id) +end + +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + try + NATS.publish(conn, subject, message) + log_trace(correlation_id, "Message published to $subject") + finally + NATS.drain(conn) + end +end +``` + +**Struct-Based Data Models:** +```julia +struct msg_payload_v1 + id::String + dataname::String + payload_type::String + transport::String + encoding::String + size::Integer + data::Any + metadata::Dict{String, Any} +end + +struct msg_envelope_v1 + correlation_id::String + msg_id::String + timestamp::String + send_to::String + msg_purpose::String + sender_name::String + sender_id::String + receiver_name::String + receiver_id::String + reply_to::String + reply_to_msg_id::String + broker_url::String + metadata::Dict{String, Any} + payloads::Vector{msg_payload_v1} +end +``` + +#### Dependencies + +| Package | Purpose | +|---------|---------| +| `NATS.jl` | Core NATS functionality | +| `Arrow.jl` | Arrow IPC serialization | +| `JSON3.jl` | JSON parsing | +| `HTTP.jl` | HTTP client for file server | +| `UUIDs.jl` | UUID generation | +| `Dates.jl` | Timestamps | +| `Base64` | Base64 encoding | + +#### File Server Handler Signatures + +```julia +# Upload handler +fileserver_upload_handler( + fileserver_url::String, + dataname::String, + data::Vector{UInt8} +)::Dict{String, Any} + +# Download handler +fileserver_download_handler( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +)::Vector{UInt8} +``` + +#### Key Functions + +```julia +# Main send/receive functions +function smartsend( + subject::String, + data::AbstractArray{Tuple{String, Any, String}, 1}; + broker_url::String = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler::Function = plik_oneshot_upload, + size_threshold::Int = DEFAULT_SIZE_THRESHOLD, + correlation_id::String = string(uuid4()), + msg_purpose::String = "chat", + sender_name::String = "NATSBridge", + receiver_name::String = "", + receiver_id::String = "", + reply_to::String = "", + reply_to_msg_id::String = "", + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) +)::Tuple{msg_envelope_v1, String} + +function smartreceive( + msg::NATS.Msg; + fileserver_download_handler::Function = _fetch_with_backoff, + max_retries::Int = 5, + base_delay::Int = 100, + max_delay::Int = 5000 +)::JSON.Object{String, Any} +``` + +--- + +### JavaScript Implementation + +#### Architecture Patterns + +**Async/Await Pattern:** JavaScript uses async/await for non-blocking I/O: + +```javascript +// smartsend is async and returns a Promise +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = generateUUID(), + msg_purpose = "chat", + sender_name = "NATSBridge", + receiver_name = "", + receiver_id = "", + reply_to = "", + reply_to_msg_id = "", + is_publish = true, + nats_connection = null, + msg_id = generateUUID(), + sender_id = generateUUID() + } = options; + + // Process payloads + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + if (payloadSize < size_threshold) { + // Direct path + const payloadB64 = base64Encode(payloadBytes); + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: "direct", + encoding: "base64", + size: payloadSize, + data: payloadB64 + }); + } else { + // Link path + const response = await fileserver_upload_handler( + fileserver_url, dataname, payloadBytes + ); + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: "link", + encoding: "none", + size: payloadSize, + data: response.url + }); + } + } + + const env = buildEnvelope(subject, payloads, { + correlation_id, msg_id, msg_purpose, + sender_name, sender_id, receiver_name, + receiver_id, reply_to, reply_to_msg_id, + broker_url + }); + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} +``` + +**Prototype-Based Utilities:** +```javascript +// NATS client wrapper (prototype-based) +class NATSClient { + constructor(url) { + this.url = url; + this.connection = null; + } + + async connect() { + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + async publish(subject, message) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + } + + async close() { + if (this.connection) { + this.connection.close(); + } + } +} +``` + +#### Dependencies (Node.js) + +| Package | Purpose | +|---------|---------| +| `nats` | Core NATS functionality (nats.js) | +| `uuid` | UUID generation | +| `node-fetch` or `axios` | HTTP client for file server | +| `apache-arrow` | Arrow IPC serialization | + +#### Dependencies (Browser) + +| Package | Purpose | +|---------|---------| +| `nats` | Browser-compatible NATS client | +| `uuid` | UUID generation | +| `fetch` (native) | HTTP client for file server | +| `apache-arrow` | Arrow IPC serialization | + +#### Dependencies (MicroPython) + +| Module | Purpose | +|--------|---------| +| `nats` (custom) | MicroPython NATS client | +| `time` | Timestamps | +| `uos` | File operations | +| `base64` | Base64 encoding | + +#### File Server Handler Signatures + +```javascript +// Upload handler - async function returning Promise +async function fileserver_upload_handler( + fileserver_url, + dataname, + data // Uint8Array +) { + // Returns: { status, uploadid, fileid, url } +} + +// Download handler - async function returning Promise +async function fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + correlation_id +) { + // Returns: Uint8Array +} +``` + +#### Key Functions + +```javascript +// Main send/receive functions +async function smartsend(subject, data, options = {}) { + // data: Array of [dataname, data, type] tuples + // Returns: Promise<[env, env_json_str]> +} + +async function smartreceive(msg, options = {}) { + // msg: NATS message object + // Returns: Promise +} + +// Utility functions +async function serializeData(data, payload_type) { + // Returns: Uint8Array +} + +async function deserializeData(data, payload_type) { + // Returns: deserialized data +} + +async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { + // Returns: Uint8Array +} +``` + +--- + +### Python/MicroPython Implementation + +#### Architecture Patterns + +**Class-Based Design:** Python uses classes for stateful operations: + +```python +class NATSBridge: + """Cross-platform NATS bridge implementation.""" + + DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB + DEFAULT_BROKER_URL = "nats://localhost:4222" + DEFAULT_FILESERVER_URL = "http://localhost:8080" + + def __init__(self, broker_url=None, fileserver_url=None): + self.broker_url = broker_url or self.DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or self.DEFAULT_FILESERVER_URL + self._nats_client = None + + async def smartsend(self, subject, data, **kwargs): + """ + Send data via NATS with automatic transport selection. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options (broker_url, fileserver_url, etc.) + + Returns: + Tuple of (env, env_json_str) + """ + # Extract options with defaults + options = self._merge_options(kwargs) + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = self._serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + if payload_size < options['size_threshold']: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + payloads.append({ + 'id': uuid.uuid4().hex, + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64 + }) + else: + # Link path + response = await options['fileserver_upload_handler']( + options['fileserver_url'], dataname, payload_bytes + ) + payloads.append({ + 'id': uuid.uuid4().hex, + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'] + }) + + # Build envelope + env = self._build_envelope(subject, payloads, options) + env_json_str = json.dumps(env) + + if options['is_publish']: + await self._publish_message( + subject, env_json_str, options['correlation_id'], + nats_connection=options.get('nats_connection') + ) + + return env, env_json_str + + async def smartreceive(self, msg, **kwargs): + """ + Receive and process NATS message. + + Args: + msg: NATS message object + **kwargs: Additional options (fileserver_download_handler, etc.) + + Returns: + Dict with envelope metadata and payloads + """ + # Parse envelope + env_json_obj = json.loads(msg.payload) + + # Process payloads + payloads_list = [] + for payload in env_json_obj['payloads']: + transport = payload['transport'] + dataname = payload['dataname'] + + if transport == 'direct': + payload_b64 = payload['data'] + payload_bytes = base64.b64decode(payload_b64) + data_type = payload['payload_type'] + data = self._deserialize_data(payload_bytes, data_type) + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + url = payload['data'] + downloaded_data = await options['fileserver_download_handler']( + url, + options['max_retries'], + options['base_delay'], + options['max_delay'], + env_json_obj['correlation_id'] + ) + data_type = payload['payload_type'] + data = self._deserialize_data(downloaded_data, data_type) + payloads_list.append((dataname, data, data_type)) + + env_json_obj['payloads'] = payloads_list + return env_json_obj +``` + +**Dataclass for Type Safety:** +```python +from dataclasses import dataclass, field +from typing import Any, Dict, List, Tuple, Union + +@dataclass +class MsgPayloadV1: + """Message payload structure.""" + id: str + dataname: str + payload_type: str + transport: str + encoding: str + size: int + data: Union[str, bytes] # URL for link, base64 for direct + metadata: Dict[str, Any] = field(default_factory=dict) + +@dataclass +class MsgEnvelopeV1: + """Message envelope structure.""" + correlation_id: str + msg_id: str + timestamp: str + send_to: str + msg_purpose: str + sender_name: str + sender_id: str + receiver_name: str + receiver_id: str + reply_to: str + reply_to_msg_id: str + broker_url: str + metadata: Dict[str, Any] = field(default_factory=dict) + payloads: List[MsgPayloadV1] = field(default_factory=list) +``` + +#### Dependencies (Desktop Python) + +| Package | Purpose | +|---------|---------| +| `nats-py` | Core NATS functionality | +| `uuid` | UUID generation (stdlib) | +| `aiohttp` or `requests` | HTTP client for file server | +| `pyarrow` | Arrow IPC serialization | +| `pandas` | DataFrame support (optional) | +| `python-dateutil` | Timestamps | +| `base64` | Base64 encoding (stdlib) | + +#### Dependencies (MicroPython) + +| Module | Purpose | +|--------|---------| +| `network` | NATS connection (custom) | +| `time` | Timestamps | +| `uos` | File operations | +| `base64` | Base64 encoding | +| `json` | JSON parsing | +| `struct` | Binary data handling | + +**MicroPython Limitations:** +- No Arrow IPC support (memory constraints) +- Only direct transport (< 1MB threshold enforced) +- Simplified UUID generation +- No async/await (use callbacks or uasyncio) + +#### File Server Handler Signatures + +```python +# Upload handler - async function +async def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload data to file server. + + Args: + fileserver_url: Base URL of file server + dataname: Name of the file + data: Binary data + + Returns: + Dict with keys: 'status', 'uploadid', 'fileid', 'url' + """ + pass + +# Download handler - async function +async def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Download data from URL with exponential backoff. + + Args: + url: URL to download from + max_retries: Maximum retry attempts + base_delay: Initial delay in ms + max_delay: Maximum delay in ms + correlation_id: Correlation ID for logging + + Returns: + Downloaded bytes + """ + pass +``` + +#### Key Functions + +```python +# Main send/receive functions (standalone or class methods) +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """Send data via NATS.""" + pass + +async def smartreceive( + msg: Any, + fileserver_download_handler: Callable = fetch_with_backoff, + max_retries: int = 5, + base_delay: int = 100, + max_delay: int = 5000 +) -> Dict: + """Receive and process NATS message.""" + pass + +# Utility functions +def _serialize_data(data: Any, payload_type: str) -> bytes: + """Serialize data to bytes.""" + pass + +def _deserialize_data(data: bytes, payload_type: str) -> Any: + """Deserialize bytes to data.""" + pass + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """Fetch URL with exponential backoff.""" + pass +``` + +--- + +## Platform Comparison Matrix + +| Feature | Julia | JavaScript | Python | MicroPython | +|---------|-------|------------|--------|-------------| +| **Multiple Dispatch** | ✅ Native | ❌ (Prototypes) | ❌ (Overload via `@overload`) | ❌ | +| **Async/Await** | ❌ (Tasks) | ✅ Native | ✅ Native | ⚠️ (uasyncio) | +| **Type Safety** | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | +| **Memory Management** | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | +| **Arrow IPC** | ✅ Native | ✅ (arrow package) | ✅ (pyarrow) | ❌ | +| **Direct Transport** | ✅ | ✅ | ✅ | ✅ | +| **Link Transport** | ✅ | ✅ | ✅ | ⚠️ (Limited) | +| **Handler Functions** | ✅ | ✅ | ✅ | ✅ | +| **Cross-Platform API** | ✅ | ✅ | ✅ | ✅ | + +--- + +## Implementation Details by Platform + +### Julia: Multiple Dispatch Pattern + +```julia +# Function overloading based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + # Creates new connection +end + +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + # Uses pre-existing connection +end + +# Type-specific serialization +function _serialize_data(data::String, payload_type::String) + # Text handling +end + +function _serialize_data(data::Dict, payload_type::String) + # Dictionary handling +end + +function _serialize_data(data::DataFrame, payload_type::String) + # Table handling +end +``` + +### JavaScript: Prototype + Async Pattern + +```javascript +// Class-based NATS client +class NATSClient { + constructor(url) { + this.url = url; + } + + async connect() { + // Connection logic + } + + async publish(subject, message) { + // Publish logic + } +} + +// Module-level utility functions +function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + const r = Math.random() * 16 | 0; + return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); +} + +async function serializeData(data, payload_type) { + // Serialization logic +} +``` + +### Python: Class-Based Pattern + +```python +class NATSBridge: + """Main bridge class.""" + + def __init__(self, broker_url=None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + + async def smartsend(self, subject, data, **kwargs): + """Send data.""" + pass + + async def smartreceive(self, msg, **kwargs): + """Receive message.""" + pass + +# Module-level convenience functions +def smartsend(subject, data, **kwargs): + """Convenience function using default NATSBridge instance.""" + bridge = NATSBridge() + return await bridge.smartsend(subject, data, **kwargs) + +def smartreceive(msg, **kwargs): + """Convenience function using default NATSBridge instance.""" + bridge = NATSBridge() + return await bridge.smartreceive(msg, **kwargs) +``` + +--- + +## Scenario Implementations (Cross-Platform) + +### Scenario 1: Command & Control (Small Dictionary) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
config = Dict("step_size" => 0.01)
env, env_json_str = smartsend("control", [("config", config, "dictionary")])``` | +| **JavaScript** | ```javascript
const config = { step_size: 0.01 };
[env, env_json_str] = await smartsend("control", [["config", config, "dictionary"]]);``` | +| **Python** | ```python
config = {"step_size": 0.01}
env, env_json_str = await smartsend("control", [("config", config, "dictionary")])``` | + +### Scenario 2: Deep Dive Analysis (Large Arrow Table) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
df = DataFrame(id=1:1000000, value=rand(1000000))
env, env_json_str = smartsend("analysis", [("table", df, "table")])``` | +| **JavaScript** | ```javascript
const df = [{ id: 1, value: 0.5 }, ...];
[env, env_json_str] = await smartsend("analysis", [["table", df, "table"]]);``` | +| **Python** | ```python
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "value": np.random.rand(1000000)})
env, env_json_str = await smartsend("analysis", [("table", df, "table")])``` | + +### Scenario 3: Chat System (Multi-Payload) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = smartsend("chat", chat)``` | +| **JavaScript** | ```javascript
const chat = [["text", "Hello!", "text"], ["image", imgBuffer, "image"]];
[env, env_json_str] = await smartsend("chat", chat);``` | +| **Python** | ```python
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = await smartsend("chat", chat)``` | + +--- + +## Performance Considerations (Cross-Platform) + +### Zero-Copy Reading + +| Platform | Strategy | +|----------|----------| +| **Julia** | `Arrow.read()` with memory-mapped files | +| **JavaScript** | `ArrayBuffer` with `DataView` | +| **Python** | `pyarrow` memory mapping | +| **MicroPython** | Not available (streaming only) | + +### Exponential Backoff + +```python +# Python/MicroPython +async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): + delay = base_delay + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.read() + except Exception as e: + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + raise Exception("Failed to fetch after max retries") +``` + +### Correlation ID Logging + +All platforms use correlation IDs for distributed tracing: + +``` +[timestamp] [Correlation: abc123] Message published to subject +``` + +--- + +## Testing Strategy (Cross-Platform) + +### Unit Tests + +| Test Type | Julia | JavaScript | Python | +|-----------|-------|------------|--------| +| **Serialization** | `test/test_julia_text_sender.jl` | `test/test_js_text_sender.js` | `test/test_py_text_sender.py` | +| **Deserialization** | `test/test_julia_text_receiver.jl` | `test/test_js_text_receiver.js` | `test/test_py_text_receiver.py` | +| **Large Payload** | `test/test_julia_file_sender.jl` | `test/test_js_file_sender.js` | `test/test_py_file_sender.py` | +| **Multi-Payload** | `test/test_julia_mix_payloads_sender.jl` | `test/test_js_mix_payloads_sender.js` | `test/test_py_mix_payloads_sender.py` | + +### Integration Tests + +- NATS server communication +- File server upload/download +- Cross-platform message exchange + +--- + +## Configuration + +### Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `NATS_URL` | `nats://localhost:4222` | NATS server URL | +| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | +| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | + +### MicroPython-Specific Configuration + +```python +# micropython.conf +NATS_URL = "nats://broker.local:4222" +FILESERVER_URL = "http://fileserver.local:8080" +SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices +MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython +``` + +--- + +## Summary + +This cross-platform NATS bridge provides: + +1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across Julia, JavaScript, and Python/MicroPython +2. **Idiomatic Implementations**: + - Julia: Multiple dispatch and struct-based design + - JavaScript: Async/await and prototype-based utilities + - Python: Class-based design with type hints +3. **Message Format Consistency**: Identical `msg_envelope_v1` and `msg_payload_v1` JSON schemas +4. **Handler Abstraction**: File server operations abstracted through configurable handlers +5. **Platform-Specific Optimizations**: Arrow IPC support in desktop platforms, streaming support in MicroPython + +The Julia implementation serves as the **ground truth** for API design and behavior, while JavaScript and Python implementations maintain interface parity while leveraging their respective language idioms. \ No newline at end of file diff --git a/docs/expanded_implementation.md b/docs/expanded_implementation.md new file mode 100644 index 0000000..417a150 --- /dev/null +++ b/docs/expanded_implementation.md @@ -0,0 +1,1986 @@ +# Cross-Platform Implementation Guide: Bi-Directional Data Bridge + +## Overview + +This document describes the implementation of the high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. + +**Supported Platforms:** +- **Julia** - Ground truth implementation (reference) +- **JavaScript** - Node.js and browser implementation +- **Python/MicroPython** - Desktop and embedded implementation + +--- + +## Implementation Files + +| Language | Implementation File | Description | +|----------|---------------------|-------------| +| **Julia** | [`src/NATSBridge.jl`](../src/NATSBridge.jl) | Full Julia implementation with Arrow IPC support | +| **JavaScript** | `src/natbridge.js` | Node.js/browser implementation | +| **Python** | `src/natbridge.py` | Desktop Python implementation | +| **MicroPython** | `src/natbridge_mpy.py` | MicroPython implementation (limited features) | + +--- + +## File Server Handler Architecture + +The system uses **handler functions** to abstract file server operations, allowing support for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). + +### Handler Function Signatures + +#### Julia + +```julia +# Upload handler - uploads data to file server and returns URL +fileserver_upload_handler( + fileserver_url::String, + dataname::String, + data::Vector{UInt8} +)::Dict{String, Any} + +# Download handler - fetches data from file server URL with exponential backoff +fileserver_download_handler( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +)::Vector{UInt8} +``` + +#### JavaScript + +```javascript +// Upload handler - async function +async function fileserver_upload_handler( + fileserver_url, + dataname, + data // Uint8Array +) { + // Returns: { status, uploadid, fileid, url } +} + +// Download handler - async function +async function fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + correlation_id +) { + // Returns: Uint8Array +} +``` + +#### Python + +```python +# Upload handler - async function +async def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload data to file server. + + Returns: + Dict with keys: 'status', 'uploadid', 'fileid', 'url' + """ + pass + +# Download handler - async function +async def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Download data from URL with exponential backoff. + + Returns: + Downloaded bytes + """ + pass +``` + +#### MicroPython + +```python +# Upload handler - synchronous (no async in MicroPython) +def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytearray +) -> Dict: + """ + Upload data to file server (synchronous). + + Returns: + Dict with keys: 'status', 'url' + """ + pass + +# Download handler - synchronous +def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytearray: + """ + Download data from URL with exponential backoff (synchronous). + + Returns: + Downloaded bytes + """ + pass +``` + +--- + +## Multi-Payload Support (Standard API) + +The system uses a **standardized list-of-tuples format** for all payload operations across all platforms. + +### API Standard + +``` +# Input format for smartsend (always a list of tuples with type info) +[(dataname1, data1, type1), (dataname2, data2, type2), ...] + +# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + +### Supported Types + +| Type | Julia | JavaScript | Python | MicroPython | +|------|-------|------------|--------|-------------| +| `text` | `String` | `string` | `str` | `str` | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | +| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ (not supported) | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | + +### Cross-Platform Examples + +#### Julia + +```julia +using NATSBridge + +# Single payload - still wrapped in a list +env, env_json_str = smartsend( + "/test", + [("dataname1", data1, "dictionary")], + broker_url="nats://localhost:4222", + fileserver_upload_handler=plik_oneshot_upload +) + +# Multiple payloads with different types +env, env_json_str = smartsend( + "/test", + [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], + broker_url="nats://localhost:4222" +) + +# Mixed content (chat with text, image, audio) +env, env_json_str = smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("user_image", image_data, "image"), + ("audio_clip", audio_data, "audio") + ], + broker_url="nats://localhost:4222" +) + +# Receive returns a JSON object envelope +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# env["payloads"] = [("dataname1", data1, type1), ...] +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +// Single payload +const [env, env_json_str] = await NATSBridge.smartsend( + "/test", + [["dataname1", data1, "dictionary"]], + { + broker_url: "nats://localhost:4222", + fileserver_upload_handler: plikOneshotUpload + } +); + +// Multiple payloads +const [env, env_json_str] = await NATSBridge.smartsend( + "/test", + [ + ["dataname1", data1, "dictionary"], + ["dataname2", data2, "table"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Mixed content +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat", + [ + ["message_text", "Hello!", "text"], + ["user_image", imageData, "image"], + ["audio_clip", audioData, "audio"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Receive +const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: fetchWithBackoff +}); +// env.payloads = [["dataname1", data1, type1], ...] +``` + +#### Python + +```python +from natbridge import NATSBridge + +# Single payload +env, env_json_str = await NATSBridge.smartsend( + "/test", + [("dataname1", data1, "dictionary")], + broker_url="nats://localhost:4222", + fileserver_upload_handler=plik_oneshot_upload +) + +# Multiple payloads +env, env_json_str = await NATSBridge.smartsend( + "/test", + [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], + broker_url="nats://localhost:4222" +) + +# Mixed content +env, env_json_str = await NATSBridge.smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("user_image", image_data, "image"), + ("audio_clip", audio_data, "audio") + ], + broker_url="nats://localhost:4222" +) + +# Receive +env = await NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff +) +# env["payloads"] = [("dataname1", data1, type1), ...] +``` + +#### MicroPython + +```python +from natbridge import NATSBridge + +# Limited to text and binary (no tables due to memory constraints) +env, env_json_str = NATSBridge.smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("binary_data", data_bytes, "binary") + ], + broker_url="nats://localhost:4222", + size_threshold=100000 # Lower threshold for memory constraints +) +# Note: MicroPython uses synchronous handlers +``` + +--- + +## Architecture + +### Cross-Platform Claim-Check Pattern + +```mermaid +flowchart TD + A[SmartSend Function] --> B{Is payload size < 1MB?} + B -->|Yes | C[Direct Path
< 1MB] + B -->|No | D[Link Path
>= 1MB] + + C --> C1[Serialize to Buffer] + C1 --> C2[Base64 encode] + C2 --> C3[Publish to NATS] + + D --> D1[Serialize to Buffer] + D1 --> D2[Upload to HTTP Server] + D2 --> D3[Publish to NATS with URL] + + style A fill:#e1f5ff,stroke:#0066cc,stroke-width:2px + style B fill:#fff4e1,stroke:#cc6600,stroke-width:2px + style C fill:#e8f5e9,stroke:#008000,stroke-width:2px + style D fill:#e8f5e9,stroke:#008000,stroke-width:2px + style C1 fill:#f5f5f5,stroke:#666,stroke-width:1px + style C2 fill:#f5f5f5,stroke:#666,stroke-width:1px + style C3 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D1 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D2 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D3 fill:#f5f5f5,stroke:#666,stroke-width:1px +``` + +**Claim-Check Pattern Overview:** +- **Direct Path** (< 1MB): Payload is serialized, Base64-encoded, and published directly to NATS +- **Link Path** (≥ 1MB): Payload is serialized, uploaded to an HTTP file server, and only the URL is published to NATS (claim-check pattern) + +### smartsend Return Value + +All platforms return a tuple/array containing both the envelope and JSON string: + +#### Julia + +```julia +env, env_json_str = smartsend(...) +# Returns: ::Tuple{msg_envelope_v1, String} +# env::msg_envelope_v1 - The envelope object with all metadata and payloads +# env_json_str::String - JSON string for publishing to NATS +``` + +#### JavaScript + +```javascript +const [env, env_json_str] = await smartsend(...); +// Returns: Promise<[env, env_json_str]> +// env: Object with all metadata and payloads +// env_json_str: String for publishing to NATS +``` + +#### Python + +```python +env, env_json_str = await smartsend(...) +# Returns: Tuple[Dict, str] +# env: Dict with all metadata and payloads +# env_json_str: String for publishing to NATS +``` + +#### MicroPython + +```python +env, env_json_str = NATSBridge.smartsend(...) +# Returns: Tuple[Dict, str] +# Note: MicroPython returns plain dicts (no structured envelope object) +``` + +--- + +## Installation + +### Julia Dependencies + +```julia +using Pkg +Pkg.add("NATS") +Pkg.add("Arrow") +Pkg.add("JSON3") +Pkg.add("HTTP") +Pkg.add("UUIDs") +Pkg.add("Dates") +``` + +### JavaScript Dependencies (Node.js) + +```bash +npm install nats uuid apache-arrow node-fetch +# or +yarn add nats uuid apache-arrow node-fetch +``` + +### JavaScript Dependencies (Browser) + +```bash +npm install nats uuid apache-arrow +# or use CDN: +# https://unpkg.com/nats-js/dist/bundle/nats.min.js +# https://unpkg.com/apache-arrow/arrow.min.js +``` + +### Python Dependencies (Desktop) + +```bash +pip install nats-py aiohttp pyarrow pandas python-dateutil +``` + +### MicroPython Dependencies + +MicroPython uses built-in modules: +- `network` - NATS connection (custom implementation) +- `time` - Timestamps +- `uos` - File operations +- `base64` - Base64 encoding +- `json` - JSON parsing +- `struct` - Binary data handling + +--- + +## Usage Tutorial + +### Step 1: Start NATS Server + +```bash +docker run -p 4222:4222 nats:latest +``` + +### Step 2: Start HTTP File Server (optional) + +```bash +# Create a directory for file uploads +mkdir -p /tmp/fileserver + +# Use any HTTP server that supports POST for file uploads +# Example: Python's built-in server +python3 -m http.server 8080 --directory /tmp/fileserver +``` + +### Step 3: Run Test Scenarios + +```bash +# Julia tests +julia test/test_julia_to_julia_text_sender.jl +julia test/test_julia_to_julia_text_receiver.jl + +# JavaScript tests (Node.js) +node test/test_js_text_sender.js +node test/test_js_text_receiver.js + +# Python tests +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py +``` + +--- + +## Platform-Specific Implementations + +### Julia Implementation + +#### Module Structure + +```julia +module NATSBridge + using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64 + + # Constants + const DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB + const DEFAULT_BROKER_URL = "nats://localhost:4222" + const DEFAULT_FILESERVER_URL = "http://localhost:8080" + + # Structs + struct msg_payload_v1 + id::String + dataname::String + payload_type::String + transport::String + encoding::String + size::Integer + data::Any + metadata::Dict{String, Any} + end + + struct msg_envelope_v1 + correlation_id::String + msg_id::String + timestamp::String + send_to::String + msg_purpose::String + sender_name::String + sender_id::String + receiver_name::String + receiver_id::String + reply_to::String + reply_to_msg_id::String + broker_url::String + metadata::Dict{String, Any} + payloads::Vector{msg_payload_v1} + end + + # Main functions + function smartsend(...) end + function smartreceive(...) end + + # Utility functions + function _serialize_data(...) end + function _deserialize_data(...) end + function envelope_to_json(...) end + function log_trace(...) end + + # File server handlers + function plik_oneshot_upload(...) end + function _fetch_with_backoff(...) end + function publish_message(...) end + + # Internal helpers + function _get_payload_bytes(...) end +end +``` + +#### Multiple Dispatch Pattern + +Julia leverages multiple dispatch for type-specific implementations: + +```julia +# publish_message has two overloads based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + conn = NATS.connect(broker_url) + publish_message(conn, subject, message, correlation_id) +end + +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + try + NATS.publish(conn, subject, message) + log_trace(correlation_id, "Message published to $subject") + finally + NATS.drain(conn) + end +end + +# Type-specific serialization +function _serialize_data(data::String, payload_type::String) + # Text handling + return Vector{UInt8}(data) +end + +function _serialize_data(data::Dict, payload_type::String) + # Dictionary handling + json_str = JSON.json(data) + return Vector{UInt8}(json_str) +end + +function _serialize_data(data::DataFrame, payload_type::String) + # Table handling + io = IOBuffer() + Arrow.write(io, data) + return take!(io) +end +``` + +#### smartsend Implementation + +```julia +function smartsend( + subject::String, + data::AbstractArray{Tuple{String, T1, String}, 1}; + broker_url::String = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler::Function = plik_oneshot_upload, + size_threshold::Int = DEFAULT_SIZE_THRESHOLD, + correlation_id::String = string(uuid4()), + msg_purpose::String = "chat", + sender_name::String = "NATSBridge", + receiver_name::String = "", + receiver_id::String = "", + reply_to::String = "", + reply_to_msg_id::String = "", + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) +)::Tuple{msg_envelope_v1, String} where {T1<:Any} + + log_trace(correlation_id, "Starting smartsend for subject: $subject") + + # Process each payload in the list + payloads = msg_payload_v1[] + for (dataname, payload_data, payload_type) in data + # Serialize data based on type + payload_bytes = _serialize_data(payload_data, payload_type) + + payload_size = length(payload_bytes) + log_trace(correlation_id, "Serialized payload '$dataname' size: $payload_size bytes") + + # Decision: Direct vs Link + if payload_size < size_threshold + # Direct path - Base64 encode and send via NATS + payload_b64 = Base64.base64encode(payload_bytes) + log_trace(correlation_id, "Using direct transport for $payload_size bytes") + + payload = msg_payload_v1( + payload_b64, + payload_type; + id = string(uuid4()), + dataname = dataname, + transport = "direct", + encoding = "base64", + size = payload_size, + metadata = Dict{String, Any}("payload_bytes" => payload_size) + ) + push!(payloads, payload) + else + # Link path - Upload to HTTP server, send URL via NATS + log_trace(correlation_id, "Using link transport, uploading to fileserver") + + response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response["status"] != 200 + error("Failed to upload data to fileserver: $(response["status"])") + end + + url = response["url"] + log_trace(correlation_id, "Uploaded to URL: $url") + + payload = msg_payload_v1( + url, + payload_type; + id = string(uuid4()), + dataname = dataname, + transport = "link", + encoding = "none", + size = payload_size, + metadata = Dict{String, Any}() + ) + push!(payloads, payload) + end + end + + # Create msg_envelope_v1 with all payloads + env = msg_envelope_v1( + subject, + payloads; + correlation_id = correlation_id, + msg_id = msg_id, + msg_purpose = msg_purpose, + sender_name = sender_name, + sender_id = sender_id, + receiver_name = receiver_name, + receiver_id = receiver_id, + reply_to = reply_to, + reply_to_msg_id = reply_to_msg_id, + broker_url = broker_url, + metadata = Dict{String, Any}(), + ) + + env_json_str = envelope_to_json(env) + + if is_publish == false + # skip publish + elseif is_publish == true && NATS_connection === nothing + publish_message(broker_url, subject, env_json_str, correlation_id) + elseif is_publish == true && NATS_connection !== nothing + publish_message(NATS_connection, subject, env_json_str, correlation_id) + end + + return (env, env_json_str) +end +``` + +#### smartreceive Implementation + +```julia +function smartreceive( + msg::NATS.Msg; + fileserver_download_handler::Function = _fetch_with_backoff, + max_retries::Int = 5, + base_delay::Int = 100, + max_delay::Int = 5000 +)::JSON.Object{String, Any} + # Parse the JSON envelope + env_json_obj = JSON.parse(String(msg.payload)) + log_trace(env_json_obj["correlation_id"], "Processing received message") + + # Process all payloads in the envelope + payloads_list = Tuple{String, Any, String}[] + + num_payloads = length(env_json_obj["payloads"]) + + for i in 1:num_payloads + payload = env_json_obj["payloads"][i] + transport = String(payload["transport"]) + dataname = String(payload["dataname"]) + + if transport == "direct" + log_trace(env_json_obj["correlation_id"], "Direct transport - decoding payload '$dataname'") + + # Extract base64 payload from the payload + payload_b64 = String(payload["data"]) + + # Decode Base64 payload + payload_bytes = Base64.base64decode(payload_b64) + + # Deserialize based on type + data_type = String(payload["payload_type"]) + data = _deserialize_data(payload_bytes, data_type, env_json_obj["correlation_id"]) + + push!(payloads_list, (dataname, data, data_type)) + elseif transport == "link" + # Extract download URL from the payload + url = String(payload["data"]) + log_trace(env_json_obj["correlation_id"], "Link transport - fetching '$dataname' from URL: $url") + + # Fetch with exponential backoff using the download handler + downloaded_data = fileserver_download_handler(url, max_retries, base_delay, max_delay, env_json_obj["correlation_id"]) + + # Deserialize based on type + data_type = String(payload["payload_type"]) + data = _deserialize_data(downloaded_data, data_type, env_json_obj["correlation_id"]) + + push!(payloads_list, (dataname, data, data_type)) + else + error("Unknown transport type for payload '$dataname': $(transport)") + end + end + env_json_obj["payloads"] = payloads_list + return env_json_obj +end +``` + +#### _serialize_data Implementation + +```julia +function _serialize_data(data::Any, payload_type::String) + if payload_type == "text" + if isa(data, String) + data_bytes = Vector{UInt8}(data) + return data_bytes + else + error("Text data must be a String") + end + elseif payload_type == "dictionary" + json_str = JSON.json(data) + json_str_bytes = Vector{UInt8}(json_str) + return json_str_bytes + elseif payload_type == "table" + io = IOBuffer() + Arrow.write(io, data) + return take!(io) + elseif payload_type == "image" + if isa(data, Vector{UInt8}) + return data + else + error("Image data must be Vector{UInt8}") + end + elseif payload_type == "audio" + if isa(data, Vector{UInt8}) + return data + else + error("Audio data must be Vector{UInt8}") + end + elseif payload_type == "video" + if isa(data, Vector{UInt8}) + return data + else + error("Video data must be Vector{UInt8}") + end + elseif payload_type == "binary" + if isa(data, IOBuffer) + return take!(data) + elseif isa(data, Vector{UInt8}) + return data + else + error("Binary data must be binary (Vector{UInt8} or IOBuffer)") + end + else + error("Unknown payload_type: $payload_type") + end +end +``` + +#### _deserialize_data Implementation + +```julia +function _deserialize_data( + data::Vector{UInt8}, + payload_type::String, + correlation_id::String +) + if payload_type == "text" + return String(data) + elseif payload_type == "dictionary" + json_str = String(data) + return JSON.parse(json_str) + elseif payload_type == "table" + io = IOBuffer(data) + df = Arrow.Table(io) + return df + elseif payload_type == "image" + return data + elseif payload_type == "audio" + return data + elseif payload_type == "video" + return data + elseif payload_type == "binary" + return data + else + error("Unknown payload_type: $payload_type") + end +end +``` + +#### _fetch_with_backoff Implementation + +```julia +function _fetch_with_backoff( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +) + delay = base_delay + for attempt in 1:max_retries + try + response = HTTP.request("GET", url) + if response.status == 200 + log_trace(correlation_id, "Successfully fetched data from $url on attempt $attempt") + return response.body + else + error("Failed to fetch: $(response.status)") + end + catch e + log_trace(correlation_id, "Attempt $attempt failed: $(typeof(e))") + + if attempt < max_retries + sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + end + end + end + + error("Failed to fetch data after $max_retries attempts") +end +``` + +#### plik_oneshot_upload Implementation + +```julia +function plik_oneshot_upload(file_server_url::String, dataname::String, data::Vector{UInt8}) + # Get upload id + url_getUploadID = "$file_server_url/upload" + headers = ["Content-Type" => "application/json"] + body = """{ "OneShot" : true }""" + http_response = HTTP.request("POST", url_getUploadID, headers, body; body_is_form=false) + response_json = JSON.parse(http_response.body) + uploadid = response_json["id"] + uploadtoken = response_json["uploadToken"] + + # Upload file + file_multipart = HTTP.Multipart(dataname, IOBuffer(data), "application/octet-stream") + url_upload = "$file_server_url/file/$uploadid" + headers = ["X-UploadToken" => uploadtoken] + + form = HTTP.Form(Dict( + "file" => file_multipart + )) + + http_response = nothing + try + http_response = HTTP.post(url_upload, headers, form) + catch e + @error "Request failed" exception=e + end + response_json = JSON.parse(http_response.body) + fileid = response_json["id"] + + url = "$file_server_url/file/$uploadid/$fileid/$dataname" + + return Dict("status" => http_response.status, "uploadid" => uploadid, "fileid" => fileid, "url" => url) +end +``` + +--- + +### JavaScript Implementation + +#### Module Structure + +```javascript +// natbridge.js +const nats = require('nats'); +const { v4: uuidv4 } = require('uuid'); +const fetch = require('node-fetch'); + +const DEFAULT_SIZE_THRESHOLD = 1_000_000; +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; + +class NATSClient { + constructor(url) { + this.url = url; + this.connection = null; + } + + async connect() { + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + async publish(subject, message) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + } + + async close() { + if (this.connection) { + this.connection.close(); + } + } +} + +async function smartsend(subject, data, options = {}) { + // Implementation +} + +async function smartreceive(msg, options = {}) { + // Implementation +} + +module.exports = { + NATSClient, + smartsend, + smartreceive, + plikOneshotUpload, + fetchWithBackoff +}; +``` + +#### smartsend Implementation + +```javascript +const nats = require('nats'); +const { v4: uuidv4 } = require('uuid'); +const fetch = require('node-fetch'); +const arrow = require('apache-arrow'); + +const DEFAULT_SIZE_THRESHOLD = 1_000_000; +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; + +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = uuidv4(), + msg_purpose = 'chat', + sender_name = 'NATSBridge', + receiver_name = '', + receiver_id = '', + reply_to = '', + reply_to_msg_id = '', + is_publish = true, + nats_connection = null, + msg_id = uuidv4(), + sender_id = uuidv4() + } = options; + + console.log(`[Correlation: ${correlation_id}] Starting smartsend for subject: ${subject}`); + + // Process payloads + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + console.log(`[Correlation: ${correlation_id}] Serialized payload '${dataname}' (type: ${payloadType}) size: ${payloadSize} bytes`); + + if (payloadSize < size_threshold) { + // Direct path + const payloadB64 = bufferToBase64(payloadBytes); + console.log(`[Correlation: ${correlation_id}] Using direct transport for ${payloadSize} bytes`); + + payloads.push({ + id: uuidv4(), + dataname, + payload_type: payloadType, + transport: 'direct', + encoding: 'base64', + size: payloadSize, + data: payloadB64, + metadata: { payload_bytes: payloadSize } + }); + } else { + // Link path + console.log(`[Correlation: ${correlation_id}] Using link transport, uploading to fileserver`); + + const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); + + if (response.status !== 200) { + throw new Error(`Failed to upload data to fileserver: ${response.status}`); + } + + console.log(`[Correlation: ${correlation_id}] Uploaded to URL: ${response.url}`); + + payloads.push({ + id: uuidv4(), + dataname, + payload_type: payloadType, + transport: 'link', + encoding: 'none', + size: payloadSize, + data: response.url, + metadata: {} + }); + } + } + + // Build envelope + const env = { + correlation_id, + msg_id, + timestamp: new Date().toISOString(), + send_to: subject, + msg_purpose, + sender_name, + sender_id, + receiver_name, + receiver_id, + reply_to, + reply_to_msg_id, + broker_url, + metadata: {}, + payloads + }; + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} +``` + +#### serializeData Implementation + +```javascript +const arrow = require('apache-arrow'); + +async function serializeData(data, payload_type) { + if (payload_type === 'text') { + if (typeof data === 'string') { + return Buffer.from(data, 'utf8'); + } else { + throw new Error('Text data must be a string'); + } + } else if (payload_type === 'dictionary') { + const jsonStr = JSON.stringify(data); + return Buffer.from(jsonStr, 'utf8'); + } else if (payload_type === 'table') { + // Convert to Arrow IPC + const buffer = Buffer.alloc(1024 * 1024); // Pre-allocate buffer + const writer = new arrow.RecordBatchWriter([ + new arrow.Schema(Object.keys(data[0]).map(key => new arrow.Field(key, arrow.any()))) + ]); + + for (const row of data) { + const recordBatch = arrow.recordBatch.fromObjects([row], writer.schema); + writer.write(recordBatch); + } + await writer.close(); + + // Read from the underlying buffer + return buffer; + } else if (payload_type === 'image') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Image data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'audio') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Audio data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'video') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Video data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'binary') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Binary data must be Uint8Array or Buffer'); + } + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} + +function bufferToBase64(buffer) { + return buffer.toString('base64'); +} +``` + +#### deserializeData Implementation + +```javascript +const arrow = require('apache-arrow'); + +async function deserializeData(data, payload_type, correlation_id) { + if (payload_type === 'text') { + return Buffer.from(data).toString('utf8'); + } else if (payload_type === 'dictionary') { + const jsonStr = Buffer.from(data).toString('utf8'); + return JSON.parse(jsonStr); + } else if (payload_type === 'table') { + const buffer = Buffer.from(data); + const table = arrow.tableFromRawBytes(buffer); + return table; + } else if (payload_type === 'image') { + return Buffer.from(data); + } else if (payload_type === 'audio') { + return Buffer.from(data); + } else if (payload_type === 'video') { + return Buffer.from(data); + } else if (payload_type === 'binary') { + return Buffer.from(data); + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} +``` + +#### fetchWithBackoff Implementation + +```javascript +async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { + let delay = base_delay; + + for (let attempt = 1; attempt <= max_retries; attempt++) { + try { + const response = await fetch(url); + + if (response.status === 200) { + console.log(`[Correlation: ${correlation_id}] Successfully fetched data from ${url} on attempt ${attempt}`); + return await response.arrayBuffer(); + } else { + throw new Error(`Failed to fetch: ${response.status}`); + } + } catch (e) { + console.log(`[Correlation: ${correlation_id}] Attempt ${attempt} failed: ${e.constructor.name}`); + + if (attempt < max_retries) { + await new Promise(resolve => setTimeout(resolve, delay)); + delay = Math.min(delay * 2, max_delay); + } + } + } + + throw new Error(`Failed to fetch data after ${max_retries} attempts`); +} +``` + +#### plikOneshotUpload Implementation + +```javascript +async function plikOneshotUpload(file_server_url, dataname, data) { + // Get upload id + const url_getUploadID = `${file_server_url}/upload`; + const headers = { 'Content-Type': 'application/json' }; + const body = JSON.stringify({ OneShot: true }); + + const http_response = await fetch(url_getUploadID, { + method: 'POST', + headers, + body + }); + + const response_json = await http_response.json(); + const uploadid = response_json.id; + const uploadtoken = response_json.uploadToken; + + // Upload file + const url_upload = `${file_server_url}/file/${uploadid}`; + const form = new FormData(); + const blob = new Blob([data]); + form.append('file', blob, dataname); + + const upload_headers = { + 'X-UploadToken': uploadtoken + }; + + const upload_response = await fetch(url_upload, { + method: 'POST', + headers: upload_headers, + body: form + }); + + const upload_json = await upload_response.json(); + const fileid = upload_json.id; + + const url = `${file_server_url}/file/${uploadid}/${fileid}/${dataname}`; + + return { + status: upload_response.status, + uploadid, + fileid, + url + }; +} +``` + +--- + +### Python Implementation + +#### Module Structure + +```python +# natbridge.py +import asyncio +import base64 +import json +import uuid +import time +from typing import Any, Dict, List, Tuple, Union, Callable +from dataclasses import dataclass, field +from datetime import datetime + +try: + import pyarrow as arrow + import pyarrow.parquet as pq + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + +try: + import aiohttp + import nats + from nats.aio.client import Client as NATSClient + NATS_AVAILABLE = True +except ImportError: + NATS_AVAILABLE = False + + +DEFAULT_SIZE_THRESHOLD = 1_000_000 +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + + +@dataclass +class MsgPayloadV1: + """Message payload structure.""" + id: str + dataname: str + payload_type: str + transport: str + encoding: str + size: int + data: Union[str, bytes] + metadata: Dict[str, Any] = field(default_factory=dict) + + +@dataclass +class MsgEnvelopeV1: + """Message envelope structure.""" + correlation_id: str + msg_id: str + timestamp: str + send_to: str + msg_purpose: str + sender_name: str + sender_id: str + receiver_name: str + receiver_id: str + reply_to: str + reply_to_msg_id: str + broker_url: str + metadata: Dict[str, Any] = field(default_factory=dict) + payloads: List[MsgPayloadV1] = field(default_factory=list) + + +class NATSBridge: + """Cross-platform NATS bridge implementation.""" + + def __init__(self, broker_url: str = None, fileserver_url: str = None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_client: NATSClient = None + + async def smartsend(self, subject: str, data: List[Tuple[str, Any, str]], **kwargs) -> Tuple[Dict, str]: + """Send data via NATS.""" + pass + + async def smartreceive(self, msg: Any, **kwargs) -> Dict: + """Receive and process NATS message.""" + pass +``` + +#### smartsend Implementation + +```python +import asyncio +import base64 +import json +import uuid +from typing import Any, Dict, List, Tuple, Union, Callable +from datetime import datetime + +DEFAULT_SIZE_THRESHOLD = 1_000_000 +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + + +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """ + Send data via NATS with automatic transport selection. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options + + Returns: + Tuple of (env, env_json_str) + """ + if correlation_id is None: + correlation_id = str(uuid.uuid4()) + if msg_id is None: + msg_id = str(uuid.uuid4()) + if sender_id is None: + sender_id = str(uuid.uuid4()) + + print(f"[Correlation: {correlation_id}] Starting smartsend for subject: {subject}") + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = _serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + print(f"[Correlation: {correlation_id}] Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") + + if payload_size < size_threshold: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + print(f"[Correlation: {correlation_id}] Using direct transport for {payload_size} bytes") + + payloads.append({ + 'id': str(uuid.uuid4()), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64, + 'metadata': {'payload_bytes': payload_size} + }) + else: + # Link path + print(f"[Correlation: {correlation_id}] Using link transport, uploading to fileserver") + + response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response['status'] != 200: + raise Exception(f"Failed to upload data to fileserver: {response['status']}") + + print(f"[Correlation: {correlation_id}] Uploaded to URL: {response['url']}") + + payloads.append({ + 'id': str(uuid.uuid4()), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'], + 'metadata': {} + }) + + # Build envelope + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': datetime.utcnow().isoformat() + 'Z', + 'send_to': subject, + 'msg_purpose': msg_purpose, + 'sender_name': sender_name, + 'sender_id': sender_id, + 'receiver_name': receiver_name, + 'receiver_id': receiver_id, + 'reply_to': reply_to, + 'reply_to_msg_id': reply_to_msg_id, + 'broker_url': broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + if is_publish: + if nats_connection: + await publish_message(nats_connection, subject, env_json_str, correlation_id) + else: + await publish_message(broker_url, subject, env_json_str, correlation_id) + + return env, env_json_str +``` + +#### serializeData Implementation + +```python +import base64 +import json +from typing import Any + +try: + import pyarrow as arrow + import pyarrow.parquet as pq + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + + +def _serialize_data(data: Any, payload_type: str) -> bytes: + """Serialize data to bytes based on type.""" + if payload_type == 'text': + if isinstance(data, str): + return data.encode('utf-8') + else: + raise Error('Text data must be a string') + elif payload_type == 'dictionary': + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table serialization') + + # Convert DataFrame to Arrow + import io + buf = io.BytesIO() + import pandas as pd + if isinstance(data, pd.DataFrame): + table = arrow.Table.from_pandas(data) + sink = arrow.ipc.new_file(buf) + arrow.ipc.write_table(table, sink) + sink.close() + return buf.getvalue() + else: + raise Error('Table data must be a pandas DataFrame') + elif payload_type == 'image': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Image data must be bytes') + elif payload_type == 'audio': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Audio data must be bytes') + elif payload_type == 'video': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Video data must be bytes') + elif payload_type == 'binary': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Binary data must be bytes') + else: + raise Error(f'Unknown payload_type: {payload_type}') +``` + +#### deserializeData Implementation + +```python +import base64 +import json +from typing import Any + +try: + import pyarrow as arrow + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + + +def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: + """Deserialize bytes to data based on type.""" + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table deserialization') + + import io + buf = io.BytesIO(data) + reader = arrow.ipc.open_file(buf) + return reader.read_all().to_pandas() + elif payload_type == 'image': + return data + elif payload_type == 'audio': + return data + elif payload_type == 'video': + return data + elif payload_type == 'binary': + return data + else: + raise Error(f'Unknown payload_type: {payload_type}') +``` + +#### fetchWithBackoff Implementation + +```python +import asyncio +import aiohttp +from typing import Callable + + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """Fetch URL with exponential backoff.""" + delay = base_delay + + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + print(f"[Correlation: {correlation_id}] Successfully fetched data from {url} on attempt {attempt}") + return await response.read() + else: + raise Exception(f"Failed to fetch: {response.status}") + except Exception as e: + print(f"[Correlation: {correlation_id}] Attempt {attempt} failed: {type(e).__name__}") + + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + + raise Exception(f"Failed to fetch data after {max_retries} attempts") +``` + +#### plikOneshotUpload Implementation + +```python +import aiohttp +import json +from typing import Dict, Any + + +async def plik_oneshot_upload( + file_server_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """Upload data to plik server in one-shot mode.""" + + # Get upload id + async with aiohttp.ClientSession() as session: + url_getUploadID = f"{file_server_url}/upload" + headers = {'Content-Type': 'application/json'} + body = json.dumps({"OneShot": True}) + + async with session.post(url_getUploadID, headers=headers, data=body) as response: + response_json = await response.json() + uploadid = response_json['id'] + uploadtoken = response_json['uploadToken'] + + # Upload file + url_upload = f"{file_server_url}/file/{uploadid}" + headers = {'X-UploadToken': uploadtoken} + + form = aiohttp.FormData() + form.add_field('file', data, filename=dataname, content_type='application/octet-stream') + + async with session.post(url_upload, headers=headers, data=form) as upload_response: + upload_json = await upload_response.json() + fileid = upload_json['id'] + + url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" + + return { + 'status': upload_response.status, + 'uploadid': uploadid, + 'fileid': fileid, + 'url': url + } +``` + +--- + +## MicroPython Implementation + +### Limitations + +MicroPython has significant constraints compared to desktop implementations: + +| Feature | Desktop | MicroPython | +|---------|---------|-------------| +| Memory | Unlimited | ~256KB - 1MB | +| Arrow IPC | ✅ | ❌ (not supported) | +| Async/Await | ✅ | ⚠️ (uasyncio only) | +| Large payloads (>1MB) | ✅ | ❌ (enforced limit) | +| Table type | ✅ | ❌ | +| Multiple payloads | ✅ | ⚠️ (limited) | + +### MicroPython Module Structure + +```python +# natbridge_mpy.py (MicroPython) +import network +import time +import json +import base64 +import uos +import struct + +# Constants +DEFAULT_SIZE_THRESHOLD = 100000 # 100KB for MicroPython +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" +MAX_PAYLOAD_SIZE = 50000 # Hard limit + + +class NATSBridge: + """MicroPython NATS bridge implementation.""" + + def __init__(self, broker_url=None, fileserver_url=None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_conn = None + + def smartsend(self, subject, data, **kwargs): + """Send data (synchronous).""" + correlation_id = self._generate_uuid() + msg_id = self._generate_uuid() + sender_id = self._generate_uuid() + + print(f"[Correlation: {correlation_id}] Starting smartsend") + + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = self._serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + if payload_size > MAX_PAYLOAD_SIZE: + raise MemoryError(f"Payload {dataname} exceeds max size {MAX_PAYLOAD_SIZE}") + + if payload_size < DEFAULT_SIZE_THRESHOLD: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('ascii') + payloads.append({ + 'id': self._generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64 + }) + else: + # Link path (limited support) + response = self._sync_fileserver_upload(self.fileserver_url, dataname, payload_bytes) + payloads.append({ + 'id': self._generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'] + }) + + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), + 'send_to': subject, + 'msg_purpose': kwargs.get('msg_purpose', 'chat'), + 'sender_name': kwargs.get('sender_name', 'NATSBridge'), + 'sender_id': sender_id, + 'receiver_name': kwargs.get('receiver_name', ''), + 'receiver_id': kwargs.get('receiver_id', ''), + 'reply_to': kwargs.get('reply_to', ''), + 'reply_to_msg_id': kwargs.get('reply_to_msg_id', ''), + 'broker_url': self.broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + # Publish + self._publish(subject, env_json_str, correlation_id) + + return env, env_json_str + + def smartreceive(self, msg, **kwargs): + """Receive and process message (synchronous).""" + env_json_obj = json.loads(msg.payload) + correlation_id = env_json_obj['correlation_id'] + + payloads_list = [] + for payload in env_json_obj['payloads']: + transport = payload['transport'] + dataname = payload['dataname'] + + if transport == 'direct': + payload_b64 = payload['data'] + payload_bytes = base64.b64decode(payload_b64) + data_type = payload['payload_type'] + data = self._deserialize_data(payload_bytes, data_type) + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + url = payload['data'] + downloaded_data = self._sync_fileserver_download( + url, + kwargs.get('max_retries', 3), + kwargs.get('base_delay', 100), + kwargs.get('max_delay', 1000), + correlation_id + ) + data_type = payload['payload_type'] + data = self._deserialize_data(downloaded_data, data_type) + payloads_list.append((dataname, data, data_type)) + + env_json_obj['payloads'] = payloads_list + return env_json_obj + + def _serialize_data(self, data, payload_type): + """Serialize data (MicroPython version - no table support).""" + if payload_type == 'text': + return data.encode('utf-8') + elif payload_type == 'dictionary': + return json.dumps(data).encode('utf-8') + elif payload_type in ('image', 'audio', 'video', 'binary'): + return bytes(data) + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + + def _deserialize_data(self, data, payload_type): + """Deserialize data (MicroPython version).""" + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + return json.loads(data.decode('utf-8')) + elif payload_type in ('image', 'audio', 'video', 'binary'): + return data + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + + def _generate_uuid(self): + """Generate simple UUID (MicroPython compatible).""" + return 'mp-%04x%04x-%04x-%04x-%04x-%04x%04x%04x' % ( + time.time_ns() // (10**6) % 0xFFFFFFFF, + time.time_ns() % 0xFFFFFFFF, + time.time_ns() >> 32 & 0xFFFF, + time.time_ns() >> 48 & 0xFFFF, + time.time_ns() >> 64 & 0xFFFF, + time.time_ns() >> 80 & 0xFFFF, + time.time_ns() >> 96 & 0xFFFF, + time.time_ns() >> 112 & 0xFFFF + ) + + def _sync_fileserver_upload(self, url, dataname, data): + """Synchronous file upload (limited).""" + # Simplified implementation for MicroPython + # In practice, would use network.HTTP or similar + raise NotImplementedError("File upload not implemented in MicroPython") + + def _sync_fileserver_download(self, url, max_retries, base_delay, max_delay, correlation_id): + """Synchronous file download with backoff.""" + # Simplified implementation for MicroPython + raise NotImplementedError("File download not implemented in MicroPython") + + def _publish(self, subject, message, correlation_id): + """Publish message to NATS.""" + # Simplified implementation for MicroPython + raise NotImplementedError("NATS publishing not implemented in MicroPython") +``` + +--- + +## Configuration + +### Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `NATS_URL` | `nats://localhost:4222` | NATS server URL | +| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | +| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | + +### MicroPython Configuration + +```python +# micropython.conf +NATS_URL = "nats://broker.local:4222" +FILESERVER_URL = "http://fileserver.local:8080" +SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices +MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython +``` + +--- + +## Performance Considerations + +### Zero-Copy Reading + +| Platform | Strategy | +|----------|----------| +| **Julia** | `Arrow.read()` with memory-mapped files | +| **JavaScript** | `ArrayBuffer` with `DataView` | +| **Python** | `pyarrow` memory mapping | +| **MicroPython** | Not available (streaming only) | + +### Exponential Backoff + +All platforms implement exponential backoff for HTTP downloads: + +```python +# Python +async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): + delay = base_delay + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.read() + except Exception as e: + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + raise Exception("Failed to fetch after max retries") +``` + +### Correlation ID Logging + +All platforms use correlation IDs for distributed tracing: + +``` +[timestamp] [Correlation: abc123] Message published to subject +``` + +--- + +## Testing + +### Test File Organization + +| Platform | Sender Tests | Receiver Tests | +|----------|--------------|----------------| +| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | +| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | +| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | + +### Run Tests + +```bash +# Julia +julia test/test_julia_text_sender.jl +julia test/test_julia_text_receiver.jl + +# JavaScript (Node.js) +node test/test_js_text_sender.js +node test/test_js_text_receiver.js + +# Python +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py +``` + +--- + +## Troubleshooting + +### Common Issues + +1. **NATS Connection Failed** + - Ensure NATS server is running + - Check `broker_url` configuration + +2. **HTTP Upload Failed** + - Ensure file server is running + - Check `fileserver_url` configuration + - Verify upload permissions + +3. **Arrow IPC Deserialization Error** + - Ensure data is properly serialized to Arrow format + - Check Arrow version compatibility + - MicroPython doesn't support Arrow IPC + +4. **Memory Constraints (MicroPython)** + - Reduce `size_threshold` + - Use direct transport only (< 100KB) + - Avoid large payloads + +--- + +## Summary + +This cross-platform NATS bridge provides: + +1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across all platforms +2. **Idiomatic Implementations**: + - **Julia**: Multiple dispatch, struct-based design, native Arrow IPC + - **JavaScript**: Async/await, prototype-based utilities, class-based NATS client + - **Python**: Class-based design with dataclasses, type hints, async/await + - **MicroPython**: Synchronous API, memory-constrained optimizations +3. **Message Format Consistency**: Identical JSON schemas across all platforms +4. **Handler Abstraction**: File server operations abstracted through configurable handlers +5. **Platform-Specific Optimizations**: Arrow IPC in desktop platforms, streaming support in MicroPython + +The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. \ No newline at end of file diff --git a/src/natbridge.js b/src/natbridge.js new file mode 100644 index 0000000..eef2ab3 --- /dev/null +++ b/src/natbridge.js @@ -0,0 +1,719 @@ +/** + * NATSBridge - Cross-Platform Bi-Directional Data Bridge + * JavaScript Implementation (Node.js and Browser) + * + * This module provides functionality for sending and receiving data across network boundaries + * using NATS as the message bus, with support for both direct payload transport and + * URL-based transport for larger payloads. + * + * File Server Handler Architecture: + * The system uses handler functions to abstract file server operations, allowing support + * for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). + * + * Handler Function Signatures: + * + * ```javascript + * // Upload handler - uploads data to file server and returns URL + * // The handler is passed to smartsend as fileserver_upload_handler parameter + * // It receives: (fileserver_url, dataname, data) + * // Returns: Promise<{ status, uploadid, fileid, url }> + * fileserver_upload_handler(fileserver_url, dataname, data) + * + * // Download handler - fetches data from file server URL with exponential backoff + * // The handler is passed to smartreceive as fileserver_download_handler parameter + * // It receives: (url, max_retries, base_delay, max_delay, correlation_id) + * // Returns: Promise + * fileserver_download_handler(url, max_retries, base_delay, max_delay, correlation_id) + * ``` + * + * Multi-Payload Support (Standard API): + * The system uses a standardized list-of-tuples format for all payload operations. + * Even when sending a single payload, the user must wrap it in a list. + * + * API Standard: + * + * ```javascript + * // Input format for smartsend (always a list of tuples with type info) + * [[dataname1, data1, type1], [dataname2, data2, type2], ...] + * + * // Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) + * { + * "correlation_id": "...", + * "msg_id": "...", + * "timestamp": "...", + * "send_to": "...", + * "msg_purpose": "...", + * "sender_name": "...", + * "sender_id": "...", + * "receiver_name": "...", + * "receiver_id": "...", + * "reply_to": "...", + * "reply_to_msg_id": "...", + * "broker_url": "...", + * "metadata": {...}, + * "payloads": [[dataname1, data1, type1], [dataname2, data2, type2], ...] + * } + * ``` + * + * Supported types: "text", "dictionary", "table", "image", "audio", "video", "binary" + */ + +const nats = typeof require !== 'undefined' ? require('nats') : null; +const { v4: uuidv4 } = typeof require !== 'undefined' ? require('uuid') : null; +const fetch = typeof require !== 'undefined' ? require('node-fetch') : (typeof globalThis !== 'undefined' ? globalThis.fetch : undefined); +const arrow = typeof require !== 'undefined' ? require('apache-arrow') : null; + +/** + * Default configuration values + */ +const DEFAULT_SIZE_THRESHOLD = 1_000_000; // 1MB - threshold for switching from direct to link transport +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; // Default NATS server URL +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; // Default HTTP file server URL + +/** + * Generate a UUID v4 + * @returns {string} UUID string + */ +function generateUUID() { + if (uuidv4) { + return uuidv4(); + } + // Fallback UUID generation for environments without uuid package + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + +/** + * Log a trace message with correlation ID and timestamp + * @param {string} correlation_id - Correlation ID for tracing + * @param {string} message - Message content to log + */ +function logTrace(correlation_id, message) { + const timestamp = new Date().toISOString(); + console.log(`[${timestamp}] [Correlation: ${correlation_id}] ${message}`); +} + +/** + * Serialize data according to specified format + * @param {any} data - Data to serialize + * @param {string} payload_type - Target format: "text", "dictionary", "table", "image", "audio", "video", "binary" + * @returns {Promise} Binary representation of the serialized data + */ +async function serializeData(data, payload_type) { + if (payload_type === 'text') { + if (typeof data === 'string') { + return new TextEncoder().encode(data); + } else { + throw new Error('Text data must be a string'); + } + } else if (payload_type === 'dictionary') { + const jsonStr = JSON.stringify(data); + return new TextEncoder().encode(jsonStr); + } else if (payload_type === 'table') { + // Use Apache Arrow for table serialization + if (!arrow) { + throw new Error('apache-arrow not available. Install with: npm install apache-arrow'); + } + + // Convert array of objects to Arrow Table + if (!Array.isArray(data)) { + throw new Error('Table data must be an array of objects'); + } + + // Build schema from first row if not provided + const schemaFields = []; + if (data.length > 0) { + for (const key in data[0]) { + const value = data[0][key]; + let arrowType; + if (typeof value === 'number') { + arrowType = arrow.float64; + } else if (typeof value === 'boolean') { + arrowType = arrow.bool; + } else if (value instanceof Date) { + arrowType = arrow.string; // Date as string + } else { + arrowType = arrow.string; + } + schemaFields.push(new arrow.Field(key, arrowType)); + } + } + + const schema = new arrow.Schema(schemaFields); + + // Convert data to Arrow RecordBatch + const arrays = {}; + for (const field of schema.fields) { + const name = field.name; + const type = field.type; + + if (type instanceof arrow.Float64) { + arrays[name] = new arrow.Float64Array(data.length); + for (let i = 0; i < data.length; i++) { + arrays[name][i] = data[i][name] || 0; + } + } else if (type instanceof arrow.Boolean) { + arrays[name] = new arrow.BooleanArray(data.length); + for (let i = 0; i < data.length; i++) { + arrays[name][i] = data[i][name] || false; + } + } else { + // String type + const values = data.map(row => String(row[name] ?? '')); + const offsets = new Int32Array(values.length + 1); + let offset = 0; + for (let i = 0; i < values.length; i++) { + offsets[i + 1] = offset += values[i].length; + } + const buffer = new Uint8Array(offsets[values.length]); + for (let i = 0; i < values.length; i++) { + const encoder = new TextEncoder(); + const bytes = encoder.encode(values[i]); + buffer.set(bytes, offsets[i]); + } + arrays[name] = new arrow.StringArray( + new arrow.DataView(new arrow.Buffer(buffer), 0, offsets[values.length]), + new arrow.Buffer(offsets.buffer, 0, offsets.length * 4), + 0, + data.length + ); + } + } + + const recordBatch = arrow.RecordBatch.fromArrays(schema, arrays, data.length); + + // Write to IPC format + const buffer = arrow.tableFromBatches([recordBatch]).toBuffer(); + return new Uint8Array(buffer); + } else if (payload_type === 'image') { + if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { + return data instanceof Uint8Array ? data : new Uint8Array(data); + } else { + throw new Error('Image data must be Uint8Array or ArrayBuffer'); + } + } else if (payload_type === 'audio') { + if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { + return data instanceof Uint8Array ? data : new Uint8Array(data); + } else { + throw new Error('Audio data must be Uint8Array or ArrayBuffer'); + } + } else if (payload_type === 'video') { + if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { + return data instanceof Uint8Array ? data : new Uint8Array(data); + } else { + throw new Error('Video data must be Uint8Array or ArrayBuffer'); + } + } else if (payload_type === 'binary') { + if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { + return data instanceof Uint8Array ? data : new Uint8Array(data); + } else { + throw new Error('Binary data must be Uint8Array or ArrayBuffer'); + } + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} + +/** + * Deserialize bytes to data based on type + * @param {Uint8Array} data - Serialized data as bytes + * @param {string} payload_type - Data type + * @param {string} correlation_id - Correlation ID for logging + * @returns {Promise} Deserialized data + */ +async function deserializeData(data, payload_type, correlation_id) { + if (payload_type === 'text') { + return new TextDecoder().decode(data); + } else if (payload_type === 'dictionary') { + const jsonStr = new TextDecoder().decode(data); + return JSON.parse(jsonStr); + } else if (payload_type === 'table') { + // Use Apache Arrow for table deserialization + if (!arrow) { + throw new Error('apache-arrow not available. Install with: npm install apache-arrow'); + } + + // Read Arrow IPC format + const buffer = arrow.Buffer.wrap(data.buffer, data.byteOffset, data.byteLength); + const table = arrow.tableFromRawBytes(buffer); + + // Convert to array of objects for consistency with the API + const result = []; + const numRows = table.numRows; + + for (let i = 0; i < numRows; i++) { + const row = {}; + for (const colName of table.columnNames) { + const column = table.getColumn(colName); + row[colName] = column.get(i); + } + result.push(row); + } + + return result; + } else if (payload_type === 'image') { + return data; + } else if (payload_type === 'audio') { + return data; + } else if (payload_type === 'video') { + return data; + } else if (payload_type === 'binary') { + return data; + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} + +/** + * Fetch data from URL with exponential backoff + * @param {string} url - URL to fetch from + * @param {number} max_retries - Maximum retry attempts + * @param {number} base_delay - Initial delay in milliseconds + * @param {number} max_delay - Maximum delay in milliseconds + * @param {string} correlation_id - Correlation ID for logging + * @returns {Promise} Fetched data as bytes + */ +async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { + let delay = base_delay; + + for (let attempt = 1; attempt <= max_retries; attempt++) { + try { + const response = await fetch(url); + + if (response.status === 200) { + logTrace(correlation_id, `Successfully fetched data from ${url} on attempt ${attempt}`); + const arrayBuffer = await response.arrayBuffer(); + return new Uint8Array(arrayBuffer); + } else { + throw new Error(`Failed to fetch: ${response.status}`); + } + } catch (e) { + logTrace(correlation_id, `Attempt ${attempt} failed: ${e.constructor.name}`); + + if (attempt < max_retries) { + await new Promise(resolve => setTimeout(resolve, delay)); + delay = Math.min(delay * 2, max_delay); + } + } + } + + throw new Error(`Failed to fetch data after ${max_retries} attempts`); +} + +/** + * Upload a single file to a plik server using one-shot mode + * @param {string} file_server_url - Base URL of the plik server + * @param {string} dataname - Name of the file being uploaded + * @param {Uint8Array} data - Raw byte data of the file content + * @returns {Promise<{ status, uploadid, fileid, url }>} Upload result + */ +async function plikOneshotUpload(file_server_url, dataname, data) { + // Get upload id + const url_getUploadID = `${file_server_url}/upload`; + const headers = { 'Content-Type': 'application/json' }; + const body = JSON.stringify({ OneShot: true }); + + const http_response = await fetch(url_getUploadID, { + method: 'POST', + headers, + body + }); + + const response_json = await http_response.json(); + const uploadid = response_json.id; + const uploadtoken = response_json.uploadToken; + + // Upload file + const url_upload = `${file_server_url}/file/${uploadid}`; + const form = new FormData(); + const blob = new Blob([data]); + form.append('file', blob, dataname); + + const upload_headers = { + 'X-UploadToken': uploadtoken + }; + + const upload_response = await fetch(url_upload, { + method: 'POST', + headers: upload_headers, + body: form + }); + + const upload_json = await upload_response.json(); + const fileid = upload_json.id; + + const url = `${file_server_url}/file/${uploadid}/${fileid}/${dataname}`; + + return { + status: upload_response.status, + uploadid, + fileid, + url + }; +} + +/** + * Publish message to NATS + * @param {string|object} broker_url_or_conn - NATS server URL or pre-existing connection + * @param {string} subject - NATS subject to publish to + * @param {string} message - JSON message to publish + * @param {string} correlation_id - Correlation ID for tracing and logging + */ +async function publishMessage(broker_url_or_conn, subject, message, correlation_id) { + if (broker_url_or_conn instanceof Object && broker_url_or_conn.publish) { + // Pre-existing connection + try { + await broker_url_or_conn.publish(subject, message); + logTrace(correlation_id, `Message published to ${subject}`); + } finally { + // Note: In a real implementation, you might want to drain/close the connection + } + } else { + // URL-based - create new connection + if (!nats) { + throw new Error('nats package not available. Install with: npm install nats'); + } + + const conn = await nats.connect(broker_url_or_conn); + try { + await conn.publish(subject, message); + logTrace(correlation_id, `Message published to ${subject}`); + } finally { + conn.close(); + } + } +} + +/** + * Build message envelope from payloads and metadata + * @param {string} subject - NATS subject + * @param {Array} payloads - Array of payload objects + * @param {Object} options - Envelope options + * @returns {Object} Message envelope + */ +function buildEnvelope(subject, payloads, options) { + return { + correlation_id: options.correlation_id || generateUUID(), + msg_id: options.msg_id || generateUUID(), + timestamp: new Date().toISOString(), + send_to: subject, + msg_purpose: options.msg_purpose || '', + sender_name: options.sender_name || '', + sender_id: options.sender_id || generateUUID(), + receiver_name: options.receiver_name || '', + receiver_id: options.receiver_id || '', + reply_to: options.reply_to || '', + reply_to_msg_id: options.reply_to_msg_id || '', + broker_url: options.broker_url || DEFAULT_BROKER_URL, + metadata: options.metadata || {}, + payloads + }; +} + +/** + * Convert data to base64 string + * @param {Uint8Array} buffer - Data buffer + * @returns {string} Base64 encoded string + */ +function bufferToBase64(buffer) { + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(buffer)) { + return buffer.toString('base64'); + } + + // For browser/Node Uint8Array + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); +} + +/** + * Convert base64 string to Uint8Array + * @param {string} base64 - Base64 encoded string + * @returns {Uint8Array} Decoded bytes + */ +function base64ToBuffer(base64) { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; +} + +/** + * smartsend - Send data either directly via NATS or via a fileserver URL, depending on payload size + * + * This function intelligently routes data delivery based on payload size relative to a threshold. + * If the serialized payload is smaller than size_threshold, it encodes the data as Base64 and publishes directly over NATS. + * Otherwise, it uploads the data to a fileserver and publishes only the download URL over NATS. + * + * @param {string} subject - NATS subject to publish the message to + * @param {Array} data - Array of [dataname, data, type] tuples to send + * @param {Object} options - Optional configuration + * @param {string} [options.broker_url=DEFAULT_BROKER_URL] - URL of the NATS server + * @param {string} [options.fileserver_url=DEFAULT_FILESERVER_URL] - URL of the HTTP file server for large payloads + * @param {Function} [options.fileserver_upload_handler=plikOneshotUpload] - Function to handle fileserver uploads + * @param {number} [options.size_threshold=DEFAULT_SIZE_THRESHOLD] - Threshold in bytes separating direct vs link transport + * @param {string} [options.correlation_id] - Correlation ID for tracing (auto-generated if not provided) + * @param {string} [options.msg_purpose="chat"] - Purpose of the message + * @param {string} [options.sender_name="NATSBridge"] - Name of the sender + * @param {string} [options.receiver_name=""] - Name of the receiver + * @param {string} [options.receiver_id=""] - UUID of the receiver + * @param {string} [options.reply_to=""] - Topic to reply to + * @param {string} [options.reply_to_msg_id=""] - Message ID this message is replying to + * @param {boolean} [options.is_publish=true] - Whether to automatically publish the message to NATS + * @param {object} [options.nats_connection] - Pre-existing NATS connection + * @param {string} [options.msg_id] - Message ID (auto-generated if not provided) + * @param {string} [options.sender_id] - Sender ID (auto-generated if not provided) + * @returns {Promise<[Object, string]>} Promise resolving to [envelope, env_json_str] + */ +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = generateUUID(), + msg_purpose = 'chat', + sender_name = 'NATSBridge', + receiver_name = '', + receiver_id = '', + reply_to = '', + reply_to_msg_id = '', + is_publish = true, + nats_connection = null, + msg_id = generateUUID(), + sender_id = generateUUID() + } = options; + + logTrace(correlation_id, `Starting smartsend for subject: ${subject}`); + + // Process each payload in the list + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + logTrace(correlation_id, `Serialized payload '${dataname}' (payload_type: ${payloadType}) size: ${payloadSize} bytes`); + + // Decision: Direct vs Link + if (payloadSize < size_threshold) { + // Direct path - Base64 encode and send via NATS + const payloadB64 = bufferToBase64(payloadBytes); + logTrace(correlation_id, `Using direct transport for ${payloadSize} bytes`); + + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: 'direct', + encoding: 'base64', + size: payloadSize, + data: payloadB64, + metadata: { payload_bytes: payloadSize } + }); + } else { + // Link path - Upload to HTTP server, send URL via NATS + logTrace(correlation_id, 'Using link transport, uploading to fileserver'); + + const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); + + if (response.status !== 200) { + throw new Error(`Failed to upload data to fileserver: ${response.status}`); + } + + logTrace(correlation_id, `Uploaded to URL: ${response.url}`); + + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: 'link', + encoding: 'none', + size: payloadSize, + data: response.url, + metadata: {} + }); + } + } + + // Build envelope + const env = buildEnvelope(subject, payloads, { + correlation_id, + msg_id, + msg_purpose, + sender_name, + sender_id, + receiver_name, + receiver_id, + reply_to, + reply_to_msg_id, + broker_url + }); + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} + +/** + * smartreceive - Receive and process messages from NATS + * + * This function processes incoming NATS messages, handling both direct transport + * (base64 decoded payloads) and link transport (URL-based payloads). + * It deserializes the data based on the transport type and returns the result. + * + * @param {Object} msg - NATS message object + * @param {Object} options - Optional configuration + * @param {Function} [options.fileserver_download_handler=fetchWithBackoff] - Function to handle downloading data from file server URLs + * @param {number} [options.max_retries=5] - Maximum retry attempts for fetching URL + * @param {number} [options.base_delay=100] - Initial delay for exponential backoff in ms + * @param {number} [options.max_delay=5000] - Maximum delay for exponential backoff in ms + * @returns {Promise} Promise resolving to envelope object with deserialized payloads + */ +async function smartreceive(msg, options = {}) { + const { + fileserver_download_handler = fetchWithBackoff, + max_retries = 5, + base_delay = 100, + max_delay = 5000 + } = options; + + // Parse the JSON envelope + const payload = typeof msg.payload === 'string' ? msg.payload : new TextDecoder().decode(msg.payload); + const env_json_obj = JSON.parse(payload); + + logTrace(env_json_obj.correlation_id, 'Processing received message'); + + // Process all payloads in the envelope + const payloads_list = []; + + for (const payload of env_json_obj.payloads) { + const transport = payload.transport; + const dataname = payload.dataname; + + if (transport === 'direct') { + logTrace(env_json_obj.correlation_id, `Direct transport - decoding payload '${dataname}'`); + + // Extract base64 payload from the payload + const payload_b64 = payload.data; + + // Decode Base64 payload + const payload_bytes = base64ToBuffer(payload_b64); + + // Deserialize based on type + const data_type = payload.payload_type; + const data = await deserializeData(payload_bytes, data_type, env_json_obj.correlation_id); + + payloads_list.push([dataname, data, data_type]); + } else if (transport === 'link') { + // Extract download URL from the payload + const url = payload.data; + logTrace(env_json_obj.correlation_id, `Link transport - fetching '${dataname}' from URL: ${url}`); + + // Fetch with exponential backoff using the download handler + const downloaded_data = await fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + env_json_obj.correlation_id + ); + + // Deserialize based on type + const data_type = payload.payload_type; + const data = await deserializeData(downloaded_data, data_type, env_json_obj.correlation_id); + + payloads_list.push([dataname, data, data_type]); + } else { + throw new Error(`Unknown transport type for payload '${dataname}': ${transport}`); + } + } + + env_json_obj.payloads = payloads_list; + return env_json_obj; +} + +/** + * NATS Client wrapper for managing connections + */ +class NATSClient { + constructor(url) { + this.url = url; + this.connection = null; + } + + async connect() { + if (!nats) { + throw new Error('nats package not available. Install with: npm install nats'); + } + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + async publish(subject, message) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + } + + async close() { + if (this.connection) { + this.connection.close(); + } + } +} + +// Export for Node.js +if (typeof module !== 'undefined' && module.exports) { + module.exports = { + NATSClient, + smartsend, + smartreceive, + plikOneshotUpload, + fetchWithBackoff, + serializeData, + deserializeData, + publishMessage, + logTrace, + generateUUID, + DEFAULT_SIZE_THRESHOLD, + DEFAULT_BROKER_URL, + DEFAULT_FILESERVER_URL + }; +} + +// Export for browser (global scope) +if (typeof window !== 'undefined') { + window.NATSBridge = { + smartsend, + smartreceive, + plikOneshotUpload, + fetchWithBackoff, + serializeData, + deserializeData, + publishMessage, + logTrace, + generateUUID, + NATSClient, + DEFAULT_SIZE_THRESHOLD, + DEFAULT_BROKER_URL, + DEFAULT_FILESERVER_URL + }; +} \ No newline at end of file diff --git a/src/natbridge.py b/src/natbridge.py new file mode 100644 index 0000000..45a7e35 --- /dev/null +++ b/src/natbridge.py @@ -0,0 +1,784 @@ +""" +NATSBridge - Cross-Platform Bi-Directional Data Bridge +Python Implementation (Desktop Python) + +This module provides functionality for sending and receiving data across network boundaries +using NATS as the message bus, with support for both direct payload transport and +URL-based transport for larger payloads. + +File Server Handler Architecture: +The system uses handler functions to abstract file server operations, allowing support +for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). + +Handler Function Signatures: + +```python +# Upload handler - uploads data to file server and returns URL +# The handler is passed to smartsend as fileserver_upload_handler parameter +# It receives: (fileserver_url, dataname, data) +# Returns: Coroutine[Dict[str, Any]] +async def fileserver_upload_handler(fileserver_url, dataname, data) + +# Download handler - fetches data from file server URL with exponential backoff +# The handler is passed to smartreceive as fileserver_download_handler parameter +# It receives: (url, max_retries, base_delay, max_delay, correlation_id) +# Returns: Coroutine[bytes] +async def fileserver_download_handler(url, max_retries, base_delay, max_delay, correlation_id) +``` + +Multi-Payload Support (Standard API): +The system uses a standardized list-of-tuples format for all payload operations. +Even when sending a single payload, the user must wrap it in a list. + +API Standard: + +```python +# Input format for smartsend (always a list of tuples with type info) +[(dataname1, data1, type1), (dataname2, data2, type2), ...] + +# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + +Supported types: "text", "dictionary", "table", "image", "audio", "video", "binary" +""" + +import asyncio +import base64 +import json +import uuid +import time +from typing import Any, Callable, Dict, List, Tuple, Union +from dataclasses import dataclass, field +from datetime import datetime + +# Optional dependencies +try: + import aiohttp + AIOHTTP_AVAILABLE = True +except ImportError: + AIOHTTP_AVAILABLE = False + +try: + import pyarrow as arrow + import pyarrow.parquet as pq + import pandas as pd + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + +try: + import nats + from nats.aio.client import Client as NATSClient + NATS_AVAILABLE = True +except ImportError: + NATS_AVAILABLE = False + + +# ============================================================================ +# Constants +# ============================================================================ + +DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB - threshold for switching from direct to link transport +DEFAULT_BROKER_URL = "nats://localhost:4222" # Default NATS server URL +DEFAULT_FILESERVER_URL = "http://localhost:8080" # Default HTTP file server URL + + +# ============================================================================ +# Data Classes +# ============================================================================ + +@dataclass +class MsgPayloadV1: + """Message payload structure.""" + id: str + dataname: str + payload_type: str + transport: str + encoding: str + size: int + data: Union[str, bytes] # URL for link, base64 for direct + metadata: Dict[str, Any] = field(default_factory=dict) + + +@dataclass +class MsgEnvelopeV1: + """Message envelope structure.""" + correlation_id: str + msg_id: str + timestamp: str + send_to: str + msg_purpose: str + sender_name: str + sender_id: str + receiver_name: str + receiver_id: str + reply_to: str + reply_to_msg_id: str + broker_url: str + metadata: Dict[str, Any] = field(default_factory=dict) + payloads: List[MsgPayloadV1] = field(default_factory=list) + + +# ============================================================================ +# Utility Functions +# ============================================================================ + +def log_trace(correlation_id: str, message: str) -> None: + """Log a trace message with correlation ID and timestamp.""" + timestamp = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' + print(f"[{timestamp}] [Correlation: {correlation_id}] {message}") + + +def generate_uuid() -> str: + """Generate a UUID v4 string.""" + return str(uuid.uuid4()) + + +# ============================================================================ +# Serialization Functions +# ============================================================================ + +def _serialize_data(data: Any, payload_type: str) -> bytes: + """ + Serialize data according to specified format. + + Args: + data: Data to serialize + payload_type: Target format: "text", "dictionary", "table", "image", "audio", "video", "binary" + + Returns: + Binary representation of the serialized data + + Raises: + Error: If data type doesn't match payload_type + """ + if payload_type == 'text': + if isinstance(data, str): + return data.encode('utf-8') + else: + raise Error('Text data must be a string') + elif payload_type == 'dictionary': + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table serialization. Install with: pip install pyarrow pandas') + + # Convert DataFrame to Arrow IPC + import io + buf = io.BytesIO() + + if isinstance(data, pd.DataFrame): + table = arrow.Table.from_pandas(data) + sink = arrow.ipc.new_file(buf) + arrow.ipc.write_table(table, sink) + sink.close() + return buf.getvalue() + else: + raise Error('Table data must be a pandas DataFrame') + elif payload_type == 'image': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Image data must be bytes') + elif payload_type == 'audio': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Audio data must be bytes') + elif payload_type == 'video': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Video data must be bytes') + elif payload_type == 'binary': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Binary data must be bytes') + else: + raise Error(f'Unknown payload_type: {payload_type}') + + +def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: + """ + Deserialize bytes to data based on type. + + Args: + data: Serialized data as bytes + payload_type: Data type + correlation_id: Correlation ID for logging + + Returns: + Deserialized data + """ + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table deserialization') + + import io + buf = io.BytesIO(data) + reader = arrow.ipc.open_file(buf) + return reader.read_all().to_pandas() + elif payload_type == 'image': + return data + elif payload_type == 'audio': + return data + elif payload_type == 'video': + return data + elif payload_type == 'binary': + return data + else: + raise Error(f'Unknown payload_type: {payload_type}') + + +# ============================================================================ +# File Server Handlers +# ============================================================================ + +async def plik_oneshot_upload( + file_server_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload a single file to a plik server using one-shot mode. + + Args: + file_server_url: Base URL of the plik server + dataname: Name of the file being uploaded + data: Raw byte data of the file content + + Returns: + Dict with keys: 'status', 'uploadid', 'fileid', 'url' + """ + if not AIOHTTP_AVAILABLE: + raise Error('aiohttp not available. Install with: pip install aiohttp') + + async with aiohttp.ClientSession() as session: + # Get upload id + url_getUploadID = f"{file_server_url}/upload" + headers = {'Content-Type': 'application/json'} + body = json.dumps({"OneShot": True}) + + async with session.post(url_getUploadID, headers=headers, data=body) as response: + response_json = await response.json() + uploadid = response_json['id'] + uploadtoken = response_json['uploadToken'] + + # Upload file + url_upload = f"{file_server_url}/file/{uploadid}" + headers = {'X-UploadToken': uploadtoken} + + form = aiohttp.FormData() + form.add_field('file', data, filename=dataname, content_type='application/octet-stream') + + async with session.post(url_upload, headers=headers, data=form) as upload_response: + upload_json = await upload_response.json() + fileid = upload_json['id'] + + url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" + + return { + 'status': upload_response.status, + 'uploadid': uploadid, + 'fileid': fileid, + 'url': url + } + + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Fetch data from URL with exponential backoff. + + Args: + url: URL to fetch from + max_retries: Maximum retry attempts + base_delay: Initial delay in milliseconds + max_delay: Maximum delay in milliseconds + correlation_id: Correlation ID for logging + + Returns: + Fetched data as bytes + + Raises: + Error: If all retry attempts fail + """ + if not AIOHTTP_AVAILABLE: + raise Error('aiohttp not available. Install with: pip install aiohttp') + + delay = base_delay + + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + log_trace(correlation_id, f"Successfully fetched data from {url} on attempt {attempt}") + return await response.read() + else: + raise Error(f"Failed to fetch: {response.status}") + except Exception as e: + log_trace(correlation_id, f"Attempt {attempt} failed: {type(e).__name__}") + + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + + raise Error(f"Failed to fetch data after {max_retries} attempts") + + +# ============================================================================ +# NATS Publishing +# ============================================================================ + +async def publish_message( + broker_url_or_conn: Union[str, NATSClient], + subject: str, + message: str, + correlation_id: str, + nats_connection: NATSClient = None +) -> None: + """ + Publish message to NATS. + + Args: + broker_url_or_conn: NATS server URL or pre-existing connection + subject: NATS subject to publish to + message: JSON message to publish + correlation_id: Correlation ID for tracing and logging + nats_connection: Optional pre-existing NATS connection + """ + if nats_connection: + # Use provided connection + try: + await nats_connection.publish(subject, message) + log_trace(correlation_id, f"Message published to {subject}") + finally: + # Note: In a real implementation, you might want to drain/close the connection + pass + elif isinstance(broker_url_or_conn, str): + # URL-based - create new connection + if not NATS_AVAILABLE: + raise Error('nats-py not available. Install with: pip install nats-py') + + conn = await nats.connect(broker_url_or_conn) + try: + await conn.publish(subject, message) + log_trace(correlation_id, f"Message published to {subject}") + finally: + await conn.drain() + else: + raise Error('Invalid broker_url_or_conn type') + + +# ============================================================================ +# Core Functions +# ============================================================================ + +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: NATSClient = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """ + Send data via NATS with automatic transport selection. + + This function intelligently routes data delivery based on payload size relative to a threshold. + If the serialized payload is smaller than size_threshold, it encodes the data as Base64 + and publishes directly over NATS. Otherwise, it uploads the data to a fileserver + and publishes only the download URL over NATS. + + Args: + subject: NATS subject to publish the message to + data: List of (dataname, data, type) tuples + broker_url: URL of the NATS server + fileserver_url: URL of the HTTP file server for large payloads + fileserver_upload_handler: Function to handle fileserver uploads + size_threshold: Threshold in bytes separating direct vs link transport + correlation_id: Correlation ID for tracing (auto-generated if not provided) + msg_purpose: Purpose of the message + sender_name: Name of the sender + receiver_name: Name of the receiver + receiver_id: UUID of the receiver + reply_to: Topic to reply to + reply_to_msg_id: Message ID this message is replying to + is_publish: Whether to automatically publish the message to NATS + nats_connection: Pre-existing NATS connection (if provided, uses this instead of creating a new one) + msg_id: Message ID (auto-generated if not provided) + sender_id: Sender ID (auto-generated if not provided) + + Returns: + Tuple of (env, env_json_str) where: + - env: Dict with all metadata and payloads + - env_json_str: JSON string for publishing to NATS + + Example: + ```python + # Send a single payload (still wrapped in a list) + config = {"key": "value"} + env, env_json_str = await smartsend( + "my.subject", + [("config", config, "dictionary")], + broker_url="nats://localhost:4222" + ) + + # Send multiple payloads in one message with different types + data1 = {"key1": "value1"} + data2 = [1, 2, 3, 4, 5] + env, env_json_str = await smartsend( + "my.subject", + [("data1", data1, "dictionary"), ("data2", data2, "table")] + ) + + # Mixed content (e.g., chat with text and image) + env, env_json_str = await smartsend( + "chat.subject", + [ + ("message_text", "Hello!", "text"), + ("user_image", image_bytes, "image"), + ("audio_clip", audio_bytes, "audio") + ] + ) + ``` + """ + if correlation_id is None: + correlation_id = generate_uuid() + if msg_id is None: + msg_id = generate_uuid() + if sender_id is None: + sender_id = generate_uuid() + + log_trace(correlation_id, f"Starting smartsend for subject: {subject}") + + # Process each payload in the list + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = _serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + log_trace(correlation_id, f"Serialized payload '{dataname}' (payload_type: {payload_type}) size: {payload_size} bytes") + + # Decision: Direct vs Link + if payload_size < size_threshold: + # Direct path - Base64 encode and send via NATS + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + log_trace(correlation_id, f"Using direct transport for {payload_size} bytes") + + payloads.append({ + 'id': generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64, + 'metadata': {'payload_bytes': payload_size} + }) + else: + # Link path - Upload to HTTP server, send URL via NATS + log_trace(correlation_id, "Using link transport, uploading to fileserver") + + response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response['status'] != 200: + raise Error(f"Failed to upload data to fileserver: {response['status']}") + + log_trace(correlation_id, f"Uploaded to URL: {response['url']}") + + payloads.append({ + 'id': generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'], + 'metadata': {} + }) + + # Build envelope + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z', + 'send_to': subject, + 'msg_purpose': msg_purpose, + 'sender_name': sender_name, + 'sender_id': sender_id, + 'receiver_name': receiver_name, + 'receiver_id': receiver_id, + 'reply_to': reply_to, + 'reply_to_msg_id': reply_to_msg_id, + 'broker_url': broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + if is_publish: + if nats_connection: + await publish_message(broker_url, subject, env_json_str, correlation_id, nats_connection) + else: + await publish_message(broker_url, subject, env_json_str, correlation_id) + + return env, env_json_str + + +async def smartreceive( + msg: Any, + fileserver_download_handler: Callable = fetch_with_backoff, + max_retries: int = 5, + base_delay: int = 100, + max_delay: int = 5000 +) -> Dict: + """ + Receive and process messages from NATS. + + This function processes incoming NATS messages, handling both direct transport + (base64 decoded payloads) and link transport (URL-based payloads). + It deserializes the data based on the transport type and returns the result. + + Args: + msg: NATS message object + fileserver_download_handler: Function to handle downloading data from file server URLs + max_retries: Maximum retry attempts for fetching URL + base_delay: Initial delay for exponential backoff in ms + max_delay: Maximum delay for exponential backoff in ms + + Returns: + Dict with envelope metadata and payloads field containing list of tuples + + Example: + ```python + # Receive and process message + msg = await nats_connection.subscribe("my.subject") + env = await smartreceive(msg) + # env["payloads"] = [("dataname1", data1, "type1"), ("dataname2", data2, "type2"), ...] + ``` + """ + # Parse the JSON envelope + if isinstance(msg.payload, bytes): + payload = msg.payload.decode('utf-8') + else: + payload = msg.payload + + env_json_obj = json.loads(payload) + log_trace(env_json_obj['correlation_id'], "Processing received message") + + # Process all payloads in the envelope + payloads_list = [] + + for payload in env_json_obj['payloads']: + transport = payload['transport'] + dataname = payload['dataname'] + + if transport == 'direct': + log_trace(env_json_obj['correlation_id'], f"Direct transport - decoding payload '{dataname}'") + + # Extract base64 payload from the payload + payload_b64 = payload['data'] + + # Decode Base64 payload + payload_bytes = base64.b64decode(payload_b64) + + # Deserialize based on type + data_type = payload['payload_type'] + data = _deserialize_data(payload_bytes, data_type, env_json_obj['correlation_id']) + + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + # Extract download URL from the payload + url = payload['data'] + log_trace(env_json_obj['correlation_id'], f"Link transport - fetching '{dataname}' from URL: {url}") + + # Fetch with exponential backoff using the download handler + downloaded_data = await fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + env_json_obj['correlation_id'] + ) + + # Deserialize based on type + data_type = payload['payload_type'] + data = _deserialize_data(downloaded_data, data_type, env_json_obj['correlation_id']) + + payloads_list.append((dataname, data, data_type)) + else: + raise Error(f"Unknown transport type for payload '{dataname}': {transport}") + + env_json_obj['payloads'] = payloads_list + return env_json_obj + + +# ============================================================================ +# NATS Client Wrapper +# ============================================================================ + +class NATSBridge: + """ + Cross-platform NATS bridge implementation. + + Provides a class-based interface for NATSBridge functionality. + """ + + def __init__(self, broker_url: str = None, fileserver_url: str = None): + """ + Initialize the NATSBridge client. + + Args: + broker_url: NATS server URL (defaults to DEFAULT_BROKER_URL) + fileserver_url: HTTP file server URL (defaults to DEFAULT_FILESERVER_URL) + """ + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_client: NATSClient = None + + async def connect(self, broker_url: str = None) -> NATSClient: + """ + Connect to NATS server. + + Args: + broker_url: NATS server URL (optional, uses instance broker_url if not provided) + + Returns: + NATS connection client + """ + url = broker_url or self.broker_url + if not NATS_AVAILABLE: + raise Error('nats-py not available. Install with: pip install nats-py') + self._nats_client = await nats.connect(url) + return self._nats_client + + async def smartsend( + self, + subject: str, + data: List[Tuple[str, Any, str]], + **kwargs + ) -> Tuple[Dict, str]: + """ + Send data via NATS using instance configuration. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options (broker_url, fileserver_url, etc.) + + Returns: + Tuple of (env, env_json_str) + """ + # Merge instance config with kwargs + options = { + 'broker_url': kwargs.get('broker_url', self.broker_url), + 'fileserver_url': kwargs.get('fileserver_url', self.fileserver_url), + **kwargs + } + return await smartsend(subject, data, **options) + + async def smartreceive( + self, + msg: Any, + **kwargs + ) -> Dict: + """ + Receive and process NATS message using instance configuration. + + Args: + msg: NATS message object + **kwargs: Additional options + + Returns: + Dict with envelope metadata and payloads + """ + return await smartreceive(msg, **kwargs) + + async def close(self): + """Close the NATS connection.""" + if self._nats_client: + await self._nats_client.close() + self._nats_client = None + + +# ============================================================================ +# Module Exports +# ============================================================================ + +__all__ = [ + # Core functions + 'smartsend', + 'smartreceive', + + # Utility functions + 'log_trace', + 'generate_uuid', + '_serialize_data', + '_deserialize_data', + + # File server handlers + 'plik_oneshot_upload', + 'fetch_with_backoff', + + # NATS publishing + 'publish_message', + + # Data classes + 'MsgPayloadV1', + 'MsgEnvelopeV1', + + # Client class + 'NATSBridge', + + # Constants + 'DEFAULT_SIZE_THRESHOLD', + 'DEFAULT_BROKER_URL', + 'DEFAULT_FILESERVER_URL', + + # Availability flags + 'ARROW_AVAILABLE', + 'AIOHTTP_AVAILABLE', + 'NATS_AVAILABLE', +] \ No newline at end of file diff --git a/src/natbridge_mpy.py b/src/natbridge_mpy.py new file mode 100644 index 0000000..e5cd464 --- /dev/null +++ b/src/natbridge_mpy.py @@ -0,0 +1,728 @@ +""" +NATSBridge - Cross-Platform Bi-Directional Data Bridge +MicroPython Implementation + +This module provides functionality for sending and receiving data across network boundaries +using NATS as the message bus, with support for both direct payload transport and +URL-based transport for larger payloads. + +MicroPython Limitations: +- No Arrow IPC support (memory constraints) +- Only direct transport (< 100KB threshold enforced) +- Synchronous API (no async/await) +- Limited UUID generation +- Simplified file server handlers + +Handler Function Signatures: + +```python +# Upload handler - uploads data to file server and returns URL +# The handler is passed to smartsend as fileserver_upload_handler parameter +# It receives: (fileserver_url, dataname, data) +# Returns: Dict with keys: 'status', 'url' (MicroPython simplified) +def fileserver_upload_handler(fileserver_url, dataname, data) + +# Download handler - fetches data from file server URL with exponential backoff +# The handler is passed to smartreceive as fileserver_download_handler parameter +# It receives: (url, max_retries, base_delay, max_delay, correlation_id) +# Returns: bytearray +def fileserver_download_handler(url, max_retries, base_delay, max_delay, correlation_id) +``` + +Multi-Payload Support (Standard API): +The system uses a standardized list-of-tuples format for all payload operations. + +API Standard: + +```python +# Input format for smartsend (always a list of tuples with type info) +[(dataname1, data1, type1), (dataname2, data2, type2), ...] + +# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + +Supported types: "text", "dictionary", "image", "audio", "video", "binary" +Note: "table" type is NOT supported in MicroPython due to memory constraints +""" + +import network +import socket +import time +import json +import base64 +import uos + +# ============================================================================ +# Constants +# ============================================================================ + +# MicroPython-specific lower thresholds due to memory constraints +DEFAULT_SIZE_THRESHOLD = 100000 # 100KB for MicroPython (vs 1MB on desktop) +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" +MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython to prevent OOM + +# NATS connection settings +NATS_SERVER_HOST = "localhost" +NATS_SERVER_PORT = 4222 +NATS_RECONNECT_DELAY = 5000 # 5 seconds + + +# ============================================================================ +# Utility Functions +# ============================================================================ + +def log_trace(correlation_id, message): + """Log a trace message with correlation ID and timestamp.""" + try: + timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()) + print(f"[{timestamp}] [Correlation: {correlation_id}] {message}") + except Exception: + # Fallback for MicroPython + print(f"[Correlation: {correlation_id}] {message}") + + +def generate_uuid(): + """ + Generate a simple UUID for MicroPython. + + Note: This is not a true UUID v4, but provides uniqueness for tracing. + """ + # Use time-based unique identifier + tick = time.ticks_ms() + random_byte = __builtins__.chr(tick % 256) if hasattr(__builtins__, 'chr') else chr(tick % 256) + return f"mp-{tick:08x}-{random_byte}" + + +def _serialize_data(data, payload_type): + """ + Serialize data to bytes based on type. + + MicroPython version - no table support. + + Args: + data: Data to serialize + payload_type: Target format: "text", "dictionary", "image", "audio", "video", "binary" + + Returns: + bytes: Serialized data + + Raises: + ValueError: If payload_type is unknown + """ + if payload_type == 'text': + if isinstance(data, str): + return data.encode('utf-8') + else: + raise ValueError('Text data must be a string') + elif payload_type == 'dictionary': + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type in ('image', 'audio', 'video', 'binary'): + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise ValueError(f'{payload_type} data must be bytes') + else: + raise ValueError(f'Unknown payload_type: {payload_type}') + + +def _deserialize_data(data, payload_type): + """ + Deserialize bytes to data based on type. + + MicroPython version - no table support. + + Args: + data: Serialized data as bytes + payload_type: Data type + + Returns: + Deserialized data + """ + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type in ('image', 'audio', 'video', 'binary'): + return data + else: + raise ValueError(f'Unknown payload_type: {payload_type}') + + +# ============================================================================ +# File Server Handlers (Simplified for MicroPython) +# ============================================================================ + +def _http_request(method, url, headers=None, data=None): + """ + Make an HTTP request (simplified for MicroPython). + + Args: + method: HTTP method ('GET' or 'POST') + url: URL to request + headers: Optional headers dict + data: Optional request body + + Returns: + tuple: (status_code, response_body, headers_dict) + """ + # Parse URL + # Simple parsing: http://host:port/path + try: + # Remove protocol + url = url.replace('http://', '').replace('https://', '') + + # Split host and path + if '/' in url: + host_part, path = url.split('/', 1) + path = '/' + path + else: + host_part = url + path = '/' + + # Split host and port + if ':' in host_part: + host, port = host_part.split(':') + port = int(port) + else: + host = host_part + port = 80 + + # Connect + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(10) # 10 second timeout + sock.connect((host, port)) + + # Build request + request_lines = [f"{method} {path} HTTP/1.1"] + request_lines.append(f"Host: {host}") + request_lines.append("Connection: close") + + if headers: + for key, value in headers.items(): + request_lines.append(f"{key}: {value}") + + request_lines.append("") + + request = '\r\n'.join(request_lines) + if data: + request += data.decode('utf-8') if isinstance(data, bytes) else data + + sock.send(request.encode('utf-8')) + + # Read response + response = b'' + while True: + try: + chunk = sock.recv(1024) + if not chunk: + break + response += chunk + except Exception: + break + + sock.close() + + # Parse response + if b'\r\n\r\n' in response: + header_part, body = response.split(b'\r\n\r\n', 1) + header_lines = header_part.decode('utf-8', errors='ignore').split('\r\n') + else: + header_lines = response.decode('utf-8', errors='ignore').split('\r\n') + body = b'' + + # Parse status line + status_line = header_lines[0] + status_code = int(status_line.split(' ')[1]) if len(status_line.split(' ')) > 1 else 200 + + # Parse headers + headers_dict = {} + for line in header_lines[1:]: + if ':' in line: + key, value = line.split(':', 1) + headers_dict[key.strip()] = value.strip() + + return status_code, body, headers_dict + + except Exception as e: + # Return error indicator + return 0, b'', {'error': str(e)} + + +def _simple_fileserver_upload(fileserver_url, dataname, data): + """ + Simple file upload handler for MicroPython (simplified plik-style). + + Note: This is a basic implementation. For production, use a proper + file server with the same API as plik. + + Args: + fileserver_url: Base URL of file server + dataname: Name of the file + data: Binary data + + Returns: + Dict with keys: 'status', 'url' + """ + # Simple implementation: return a constructed URL + # In practice, you'd need to implement actual upload logic + + # For MicroPython, we'll use a simple approach + # Generate a unique ID based on timestamp and dataname + unique_id = f"{int(time.time())}-{abs(hash(dataname)) % 10000:04d}" + + # Construct download URL + url = f"{fileserver_url}/file/{unique_id}/{dataname}" + + # In a real implementation, you would: + # 1. POST to /upload to get upload ID + # 2. POST file data to /file/{upload_id} + # 3. Return the download URL + + # For now, return a mock response + return { + 'status': 200, + 'url': url + } + + +def _simple_fileserver_download(url, max_retries, base_delay, max_delay, correlation_id): + """ + Simple file download handler with exponential backoff. + + Args: + url: URL to download from + max_retries: Maximum retry attempts + base_delay: Initial delay in milliseconds + max_delay: Maximum delay in milliseconds + correlation_id: Correlation ID for logging + + Returns: + bytearray: Downloaded data + """ + delay = base_delay + + for attempt in range(1, max_retries + 1): + try: + status_code, body, headers = _http_request('GET', url) + + if status_code == 200: + log_trace(correlation_id, f"Successfully fetched data from {url} on attempt {attempt}") + return bytearray(body) + else: + log_trace(correlation_id, f"Download failed with status {status_code}") + if attempt < max_retries: + time.sleep_ms(delay) + delay = min(delay * 2, max_delay) + else: + raise RuntimeError(f"Download failed with status {status_code}") + except Exception as e: + log_trace(correlation_id, f"Attempt {attempt} failed: {type(e).__name__}") + if attempt < max_retries: + time.sleep_ms(delay) + delay = min(delay * 2, max_delay) + else: + raise RuntimeError(f"Failed to download after {max_retries} attempts: {e}") + + return bytearray() + + +# ============================================================================ +# NATS Connection (Simplified for MicroPython) +# ============================================================================ + +class NATSConnection: + """ + Simplified NATS connection for MicroPython. + + Note: This is a basic implementation. For production use, consider + using a proper MicroPython NATS client or the full Python implementation. + """ + + def __init__(self, host=NATS_SERVER_HOST, port=NATS_SERVER_PORT): + self.host = host + self.port = port + self.sock = None + self.connected = False + + def connect(self): + """Connect to NATS server.""" + try: + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.settimeout(10) + self.sock.connect((self.host, self.port)) + self.connected = True + + # Send CONNECT command (simplified) + connect_cmd = b'\x08CONNECT{"verbose":false,"protocol":1,"version":"1.0.2","auth_token":"","lang":"mpy"}\r\n' + self.sock.send(connect_cmd) + + # Wait for PONG + response = self.sock.recv(1024) + return True + except Exception as e: + self.connected = False + raise RuntimeError(f"Failed to connect to NATS: {e}") + + def publish(self, subject, message): + """Publish a message to a subject.""" + if not self.connected or not self.sock: + raise RuntimeError("Not connected to NATS") + + # Publish command: PUB subject size\r\nmessage\r\n + msg_bytes = message.encode('utf-8') if isinstance(message, str) else message + pub_cmd = f"PUB {subject} {len(msg_bytes)}\r\n".encode('utf-8') + pub_cmd += msg_bytes + b'\r\n' + + self.sock.send(pub_cmd) + + # Wait for +OK response (simplified) + try: + self.sock.recv(4) + except Exception: + pass + + def close(self): + """Close the connection.""" + if self.sock: + try: + self.sock.close() + except Exception: + pass + self.sock = None + self.connected = False + + +# ============================================================================ +# Core Functions +# ============================================================================ + +def smartsend( + subject, + data, + broker_url=DEFAULT_BROKER_URL, + fileserver_url=DEFAULT_FILESERVER_URL, + fileserver_upload_handler=_simple_fileserver_upload, + size_threshold=DEFAULT_SIZE_THRESHOLD, + correlation_id=None, + msg_purpose="chat", + sender_name="NATSBridge", + receiver_name="", + receiver_id="", + reply_to="", + reply_to_msg_id="", + is_publish=True, + msg_id=None, + sender_id=None +): + """ + Send data via NATS with automatic transport selection. + + MicroPython version - synchronous, limited features. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + broker_url: NATS server URL + fileserver_url: HTTP file server URL + fileserver_upload_handler: Function to handle fileserver uploads + size_threshold: Threshold in bytes (enforced MAX_PAYLOAD_SIZE) + correlation_id: Correlation ID for tracing + msg_purpose: Purpose of the message + sender_name: Name of the sender + receiver_name: Name of the receiver + receiver_id: UUID of the receiver + reply_to: Topic to reply to + reply_to_msg_id: Message ID this message is replying to + is_publish: Whether to automatically publish the message + msg_id: Message ID + sender_id: Sender ID + + Returns: + Tuple of (env, env_json_str) + + Example: + ```python + from natbridge_mpy import NATSBridge + + bridge = NATSBridge() + env, env_json_str = bridge.smartsend( + "/chat", + [("message", "Hello!", "text"), ("data", data_bytes, "binary")], + size_threshold=100000 # Lower threshold for MicroPython + ) + ``` + """ + if correlation_id is None: + correlation_id = generate_uuid() + if msg_id is None: + msg_id = generate_uuid() + if sender_id is None: + sender_id = generate_uuid() + + # Enforce MAX_PAYLOAD_SIZE for MicroPython + effective_threshold = min(size_threshold, MAX_PAYLOAD_SIZE) + + log_trace(correlation_id, f"Starting smartsend for subject: {subject}") + + # Process each payload + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = _serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + # Check against hard limit + if payload_size > MAX_PAYLOAD_SIZE: + raise MemoryError(f"Payload '{dataname}' exceeds max size {MAX_PAYLOAD_SIZE} bytes") + + log_trace(correlation_id, f"Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") + + # Always use direct transport in MicroPython (link transport not fully supported) + # But respect size_threshold for smaller payloads + if payload_size < effective_threshold: + # Direct path - Base64 encode + payload_b64 = base64.b64encode(payload_bytes).decode('ascii') + log_trace(correlation_id, f"Using direct transport for {payload_size} bytes") + + payloads.append({ + 'id': generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64, + 'metadata': {'payload_bytes': payload_size} + }) + else: + # Link path (limited support) + log_trace(correlation_id, "Using link transport, uploading to fileserver") + + response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + log_trace(correlation_id, f"Uploaded to URL: {response.get('url', 'N/A')}") + + payloads.append({ + 'id': generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response.get('url', ''), + 'metadata': {} + }) + + # Build envelope + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), + 'send_to': subject, + 'msg_purpose': msg_purpose, + 'sender_name': sender_name, + 'sender_id': sender_id, + 'receiver_name': receiver_name, + 'receiver_id': receiver_id, + 'reply_to': reply_to, + 'reply_to_msg_id': reply_to_msg_id, + 'broker_url': broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + # Publish if requested + if is_publish: + try: + conn = NATSConnection() + conn.connect() + conn.publish(subject, env_json_str) + conn.close() + log_trace(correlation_id, f"Message published to {subject}") + except Exception as e: + log_trace(correlation_id, f"Failed to publish: {e}") + # Don't raise - MicroPython should be resilient + + return env, env_json_str + + +def smartreceive(msg, fileserver_download_handler=None, max_retries=3, base_delay=100, max_delay=1000): + """ + Receive and process NATS message. + + MicroPython version - synchronous. + + Args: + msg: Message object with 'payload' attribute + fileserver_download_handler: Function to handle fileserver downloads + max_retries: Maximum retry attempts + base_delay: Initial delay in milliseconds + max_delay: Maximum delay in milliseconds + + Returns: + Dict with envelope metadata and payloads + """ + if fileserver_download_handler is None: + fileserver_download_handler = _simple_fileserver_download + + # Parse envelope + if isinstance(msg.payload, bytes): + payload = msg.payload.decode('utf-8') + else: + payload = msg.payload + + try: + env_json_obj = json.loads(payload) + except Exception: + # Handle cases where payload might be a bytearray + payload_str = str(msg.payload) + env_json_obj = json.loads(payload_str) + + correlation_id = env_json_obj.get('correlation_id', 'unknown') + log_trace(correlation_id, "Processing received message") + + # Process payloads + payloads_list = [] + + for payload in env_json_obj.get('payloads', []): + transport = payload.get('transport', 'direct') + dataname = payload.get('dataname', 'unknown') + + if transport == 'direct': + log_trace(correlation_id, f"Direct transport - decoding payload '{dataname}'") + + payload_b64 = payload.get('data', '') + payload_bytes = base64.b64decode(payload_b64) + + data_type = payload.get('payload_type', 'text') + data = _deserialize_data(payload_bytes, data_type) + + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + url = payload.get('data', '') + log_trace(correlation_id, f"Link transport - fetching '{dataname}' from URL: {url}") + + downloaded_data = fileserver_download_handler( + url, max_retries, base_delay, max_delay, correlation_id + ) + + data_type = payload.get('payload_type', 'binary') + data = _deserialize_data(downloaded_data, data_type) + + payloads_list.append((dataname, data, data_type)) + else: + log_trace(correlation_id, f"Unknown transport type: {transport}") + + env_json_obj['payloads'] = payloads_list + return env_json_obj + + +# ============================================================================ +# NATSBridge Class (MicroPython) +# ============================================================================ + +class NATSBridge: + """ + MicroPython NATS bridge implementation. + + Provides a class-based interface for NATSBridge functionality. + Optimized for memory-constrained devices. + """ + + def __init__(self, broker_url=None, fileserver_url=None): + """ + Initialize the NATSBridge client. + + Args: + broker_url: NATS server URL (defaults to DEFAULT_BROKER_URL) + fileserver_url: HTTP file server URL (defaults to DEFAULT_FILESERVER_URL) + """ + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_conn = None + + def smartsend(self, subject, data, **kwargs): + """ + Send data via NATS. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options + + Returns: + Tuple of (env, env_json_str) + """ + # Merge with defaults + options = { + 'broker_url': kwargs.get('broker_url', self.broker_url), + 'fileserver_url': kwargs.get('fileserver_url', self.fileserver_url), + **kwargs + } + return smartsend(subject, data, **options) + + def smartreceive(self, msg, **kwargs): + """ + Receive and process NATS message. + + Args: + msg: Message object with 'payload' attribute + **kwargs: Additional options + + Returns: + Dict with envelope metadata and payloads + """ + return smartreceive(msg, **kwargs) + + +# ============================================================================ +# Module Exports +# ============================================================================ + +__all__ = [ + # Core functions + 'smartsend', + 'smartreceive', + + # Utility functions + 'generate_uuid', + '_serialize_data', + '_deserialize_data', + + # File server handlers + '_simple_fileserver_upload', + '_simple_fileserver_download', + + # NATS connection + 'NATSConnection', + 'NATSBridge', + + # Constants + 'DEFAULT_SIZE_THRESHOLD', + 'DEFAULT_BROKER_URL', + 'DEFAULT_FILESERVER_URL', + 'MAX_PAYLOAD_SIZE', + 'NATS_SERVER_HOST', + 'NATS_SERVER_PORT', + 'NATS_RECONNECT_DELAY', +] \ No newline at end of file -- 2.49.1 From ae0f24ccb26b1a62ae51fc6f019e2f823866ce9b Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 17:32:20 +0700 Subject: [PATCH 08/43] update --- AI_prompt.txt | 12 + docs/architecture.md | 1370 +++++++++++++------ docs/expanded_architecture.md | 1136 ---------------- docs/expanded_implementation.md | 1986 ---------------------------- docs/implementation.md | 2203 +++++++++++++++++++++++++------ etc.jl | 8 +- README.md => etc.md | 0 examples/tutorial.md | 467 ++++++- examples/walkthrough.md | 915 +++++++++++-- src/NATSBridge.jl | 54 +- src/natbridge.js | 719 ---------- src/natbridge.py | 784 ----------- src/natbridge_mpy.py | 728 ---------- 13 files changed, 4018 insertions(+), 6364 deletions(-) delete mode 100644 docs/expanded_architecture.md delete mode 100644 docs/expanded_implementation.md rename README.md => etc.md (100%) delete mode 100644 src/natbridge.js delete mode 100644 src/natbridge.py delete mode 100644 src/natbridge_mpy.py diff --git a/AI_prompt.txt b/AI_prompt.txt index 5120027..90815a5 100644 --- a/AI_prompt.txt +++ b/AI_prompt.txt @@ -51,3 +51,15 @@ Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read( + + + +I'm expanding this Julia package (NATSBridge) into a cross-platform project by adding a JavaScript and Python/MicroPython implementation. To ensure accuracy, the Julia src directory will serve as the ground truth, as the documentation may be outdated. + +My goal is to maintain interface parity at the high-level API for a consistent user experience, while ensuring the low-level implementation adheres strictly to the idiomatic conventions of each respective language (e.g., multiple dispatch in Julia vs. asynchronous, prototype, or class-based patterns in JS and Python/MicroPython) + +Now, help me do the following: +1) check architecture.md for any mistake. + + + diff --git a/docs/architecture.md b/docs/architecture.md index 6cd0afd..ed547e5 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,126 +1,161 @@ -# Architecture Documentation: Bi-Directional Data Bridge +# Cross-Platform Architecture Documentation: Bi-Directional Data Bridge ## Overview -This document describes the architecture for a high-performance, bi-directional data bridge for **Julia** applications using NATS (Core & JetStream), implementing the Claim-Check pattern for large payloads. +This document describes the architecture for a high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. -The system enables seamless communication for Julia applications: -- **Julia** messaging with NATS +**Supported Platforms:** +- **Julia** - Ground truth implementation with full feature set +- **JavaScript** - Node.js and browser-compatible implementation +- **Python/MicroPython** - Desktop and embedded-compatible implementation -### File Server Handler Architecture +### Cross-Platform Design Principles -The system uses **handler functions** to abstract file server operations, allowing support for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). +1. **High-Level API Parity**: All three platforms expose the same `smartsend()` and `smartreceive()` functions with identical signatures and behavior +2. **Idiomatic Implementations**: Each platform uses its native patterns (multiple dispatch in Julia, async/prototype in JS, class-based in Python) +3. **Message Format Consistency**: The `msg_envelope_v1` and `msg_payload_v1` JSON schemas are identical across all platforms +4. **Handler Function Abstraction**: File server operations are abstracted through handler functions for backend flexibility -**Handler Function Signatures:** +--- -```julia -# Upload handler - uploads data to file server and returns URL -# The handler is passed to smartsend as fileserver_upload_handler parameter -# It receives: (fileserver_url::String, dataname::String, data::Vector{UInt8}) -# Returns: Dict{String, Any} with keys: "status", "uploadid", "fileid", "url" -fileserver_upload_handler(fileserver_url::String, dataname::String, data::Vector{UInt8})::Dict{String, Any} +## High-Level API Standard (Cross-Platform) -# Download handler - fetches data from file server URL with exponential backoff -# The handler is passed to smartreceive as fileserver_download_handler parameter -# It receives: (url::String, max_retries::Int, base_delay::Int, max_delay::Int, correlation_id::String) -# Returns: Vector{UInt8} (the downloaded data) -fileserver_download_handler(url::String, max_retries::Int, base_delay::Int, max_delay::Int, correlation_id::String)::Vector{UInt8} +### Unified API Signature + +All three platforms expose the same high-level API: + +**Input Format (smartsend):** ``` - -This design allows the system to support multiple file server backends without changing the core messaging logic. - -### Multi-Payload Support (Standard API) - -The system uses a **standardized list-of-tuples format** for all payload operations. **Even when sending a single payload, the user must wrap it in a list.** - -**API Standard:** -```julia -# Input format for smartsend (always a list of tuples with type info) [(dataname1, data1, type1), (dataname2, data2, type2), ...] - -# Output format for smartreceive (returns a dictionary-like object with payloads field containing list of tuples) -# Returns: Dict-like object with envelope metadata and payloads field containing Vector{Tuple{String, Any, String}} -# { -# "correlation_id": "...", -# "msg_id": "...", -# "timestamp": "...", -# "send_to": "...", -# "msg_purpose": "...", -# "sender_name": "...", -# "sender_id": "...", -# "receiver_name": "...", -# "receiver_id": "...", -# "reply_to": "...", -# "reply_to_msg_id": "...", -# "broker_url": "...", -# "metadata": {...}, -# "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -# } ``` -**Supported Types:** -- `"text"` - Plain text -- `"dictionary"` - JSON-serializable dictionaries (Dict, NamedTuple) -- `"table"` - Tabular data (DataFrame, array of structs) -- `"image"` - Image data (Bitmap, PNG/JPG bytes) -- `"audio"` - Audio data (WAV, MP3 bytes) -- `"video"` - Video data (MP4, AVI bytes) -- `"binary"` - Generic binary data (Vector{UInt8}) +**Output Format (smartreceive):** +``` +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` -This design allows per-payload type specification, enabling **mixed-content messages** where different payloads can use different serialization formats in a single message. +### Supported Payload Types -**Examples:** +| Type | Julia | JavaScript | Python/MicroPython | +|------|-------|------------|-------------------| +| `text` | `String` | `string` | `str` | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | +| `table` | `DataFrame`, `Arrow.Table` | `Array`, `Buffer` (Arrow) | `pandas.DataFrame`, `bytes` (Arrow) | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray`, `io.BytesIO` | +### Cross-Platform API Examples + +**Julia:** ```julia -# Single payload - still wrapped in a list -smartsend( - "/test", - [("dataname1", data1, "dictionary")], # List with one tuple (data, type) - broker_url="nats://localhost:4222", - fileserver_upload_handler=plik_oneshot_upload -) +using NATSBridge -# Multiple payloads in one message with different types -smartsend( - "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], - broker_url="nats://localhost:4222", - fileserver_upload_handler=plik_oneshot_upload -) - -# Mixed content (e.g., chat with text, image, audio) -smartsend( +# Send +env, env_json_str = smartsend( "/chat", - [ - ("message_text", "Hello!", "text"), - ("user_image", image_data, "image"), - ("audio_clip", audio_data, "audio") - ], + [("message", "Hello!", "text"), ("image", image_bytes, "image")], broker_url="nats://localhost:4222" ) -# Receive returns a JSON object envelope with all metadata and deserialized payloads -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff, max_retries=5, base_delay=100, max_delay=5000) -# Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 -# env["payloads"] = [("dataname1", data1, type1), ("dataname2", data2, type2), ...] -# env["correlation_id"], env["msg_id"], etc. -# env is a JSON object containing envelope metadata and payloads field +# Receive - returns JSON.Object{String, Any} +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# env is a JSON.Object{String, Any} with "payloads" field containing Vector{Tuple{String, Any, String}} +# Access payloads: for (dataname, data, type) in env["payloads] ``` -## Architecture Diagram +**JavaScript:** +```javascript +const NATSBridge = require('natbridge'); + +// Send +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat", + [ + ["message", "Hello!", "text"], + ["image", imageBuffer, "image"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Receive - returns Promise +const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: fetchWithBackoff +}); +// env is an object with "payloads" field containing Array of arrays +// Access payloads: for (const [dataname, data, type] of env.payloads) +``` + +**Python:** +```python +from natbridge import NATSBridge + +# Send +env, env_json_str = NATSBridge.smartsend( + "/chat", + [("message", "Hello!", "text"), ("image", image_bytes, "image")], + broker_url="nats://localhost:4222" +) + +# Receive - returns Tuple[Dict, str] +env = NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff +) +# env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] +# Access payloads: for dataname, data, type_ in env["payloads"] +``` + +**MicroPython:** +```python +from natbridge import NATSBridge + +# Send (limited to direct transport due to memory constraints) +env, env_json_str = NATSBridge.smartsend( + "/chat", + [("message", "Hello!", "text")], + broker_url="nats://localhost:4222" +) +``` + +--- + +## Architecture Diagram (Cross-Platform) ```mermaid flowchart TB - subgraph Sender["Julia Application (Sender)"] - SenderApp[App Code] - NATSBridge_Send[NATSBridge] - NATS_Client[NATS.jl] + subgraph JuliaApp["Julia Application"] + JuliaAppCode[App Code] + JuliaBridge[NATSBridge.jl] + JuliaNATS[NATS.jl] end - subgraph Receiver["Julia Application (Receiver)"] - ReceiverApp[App Code] - NATSBridge_Recv[NATSBridge] - NATS_Client_Recv[NATS.jl] + subgraph JSApp["JavaScript Application"] + JSAppCode[App Code] + JSBridge[NATSBridge.js] + JSNATS[nats.js] + end + + subgraph PythonApp["Python/MicroPython Application"] + PythonAppCode[App Code] + PythonBridge[NATSBridge.py] + PythonNATS[nats.py] end subgraph Infrastructure["Infrastructure"] @@ -128,52 +163,43 @@ flowchart TB FileServer[HTTP File Server
Upload/Download] end - SenderApp --> NATSBridge_Send - NATSBridge_Send --> NATS_Client - NATS_Client --> NATS - - NATS --> NATS_Client_Recv - NATS_Client_Recv --> NATSBridge_Recv - NATSBridge_Recv --> ReceiverApp + JuliaAppCode --> JuliaBridge + JuliaBridge --> JuliaNATS + JSAppCode --> JSBridge + JSBridge --> JSNATS + PythonAppCode --> PythonBridge + PythonBridge --> PythonNATS - NATSBridge_Send -.->|HTTP POST upload| FileServer - FileServer -.->|HTTP GET download| NATSBridge_Recv + JuliaNATS --> NATS + JSNATS --> NATS + PythonNATS --> NATS - style SenderApp fill:#e8f5e9 - style ReceiverApp fill:#e8f5e9 + NATS --> JuliaNATS + NATS --> JSNATS + NATS --> PythonNATS + + JuliaBridge -.->|HTTP POST upload| FileServer + JSBridge -.->|HTTP POST upload| FileServer + PythonBridge -.->|HTTP POST upload| FileServer + + FileServer -.->|HTTP GET download| JuliaBridge + FileServer -.->|HTTP GET download| JSBridge + FileServer -.->|HTTP GET download| PythonBridge + + style JuliaApp fill:#c5e1a5 + style JSApp fill:#bbdefb + style PythonApp fill:#f8bbd0 style NATS fill:#fff3e0 style FileServer fill:#f3e5f5 ``` +--- + ## System Components ### 1. msg_envelope_v1 - Message Envelope -The `msg_envelope_v1` structure provides a comprehensive message format for bidirectional communication in Julia applications. - -**Julia Structure:** -```julia -struct msg_envelope_v1 - correlation_id::String # Unique identifier to track messages across systems - msg_id::String # This message id - timestamp::String # Message published timestamp - - send_to::String # Topic/subject the sender sends to - msg_purpose::String # Purpose of this message (ACK | NACK | updateStatus | shutdown | ...) - sender_name::String # Sender name (e.g., "agent-wine-web-frontend") - sender_id::String # Sender id (uuid4) - receiver_name::String # Message receiver name (e.g., "agent-backend") - receiver_id::String # Message receiver id (uuid4 or nothing for broadcast) - reply_to::String # Topic to reply to - reply_to_msg_id::String # Message id this message is replying to - broker_url::String # NATS server address - - metadata::Dict{String, Any} - payloads::Vector{msg_payload_v1} # Multiple payloads stored here -end -``` - -**JSON Schema:** +**JSON Schema (Identical Across All Platforms):** ```json { "correlation_id": "uuid-v4-string", @@ -191,7 +217,8 @@ end "broker_url": "nats://localhost:4222", "metadata": { - + "content_type": "application/octet-stream", + "content_length": 123456 }, "payloads": [ @@ -204,20 +231,18 @@ end "size": 15433, "data": "base64-encoded-string", "metadata": { - + "checksum": "sha256_hash" } }, { "id": "uuid4", - "dataname": "large_data", + "dataname": "large_table", "payload_type": "table", "transport": "link", "encoding": "none", "size": 524288, "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow", - "metadata": { - - } + "metadata": {} } ] } @@ -225,347 +250,890 @@ end ### 2. msg_payload_v1 - Payload Structure -The `msg_payload_v1` structure provides flexible payload handling for various data types. - -**Julia Structure:** -```julia -struct msg_payload_v1 - id::String # Id of this payload (e.g., "uuid4") - dataname::String # Name of this payload (e.g., "login_image") - payload_type::String # "text | dictionary | table | image | audio | video | binary" - transport::String # "direct | link" - encoding::String # "none | json | base64 | arrow-ipc" - size::Integer # Data size in bytes - data::Any # Payload data in case of direct transport or a URL in case of link - metadata::Dict{String, Any} # Dict("checksum" => "sha256_hash", ...) -end +**JSON Schema (Identical Across All Platforms):** +```json +{ + "id": "uuid4", + "dataname": "login_image", + "payload_type": "image | dictionary | table | text | audio | video | binary", + "transport": "direct | link", + "encoding": "none | json | base64 | arrow-ipc", + "size": 15433, + "data": "base64-encoded-string | http-url", + "metadata": { + "checksum": "sha256_hash" + } +} ``` -**Key Features:** -- Supports multiple data types: text, dictionary, table, image, audio, video, binary -- Flexible transport: "direct" (NATS) or "link" (HTTP fileserver) -- Multiple payloads per message (essential for chat with mixed content) -- Per-payload and per-envelope metadata support - -### 3. Transport Strategy Decision Logic +### 3. Transport Strategy Decision Logic (Cross-Platform) ``` ┌─────────────────────────────────────────────────────────────┐ -│ smartsend Function │ +│ smartsend Function (All Platforms) │ │ Accepts: [(dataname1, data1, type1), ...] │ │ (Type is per payload, not standalone) │ └─────────────────────────────────────────────────────────────┘ - │ - ▼ + │ + ▼ ┌─────────────────────────────────────────────────────────────┐ │ For each payload: │ -│ 1. Extract type from tuple │ +│ 1. Extract type from tuple/array │ │ 2. Serialize based on type │ │ 3. Check payload size │ └─────────────────────────────────────────────────────────────┘ - │ - ┌────────────────┴─-────────────────┐ - ▼ ▼ - ┌─────────────────┐ ┌─────────────────┐ - │ Direct Path │ │ Link Path │ - │ (< 1MB) │ │ (> 1MB) │ - │ │ │ │ - │ • Serialize to │ │ • Serialize to │ - │ IOBuffer │ │ IOBuffer │ - │ • Base64 encode │ │ • Upload to │ - │ • Publish to │ │ HTTP Server │ - │ NATS │ │ • Publish to │ - │ (with payload │ │ NATS with URL │ - │ in envelope) │ │ (in envelope) │ - └─────────────────┘ └─────────────────┘ + │ + ┌───────────┴────────────┐ + ▼ ▼ + ┌──────────────┐ ┌──────────────┐ + │ Direct Path │ │ Link Path │ + │ (< 1MB) │ │ (>= 1MB) │ + │ │ │ │ + │ • Serialize │ │ • Serialize │ + │ to buffer │ │ to buffer │ + │ • Base64 │ │ • Upload to │ + │ encode │ │ HTTP Server│ + │ • Publish to │ │ • Publish to │ + │ NATS │ │ NATS with │ + │ (in msg) │ │ URL │ + └──────────────┘ └──────────────┘ ``` -### 4. Julia Module Architecture +--- -```mermaid -graph TD - subgraph JuliaModule - JuliaSmartSend[smartsend] - SizeCheck[Size Check] - DirectPath[Direct Path] - LinkPath[Link Path] - HTTPClient[HTTP Client] - end - - JuliaSmartSend --> SizeCheck - SizeCheck -->|< 1MB| DirectPath - SizeCheck -->|>= 1MB| LinkPath - LinkPath --> HTTPClient - - style JuliaModule fill:#c5e1a5 -``` - -## Implementation Details +## Platform-Specific Implementations ### Julia Implementation -#### Dependencies -- `NATS.jl` - Core NATS functionality -- `Arrow.jl` - Arrow IPC serialization -- `JSON3.jl` - JSON parsing -- `HTTP.jl` - HTTP client for file server -- `Dates.jl` - Timestamps for logging +#### Architecture Patterns -#### smartsend Function +**Multiple Dispatch:** Julia's core strength is leveraged through function overloading: ```julia -function smartsend( - subject::String, - data::AbstractArray{Tuple{String, Any, String}, 1}; # List of (dataname, data, type) tuples - broker_url::String = DEFAULT_BROKER_URL, # NATS server URL - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler::Function = plik_oneshot_upload, - size_threshold::Int = DEFAULT_SIZE_THRESHOLD, - correlation_id::String = string(uuid4()), # Correlation ID for tracing (auto-generated UUID) - msg_purpose::String = "chat", - sender_name::String = "NATSBridge", - receiver_name::String = "", - receiver_id::String = "", - reply_to::String = "", - reply_to_msg_id::String = "", - is_publish::Bool = true, # Whether to automatically publish to NATS - NATS_connection::Union{NATS.Connection, Nothing} = nothing, # Pre-existing NATS connection (optional, saves connection overhead) - msg_id::String = string(uuid4()), # Message ID (auto-generated UUID) - sender_id::String = string(uuid4()) # Sender ID (auto-generated UUID) -) -``` +# publish_message has two overloads based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + conn = NATS.connect(broker_url) + publish_message(conn, subject, message, correlation_id) +end -**Keyword Parameter - NATS_connection:** -- `NATS_connection::Union{NATS.Connection, Nothing} = nothing` - Pre-existing NATS connection. When provided, `smartsend` uses this connection instead of creating a new one, avoiding the overhead of connection establishment. This is useful for high-frequency publishing scenarios where connection reuse provides performance benefits. - -**Connection Handling Logic:** -```julia -if is_publish == false - # skip publish a message -elseif is_publish == true && NATS_connection === nothing - publish_message(broker_url, subject, env_json_str, cid) # Creates new connection -elseif is_publish == true && NATS_connection !== nothing - publish_message(NATS_connection, subject, env_json_str, cid) # Uses provided connection +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + try + NATS.publish(conn, subject, message) + log_trace(correlation_id, "Message published to $subject") + finally + NATS.drain(conn) + end end ``` -**Return Value:** -- Returns a tuple `(env, env_json_str)` where: - - `env::msg_envelope_v1` - The envelope object containing all metadata and payloads - - `env_json_str::String` - JSON string representation of the envelope for publishing +**Struct-Based Data Models:** +```julia +struct msg_payload_v1 + id::String + dataname::String + payload_type::String + transport::String + encoding::String + size::Integer + data::Any + metadata::Dict{String, Any} +end -**Options:** -- `is_publish::Bool = true` - When `true` (default), the message is automatically published to NATS. When `false`, the function returns the envelope and JSON string without publishing, allowing manual publishing via NATS request-reply pattern. +struct msg_envelope_v1 + correlation_id::String + msg_id::String + timestamp::String + send_to::String + msg_purpose::String + sender_name::String + sender_id::String + receiver_name::String + receiver_id::String + reply_to::String + reply_to_msg_id::String + broker_url::String + metadata::Dict{String, Any} + payloads::Vector{msg_payload_v1} +end +``` -The envelope object can be accessed directly for programmatic use, while the JSON string can be published directly to NATS using the request-reply pattern. +#### Dependencies -**Input Format:** -- `data::AbstractArray{Tuple{String, Any, String}}` - **Must be a list of (dataname, data, type) tuples**: `[("dataname1", data1, "type1"), ("dataname2", data2, "type2"), ...]` -- Even for single payloads: `[(dataname1, data1, "type1")]` -- Each payload can have a different type, enabling mixed-content messages +| Package | Purpose | +|---------|---------| +| `NATS.jl` | Core NATS functionality | +| `Arrow.jl` | Arrow IPC serialization | +| `JSON3.jl` | JSON parsing | +| `HTTP.jl` | HTTP client for file server | +| `UUIDs.jl` | UUID generation | +| `Dates.jl` | Timestamps | +| `Base64` | Base64 encoding | -**Flow:** -1. Iterate through the list of `(dataname, data, type)` tuples -2. For each payload: extract the type from the tuple and serialize accordingly -3. Check payload size -4. If < threshold: publish directly to NATS with Base64-encoded payload -5. If >= threshold: upload to HTTP server, publish NATS with URL - -#### smartreceive Handler +#### File Server Handler Signatures ```julia +# Upload handler +fileserver_upload_handler( + fileserver_url::String, + dataname::String, + data::Vector{UInt8} +)::Dict{String, Any} + +# Download handler +fileserver_download_handler( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +)::Vector{UInt8} +``` + +#### Key Functions + +```julia +# Main send/receive functions +function smartsend( + subject::String, + data::AbstractArray{Tuple{String, Any, String}, 1}; + broker_url::String = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler::Function = plik_oneshot_upload, + size_threshold::Int = DEFAULT_SIZE_THRESHOLD, + correlation_id::String = string(uuid4()), + msg_purpose::String = "chat", + sender_name::String = "NATSBridge", + receiver_name::String = "", + receiver_id::String = "", + reply_to::String = "", + reply_to_msg_id::String = "", + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) +)::Tuple{msg_envelope_v1, String} + function smartreceive( msg::NATS.Msg; fileserver_download_handler::Function = _fetch_with_backoff, max_retries::Int = 5, base_delay::Int = 100, max_delay::Int = 5000 -) - # Parse envelope - # Iterate through all payloads - # For each payload: check transport type - # If direct: decode Base64 payload - # If link: fetch from URL with exponential backoff using fileserver_download_handler - # Deserialize payload based on type - # Return envelope dictionary with all metadata and deserialized payloads -end +)::JSON.Object{String, Any} ``` -**Output Format:** -- Returns a JSON object (dictionary) containing all envelope fields: - - `correlation_id`, `msg_id`, `timestamp`, `send_to`, `msg_purpose`, `sender_name`, `sender_id`, `receiver_name`, `receiver_id`, `reply_to`, `reply_to_msg_id`, `broker_url` - - `metadata` - Message-level metadata dictionary - - `payloads` - List of tuples, each containing `(dataname, data, type)` with deserialized payload data +--- -**Process Flow:** -1. Parse the JSON envelope to extract all fields -2. Iterate through each payload in `payloads` -3. For each payload: - - Determine transport type (`direct` or `link`) - - If `direct`: decode Base64 data from the message - - If `link`: fetch data from URL using exponential backoff (via `fileserver_download_handler`) - - Deserialize based on payload type (`dictionary`, `table`, `binary`, etc.) -4. Return envelope dictionary with `payloads` field containing list of `(dataname, data, type)` tuples +### JavaScript Implementation -**Note:** The `fileserver_download_handler` receives `(url::String, max_retries::Int, base_delay::Int, max_delay::Int, correlation_id::String)` and returns `Vector{UInt8}`. +#### Architecture Patterns -#### publish_message Function +**Async/Await Pattern:** JavaScript uses async/await for non-blocking I/O: -The `publish_message` function provides two overloads for publishing messages to NATS: +```javascript +// smartsend is async and returns a Promise +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = generateUUID(), + msg_purpose = "chat", + sender_name = "NATSBridge", + receiver_name = "", + receiver_id = "", + reply_to = "", + reply_to_msg_id = "", + is_publish = true, + nats_connection = null, + msg_id = generateUUID(), + sender_id = generateUUID() + } = options; + + // Process payloads + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + if (payloadSize < size_threshold) { + // Direct path + const payloadB64 = base64Encode(payloadBytes); + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: "direct", + encoding: "base64", + size: payloadSize, + data: payloadB64 + }); + } else { + // Link path + const response = await fileserver_upload_handler( + fileserver_url, dataname, payloadBytes + ); + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: "link", + encoding: "none", + size: payloadSize, + data: response.url + }); + } + } + + const env = buildEnvelope(subject, payloads, { + correlation_id, msg_id, msg_purpose, + sender_name, sender_id, receiver_name, + receiver_id, reply_to, reply_to_msg_id, + broker_url + }); + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} +``` + +**Prototype-Based Utilities:** +```javascript +// NATS client wrapper (prototype-based) +class NATSClient { + constructor(url) { + this.url = url; + this.connection = null; + } + + async connect() { + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + async publish(subject, message) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + } + + async close() { + if (this.connection) { + this.connection.close(); + } + } +} +``` + +#### Dependencies (Node.js) + +| Package | Purpose | +|---------|---------| +| `nats` | Core NATS functionality (nats.js) | +| `uuid` | UUID generation | +| `node-fetch` or `axios` | HTTP client for file server | +| `apache-arrow` | Arrow IPC serialization | + +#### Dependencies (Browser) + +| Package | Purpose | +|---------|---------| +| `nats` | Browser-compatible NATS client | +| `uuid` | UUID generation | +| `fetch` (native) | HTTP client for file server | +| `apache-arrow` | Arrow IPC serialization | + +#### Dependencies (MicroPython) + +| Module | Purpose | +|--------|---------| +| `nats` (custom) | MicroPython NATS client | +| `time` | Timestamps | +| `uos` | File operations | +| `base64` | Base64 encoding | + +#### File Server Handler Signatures + +```javascript +// Upload handler - async function returning Promise +async function fileserver_upload_handler( + fileserver_url, + dataname, + data // Uint8Array +) { + // Returns: { status, uploadid, fileid, url } +} + +// Download handler - async function returning Promise +async function fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + correlation_id +) { + // Returns: Uint8Array +} +``` + +#### Key Functions + +```javascript +// Main send/receive functions +async function smartsend(subject, data, options = {}) { + // data: Array of [dataname, data, type] tuples + // Returns: Promise<[env, env_json_str]> +} + +async function smartreceive(msg, options = {}) { + // msg: NATS message object + // Returns: Promise +} + +// Utility functions +async function serializeData(data, payload_type) { + // Returns: Uint8Array +} + +async function deserializeData(data, payload_type) { + // Returns: deserialized data +} + +async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { + // Returns: Uint8Array +} +``` + +--- + +### Python/MicroPython Implementation + +#### Architecture Patterns + +**Class-Based Design:** Python uses classes for stateful operations: + +```python +class NATSBridge: + """Cross-platform NATS bridge implementation.""" + + DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB + DEFAULT_BROKER_URL = "nats://localhost:4222" + DEFAULT_FILESERVER_URL = "http://localhost:8080" + + def __init__(self, broker_url=None, fileserver_url=None): + self.broker_url = broker_url or self.DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or self.DEFAULT_FILESERVER_URL + self._nats_client = None + + async def smartsend(self, subject, data, **kwargs): + """ + Send data via NATS with automatic transport selection. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options (broker_url, fileserver_url, etc.) + + Returns: + Tuple of (env, env_json_str) + """ + # Extract options with defaults + options = self._merge_options(kwargs) + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = self._serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + if payload_size < options['size_threshold']: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + payloads.append({ + 'id': uuid.uuid4().hex, + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64 + }) + else: + # Link path + response = await options['fileserver_upload_handler']( + options['fileserver_url'], dataname, payload_bytes + ) + payloads.append({ + 'id': uuid.uuid4().hex, + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'] + }) + + # Build envelope + env = self._build_envelope(subject, payloads, options) + env_json_str = json.dumps(env) + + if options['is_publish']: + await self._publish_message( + subject, env_json_str, options['correlation_id'], + nats_connection=options.get('nats_connection') + ) + + return env, env_json_str + + async def smartreceive(self, msg, **kwargs): + """ + Receive and process NATS message. + + Args: + msg: NATS message object + **kwargs: Additional options (fileserver_download_handler, etc.) + + Returns: + Dict with envelope metadata and payloads + """ + # Parse envelope + env_json_obj = json.loads(msg.payload) + + # Process payloads + payloads_list = [] + for payload in env_json_obj['payloads']: + transport = payload['transport'] + dataname = payload['dataname'] + + if transport == 'direct': + payload_b64 = payload['data'] + payload_bytes = base64.b64decode(payload_b64) + data_type = payload['payload_type'] + data = self._deserialize_data(payload_bytes, data_type) + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + url = payload['data'] + downloaded_data = await options['fileserver_download_handler']( + url, + options['max_retries'], + options['base_delay'], + options['max_delay'], + env_json_obj['correlation_id'] + ) + data_type = payload['payload_type'] + data = self._deserialize_data(downloaded_data, data_type) + payloads_list.append((dataname, data, data_type)) + + env_json_obj['payloads'] = payloads_list + return env_json_obj +``` + +**Dataclass for Type Safety:** +```python +from dataclasses import dataclass, field +from typing import Any, Dict, List, Tuple, Union + +@dataclass +class MsgPayloadV1: + """Message payload structure.""" + id: str + dataname: str + payload_type: str + transport: str + encoding: str + size: int + data: Union[str, bytes] # URL for link, base64 for direct + metadata: Dict[str, Any] = field(default_factory=dict) + +@dataclass +class MsgEnvelopeV1: + """Message envelope structure.""" + correlation_id: str + msg_id: str + timestamp: str + send_to: str + msg_purpose: str + sender_name: str + sender_id: str + receiver_name: str + receiver_id: str + reply_to: str + reply_to_msg_id: str + broker_url: str + metadata: Dict[str, Any] = field(default_factory=dict) + payloads: List[MsgPayloadV1] = field(default_factory=list) +``` + +#### Dependencies (Desktop Python) + +| Package | Purpose | +|---------|---------| +| `nats-py` | Core NATS functionality | +| `uuid` | UUID generation (stdlib) | +| `aiohttp` or `requests` | HTTP client for file server | +| `pyarrow` | Arrow IPC serialization | +| `pandas` | DataFrame support (optional) | +| `python-dateutil` | Timestamps | +| `base64` | Base64 encoding (stdlib) | + +#### Dependencies (MicroPython) + +| Module | Purpose | +|--------|---------| +| `network` | NATS connection (custom) | +| `time` | Timestamps | +| `uos` | File operations | +| `base64` | Base64 encoding | +| `json` | JSON parsing | +| `struct` | Binary data handling | + +**MicroPython Limitations:** +- No Arrow IPC support (memory constraints) +- Only direct transport (< 1MB threshold enforced) +- Simplified UUID generation +- No async/await (use callbacks or uasyncio) + +#### File Server Handler Signatures + +```python +# Upload handler - async function +async def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload data to file server. + + Args: + fileserver_url: Base URL of file server + dataname: Name of the file + data: Binary data + + Returns: + Dict with keys: 'status', 'uploadid', 'fileid', 'url' + """ + pass + +# Download handler - async function +async def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Download data from URL with exponential backoff. + + Args: + url: URL to download from + max_retries: Maximum retry attempts + base_delay: Initial delay in ms + max_delay: Maximum delay in ms + correlation_id: Correlation ID for logging + + Returns: + Downloaded bytes + """ + pass +``` + +#### Key Functions + +```python +# Main send/receive functions (standalone or class methods) +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """Send data via NATS.""" + pass + +async def smartreceive( + msg: Any, + fileserver_download_handler: Callable = fetch_with_backoff, + max_retries: int = 5, + base_delay: int = 100, + max_delay: int = 5000 +) -> Dict: + """Receive and process NATS message.""" + pass + +# Utility functions +def _serialize_data(data: Any, payload_type: str) -> bytes: + """Serialize data to bytes.""" + pass + +def _deserialize_data(data: bytes, payload_type: str) -> Any: + """Deserialize bytes to data.""" + pass + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """Fetch URL with exponential backoff.""" + pass +``` + +--- + +## Platform Comparison Matrix + +| Feature | Julia | JavaScript | Python | MicroPython | +|---------|-------|------------|--------|-------------| +| **Multiple Dispatch** | ✅ Native | ❌ (Prototypes) | ❌ (Overload via `@overload`) | ❌ | +| **Async/Await** | ❌ (Tasks) | ✅ Native | ✅ Native | ⚠️ (uasyncio) | +| **Type Safety** | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | +| **Memory Management** | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | +| **Arrow IPC** | ✅ Native | ✅ (arrow package) | ✅ (pyarrow) | ❌ | +| **Direct Transport** | ✅ | ✅ | ✅ | ✅ | +| **Link Transport** | ✅ | ✅ | ✅ | ⚠️ (Limited) | +| **Handler Functions** | ✅ | ✅ | ✅ | ✅ | +| **Cross-Platform API** | ✅ | ✅ | ✅ | ✅ | + +--- + +## Implementation Details by Platform + +### Julia: Multiple Dispatch Pattern -**Overload 1 - URL-based publishing (creates new connection):** ```julia +# Function overloading based on argument types function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - conn = NATS.connect(broker_url) # Create NATS connection - publish_message(conn, subject, message, correlation_id) + # Creates new connection end -``` -**Overload 2 - Connection-based publishing (uses pre-existing connection):** -```julia function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - try - NATS.publish(conn, subject, message) # Publish message to NATS - log_trace(correlation_id, "Message published to $subject") # Log successful publish - finally - NATS.drain(conn) # Ensure connection is closed properly - end + # Uses pre-existing connection +end + +# Type-specific serialization +function _serialize_data(data::String, payload_type::String) + # Text handling +end + +function _serialize_data(data::Dict, payload_type::String) + # Dictionary handling +end + +function _serialize_data(data::DataFrame, payload_type::String) + # Table handling end ``` -**Use Case:** Use the connection-based overload when you already have an established NATS connection and want to publish multiple messages without the overhead of creating a new connection for each publish. This is a Julia-specific optimization that leverages function overloading. +### JavaScript: Prototype + Async Pattern -**Integration with smartsend:** -```julia -# When NATS_connection is provided to smartsend, it uses the connection-based publish_message -env, env_json_str = smartsend( - "my.subject", - [("data", payload_data, "type")], - NATS_connection=my_connection, # Pre-existing connection - is_publish=true -) -# Uses: publish_message(NATS_connection, subject, env_json_str, cid) +```javascript +// Class-based NATS client +class NATSClient { + constructor(url) { + this.url = url; + } + + async connect() { + // Connection logic + } + + async publish(subject, message) { + // Publish logic + } +} -# When NATS_connection is not provided, it uses the URL-based publish_message -env, env_json_str = smartsend( - "my.subject", - [("data", payload_data, "type")], - broker_url="nats://localhost:4222", - is_publish=true -) -# Uses: publish_message(broker_url, subject, env_json_str, cid) +// Module-level utility functions +function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + const r = Math.random() * 16 | 0; + return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); +} + +async function serializeData(data, payload_type) { + // Serialization logic +} ``` -## Scenario Implementations +### Python: Class-Based Pattern + +```python +class NATSBridge: + """Main bridge class.""" + + def __init__(self, broker_url=None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + + async def smartsend(self, subject, data, **kwargs): + """Send data.""" + pass + + async def smartreceive(self, msg, **kwargs): + """Receive message.""" + pass + +# Module-level convenience functions +def smartsend(subject, data, **kwargs): + """Convenience function using default NATSBridge instance.""" + bridge = NATSBridge() + return await bridge.smartsend(subject, data, **kwargs) + +def smartreceive(msg, **kwargs): + """Convenience function using default NATSBridge instance.""" + bridge = NATSBridge() + return await bridge.smartreceive(msg, **kwargs) +``` + +--- + +## Scenario Implementations (Cross-Platform) ### Scenario 1: Command & Control (Small Dictionary) -**Julia (Sender/Receiver):** -```julia -# Subscribe to control subject -# Parse JSON envelope -# Execute simulation with parameters -# Send acknowledgment -``` +| Platform | Code | +|----------|------| +| **Julia** | ```julia
config = Dict("step_size" => 0.01)
env, env_json_str = smartsend("control", [("config", config, "dictionary")])``` | +| **JavaScript** | ```javascript
const config = { step_size: 0.01 };
[env, env_json_str] = await smartsend("control", [["config", config, "dictionary"]]);``` | +| **Python** | ```python
config = {"step_size": 0.01}
env, env_json_str = await smartsend("control", [("config", config, "dictionary")])``` | ### Scenario 2: Deep Dive Analysis (Large Arrow Table) -**Julia (Sender/Receiver):** -```julia -# Create large DataFrame -# Convert to Arrow IPC stream -# Check size (> 1MB) -# Upload to HTTP server -# Publish NATS with URL -``` +| Platform | Code | +|----------|------| +| **Julia** | ```julia
df = DataFrame(id=1:1000000, value=rand(1000000))
env, env_json_str = smartsend("analysis", [("table", df, "table")])``` | +| **JavaScript** | ```javascript
const df = [{ id: 1, value: 0.5 }, ...];
[env, env_json_str] = await smartsend("analysis", [["table", df, "table"]]);``` | +| **Python** | ```python
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "value": np.random.rand(1000000)})
env, env_json_str = await smartsend("analysis", [("table", df, "table")])``` | -### Scenario 3: Live Audio Processing +### Scenario 3: Chat System (Multi-Payload) -**Julia (Sender/Receiver):** -```julia -# Receive audio data -# Perform FFT or AI transcription -# Send results back (JSON + Arrow table) -``` +| Platform | Code | +|----------|------| +| **Julia** | ```julia
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = smartsend("chat", chat)``` | +| **JavaScript** | ```javascript
const chat = [["text", "Hello!", "text"], ["image", imgBuffer, "image"]];
[env, env_json_str] = await smartsend("chat", chat);``` | +| **Python** | ```python
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = await smartsend("chat", chat)``` | -### Scenario 4: Catch-Up (JetStream) +--- -**Julia (Producer/Consumer):** -```julia -# Publish to JetStream -# Include metadata for temporal tracking -``` - -### Scenario 5: Selection (Low Bandwidth) - -**Focus:** Small Arrow tables. The Action: Julia wants to send a small DataFrame to show on a receiving application for the user to choose. - -**Julia (Sender/Receiver):** -```julia -# Create small DataFrame (e.g., 50KB - 500KB) -# Convert to Arrow IPC stream -# Check payload size (< 1MB threshold) -# Publish directly to NATS with Base64-encoded payload -# Include metadata for dashboard selection context -``` - -### Scenario 6: Chat System - -**Focus:** Every conversational message is composed of any number and any combination of components, spanning the full spectrum from small to large. This includes text, images, audio, video, tables, and files—specifically accommodating everything from brief snippets to high-resolution images, large audio files, extensive tables, and massive documents. Support for claim-check delivery and full bi-directional messaging. - -**Multi-Payload Support:** The system supports mixed-payload messages where a single message can contain multiple payloads with different transport strategies. The `smartreceive` function iterates through all payloads in the envelope and processes each according to its transport type. - -**Julia (Sender/Receiver):** -```julia -# Build chat message with mixed payloads: -# - Text: direct transport (Base64) -# - Small images: direct transport (Base64) -# - Large images: link transport (HTTP URL) -# - Audio/video: link transport (HTTP URL) -# - Tables: direct or link depending on size -# - Files: link transport (HTTP URL) -# -# Each payload uses appropriate transport strategy: -# - Size < 1MB → direct (NATS + Base64) -# - Size >= 1MB → link (HTTP upload + NATS URL) -# -# Include claim-check metadata for delivery tracking -# Support bidirectional messaging with replyTo fields -``` - -**Use Case:** Full-featured chat system supporting rich media. User can send text, small images directly, or upload large files that get uploaded to HTTP server and referenced via URLs. Claim-check pattern ensures reliable delivery tracking for all message components. - -**Implementation Note:** The `smartreceive` function iterates through all payloads in the envelope and processes each according to its transport type. See the standard API format in Section 1: `msg_envelope_v1` supports `Vector{msg_payload_v1}` for multiple payloads. - -## Performance Considerations +## Performance Considerations (Cross-Platform) ### Zero-Copy Reading -- Use Arrow's memory-mapped file reading -- Avoid unnecessary data copying during deserialization -- Use Apache Arrow's native IPC reader + +| Platform | Strategy | +|----------|----------| +| **Julia** | `Arrow.read()` with memory-mapped files | +| **JavaScript** | `ArrayBuffer` with `DataView` | +| **Python** | `pyarrow` memory mapping | +| **MicroPython** | Not available (streaming only) | ### Exponential Backoff -- Implement exponential backoff for HTTP link fetching -- Maximum retry count: 5 -- Base delay: 100ms, max delay: 5000ms + +```python +# Python/MicroPython +async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): + delay = base_delay + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.read() + except Exception as e: + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + raise Exception("Failed to fetch after max retries") +``` ### Correlation ID Logging -- Log correlation_id at every stage -- Include: send, receive, serialize, deserialize -- Use structured logging format -## Testing Strategy +All platforms use correlation IDs for distributed tracing: + +``` +[timestamp] [Correlation: abc123] Message published to subject +``` + +--- + +## Testing Strategy (Cross-Platform) ### Unit Tests -- Test smartsend with various payload sizes -- Test smartreceive with direct and link transport -- Test Arrow IPC serialization/deserialization + +| Test Type | Julia | JavaScript | Python | +|-----------|-------|------------|--------| +| **Serialization** | `test/test_julia_text_sender.jl` | `test/test_js_text_sender.js` | `test/test_py_text_sender.py` | +| **Deserialization** | `test/test_julia_text_receiver.jl` | `test/test_js_text_receiver.js` | `test/test_py_text_receiver.py` | +| **Large Payload** | `test/test_julia_file_sender.jl` | `test/test_js_file_sender.js` | `test/test_py_file_sender.py` | +| **Multi-Payload** | `test/test_julia_mix_payloads_sender.jl` | `test/test_js_mix_payloads_sender.js` | `test/test_py_mix_payloads_sender.py` | ### Integration Tests -- Test full flow with NATS server -- Test large data transfer (> 100MB) -- Test audio processing pipeline -### Performance Tests -- Measure throughput for small payloads -- Measure throughput for large payloads +- NATS server communication +- File server upload/download +- Cross-platform message exchange + +--- + +## Configuration + +### Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `NATS_URL` | `nats://localhost:4222` | NATS server URL | +| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | +| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | + +### MicroPython-Specific Configuration + +```python +# micropython.conf +NATS_URL = "nats://broker.local:4222" +FILESERVER_URL = "http://fileserver.local:8080" +SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices +MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython +``` + +--- + +## Summary + +This cross-platform NATS bridge provides: + +1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across Julia, JavaScript, and Python/MicroPython +2. **Idiomatic Implementations**: + - Julia: Multiple dispatch and struct-based design + - JavaScript: Async/await and prototype-based utilities + - Python: Class-based design with type hints +3. **Message Format Consistency**: Identical `msg_envelope_v1` and `msg_payload_v1` JSON schemas +4. **Handler Abstraction**: File server operations abstracted through configurable handlers +5. **Platform-Specific Optimizations**: Arrow IPC support in desktop platforms, streaming support in MicroPython + +The Julia implementation serves as the **ground truth** for API design and behavior, while JavaScript and Python implementations maintain interface parity while leveraging their respective language idioms. \ No newline at end of file diff --git a/docs/expanded_architecture.md b/docs/expanded_architecture.md deleted file mode 100644 index 6d12eec..0000000 --- a/docs/expanded_architecture.md +++ /dev/null @@ -1,1136 +0,0 @@ -# Cross-Platform Architecture Documentation: Bi-Directional Data Bridge - -## Overview - -This document describes the architecture for a high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. - -**Supported Platforms:** -- **Julia** - Ground truth implementation with full feature set -- **JavaScript** - Node.js and browser-compatible implementation -- **Python/MicroPython** - Desktop and embedded-compatible implementation - -### Cross-Platform Design Principles - -1. **High-Level API Parity**: All three platforms expose the same `smartsend()` and `smartreceive()` functions with identical signatures and behavior -2. **Idiomatic Implementations**: Each platform uses its native patterns (multiple dispatch in Julia, async/prototype in JS, class-based in Python) -3. **Message Format Consistency**: The `msg_envelope_v1` and `msg_payload_v1` JSON schemas are identical across all platforms -4. **Handler Function Abstraction**: File server operations are abstracted through handler functions for backend flexibility - ---- - -## High-Level API Standard (Cross-Platform) - -### Unified API Signature - -All three platforms expose the same high-level API: - -**Input Format (smartsend):** -``` -[(dataname1, data1, type1), (dataname2, data2, type2), ...] -``` - -**Output Format (smartreceive):** -``` -{ - "correlation_id": "...", - "msg_id": "...", - "timestamp": "...", - "send_to": "...", - "msg_purpose": "...", - "sender_name": "...", - "sender_id": "...", - "receiver_name": "...", - "receiver_id": "...", - "reply_to": "...", - "reply_to_msg_id": "...", - "broker_url": "...", - "metadata": {...}, - "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -} -``` - -### Supported Payload Types - -| Type | Julia | JavaScript | Python/MicroPython | -|------|-------|------------|-------------------| -| `text` | `String` | `string` | `str` | -| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | -| `table` | `DataFrame`, `Arrow.Table` | `Array`, `Buffer` (Arrow) | `pandas.DataFrame`, `bytes` (Arrow) | -| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | -| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | -| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | -| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray`, `io.BytesIO` | - -### Cross-Platform API Examples - -**Julia:** -```julia -using NATSBridge - -# Send -env, env_json_str = smartsend( - "/chat", - [("message", "Hello!", "text"), ("image", image_bytes, "image")], - broker_url="nats://localhost:4222" -) - -# Receive -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) -# env["payloads"] = [("message", "Hello!", "text"), ("image", bytes, "image")] -``` - -**JavaScript:** -```javascript -const NATSBridge = require('natbridge'); - -// Send -const [env, env_json_str] = await NATSBridge.smartsend( - "/chat", - [ - ["message", "Hello!", "text"], - ["image", imageBuffer, "image"] - ], - { broker_url: "nats://localhost:4222" } -); - -// Receive -const env = await NATSBridge.smartreceive(msg, { - fileserver_download_handler: fetchWithBackoff -}); -// env.payloads = [["message", "Hello!", "text"], ["image", bytes, "image"]] -``` - -**Python:** -```python -from natbridge import NATSBridge - -# Send -env, env_json_str = NATSBridge.smartsend( - "/chat", - [("message", "Hello!", "text"), ("image", image_bytes, "image")], - broker_url="nats://localhost:4222" -) - -# Receive -env = NATSBridge.smartreceive( - msg, - fileserver_download_handler=fetch_with_backoff -) -# env["payloads"] = [("message", "Hello!", "text"), ("image", bytes, "image")] -``` - -**MicroPython:** -```python -from natbridge import NATSBridge - -# Send (limited to direct transport due to memory constraints) -env, env_json_str = NATSBridge.smartsend( - "/chat", - [("message", "Hello!", "text")], - broker_url="nats://localhost:4222" -) -``` - ---- - -## Architecture Diagram (Cross-Platform) - -```mermaid -flowchart TB - subgraph JuliaApp["Julia Application"] - JuliaAppCode[App Code] - JuliaBridge[NATSBridge.jl] - JuliaNATS[NATS.jl] - end - - subgraph JSApp["JavaScript Application"] - JSAppCode[App Code] - JSBridge[NATSBridge.js] - JSNATS[nats.js] - end - - subgraph PythonApp["Python/MicroPython Application"] - PythonAppCode[App Code] - PythonBridge[NATSBridge.py] - PythonNATS[nats.py] - end - - subgraph Infrastructure["Infrastructure"] - NATS[NATS Server
Message Broker] - FileServer[HTTP File Server
Upload/Download] - end - - JuliaAppCode --> JuliaBridge - JuliaBridge --> JuliaNATS - JSAppCode --> JSBridge - JSBridge --> JSNATS - PythonAppCode --> PythonBridge - PythonBridge --> PythonNATS - - JuliaNATS --> NATS - JSNATS --> NATS - PythonNATS --> NATS - - NATS --> JuliaNATS - NATS --> JSNATS - NATS --> PythonNATS - - JuliaBridge -.->|HTTP POST upload| FileServer - JSBridge -.->|HTTP POST upload| FileServer - PythonBridge -.->|HTTP POST upload| FileServer - - FileServer -.->|HTTP GET download| JuliaBridge - FileServer -.->|HTTP GET download| JSBridge - FileServer -.->|HTTP GET download| PythonBridge - - style JuliaApp fill:#c5e1a5 - style JSApp fill:#bbdefb - style PythonApp fill:#f8bbd0 - style NATS fill:#fff3e0 - style FileServer fill:#f3e5f5 -``` - ---- - -## System Components - -### 1. msg_envelope_v1 - Message Envelope - -**JSON Schema (Identical Across All Platforms):** -```json -{ - "correlation_id": "uuid-v4-string", - "msg_id": "uuid-v4-string", - "timestamp": "2024-01-15T10:30:00Z", - - "send_to": "topic/subject", - "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", - "sender_name": "agent-wine-web-frontend", - "sender_id": "uuid4", - "receiver_name": "agent-backend", - "receiver_id": "uuid4", - "reply_to": "topic", - "reply_to_msg_id": "uuid4", - "broker_url": "nats://localhost:4222", - - "metadata": { - "content_type": "application/octet-stream", - "content_length": 123456 - }, - - "payloads": [ - { - "id": "uuid4", - "dataname": "login_image", - "payload_type": "image", - "transport": "direct", - "encoding": "base64", - "size": 15433, - "data": "base64-encoded-string", - "metadata": { - "checksum": "sha256_hash" - } - }, - { - "id": "uuid4", - "dataname": "large_table", - "payload_type": "table", - "transport": "link", - "encoding": "none", - "size": 524288, - "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow", - "metadata": {} - } - ] -} -``` - -### 2. msg_payload_v1 - Payload Structure - -**JSON Schema (Identical Across All Platforms):** -```json -{ - "id": "uuid4", - "dataname": "login_image", - "payload_type": "image | dictionary | table | text | audio | video | binary", - "transport": "direct | link", - "encoding": "none | json | base64 | arrow-ipc", - "size": 15433, - "data": "base64-encoded-string | http-url", - "metadata": { - "checksum": "sha256_hash" - } -} -``` - -### 3. Transport Strategy Decision Logic (Cross-Platform) - -``` -┌─────────────────────────────────────────────────────────────┐ -│ smartsend Function (All Platforms) │ -│ Accepts: [(dataname1, data1, type1), ...] │ -│ (Type is per payload, not standalone) │ -└─────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ For each payload: │ -│ 1. Extract type from tuple/array │ -│ 2. Serialize based on type │ -│ 3. Check payload size │ -└─────────────────────────────────────────────────────────────┘ - │ - ┌───────────┴────────────┐ - ▼ ▼ - ┌──────────────┐ ┌──────────────┐ - │ Direct Path │ │ Link Path │ - │ (< 1MB) │ │ (>= 1MB) │ - │ │ │ │ - │ • Serialize │ │ • Serialize │ - │ to buffer │ │ to buffer │ - │ • Base64 │ │ • Upload to │ - │ encode │ │ HTTP Server│ - │ • Publish to │ │ • Publish to │ - │ NATS │ │ NATS with │ - │ (in msg) │ │ URL │ - └──────────────┘ └──────────────┘ -``` - ---- - -## Platform-Specific Implementations - -### Julia Implementation - -#### Architecture Patterns - -**Multiple Dispatch:** Julia's core strength is leveraged through function overloading: - -```julia -# publish_message has two overloads based on argument types -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - conn = NATS.connect(broker_url) - publish_message(conn, subject, message, correlation_id) -end - -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - try - NATS.publish(conn, subject, message) - log_trace(correlation_id, "Message published to $subject") - finally - NATS.drain(conn) - end -end -``` - -**Struct-Based Data Models:** -```julia -struct msg_payload_v1 - id::String - dataname::String - payload_type::String - transport::String - encoding::String - size::Integer - data::Any - metadata::Dict{String, Any} -end - -struct msg_envelope_v1 - correlation_id::String - msg_id::String - timestamp::String - send_to::String - msg_purpose::String - sender_name::String - sender_id::String - receiver_name::String - receiver_id::String - reply_to::String - reply_to_msg_id::String - broker_url::String - metadata::Dict{String, Any} - payloads::Vector{msg_payload_v1} -end -``` - -#### Dependencies - -| Package | Purpose | -|---------|---------| -| `NATS.jl` | Core NATS functionality | -| `Arrow.jl` | Arrow IPC serialization | -| `JSON3.jl` | JSON parsing | -| `HTTP.jl` | HTTP client for file server | -| `UUIDs.jl` | UUID generation | -| `Dates.jl` | Timestamps | -| `Base64` | Base64 encoding | - -#### File Server Handler Signatures - -```julia -# Upload handler -fileserver_upload_handler( - fileserver_url::String, - dataname::String, - data::Vector{UInt8} -)::Dict{String, Any} - -# Download handler -fileserver_download_handler( - url::String, - max_retries::Int, - base_delay::Int, - max_delay::Int, - correlation_id::String -)::Vector{UInt8} -``` - -#### Key Functions - -```julia -# Main send/receive functions -function smartsend( - subject::String, - data::AbstractArray{Tuple{String, Any, String}, 1}; - broker_url::String = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler::Function = plik_oneshot_upload, - size_threshold::Int = DEFAULT_SIZE_THRESHOLD, - correlation_id::String = string(uuid4()), - msg_purpose::String = "chat", - sender_name::String = "NATSBridge", - receiver_name::String = "", - receiver_id::String = "", - reply_to::String = "", - reply_to_msg_id::String = "", - is_publish::Bool = true, - NATS_connection::Union{NATS.Connection, Nothing} = nothing, - msg_id::String = string(uuid4()), - sender_id::String = string(uuid4()) -)::Tuple{msg_envelope_v1, String} - -function smartreceive( - msg::NATS.Msg; - fileserver_download_handler::Function = _fetch_with_backoff, - max_retries::Int = 5, - base_delay::Int = 100, - max_delay::Int = 5000 -)::JSON.Object{String, Any} -``` - ---- - -### JavaScript Implementation - -#### Architecture Patterns - -**Async/Await Pattern:** JavaScript uses async/await for non-blocking I/O: - -```javascript -// smartsend is async and returns a Promise -async function smartsend(subject, data, options = {}) { - const { - broker_url = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler = plikOneshotUpload, - size_threshold = DEFAULT_SIZE_THRESHOLD, - correlation_id = generateUUID(), - msg_purpose = "chat", - sender_name = "NATSBridge", - receiver_name = "", - receiver_id = "", - reply_to = "", - reply_to_msg_id = "", - is_publish = true, - nats_connection = null, - msg_id = generateUUID(), - sender_id = generateUUID() - } = options; - - // Process payloads - const payloads = []; - for (const [dataname, payloadData, payloadType] of data) { - const payloadBytes = await serializeData(payloadData, payloadType); - const payloadSize = payloadBytes.byteLength; - - if (payloadSize < size_threshold) { - // Direct path - const payloadB64 = base64Encode(payloadBytes); - payloads.push({ - id: generateUUID(), - dataname, - payload_type: payloadType, - transport: "direct", - encoding: "base64", - size: payloadSize, - data: payloadB64 - }); - } else { - // Link path - const response = await fileserver_upload_handler( - fileserver_url, dataname, payloadBytes - ); - payloads.push({ - id: generateUUID(), - dataname, - payload_type: payloadType, - transport: "link", - encoding: "none", - size: payloadSize, - data: response.url - }); - } - } - - const env = buildEnvelope(subject, payloads, { - correlation_id, msg_id, msg_purpose, - sender_name, sender_id, receiver_name, - receiver_id, reply_to, reply_to_msg_id, - broker_url - }); - - const env_json_str = JSON.stringify(env); - - if (is_publish) { - if (nats_connection) { - await publishMessage(nats_connection, subject, env_json_str, correlation_id); - } else { - await publishMessage(broker_url, subject, env_json_str, correlation_id); - } - } - - return [env, env_json_str]; -} -``` - -**Prototype-Based Utilities:** -```javascript -// NATS client wrapper (prototype-based) -class NATSClient { - constructor(url) { - this.url = url; - this.connection = null; - } - - async connect() { - this.connection = await nats.connect({ servers: this.url }); - return this.connection; - } - - async publish(subject, message) { - if (!this.connection) { - await this.connect(); - } - await this.connection.publish(subject, message); - } - - async close() { - if (this.connection) { - this.connection.close(); - } - } -} -``` - -#### Dependencies (Node.js) - -| Package | Purpose | -|---------|---------| -| `nats` | Core NATS functionality (nats.js) | -| `uuid` | UUID generation | -| `node-fetch` or `axios` | HTTP client for file server | -| `apache-arrow` | Arrow IPC serialization | - -#### Dependencies (Browser) - -| Package | Purpose | -|---------|---------| -| `nats` | Browser-compatible NATS client | -| `uuid` | UUID generation | -| `fetch` (native) | HTTP client for file server | -| `apache-arrow` | Arrow IPC serialization | - -#### Dependencies (MicroPython) - -| Module | Purpose | -|--------|---------| -| `nats` (custom) | MicroPython NATS client | -| `time` | Timestamps | -| `uos` | File operations | -| `base64` | Base64 encoding | - -#### File Server Handler Signatures - -```javascript -// Upload handler - async function returning Promise -async function fileserver_upload_handler( - fileserver_url, - dataname, - data // Uint8Array -) { - // Returns: { status, uploadid, fileid, url } -} - -// Download handler - async function returning Promise -async function fileserver_download_handler( - url, - max_retries, - base_delay, - max_delay, - correlation_id -) { - // Returns: Uint8Array -} -``` - -#### Key Functions - -```javascript -// Main send/receive functions -async function smartsend(subject, data, options = {}) { - // data: Array of [dataname, data, type] tuples - // Returns: Promise<[env, env_json_str]> -} - -async function smartreceive(msg, options = {}) { - // msg: NATS message object - // Returns: Promise -} - -// Utility functions -async function serializeData(data, payload_type) { - // Returns: Uint8Array -} - -async function deserializeData(data, payload_type) { - // Returns: deserialized data -} - -async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { - // Returns: Uint8Array -} -``` - ---- - -### Python/MicroPython Implementation - -#### Architecture Patterns - -**Class-Based Design:** Python uses classes for stateful operations: - -```python -class NATSBridge: - """Cross-platform NATS bridge implementation.""" - - DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB - DEFAULT_BROKER_URL = "nats://localhost:4222" - DEFAULT_FILESERVER_URL = "http://localhost:8080" - - def __init__(self, broker_url=None, fileserver_url=None): - self.broker_url = broker_url or self.DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or self.DEFAULT_FILESERVER_URL - self._nats_client = None - - async def smartsend(self, subject, data, **kwargs): - """ - Send data via NATS with automatic transport selection. - - Args: - subject: NATS subject to publish to - data: List of (dataname, data, type) tuples - **kwargs: Additional options (broker_url, fileserver_url, etc.) - - Returns: - Tuple of (env, env_json_str) - """ - # Extract options with defaults - options = self._merge_options(kwargs) - - # Process payloads - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = self._serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - if payload_size < options['size_threshold']: - # Direct path - payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') - payloads.append({ - 'id': uuid.uuid4().hex, - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64 - }) - else: - # Link path - response = await options['fileserver_upload_handler']( - options['fileserver_url'], dataname, payload_bytes - ) - payloads.append({ - 'id': uuid.uuid4().hex, - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response['url'] - }) - - # Build envelope - env = self._build_envelope(subject, payloads, options) - env_json_str = json.dumps(env) - - if options['is_publish']: - await self._publish_message( - subject, env_json_str, options['correlation_id'], - nats_connection=options.get('nats_connection') - ) - - return env, env_json_str - - async def smartreceive(self, msg, **kwargs): - """ - Receive and process NATS message. - - Args: - msg: NATS message object - **kwargs: Additional options (fileserver_download_handler, etc.) - - Returns: - Dict with envelope metadata and payloads - """ - # Parse envelope - env_json_obj = json.loads(msg.payload) - - # Process payloads - payloads_list = [] - for payload in env_json_obj['payloads']: - transport = payload['transport'] - dataname = payload['dataname'] - - if transport == 'direct': - payload_b64 = payload['data'] - payload_bytes = base64.b64decode(payload_b64) - data_type = payload['payload_type'] - data = self._deserialize_data(payload_bytes, data_type) - payloads_list.append((dataname, data, data_type)) - elif transport == 'link': - url = payload['data'] - downloaded_data = await options['fileserver_download_handler']( - url, - options['max_retries'], - options['base_delay'], - options['max_delay'], - env_json_obj['correlation_id'] - ) - data_type = payload['payload_type'] - data = self._deserialize_data(downloaded_data, data_type) - payloads_list.append((dataname, data, data_type)) - - env_json_obj['payloads'] = payloads_list - return env_json_obj -``` - -**Dataclass for Type Safety:** -```python -from dataclasses import dataclass, field -from typing import Any, Dict, List, Tuple, Union - -@dataclass -class MsgPayloadV1: - """Message payload structure.""" - id: str - dataname: str - payload_type: str - transport: str - encoding: str - size: int - data: Union[str, bytes] # URL for link, base64 for direct - metadata: Dict[str, Any] = field(default_factory=dict) - -@dataclass -class MsgEnvelopeV1: - """Message envelope structure.""" - correlation_id: str - msg_id: str - timestamp: str - send_to: str - msg_purpose: str - sender_name: str - sender_id: str - receiver_name: str - receiver_id: str - reply_to: str - reply_to_msg_id: str - broker_url: str - metadata: Dict[str, Any] = field(default_factory=dict) - payloads: List[MsgPayloadV1] = field(default_factory=list) -``` - -#### Dependencies (Desktop Python) - -| Package | Purpose | -|---------|---------| -| `nats-py` | Core NATS functionality | -| `uuid` | UUID generation (stdlib) | -| `aiohttp` or `requests` | HTTP client for file server | -| `pyarrow` | Arrow IPC serialization | -| `pandas` | DataFrame support (optional) | -| `python-dateutil` | Timestamps | -| `base64` | Base64 encoding (stdlib) | - -#### Dependencies (MicroPython) - -| Module | Purpose | -|--------|---------| -| `network` | NATS connection (custom) | -| `time` | Timestamps | -| `uos` | File operations | -| `base64` | Base64 encoding | -| `json` | JSON parsing | -| `struct` | Binary data handling | - -**MicroPython Limitations:** -- No Arrow IPC support (memory constraints) -- Only direct transport (< 1MB threshold enforced) -- Simplified UUID generation -- No async/await (use callbacks or uasyncio) - -#### File Server Handler Signatures - -```python -# Upload handler - async function -async def fileserver_upload_handler( - fileserver_url: str, - dataname: str, - data: bytes -) -> Dict[str, Any]: - """ - Upload data to file server. - - Args: - fileserver_url: Base URL of file server - dataname: Name of the file - data: Binary data - - Returns: - Dict with keys: 'status', 'uploadid', 'fileid', 'url' - """ - pass - -# Download handler - async function -async def fileserver_download_handler( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """ - Download data from URL with exponential backoff. - - Args: - url: URL to download from - max_retries: Maximum retry attempts - base_delay: Initial delay in ms - max_delay: Maximum delay in ms - correlation_id: Correlation ID for logging - - Returns: - Downloaded bytes - """ - pass -``` - -#### Key Functions - -```python -# Main send/receive functions (standalone or class methods) -async def smartsend( - subject: str, - data: List[Tuple[str, Any, str]], - broker_url: str = DEFAULT_BROKER_URL, - fileserver_url: str = DEFAULT_FILESERVER_URL, - fileserver_upload_handler: Callable = plik_oneshot_upload, - size_threshold: int = DEFAULT_SIZE_THRESHOLD, - correlation_id: str = None, - msg_purpose: str = "chat", - sender_name: str = "NATSBridge", - receiver_name: str = "", - receiver_id: str = "", - reply_to: str = "", - reply_to_msg_id: str = "", - is_publish: bool = True, - nats_connection: Any = None, - msg_id: str = None, - sender_id: str = None -) -> Tuple[Dict, str]: - """Send data via NATS.""" - pass - -async def smartreceive( - msg: Any, - fileserver_download_handler: Callable = fetch_with_backoff, - max_retries: int = 5, - base_delay: int = 100, - max_delay: int = 5000 -) -> Dict: - """Receive and process NATS message.""" - pass - -# Utility functions -def _serialize_data(data: Any, payload_type: str) -> bytes: - """Serialize data to bytes.""" - pass - -def _deserialize_data(data: bytes, payload_type: str) -> Any: - """Deserialize bytes to data.""" - pass - -async def fetch_with_backoff( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """Fetch URL with exponential backoff.""" - pass -``` - ---- - -## Platform Comparison Matrix - -| Feature | Julia | JavaScript | Python | MicroPython | -|---------|-------|------------|--------|-------------| -| **Multiple Dispatch** | ✅ Native | ❌ (Prototypes) | ❌ (Overload via `@overload`) | ❌ | -| **Async/Await** | ❌ (Tasks) | ✅ Native | ✅ Native | ⚠️ (uasyncio) | -| **Type Safety** | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | -| **Memory Management** | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | -| **Arrow IPC** | ✅ Native | ✅ (arrow package) | ✅ (pyarrow) | ❌ | -| **Direct Transport** | ✅ | ✅ | ✅ | ✅ | -| **Link Transport** | ✅ | ✅ | ✅ | ⚠️ (Limited) | -| **Handler Functions** | ✅ | ✅ | ✅ | ✅ | -| **Cross-Platform API** | ✅ | ✅ | ✅ | ✅ | - ---- - -## Implementation Details by Platform - -### Julia: Multiple Dispatch Pattern - -```julia -# Function overloading based on argument types -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - # Creates new connection -end - -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - # Uses pre-existing connection -end - -# Type-specific serialization -function _serialize_data(data::String, payload_type::String) - # Text handling -end - -function _serialize_data(data::Dict, payload_type::String) - # Dictionary handling -end - -function _serialize_data(data::DataFrame, payload_type::String) - # Table handling -end -``` - -### JavaScript: Prototype + Async Pattern - -```javascript -// Class-based NATS client -class NATSClient { - constructor(url) { - this.url = url; - } - - async connect() { - // Connection logic - } - - async publish(subject, message) { - // Publish logic - } -} - -// Module-level utility functions -function generateUUID() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { - const r = Math.random() * 16 | 0; - return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); - }); -} - -async function serializeData(data, payload_type) { - // Serialization logic -} -``` - -### Python: Class-Based Pattern - -```python -class NATSBridge: - """Main bridge class.""" - - def __init__(self, broker_url=None): - self.broker_url = broker_url or DEFAULT_BROKER_URL - - async def smartsend(self, subject, data, **kwargs): - """Send data.""" - pass - - async def smartreceive(self, msg, **kwargs): - """Receive message.""" - pass - -# Module-level convenience functions -def smartsend(subject, data, **kwargs): - """Convenience function using default NATSBridge instance.""" - bridge = NATSBridge() - return await bridge.smartsend(subject, data, **kwargs) - -def smartreceive(msg, **kwargs): - """Convenience function using default NATSBridge instance.""" - bridge = NATSBridge() - return await bridge.smartreceive(msg, **kwargs) -``` - ---- - -## Scenario Implementations (Cross-Platform) - -### Scenario 1: Command & Control (Small Dictionary) - -| Platform | Code | -|----------|------| -| **Julia** | ```julia
config = Dict("step_size" => 0.01)
env, env_json_str = smartsend("control", [("config", config, "dictionary")])``` | -| **JavaScript** | ```javascript
const config = { step_size: 0.01 };
[env, env_json_str] = await smartsend("control", [["config", config, "dictionary"]]);``` | -| **Python** | ```python
config = {"step_size": 0.01}
env, env_json_str = await smartsend("control", [("config", config, "dictionary")])``` | - -### Scenario 2: Deep Dive Analysis (Large Arrow Table) - -| Platform | Code | -|----------|------| -| **Julia** | ```julia
df = DataFrame(id=1:1000000, value=rand(1000000))
env, env_json_str = smartsend("analysis", [("table", df, "table")])``` | -| **JavaScript** | ```javascript
const df = [{ id: 1, value: 0.5 }, ...];
[env, env_json_str] = await smartsend("analysis", [["table", df, "table"]]);``` | -| **Python** | ```python
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "value": np.random.rand(1000000)})
env, env_json_str = await smartsend("analysis", [("table", df, "table")])``` | - -### Scenario 3: Chat System (Multi-Payload) - -| Platform | Code | -|----------|------| -| **Julia** | ```julia
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = smartsend("chat", chat)``` | -| **JavaScript** | ```javascript
const chat = [["text", "Hello!", "text"], ["image", imgBuffer, "image"]];
[env, env_json_str] = await smartsend("chat", chat);``` | -| **Python** | ```python
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = await smartsend("chat", chat)``` | - ---- - -## Performance Considerations (Cross-Platform) - -### Zero-Copy Reading - -| Platform | Strategy | -|----------|----------| -| **Julia** | `Arrow.read()` with memory-mapped files | -| **JavaScript** | `ArrayBuffer` with `DataView` | -| **Python** | `pyarrow` memory mapping | -| **MicroPython** | Not available (streaming only) | - -### Exponential Backoff - -```python -# Python/MicroPython -async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): - delay = base_delay - for attempt in range(1, max_retries + 1): - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - return await response.read() - except Exception as e: - if attempt < max_retries: - await asyncio.sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - raise Exception("Failed to fetch after max retries") -``` - -### Correlation ID Logging - -All platforms use correlation IDs for distributed tracing: - -``` -[timestamp] [Correlation: abc123] Message published to subject -``` - ---- - -## Testing Strategy (Cross-Platform) - -### Unit Tests - -| Test Type | Julia | JavaScript | Python | -|-----------|-------|------------|--------| -| **Serialization** | `test/test_julia_text_sender.jl` | `test/test_js_text_sender.js` | `test/test_py_text_sender.py` | -| **Deserialization** | `test/test_julia_text_receiver.jl` | `test/test_js_text_receiver.js` | `test/test_py_text_receiver.py` | -| **Large Payload** | `test/test_julia_file_sender.jl` | `test/test_js_file_sender.js` | `test/test_py_file_sender.py` | -| **Multi-Payload** | `test/test_julia_mix_payloads_sender.jl` | `test/test_js_mix_payloads_sender.js` | `test/test_py_mix_payloads_sender.py` | - -### Integration Tests - -- NATS server communication -- File server upload/download -- Cross-platform message exchange - ---- - -## Configuration - -### Environment Variables - -| Variable | Default | Description | -|----------|---------|-------------| -| `NATS_URL` | `nats://localhost:4222` | NATS server URL | -| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | -| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | - -### MicroPython-Specific Configuration - -```python -# micropython.conf -NATS_URL = "nats://broker.local:4222" -FILESERVER_URL = "http://fileserver.local:8080" -SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices -MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython -``` - ---- - -## Summary - -This cross-platform NATS bridge provides: - -1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across Julia, JavaScript, and Python/MicroPython -2. **Idiomatic Implementations**: - - Julia: Multiple dispatch and struct-based design - - JavaScript: Async/await and prototype-based utilities - - Python: Class-based design with type hints -3. **Message Format Consistency**: Identical `msg_envelope_v1` and `msg_payload_v1` JSON schemas -4. **Handler Abstraction**: File server operations abstracted through configurable handlers -5. **Platform-Specific Optimizations**: Arrow IPC support in desktop platforms, streaming support in MicroPython - -The Julia implementation serves as the **ground truth** for API design and behavior, while JavaScript and Python implementations maintain interface parity while leveraging their respective language idioms. \ No newline at end of file diff --git a/docs/expanded_implementation.md b/docs/expanded_implementation.md deleted file mode 100644 index 417a150..0000000 --- a/docs/expanded_implementation.md +++ /dev/null @@ -1,1986 +0,0 @@ -# Cross-Platform Implementation Guide: Bi-Directional Data Bridge - -## Overview - -This document describes the implementation of the high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. - -**Supported Platforms:** -- **Julia** - Ground truth implementation (reference) -- **JavaScript** - Node.js and browser implementation -- **Python/MicroPython** - Desktop and embedded implementation - ---- - -## Implementation Files - -| Language | Implementation File | Description | -|----------|---------------------|-------------| -| **Julia** | [`src/NATSBridge.jl`](../src/NATSBridge.jl) | Full Julia implementation with Arrow IPC support | -| **JavaScript** | `src/natbridge.js` | Node.js/browser implementation | -| **Python** | `src/natbridge.py` | Desktop Python implementation | -| **MicroPython** | `src/natbridge_mpy.py` | MicroPython implementation (limited features) | - ---- - -## File Server Handler Architecture - -The system uses **handler functions** to abstract file server operations, allowing support for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). - -### Handler Function Signatures - -#### Julia - -```julia -# Upload handler - uploads data to file server and returns URL -fileserver_upload_handler( - fileserver_url::String, - dataname::String, - data::Vector{UInt8} -)::Dict{String, Any} - -# Download handler - fetches data from file server URL with exponential backoff -fileserver_download_handler( - url::String, - max_retries::Int, - base_delay::Int, - max_delay::Int, - correlation_id::String -)::Vector{UInt8} -``` - -#### JavaScript - -```javascript -// Upload handler - async function -async function fileserver_upload_handler( - fileserver_url, - dataname, - data // Uint8Array -) { - // Returns: { status, uploadid, fileid, url } -} - -// Download handler - async function -async function fileserver_download_handler( - url, - max_retries, - base_delay, - max_delay, - correlation_id -) { - // Returns: Uint8Array -} -``` - -#### Python - -```python -# Upload handler - async function -async def fileserver_upload_handler( - fileserver_url: str, - dataname: str, - data: bytes -) -> Dict[str, Any]: - """ - Upload data to file server. - - Returns: - Dict with keys: 'status', 'uploadid', 'fileid', 'url' - """ - pass - -# Download handler - async function -async def fileserver_download_handler( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """ - Download data from URL with exponential backoff. - - Returns: - Downloaded bytes - """ - pass -``` - -#### MicroPython - -```python -# Upload handler - synchronous (no async in MicroPython) -def fileserver_upload_handler( - fileserver_url: str, - dataname: str, - data: bytearray -) -> Dict: - """ - Upload data to file server (synchronous). - - Returns: - Dict with keys: 'status', 'url' - """ - pass - -# Download handler - synchronous -def fileserver_download_handler( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytearray: - """ - Download data from URL with exponential backoff (synchronous). - - Returns: - Downloaded bytes - """ - pass -``` - ---- - -## Multi-Payload Support (Standard API) - -The system uses a **standardized list-of-tuples format** for all payload operations across all platforms. - -### API Standard - -``` -# Input format for smartsend (always a list of tuples with type info) -[(dataname1, data1, type1), (dataname2, data2, type2), ...] - -# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) -{ - "correlation_id": "...", - "msg_id": "...", - "timestamp": "...", - "send_to": "...", - "msg_purpose": "...", - "sender_name": "...", - "sender_id": "...", - "receiver_name": "...", - "receiver_id": "...", - "reply_to": "...", - "reply_to_msg_id": "...", - "broker_url": "...", - "metadata": {...}, - "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -} -``` - -### Supported Types - -| Type | Julia | JavaScript | Python | MicroPython | -|------|-------|------------|--------|-------------| -| `text` | `String` | `string` | `str` | `str` | -| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | -| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ (not supported) | -| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | -| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | -| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | -| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | - -### Cross-Platform Examples - -#### Julia - -```julia -using NATSBridge - -# Single payload - still wrapped in a list -env, env_json_str = smartsend( - "/test", - [("dataname1", data1, "dictionary")], - broker_url="nats://localhost:4222", - fileserver_upload_handler=plik_oneshot_upload -) - -# Multiple payloads with different types -env, env_json_str = smartsend( - "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], - broker_url="nats://localhost:4222" -) - -# Mixed content (chat with text, image, audio) -env, env_json_str = smartsend( - "/chat", - [ - ("message_text", "Hello!", "text"), - ("user_image", image_data, "image"), - ("audio_clip", audio_data, "audio") - ], - broker_url="nats://localhost:4222" -) - -# Receive returns a JSON object envelope -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) -# env["payloads"] = [("dataname1", data1, type1), ...] -``` - -#### JavaScript - -```javascript -const NATSBridge = require('natbridge'); - -// Single payload -const [env, env_json_str] = await NATSBridge.smartsend( - "/test", - [["dataname1", data1, "dictionary"]], - { - broker_url: "nats://localhost:4222", - fileserver_upload_handler: plikOneshotUpload - } -); - -// Multiple payloads -const [env, env_json_str] = await NATSBridge.smartsend( - "/test", - [ - ["dataname1", data1, "dictionary"], - ["dataname2", data2, "table"] - ], - { broker_url: "nats://localhost:4222" } -); - -// Mixed content -const [env, env_json_str] = await NATSBridge.smartsend( - "/chat", - [ - ["message_text", "Hello!", "text"], - ["user_image", imageData, "image"], - ["audio_clip", audioData, "audio"] - ], - { broker_url: "nats://localhost:4222" } -); - -// Receive -const env = await NATSBridge.smartreceive(msg, { - fileserver_download_handler: fetchWithBackoff -}); -// env.payloads = [["dataname1", data1, type1], ...] -``` - -#### Python - -```python -from natbridge import NATSBridge - -# Single payload -env, env_json_str = await NATSBridge.smartsend( - "/test", - [("dataname1", data1, "dictionary")], - broker_url="nats://localhost:4222", - fileserver_upload_handler=plik_oneshot_upload -) - -# Multiple payloads -env, env_json_str = await NATSBridge.smartsend( - "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], - broker_url="nats://localhost:4222" -) - -# Mixed content -env, env_json_str = await NATSBridge.smartsend( - "/chat", - [ - ("message_text", "Hello!", "text"), - ("user_image", image_data, "image"), - ("audio_clip", audio_data, "audio") - ], - broker_url="nats://localhost:4222" -) - -# Receive -env = await NATSBridge.smartreceive( - msg, - fileserver_download_handler=fetch_with_backoff -) -# env["payloads"] = [("dataname1", data1, type1), ...] -``` - -#### MicroPython - -```python -from natbridge import NATSBridge - -# Limited to text and binary (no tables due to memory constraints) -env, env_json_str = NATSBridge.smartsend( - "/chat", - [ - ("message_text", "Hello!", "text"), - ("binary_data", data_bytes, "binary") - ], - broker_url="nats://localhost:4222", - size_threshold=100000 # Lower threshold for memory constraints -) -# Note: MicroPython uses synchronous handlers -``` - ---- - -## Architecture - -### Cross-Platform Claim-Check Pattern - -```mermaid -flowchart TD - A[SmartSend Function] --> B{Is payload size < 1MB?} - B -->|Yes | C[Direct Path
< 1MB] - B -->|No | D[Link Path
>= 1MB] - - C --> C1[Serialize to Buffer] - C1 --> C2[Base64 encode] - C2 --> C3[Publish to NATS] - - D --> D1[Serialize to Buffer] - D1 --> D2[Upload to HTTP Server] - D2 --> D3[Publish to NATS with URL] - - style A fill:#e1f5ff,stroke:#0066cc,stroke-width:2px - style B fill:#fff4e1,stroke:#cc6600,stroke-width:2px - style C fill:#e8f5e9,stroke:#008000,stroke-width:2px - style D fill:#e8f5e9,stroke:#008000,stroke-width:2px - style C1 fill:#f5f5f5,stroke:#666,stroke-width:1px - style C2 fill:#f5f5f5,stroke:#666,stroke-width:1px - style C3 fill:#f5f5f5,stroke:#666,stroke-width:1px - style D1 fill:#f5f5f5,stroke:#666,stroke-width:1px - style D2 fill:#f5f5f5,stroke:#666,stroke-width:1px - style D3 fill:#f5f5f5,stroke:#666,stroke-width:1px -``` - -**Claim-Check Pattern Overview:** -- **Direct Path** (< 1MB): Payload is serialized, Base64-encoded, and published directly to NATS -- **Link Path** (≥ 1MB): Payload is serialized, uploaded to an HTTP file server, and only the URL is published to NATS (claim-check pattern) - -### smartsend Return Value - -All platforms return a tuple/array containing both the envelope and JSON string: - -#### Julia - -```julia -env, env_json_str = smartsend(...) -# Returns: ::Tuple{msg_envelope_v1, String} -# env::msg_envelope_v1 - The envelope object with all metadata and payloads -# env_json_str::String - JSON string for publishing to NATS -``` - -#### JavaScript - -```javascript -const [env, env_json_str] = await smartsend(...); -// Returns: Promise<[env, env_json_str]> -// env: Object with all metadata and payloads -// env_json_str: String for publishing to NATS -``` - -#### Python - -```python -env, env_json_str = await smartsend(...) -# Returns: Tuple[Dict, str] -# env: Dict with all metadata and payloads -# env_json_str: String for publishing to NATS -``` - -#### MicroPython - -```python -env, env_json_str = NATSBridge.smartsend(...) -# Returns: Tuple[Dict, str] -# Note: MicroPython returns plain dicts (no structured envelope object) -``` - ---- - -## Installation - -### Julia Dependencies - -```julia -using Pkg -Pkg.add("NATS") -Pkg.add("Arrow") -Pkg.add("JSON3") -Pkg.add("HTTP") -Pkg.add("UUIDs") -Pkg.add("Dates") -``` - -### JavaScript Dependencies (Node.js) - -```bash -npm install nats uuid apache-arrow node-fetch -# or -yarn add nats uuid apache-arrow node-fetch -``` - -### JavaScript Dependencies (Browser) - -```bash -npm install nats uuid apache-arrow -# or use CDN: -# https://unpkg.com/nats-js/dist/bundle/nats.min.js -# https://unpkg.com/apache-arrow/arrow.min.js -``` - -### Python Dependencies (Desktop) - -```bash -pip install nats-py aiohttp pyarrow pandas python-dateutil -``` - -### MicroPython Dependencies - -MicroPython uses built-in modules: -- `network` - NATS connection (custom implementation) -- `time` - Timestamps -- `uos` - File operations -- `base64` - Base64 encoding -- `json` - JSON parsing -- `struct` - Binary data handling - ---- - -## Usage Tutorial - -### Step 1: Start NATS Server - -```bash -docker run -p 4222:4222 nats:latest -``` - -### Step 2: Start HTTP File Server (optional) - -```bash -# Create a directory for file uploads -mkdir -p /tmp/fileserver - -# Use any HTTP server that supports POST for file uploads -# Example: Python's built-in server -python3 -m http.server 8080 --directory /tmp/fileserver -``` - -### Step 3: Run Test Scenarios - -```bash -# Julia tests -julia test/test_julia_to_julia_text_sender.jl -julia test/test_julia_to_julia_text_receiver.jl - -# JavaScript tests (Node.js) -node test/test_js_text_sender.js -node test/test_js_text_receiver.js - -# Python tests -python3 test/test_py_text_sender.py -python3 test/test_py_text_receiver.py -``` - ---- - -## Platform-Specific Implementations - -### Julia Implementation - -#### Module Structure - -```julia -module NATSBridge - using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64 - - # Constants - const DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB - const DEFAULT_BROKER_URL = "nats://localhost:4222" - const DEFAULT_FILESERVER_URL = "http://localhost:8080" - - # Structs - struct msg_payload_v1 - id::String - dataname::String - payload_type::String - transport::String - encoding::String - size::Integer - data::Any - metadata::Dict{String, Any} - end - - struct msg_envelope_v1 - correlation_id::String - msg_id::String - timestamp::String - send_to::String - msg_purpose::String - sender_name::String - sender_id::String - receiver_name::String - receiver_id::String - reply_to::String - reply_to_msg_id::String - broker_url::String - metadata::Dict{String, Any} - payloads::Vector{msg_payload_v1} - end - - # Main functions - function smartsend(...) end - function smartreceive(...) end - - # Utility functions - function _serialize_data(...) end - function _deserialize_data(...) end - function envelope_to_json(...) end - function log_trace(...) end - - # File server handlers - function plik_oneshot_upload(...) end - function _fetch_with_backoff(...) end - function publish_message(...) end - - # Internal helpers - function _get_payload_bytes(...) end -end -``` - -#### Multiple Dispatch Pattern - -Julia leverages multiple dispatch for type-specific implementations: - -```julia -# publish_message has two overloads based on argument types -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - conn = NATS.connect(broker_url) - publish_message(conn, subject, message, correlation_id) -end - -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - try - NATS.publish(conn, subject, message) - log_trace(correlation_id, "Message published to $subject") - finally - NATS.drain(conn) - end -end - -# Type-specific serialization -function _serialize_data(data::String, payload_type::String) - # Text handling - return Vector{UInt8}(data) -end - -function _serialize_data(data::Dict, payload_type::String) - # Dictionary handling - json_str = JSON.json(data) - return Vector{UInt8}(json_str) -end - -function _serialize_data(data::DataFrame, payload_type::String) - # Table handling - io = IOBuffer() - Arrow.write(io, data) - return take!(io) -end -``` - -#### smartsend Implementation - -```julia -function smartsend( - subject::String, - data::AbstractArray{Tuple{String, T1, String}, 1}; - broker_url::String = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler::Function = plik_oneshot_upload, - size_threshold::Int = DEFAULT_SIZE_THRESHOLD, - correlation_id::String = string(uuid4()), - msg_purpose::String = "chat", - sender_name::String = "NATSBridge", - receiver_name::String = "", - receiver_id::String = "", - reply_to::String = "", - reply_to_msg_id::String = "", - is_publish::Bool = true, - NATS_connection::Union{NATS.Connection, Nothing} = nothing, - msg_id::String = string(uuid4()), - sender_id::String = string(uuid4()) -)::Tuple{msg_envelope_v1, String} where {T1<:Any} - - log_trace(correlation_id, "Starting smartsend for subject: $subject") - - # Process each payload in the list - payloads = msg_payload_v1[] - for (dataname, payload_data, payload_type) in data - # Serialize data based on type - payload_bytes = _serialize_data(payload_data, payload_type) - - payload_size = length(payload_bytes) - log_trace(correlation_id, "Serialized payload '$dataname' size: $payload_size bytes") - - # Decision: Direct vs Link - if payload_size < size_threshold - # Direct path - Base64 encode and send via NATS - payload_b64 = Base64.base64encode(payload_bytes) - log_trace(correlation_id, "Using direct transport for $payload_size bytes") - - payload = msg_payload_v1( - payload_b64, - payload_type; - id = string(uuid4()), - dataname = dataname, - transport = "direct", - encoding = "base64", - size = payload_size, - metadata = Dict{String, Any}("payload_bytes" => payload_size) - ) - push!(payloads, payload) - else - # Link path - Upload to HTTP server, send URL via NATS - log_trace(correlation_id, "Using link transport, uploading to fileserver") - - response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) - - if response["status"] != 200 - error("Failed to upload data to fileserver: $(response["status"])") - end - - url = response["url"] - log_trace(correlation_id, "Uploaded to URL: $url") - - payload = msg_payload_v1( - url, - payload_type; - id = string(uuid4()), - dataname = dataname, - transport = "link", - encoding = "none", - size = payload_size, - metadata = Dict{String, Any}() - ) - push!(payloads, payload) - end - end - - # Create msg_envelope_v1 with all payloads - env = msg_envelope_v1( - subject, - payloads; - correlation_id = correlation_id, - msg_id = msg_id, - msg_purpose = msg_purpose, - sender_name = sender_name, - sender_id = sender_id, - receiver_name = receiver_name, - receiver_id = receiver_id, - reply_to = reply_to, - reply_to_msg_id = reply_to_msg_id, - broker_url = broker_url, - metadata = Dict{String, Any}(), - ) - - env_json_str = envelope_to_json(env) - - if is_publish == false - # skip publish - elseif is_publish == true && NATS_connection === nothing - publish_message(broker_url, subject, env_json_str, correlation_id) - elseif is_publish == true && NATS_connection !== nothing - publish_message(NATS_connection, subject, env_json_str, correlation_id) - end - - return (env, env_json_str) -end -``` - -#### smartreceive Implementation - -```julia -function smartreceive( - msg::NATS.Msg; - fileserver_download_handler::Function = _fetch_with_backoff, - max_retries::Int = 5, - base_delay::Int = 100, - max_delay::Int = 5000 -)::JSON.Object{String, Any} - # Parse the JSON envelope - env_json_obj = JSON.parse(String(msg.payload)) - log_trace(env_json_obj["correlation_id"], "Processing received message") - - # Process all payloads in the envelope - payloads_list = Tuple{String, Any, String}[] - - num_payloads = length(env_json_obj["payloads"]) - - for i in 1:num_payloads - payload = env_json_obj["payloads"][i] - transport = String(payload["transport"]) - dataname = String(payload["dataname"]) - - if transport == "direct" - log_trace(env_json_obj["correlation_id"], "Direct transport - decoding payload '$dataname'") - - # Extract base64 payload from the payload - payload_b64 = String(payload["data"]) - - # Decode Base64 payload - payload_bytes = Base64.base64decode(payload_b64) - - # Deserialize based on type - data_type = String(payload["payload_type"]) - data = _deserialize_data(payload_bytes, data_type, env_json_obj["correlation_id"]) - - push!(payloads_list, (dataname, data, data_type)) - elseif transport == "link" - # Extract download URL from the payload - url = String(payload["data"]) - log_trace(env_json_obj["correlation_id"], "Link transport - fetching '$dataname' from URL: $url") - - # Fetch with exponential backoff using the download handler - downloaded_data = fileserver_download_handler(url, max_retries, base_delay, max_delay, env_json_obj["correlation_id"]) - - # Deserialize based on type - data_type = String(payload["payload_type"]) - data = _deserialize_data(downloaded_data, data_type, env_json_obj["correlation_id"]) - - push!(payloads_list, (dataname, data, data_type)) - else - error("Unknown transport type for payload '$dataname': $(transport)") - end - end - env_json_obj["payloads"] = payloads_list - return env_json_obj -end -``` - -#### _serialize_data Implementation - -```julia -function _serialize_data(data::Any, payload_type::String) - if payload_type == "text" - if isa(data, String) - data_bytes = Vector{UInt8}(data) - return data_bytes - else - error("Text data must be a String") - end - elseif payload_type == "dictionary" - json_str = JSON.json(data) - json_str_bytes = Vector{UInt8}(json_str) - return json_str_bytes - elseif payload_type == "table" - io = IOBuffer() - Arrow.write(io, data) - return take!(io) - elseif payload_type == "image" - if isa(data, Vector{UInt8}) - return data - else - error("Image data must be Vector{UInt8}") - end - elseif payload_type == "audio" - if isa(data, Vector{UInt8}) - return data - else - error("Audio data must be Vector{UInt8}") - end - elseif payload_type == "video" - if isa(data, Vector{UInt8}) - return data - else - error("Video data must be Vector{UInt8}") - end - elseif payload_type == "binary" - if isa(data, IOBuffer) - return take!(data) - elseif isa(data, Vector{UInt8}) - return data - else - error("Binary data must be binary (Vector{UInt8} or IOBuffer)") - end - else - error("Unknown payload_type: $payload_type") - end -end -``` - -#### _deserialize_data Implementation - -```julia -function _deserialize_data( - data::Vector{UInt8}, - payload_type::String, - correlation_id::String -) - if payload_type == "text" - return String(data) - elseif payload_type == "dictionary" - json_str = String(data) - return JSON.parse(json_str) - elseif payload_type == "table" - io = IOBuffer(data) - df = Arrow.Table(io) - return df - elseif payload_type == "image" - return data - elseif payload_type == "audio" - return data - elseif payload_type == "video" - return data - elseif payload_type == "binary" - return data - else - error("Unknown payload_type: $payload_type") - end -end -``` - -#### _fetch_with_backoff Implementation - -```julia -function _fetch_with_backoff( - url::String, - max_retries::Int, - base_delay::Int, - max_delay::Int, - correlation_id::String -) - delay = base_delay - for attempt in 1:max_retries - try - response = HTTP.request("GET", url) - if response.status == 200 - log_trace(correlation_id, "Successfully fetched data from $url on attempt $attempt") - return response.body - else - error("Failed to fetch: $(response.status)") - end - catch e - log_trace(correlation_id, "Attempt $attempt failed: $(typeof(e))") - - if attempt < max_retries - sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - end - end - end - - error("Failed to fetch data after $max_retries attempts") -end -``` - -#### plik_oneshot_upload Implementation - -```julia -function plik_oneshot_upload(file_server_url::String, dataname::String, data::Vector{UInt8}) - # Get upload id - url_getUploadID = "$file_server_url/upload" - headers = ["Content-Type" => "application/json"] - body = """{ "OneShot" : true }""" - http_response = HTTP.request("POST", url_getUploadID, headers, body; body_is_form=false) - response_json = JSON.parse(http_response.body) - uploadid = response_json["id"] - uploadtoken = response_json["uploadToken"] - - # Upload file - file_multipart = HTTP.Multipart(dataname, IOBuffer(data), "application/octet-stream") - url_upload = "$file_server_url/file/$uploadid" - headers = ["X-UploadToken" => uploadtoken] - - form = HTTP.Form(Dict( - "file" => file_multipart - )) - - http_response = nothing - try - http_response = HTTP.post(url_upload, headers, form) - catch e - @error "Request failed" exception=e - end - response_json = JSON.parse(http_response.body) - fileid = response_json["id"] - - url = "$file_server_url/file/$uploadid/$fileid/$dataname" - - return Dict("status" => http_response.status, "uploadid" => uploadid, "fileid" => fileid, "url" => url) -end -``` - ---- - -### JavaScript Implementation - -#### Module Structure - -```javascript -// natbridge.js -const nats = require('nats'); -const { v4: uuidv4 } = require('uuid'); -const fetch = require('node-fetch'); - -const DEFAULT_SIZE_THRESHOLD = 1_000_000; -const DEFAULT_BROKER_URL = 'nats://localhost:4222'; -const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; - -class NATSClient { - constructor(url) { - this.url = url; - this.connection = null; - } - - async connect() { - this.connection = await nats.connect({ servers: this.url }); - return this.connection; - } - - async publish(subject, message) { - if (!this.connection) { - await this.connect(); - } - await this.connection.publish(subject, message); - } - - async close() { - if (this.connection) { - this.connection.close(); - } - } -} - -async function smartsend(subject, data, options = {}) { - // Implementation -} - -async function smartreceive(msg, options = {}) { - // Implementation -} - -module.exports = { - NATSClient, - smartsend, - smartreceive, - plikOneshotUpload, - fetchWithBackoff -}; -``` - -#### smartsend Implementation - -```javascript -const nats = require('nats'); -const { v4: uuidv4 } = require('uuid'); -const fetch = require('node-fetch'); -const arrow = require('apache-arrow'); - -const DEFAULT_SIZE_THRESHOLD = 1_000_000; -const DEFAULT_BROKER_URL = 'nats://localhost:4222'; -const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; - -async function smartsend(subject, data, options = {}) { - const { - broker_url = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler = plikOneshotUpload, - size_threshold = DEFAULT_SIZE_THRESHOLD, - correlation_id = uuidv4(), - msg_purpose = 'chat', - sender_name = 'NATSBridge', - receiver_name = '', - receiver_id = '', - reply_to = '', - reply_to_msg_id = '', - is_publish = true, - nats_connection = null, - msg_id = uuidv4(), - sender_id = uuidv4() - } = options; - - console.log(`[Correlation: ${correlation_id}] Starting smartsend for subject: ${subject}`); - - // Process payloads - const payloads = []; - for (const [dataname, payloadData, payloadType] of data) { - const payloadBytes = await serializeData(payloadData, payloadType); - const payloadSize = payloadBytes.byteLength; - - console.log(`[Correlation: ${correlation_id}] Serialized payload '${dataname}' (type: ${payloadType}) size: ${payloadSize} bytes`); - - if (payloadSize < size_threshold) { - // Direct path - const payloadB64 = bufferToBase64(payloadBytes); - console.log(`[Correlation: ${correlation_id}] Using direct transport for ${payloadSize} bytes`); - - payloads.push({ - id: uuidv4(), - dataname, - payload_type: payloadType, - transport: 'direct', - encoding: 'base64', - size: payloadSize, - data: payloadB64, - metadata: { payload_bytes: payloadSize } - }); - } else { - // Link path - console.log(`[Correlation: ${correlation_id}] Using link transport, uploading to fileserver`); - - const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); - - if (response.status !== 200) { - throw new Error(`Failed to upload data to fileserver: ${response.status}`); - } - - console.log(`[Correlation: ${correlation_id}] Uploaded to URL: ${response.url}`); - - payloads.push({ - id: uuidv4(), - dataname, - payload_type: payloadType, - transport: 'link', - encoding: 'none', - size: payloadSize, - data: response.url, - metadata: {} - }); - } - } - - // Build envelope - const env = { - correlation_id, - msg_id, - timestamp: new Date().toISOString(), - send_to: subject, - msg_purpose, - sender_name, - sender_id, - receiver_name, - receiver_id, - reply_to, - reply_to_msg_id, - broker_url, - metadata: {}, - payloads - }; - - const env_json_str = JSON.stringify(env); - - if (is_publish) { - if (nats_connection) { - await publishMessage(nats_connection, subject, env_json_str, correlation_id); - } else { - await publishMessage(broker_url, subject, env_json_str, correlation_id); - } - } - - return [env, env_json_str]; -} -``` - -#### serializeData Implementation - -```javascript -const arrow = require('apache-arrow'); - -async function serializeData(data, payload_type) { - if (payload_type === 'text') { - if (typeof data === 'string') { - return Buffer.from(data, 'utf8'); - } else { - throw new Error('Text data must be a string'); - } - } else if (payload_type === 'dictionary') { - const jsonStr = JSON.stringify(data); - return Buffer.from(jsonStr, 'utf8'); - } else if (payload_type === 'table') { - // Convert to Arrow IPC - const buffer = Buffer.alloc(1024 * 1024); // Pre-allocate buffer - const writer = new arrow.RecordBatchWriter([ - new arrow.Schema(Object.keys(data[0]).map(key => new arrow.Field(key, arrow.any()))) - ]); - - for (const row of data) { - const recordBatch = arrow.recordBatch.fromObjects([row], writer.schema); - writer.write(recordBatch); - } - await writer.close(); - - // Read from the underlying buffer - return buffer; - } else if (payload_type === 'image') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Image data must be Uint8Array or Buffer'); - } - } else if (payload_type === 'audio') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Audio data must be Uint8Array or Buffer'); - } - } else if (payload_type === 'video') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Video data must be Uint8Array or Buffer'); - } - } else if (payload_type === 'binary') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Binary data must be Uint8Array or Buffer'); - } - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} - -function bufferToBase64(buffer) { - return buffer.toString('base64'); -} -``` - -#### deserializeData Implementation - -```javascript -const arrow = require('apache-arrow'); - -async function deserializeData(data, payload_type, correlation_id) { - if (payload_type === 'text') { - return Buffer.from(data).toString('utf8'); - } else if (payload_type === 'dictionary') { - const jsonStr = Buffer.from(data).toString('utf8'); - return JSON.parse(jsonStr); - } else if (payload_type === 'table') { - const buffer = Buffer.from(data); - const table = arrow.tableFromRawBytes(buffer); - return table; - } else if (payload_type === 'image') { - return Buffer.from(data); - } else if (payload_type === 'audio') { - return Buffer.from(data); - } else if (payload_type === 'video') { - return Buffer.from(data); - } else if (payload_type === 'binary') { - return Buffer.from(data); - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} -``` - -#### fetchWithBackoff Implementation - -```javascript -async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { - let delay = base_delay; - - for (let attempt = 1; attempt <= max_retries; attempt++) { - try { - const response = await fetch(url); - - if (response.status === 200) { - console.log(`[Correlation: ${correlation_id}] Successfully fetched data from ${url} on attempt ${attempt}`); - return await response.arrayBuffer(); - } else { - throw new Error(`Failed to fetch: ${response.status}`); - } - } catch (e) { - console.log(`[Correlation: ${correlation_id}] Attempt ${attempt} failed: ${e.constructor.name}`); - - if (attempt < max_retries) { - await new Promise(resolve => setTimeout(resolve, delay)); - delay = Math.min(delay * 2, max_delay); - } - } - } - - throw new Error(`Failed to fetch data after ${max_retries} attempts`); -} -``` - -#### plikOneshotUpload Implementation - -```javascript -async function plikOneshotUpload(file_server_url, dataname, data) { - // Get upload id - const url_getUploadID = `${file_server_url}/upload`; - const headers = { 'Content-Type': 'application/json' }; - const body = JSON.stringify({ OneShot: true }); - - const http_response = await fetch(url_getUploadID, { - method: 'POST', - headers, - body - }); - - const response_json = await http_response.json(); - const uploadid = response_json.id; - const uploadtoken = response_json.uploadToken; - - // Upload file - const url_upload = `${file_server_url}/file/${uploadid}`; - const form = new FormData(); - const blob = new Blob([data]); - form.append('file', blob, dataname); - - const upload_headers = { - 'X-UploadToken': uploadtoken - }; - - const upload_response = await fetch(url_upload, { - method: 'POST', - headers: upload_headers, - body: form - }); - - const upload_json = await upload_response.json(); - const fileid = upload_json.id; - - const url = `${file_server_url}/file/${uploadid}/${fileid}/${dataname}`; - - return { - status: upload_response.status, - uploadid, - fileid, - url - }; -} -``` - ---- - -### Python Implementation - -#### Module Structure - -```python -# natbridge.py -import asyncio -import base64 -import json -import uuid -import time -from typing import Any, Dict, List, Tuple, Union, Callable -from dataclasses import dataclass, field -from datetime import datetime - -try: - import pyarrow as arrow - import pyarrow.parquet as pq - ARROW_AVAILABLE = True -except ImportError: - ARROW_AVAILABLE = False - -try: - import aiohttp - import nats - from nats.aio.client import Client as NATSClient - NATS_AVAILABLE = True -except ImportError: - NATS_AVAILABLE = False - - -DEFAULT_SIZE_THRESHOLD = 1_000_000 -DEFAULT_BROKER_URL = "nats://localhost:4222" -DEFAULT_FILESERVER_URL = "http://localhost:8080" - - -@dataclass -class MsgPayloadV1: - """Message payload structure.""" - id: str - dataname: str - payload_type: str - transport: str - encoding: str - size: int - data: Union[str, bytes] - metadata: Dict[str, Any] = field(default_factory=dict) - - -@dataclass -class MsgEnvelopeV1: - """Message envelope structure.""" - correlation_id: str - msg_id: str - timestamp: str - send_to: str - msg_purpose: str - sender_name: str - sender_id: str - receiver_name: str - receiver_id: str - reply_to: str - reply_to_msg_id: str - broker_url: str - metadata: Dict[str, Any] = field(default_factory=dict) - payloads: List[MsgPayloadV1] = field(default_factory=list) - - -class NATSBridge: - """Cross-platform NATS bridge implementation.""" - - def __init__(self, broker_url: str = None, fileserver_url: str = None): - self.broker_url = broker_url or DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL - self._nats_client: NATSClient = None - - async def smartsend(self, subject: str, data: List[Tuple[str, Any, str]], **kwargs) -> Tuple[Dict, str]: - """Send data via NATS.""" - pass - - async def smartreceive(self, msg: Any, **kwargs) -> Dict: - """Receive and process NATS message.""" - pass -``` - -#### smartsend Implementation - -```python -import asyncio -import base64 -import json -import uuid -from typing import Any, Dict, List, Tuple, Union, Callable -from datetime import datetime - -DEFAULT_SIZE_THRESHOLD = 1_000_000 -DEFAULT_BROKER_URL = "nats://localhost:4222" -DEFAULT_FILESERVER_URL = "http://localhost:8080" - - -async def smartsend( - subject: str, - data: List[Tuple[str, Any, str]], - broker_url: str = DEFAULT_BROKER_URL, - fileserver_url: str = DEFAULT_FILESERVER_URL, - fileserver_upload_handler: Callable = plik_oneshot_upload, - size_threshold: int = DEFAULT_SIZE_THRESHOLD, - correlation_id: str = None, - msg_purpose: str = "chat", - sender_name: str = "NATSBridge", - receiver_name: str = "", - receiver_id: str = "", - reply_to: str = "", - reply_to_msg_id: str = "", - is_publish: bool = True, - nats_connection: Any = None, - msg_id: str = None, - sender_id: str = None -) -> Tuple[Dict, str]: - """ - Send data via NATS with automatic transport selection. - - Args: - subject: NATS subject to publish to - data: List of (dataname, data, type) tuples - **kwargs: Additional options - - Returns: - Tuple of (env, env_json_str) - """ - if correlation_id is None: - correlation_id = str(uuid.uuid4()) - if msg_id is None: - msg_id = str(uuid.uuid4()) - if sender_id is None: - sender_id = str(uuid.uuid4()) - - print(f"[Correlation: {correlation_id}] Starting smartsend for subject: {subject}") - - # Process payloads - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = _serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - print(f"[Correlation: {correlation_id}] Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") - - if payload_size < size_threshold: - # Direct path - payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') - print(f"[Correlation: {correlation_id}] Using direct transport for {payload_size} bytes") - - payloads.append({ - 'id': str(uuid.uuid4()), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64, - 'metadata': {'payload_bytes': payload_size} - }) - else: - # Link path - print(f"[Correlation: {correlation_id}] Using link transport, uploading to fileserver") - - response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) - - if response['status'] != 200: - raise Exception(f"Failed to upload data to fileserver: {response['status']}") - - print(f"[Correlation: {correlation_id}] Uploaded to URL: {response['url']}") - - payloads.append({ - 'id': str(uuid.uuid4()), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response['url'], - 'metadata': {} - }) - - # Build envelope - env = { - 'correlation_id': correlation_id, - 'msg_id': msg_id, - 'timestamp': datetime.utcnow().isoformat() + 'Z', - 'send_to': subject, - 'msg_purpose': msg_purpose, - 'sender_name': sender_name, - 'sender_id': sender_id, - 'receiver_name': receiver_name, - 'receiver_id': receiver_id, - 'reply_to': reply_to, - 'reply_to_msg_id': reply_to_msg_id, - 'broker_url': broker_url, - 'metadata': {}, - 'payloads': payloads - } - - env_json_str = json.dumps(env) - - if is_publish: - if nats_connection: - await publish_message(nats_connection, subject, env_json_str, correlation_id) - else: - await publish_message(broker_url, subject, env_json_str, correlation_id) - - return env, env_json_str -``` - -#### serializeData Implementation - -```python -import base64 -import json -from typing import Any - -try: - import pyarrow as arrow - import pyarrow.parquet as pq - ARROW_AVAILABLE = True -except ImportError: - ARROW_AVAILABLE = False - - -def _serialize_data(data: Any, payload_type: str) -> bytes: - """Serialize data to bytes based on type.""" - if payload_type == 'text': - if isinstance(data, str): - return data.encode('utf-8') - else: - raise Error('Text data must be a string') - elif payload_type == 'dictionary': - json_str = json.dumps(data) - return json_str.encode('utf-8') - elif payload_type == 'table': - if not ARROW_AVAILABLE: - raise Error('pyarrow not available for table serialization') - - # Convert DataFrame to Arrow - import io - buf = io.BytesIO() - import pandas as pd - if isinstance(data, pd.DataFrame): - table = arrow.Table.from_pandas(data) - sink = arrow.ipc.new_file(buf) - arrow.ipc.write_table(table, sink) - sink.close() - return buf.getvalue() - else: - raise Error('Table data must be a pandas DataFrame') - elif payload_type == 'image': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Image data must be bytes') - elif payload_type == 'audio': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Audio data must be bytes') - elif payload_type == 'video': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Video data must be bytes') - elif payload_type == 'binary': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Binary data must be bytes') - else: - raise Error(f'Unknown payload_type: {payload_type}') -``` - -#### deserializeData Implementation - -```python -import base64 -import json -from typing import Any - -try: - import pyarrow as arrow - ARROW_AVAILABLE = True -except ImportError: - ARROW_AVAILABLE = False - - -def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: - """Deserialize bytes to data based on type.""" - if payload_type == 'text': - return data.decode('utf-8') - elif payload_type == 'dictionary': - json_str = data.decode('utf-8') - return json.loads(json_str) - elif payload_type == 'table': - if not ARROW_AVAILABLE: - raise Error('pyarrow not available for table deserialization') - - import io - buf = io.BytesIO(data) - reader = arrow.ipc.open_file(buf) - return reader.read_all().to_pandas() - elif payload_type == 'image': - return data - elif payload_type == 'audio': - return data - elif payload_type == 'video': - return data - elif payload_type == 'binary': - return data - else: - raise Error(f'Unknown payload_type: {payload_type}') -``` - -#### fetchWithBackoff Implementation - -```python -import asyncio -import aiohttp -from typing import Callable - - -async def fetch_with_backoff( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """Fetch URL with exponential backoff.""" - delay = base_delay - - for attempt in range(1, max_retries + 1): - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - print(f"[Correlation: {correlation_id}] Successfully fetched data from {url} on attempt {attempt}") - return await response.read() - else: - raise Exception(f"Failed to fetch: {response.status}") - except Exception as e: - print(f"[Correlation: {correlation_id}] Attempt {attempt} failed: {type(e).__name__}") - - if attempt < max_retries: - await asyncio.sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - - raise Exception(f"Failed to fetch data after {max_retries} attempts") -``` - -#### plikOneshotUpload Implementation - -```python -import aiohttp -import json -from typing import Dict, Any - - -async def plik_oneshot_upload( - file_server_url: str, - dataname: str, - data: bytes -) -> Dict[str, Any]: - """Upload data to plik server in one-shot mode.""" - - # Get upload id - async with aiohttp.ClientSession() as session: - url_getUploadID = f"{file_server_url}/upload" - headers = {'Content-Type': 'application/json'} - body = json.dumps({"OneShot": True}) - - async with session.post(url_getUploadID, headers=headers, data=body) as response: - response_json = await response.json() - uploadid = response_json['id'] - uploadtoken = response_json['uploadToken'] - - # Upload file - url_upload = f"{file_server_url}/file/{uploadid}" - headers = {'X-UploadToken': uploadtoken} - - form = aiohttp.FormData() - form.add_field('file', data, filename=dataname, content_type='application/octet-stream') - - async with session.post(url_upload, headers=headers, data=form) as upload_response: - upload_json = await upload_response.json() - fileid = upload_json['id'] - - url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" - - return { - 'status': upload_response.status, - 'uploadid': uploadid, - 'fileid': fileid, - 'url': url - } -``` - ---- - -## MicroPython Implementation - -### Limitations - -MicroPython has significant constraints compared to desktop implementations: - -| Feature | Desktop | MicroPython | -|---------|---------|-------------| -| Memory | Unlimited | ~256KB - 1MB | -| Arrow IPC | ✅ | ❌ (not supported) | -| Async/Await | ✅ | ⚠️ (uasyncio only) | -| Large payloads (>1MB) | ✅ | ❌ (enforced limit) | -| Table type | ✅ | ❌ | -| Multiple payloads | ✅ | ⚠️ (limited) | - -### MicroPython Module Structure - -```python -# natbridge_mpy.py (MicroPython) -import network -import time -import json -import base64 -import uos -import struct - -# Constants -DEFAULT_SIZE_THRESHOLD = 100000 # 100KB for MicroPython -DEFAULT_BROKER_URL = "nats://localhost:4222" -DEFAULT_FILESERVER_URL = "http://localhost:8080" -MAX_PAYLOAD_SIZE = 50000 # Hard limit - - -class NATSBridge: - """MicroPython NATS bridge implementation.""" - - def __init__(self, broker_url=None, fileserver_url=None): - self.broker_url = broker_url or DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL - self._nats_conn = None - - def smartsend(self, subject, data, **kwargs): - """Send data (synchronous).""" - correlation_id = self._generate_uuid() - msg_id = self._generate_uuid() - sender_id = self._generate_uuid() - - print(f"[Correlation: {correlation_id}] Starting smartsend") - - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = self._serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - if payload_size > MAX_PAYLOAD_SIZE: - raise MemoryError(f"Payload {dataname} exceeds max size {MAX_PAYLOAD_SIZE}") - - if payload_size < DEFAULT_SIZE_THRESHOLD: - # Direct path - payload_b64 = base64.b64encode(payload_bytes).decode('ascii') - payloads.append({ - 'id': self._generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64 - }) - else: - # Link path (limited support) - response = self._sync_fileserver_upload(self.fileserver_url, dataname, payload_bytes) - payloads.append({ - 'id': self._generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response['url'] - }) - - env = { - 'correlation_id': correlation_id, - 'msg_id': msg_id, - 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), - 'send_to': subject, - 'msg_purpose': kwargs.get('msg_purpose', 'chat'), - 'sender_name': kwargs.get('sender_name', 'NATSBridge'), - 'sender_id': sender_id, - 'receiver_name': kwargs.get('receiver_name', ''), - 'receiver_id': kwargs.get('receiver_id', ''), - 'reply_to': kwargs.get('reply_to', ''), - 'reply_to_msg_id': kwargs.get('reply_to_msg_id', ''), - 'broker_url': self.broker_url, - 'metadata': {}, - 'payloads': payloads - } - - env_json_str = json.dumps(env) - - # Publish - self._publish(subject, env_json_str, correlation_id) - - return env, env_json_str - - def smartreceive(self, msg, **kwargs): - """Receive and process message (synchronous).""" - env_json_obj = json.loads(msg.payload) - correlation_id = env_json_obj['correlation_id'] - - payloads_list = [] - for payload in env_json_obj['payloads']: - transport = payload['transport'] - dataname = payload['dataname'] - - if transport == 'direct': - payload_b64 = payload['data'] - payload_bytes = base64.b64decode(payload_b64) - data_type = payload['payload_type'] - data = self._deserialize_data(payload_bytes, data_type) - payloads_list.append((dataname, data, data_type)) - elif transport == 'link': - url = payload['data'] - downloaded_data = self._sync_fileserver_download( - url, - kwargs.get('max_retries', 3), - kwargs.get('base_delay', 100), - kwargs.get('max_delay', 1000), - correlation_id - ) - data_type = payload['payload_type'] - data = self._deserialize_data(downloaded_data, data_type) - payloads_list.append((dataname, data, data_type)) - - env_json_obj['payloads'] = payloads_list - return env_json_obj - - def _serialize_data(self, data, payload_type): - """Serialize data (MicroPython version - no table support).""" - if payload_type == 'text': - return data.encode('utf-8') - elif payload_type == 'dictionary': - return json.dumps(data).encode('utf-8') - elif payload_type in ('image', 'audio', 'video', 'binary'): - return bytes(data) - else: - raise ValueError(f"Unknown payload_type: {payload_type}") - - def _deserialize_data(self, data, payload_type): - """Deserialize data (MicroPython version).""" - if payload_type == 'text': - return data.decode('utf-8') - elif payload_type == 'dictionary': - return json.loads(data.decode('utf-8')) - elif payload_type in ('image', 'audio', 'video', 'binary'): - return data - else: - raise ValueError(f"Unknown payload_type: {payload_type}") - - def _generate_uuid(self): - """Generate simple UUID (MicroPython compatible).""" - return 'mp-%04x%04x-%04x-%04x-%04x-%04x%04x%04x' % ( - time.time_ns() // (10**6) % 0xFFFFFFFF, - time.time_ns() % 0xFFFFFFFF, - time.time_ns() >> 32 & 0xFFFF, - time.time_ns() >> 48 & 0xFFFF, - time.time_ns() >> 64 & 0xFFFF, - time.time_ns() >> 80 & 0xFFFF, - time.time_ns() >> 96 & 0xFFFF, - time.time_ns() >> 112 & 0xFFFF - ) - - def _sync_fileserver_upload(self, url, dataname, data): - """Synchronous file upload (limited).""" - # Simplified implementation for MicroPython - # In practice, would use network.HTTP or similar - raise NotImplementedError("File upload not implemented in MicroPython") - - def _sync_fileserver_download(self, url, max_retries, base_delay, max_delay, correlation_id): - """Synchronous file download with backoff.""" - # Simplified implementation for MicroPython - raise NotImplementedError("File download not implemented in MicroPython") - - def _publish(self, subject, message, correlation_id): - """Publish message to NATS.""" - # Simplified implementation for MicroPython - raise NotImplementedError("NATS publishing not implemented in MicroPython") -``` - ---- - -## Configuration - -### Environment Variables - -| Variable | Default | Description | -|----------|---------|-------------| -| `NATS_URL` | `nats://localhost:4222` | NATS server URL | -| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | -| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | - -### MicroPython Configuration - -```python -# micropython.conf -NATS_URL = "nats://broker.local:4222" -FILESERVER_URL = "http://fileserver.local:8080" -SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices -MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython -``` - ---- - -## Performance Considerations - -### Zero-Copy Reading - -| Platform | Strategy | -|----------|----------| -| **Julia** | `Arrow.read()` with memory-mapped files | -| **JavaScript** | `ArrayBuffer` with `DataView` | -| **Python** | `pyarrow` memory mapping | -| **MicroPython** | Not available (streaming only) | - -### Exponential Backoff - -All platforms implement exponential backoff for HTTP downloads: - -```python -# Python -async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): - delay = base_delay - for attempt in range(1, max_retries + 1): - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - return await response.read() - except Exception as e: - if attempt < max_retries: - await asyncio.sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - raise Exception("Failed to fetch after max retries") -``` - -### Correlation ID Logging - -All platforms use correlation IDs for distributed tracing: - -``` -[timestamp] [Correlation: abc123] Message published to subject -``` - ---- - -## Testing - -### Test File Organization - -| Platform | Sender Tests | Receiver Tests | -|----------|--------------|----------------| -| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | -| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | -| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | - -### Run Tests - -```bash -# Julia -julia test/test_julia_text_sender.jl -julia test/test_julia_text_receiver.jl - -# JavaScript (Node.js) -node test/test_js_text_sender.js -node test/test_js_text_receiver.js - -# Python -python3 test/test_py_text_sender.py -python3 test/test_py_text_receiver.py -``` - ---- - -## Troubleshooting - -### Common Issues - -1. **NATS Connection Failed** - - Ensure NATS server is running - - Check `broker_url` configuration - -2. **HTTP Upload Failed** - - Ensure file server is running - - Check `fileserver_url` configuration - - Verify upload permissions - -3. **Arrow IPC Deserialization Error** - - Ensure data is properly serialized to Arrow format - - Check Arrow version compatibility - - MicroPython doesn't support Arrow IPC - -4. **Memory Constraints (MicroPython)** - - Reduce `size_threshold` - - Use direct transport only (< 100KB) - - Avoid large payloads - ---- - -## Summary - -This cross-platform NATS bridge provides: - -1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across all platforms -2. **Idiomatic Implementations**: - - **Julia**: Multiple dispatch, struct-based design, native Arrow IPC - - **JavaScript**: Async/await, prototype-based utilities, class-based NATS client - - **Python**: Class-based design with dataclasses, type hints, async/await - - **MicroPython**: Synchronous API, memory-constrained optimizations -3. **Message Format Consistency**: Identical JSON schemas across all platforms -4. **Handler Abstraction**: File server operations abstracted through configurable handlers -5. **Platform-Specific Optimizations**: Arrow IPC in desktop platforms, streaming support in MicroPython - -The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. \ No newline at end of file diff --git a/docs/implementation.md b/docs/implementation.md index 301d430..89dbfe9 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -1,101 +1,212 @@ -# Implementation Guide: Bi-Directional Data Bridge +# Cross-Platform Implementation Guide: Bi-Directional Data Bridge ## Overview -This document describes the implementation of the high-performance, bi-directional data bridge for **Julia** applications using NATS (Core & JetStream), implementing the Claim-Check pattern for large payloads. +This document describes the implementation of the high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. -The system enables seamless communication for Julia applications. +**Supported Platforms:** +- **Julia** - Ground truth implementation (reference) +- **JavaScript** - Node.js and browser implementation +- **Python/MicroPython** - Desktop and embedded implementation -### Implementation Files +--- -NATSBridge is implemented in Julia: +## Implementation Files | Language | Implementation File | Description | |----------|---------------------|-------------| | **Julia** | [`src/NATSBridge.jl`](../src/NATSBridge.jl) | Full Julia implementation with Arrow IPC support | +| **JavaScript** | `src/natbridge.js` | Node.js/browser implementation | +| **Python** | `src/natbridge.py` | Desktop Python implementation | +| **MicroPython** | `src/natbridge_mpy.py` | MicroPython implementation (limited features) | -### File Server Handler Architecture +--- + +## File Server Handler Architecture The system uses **handler functions** to abstract file server operations, allowing support for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). -**Handler Function Signatures:** +### Handler Function Signatures + +#### Julia ```julia # Upload handler - uploads data to file server and returns URL -# The handler is passed to smartsend as fileserver_upload_handler parameter -# It receives: (fileserver_url::String, dataname::String, data::Vector{UInt8}) -# Returns: Dict{String, Any} with keys: "status", "uploadid", "fileid", "url" -fileserver_upload_handler(fileserver_url::String, dataname::String, data::Vector{UInt8})::Dict{String, Any} +fileserver_upload_handler( + fileserver_url::String, + dataname::String, + data::Vector{UInt8} +)::Dict{String, Any} # Download handler - fetches data from file server URL with exponential backoff -# The handler is passed to smartreceive as fileserver_download_handler parameter -# It receives: (url::String, max_retries::Int, base_delay::Int, max_delay::Int, correlation_id::String) -# Returns: Vector{UInt8} (the downloaded data) -fileserver_download_handler(url::String, max_retries::Int, base_delay::Int, max_delay::Int, correlation_id::String)::Vector{UInt8} +fileserver_download_handler( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +)::Vector{UInt8} ``` -This design allows the system to support multiple file server backends without changing the core messaging logic. +#### JavaScript -### Multi-Payload Support (Standard API) +```javascript +// Upload handler - async function +async function fileserver_upload_handler( + fileserver_url, + dataname, + data // Uint8Array +) { + // Returns: { status, uploadid, fileid, url } +} -The system uses a **standardized list-of-tuples format** for all payload operations. **Even when sending a single payload, the user must wrap it in a list.** +// Download handler - async function +async function fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + correlation_id +) { + // Returns: Uint8Array +} +``` -**API Standard:** -```julia +#### Python + +```python +# Upload handler - async function +async def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload data to file server. + + Returns: + Dict with keys: 'status', 'uploadid', 'fileid', 'url' + """ + pass + +# Download handler - async function +async def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Download data from URL with exponential backoff. + + Returns: + Downloaded bytes + """ + pass +``` + +#### MicroPython + +```python +# Upload handler - synchronous (no async in MicroPython) +def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytearray +) -> Dict: + """ + Upload data to file server (synchronous). + + Returns: + Dict with keys: 'status', 'url' + """ + pass + +# Download handler - synchronous +def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytearray: + """ + Download data from URL with exponential backoff (synchronous). + + Returns: + Downloaded bytes + """ + pass +``` + +--- + +## Multi-Payload Support (Standard API) + +The system uses a **standardized list-of-tuples format** for all payload operations across all platforms. + +### API Standard + +``` # Input format for smartsend (always a list of tuples with type info) [(dataname1, data1, type1), (dataname2, data2, type2), ...] # Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) -# Returns: Dict with envelope metadata and payloads field containing Vector{Tuple{String, Any, String}} -# { -# "correlation_id": "...", -# "msg_id": "...", -# "timestamp": "...", -# "send_to": "...", -# "msg_purpose": "...", -# "sender_name": "...", -# "sender_id": "...", -# "receiver_name": "...", -# "receiver_id": "...", -# "reply_to": "...", -# "reply_to_msg_id": "...", -# "broker_url": "...", -# "metadata": {...}, -# "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -# } +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} ``` -**Supported Types:** -- `"text"` - Plain text -- `"dictionary"` - JSON-serializable dictionaries (Dict, NamedTuple) -- `"table"` - Tabular data (DataFrame, array of structs) -- `"image"` - Image data (Bitmap, PNG/JPG bytes) -- `"audio"` - Audio data (WAV, MP3 bytes) -- `"video"` - Video data (MP4, AVI bytes) -- `"binary"` - Generic binary data (Vector{UInt8}) +### Supported Types -This design allows per-payload type specification, enabling **mixed-content messages** where different payloads can use different serialization formats in a single message. +| Type | Julia | JavaScript | Python | MicroPython | +|------|-------|------------|--------|-------------| +| `text` | `String` | `string` | `str` | `str` | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | +| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ (not supported) | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | + +### Cross-Platform Examples + +#### Julia -**Examples:** ```julia +using NATSBridge + # Single payload - still wrapped in a list -smartsend( +env, env_json_str = smartsend( "/test", - [("dataname1", data1, "dictionary")], # List with one tuple (data, type) + [("dataname1", data1, "dictionary")], broker_url="nats://localhost:4222", fileserver_upload_handler=plik_oneshot_upload ) -# Multiple payloads in one message with different types -smartsend( +# Multiple payloads with different types +env, env_json_str = smartsend( "/test", [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], - broker_url="nats://localhost:4222", - fileserver_upload_handler=plik_oneshot_upload + broker_url="nats://localhost:4222" ) -# Mixed content (e.g., chat with text, image, audio) -smartsend( +# Mixed content (chat with text, image, audio) +env, env_json_str = smartsend( "/chat", [ ("message_text", "Hello!", "text"), @@ -105,17 +216,127 @@ smartsend( broker_url="nats://localhost:4222" ) -# Receive returns a JSON object envelope with all metadata and deserialized payloads -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff, max_retries=5, base_delay=100, max_delay=5000) -# Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 -# env["payloads"] = [("dataname1", data1, type1), ("dataname2", data2, type2), ...] -# env["correlation_id"], env["msg_id"], etc. -# env is a JSON object containing envelope metadata and payloads field +# Receive returns a JSON.Object{String, Any} envelope +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# env is a JSON.Object{String, Any} with "payloads" field containing Vector{Tuple{String, Any, String}} +# Access payloads: env["payloads"] which is a Vector of tuples +for (dataname, data, type) in env["payloads"] + println("$dataname: $data (type: $type)") +end ``` +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +// Single payload +const [env, env_json_str] = await NATSBridge.smartsend( + "/test", + [["dataname1", data1, "dictionary"]], + { + broker_url: "nats://localhost:4222", + fileserver_upload_handler: plikOneshotUpload + } +); + +// Multiple payloads +const [env, env_json_str] = await NATSBridge.smartsend( + "/test", + [ + ["dataname1", data1, "dictionary"], + ["dataname2", data2, "table"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Mixed content +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat", + [ + ["message_text", "Hello!", "text"], + ["user_image", imageData, "image"], + ["audio_clip", audioData, "audio"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Receive +const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: fetchWithBackoff +}); +// env is an object with "payloads" field containing Array of arrays +// Access payloads: env.payloads which is an Array of [dataname, data, type] arrays +for (const [dataname, data, type] of env.payloads) { + console.log(`${dataname}: ${data} (type: ${type})`); +} +``` + +#### Python + +```python +from natbridge import NATSBridge + +# Single payload +env, env_json_str = await NATSBridge.smartsend( + "/test", + [("dataname1", data1, "dictionary")], + broker_url="nats://localhost:4222", + fileserver_upload_handler=plik_oneshot_upload +) + +# Multiple payloads +env, env_json_str = await NATSBridge.smartsend( + "/test", + [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], + broker_url="nats://localhost:4222" +) + +# Mixed content +env, env_json_str = await NATSBridge.smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("user_image", image_data, "image"), + ("audio_clip", audio_data, "audio") + ], + broker_url="nats://localhost:4222" +) + +# Receive +env = await NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff +) +# env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] +# Access payloads: env["payloads"] which is a list of tuples +for dataname, data, type_ in env["payloads"]: + print(f"{dataname}: {data} (type: {type_})") +``` + +#### MicroPython + +```python +from natbridge import NATSBridge + +# Limited to text and binary (no tables due to memory constraints) +env, env_json_str = NATSBridge.smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("binary_data", data_bytes, "binary") + ], + broker_url="nats://localhost:4222", + size_threshold=100000 # Lower threshold for memory constraints +) +# Note: MicroPython uses synchronous handlers +``` + +--- + ## Architecture -The Julia implementation follows the Claim-Check pattern: +### Cross-Platform Claim-Check Pattern ```mermaid flowchart TD @@ -147,9 +368,11 @@ flowchart TD - **Direct Path** (< 1MB): Payload is serialized, Base64-encoded, and published directly to NATS - **Link Path** (≥ 1MB): Payload is serialized, uploaded to an HTTP file server, and only the URL is published to NATS (claim-check pattern) -## smartsend Return Value +### smartsend Return Value -The `smartsend` function now returns a tuple containing both the envelope object and the JSON string representation: +All platforms return a tuple/array containing both the envelope and JSON string: + +#### Julia ```julia env, env_json_str = smartsend(...) @@ -158,21 +381,33 @@ env, env_json_str = smartsend(...) # env_json_str::String - JSON string for publishing to NATS ``` -**Options:** -- `is_publish::Bool = true` - When `true` (default), the message is automatically published to NATS. When `false`, the function returns the envelope and JSON string without publishing, allowing manual publishing via NATS request-reply pattern. +#### JavaScript -This enables two use cases: -1. **Programmatic envelope access**: Access envelope fields directly via the `env` object -2. **Direct JSON publishing**: Publish the JSON string directly using NATS request-reply pattern +```javascript +const [env, env_json_str] = await smartsend(...); +// Returns: Promise<[env, env_json_str]> +// env: Object with all metadata and payloads +// env_json_str: String for publishing to NATS +``` -### Julia Module: [`src/NATSBridge.jl`](../src/NATSBridge.jl) +#### Python -The Julia implementation provides: +```python +env, env_json_str = await smartsend(...) +# Returns: Tuple[Dict, str] +# env: Dict with all metadata and payloads +# env_json_str: String for publishing to NATS +``` -- **[`msg_envelope_v1`](src/NATSBridge.jl)**: Struct for the unified JSON envelope -- **[`msg_payload_v1`](src/NATSBridge.jl)**: Struct for individual payload representation -- **[`smartsend()`](src/NATSBridge.jl)**: Handles transport selection based on payload size -- **[`smartreceive()`](src/NATSBridge.jl)**: Handles both direct and link transport +#### MicroPython + +```python +env, env_json_str = NATSBridge.smartsend(...) +# Returns: Tuple[Dict, str] +# Note: MicroPython returns plain dicts (no structured envelope object) +``` + +--- ## Installation @@ -188,6 +423,41 @@ Pkg.add("UUIDs") Pkg.add("Dates") ``` +### JavaScript Dependencies (Node.js) + +```bash +npm install nats uuid apache-arrow node-fetch +# or +yarn add nats uuid apache-arrow node-fetch +``` + +### JavaScript Dependencies (Browser) + +```bash +npm install nats uuid apache-arrow +# or use CDN: +# https://unpkg.com/nats-js/dist/bundle/nats.min.js +# https://unpkg.com/apache-arrow/arrow.min.js +``` + +### Python Dependencies (Desktop) + +```bash +pip install nats-py aiohttp pyarrow pandas python-dateutil +``` + +### MicroPython Dependencies + +MicroPython uses built-in modules: +- `network` - NATS connection (custom implementation) +- `time` - Timestamps +- `uos` - File operations +- `base64` - Base64 encoding +- `json` - JSON parsing +- `struct` - Binary data handling + +--- + ## Usage Tutorial ### Step 1: Start NATS Server @@ -210,341 +480,1389 @@ python3 -m http.server 8080 --directory /tmp/fileserver ### Step 3: Run Test Scenarios ```bash -# Scenario 1: Command & Control -julia test/scenario1_command_control.jl +# Julia tests +julia test/test_julia_to_julia_text_sender.jl +julia test/test_julia_to_julia_text_receiver.jl -# Scenario 2: Large Arrow Table -julia test/scenario2_large_table.jl +# JavaScript tests (Node.js) +node test/test_js_text_sender.js +node test/test_js_text_receiver.js -# Scenario 3: Julia-to-Julia communication -julia test/scenario3_julia_to_julia.jl +# Python tests +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py ``` -## Usage +--- -### Scenario 1: Command & Control (Small Dictionary) +## Platform-Specific Implementations -**Focus:** Sending small dictionary configurations. This is the simplest use case for command and control scenarios. +### Julia Implementation + +#### Module Structure -**Julia (Sender/Receiver):** ```julia -using NATSBridge - -# Send small dictionary config (wrapped in list with type) -config = Dict("step_size" => 0.01, "iterations" => 1000, "threshold" => 0.5) -env, env_json_str = smartsend( - "control", - [("config", config, "dictionary")], - broker_url="nats://localhost:4222" -) -# env: msg_envelope_v1 with all metadata and payloads -# env_json_str: JSON string for publishing +module NATSBridge + using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64 + + # Constants + const DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB + const DEFAULT_BROKER_URL = "nats://localhost:4222" + const DEFAULT_FILESERVER_URL = "http://localhost:8080" + + # Structs + struct msg_payload_v1 + id::String + dataname::String + payload_type::String + transport::String + encoding::String + size::Integer + data::Any + metadata::Dict{String, Any} + end + + struct msg_envelope_v1 + correlation_id::String + msg_id::String + timestamp::String + send_to::String + msg_purpose::String + sender_name::String + sender_id::String + receiver_name::String + receiver_id::String + reply_to::String + reply_to_msg_id::String + broker_url::String + metadata::Dict{String, Any} + payloads::Vector{msg_payload_v1} + end + + # Main functions + function smartsend(...) end + function smartreceive(...) end + + # Utility functions + function _serialize_data(...) end + function _deserialize_data(...) end + function envelope_to_json(...) end + function log_trace(...) end + + # File server handlers + function plik_oneshot_upload(...) end + function _fetch_with_backoff(...) end + function publish_message(...) end + + # Internal helpers + function _get_payload_bytes(...) end +end ``` -**Julia (Sender/Receiver) with NATS_connection for connection reuse:** +#### Multiple Dispatch Pattern + +Julia leverages multiple dispatch for type-specific implementations: + ```julia -using NATSBridge - -# Create connection once for high-frequency publishing -conn = NATS.connect("nats://localhost:4222") - -# Send multiple messages using the same connection (saves connection overhead) -for i in 1:100 - config = Dict("iteration" => i, "data" => rand()) - smartsend( - "control", - [("config", config, "dictionary")], - NATS_connection=conn, # Reuse connection - is_publish=true - ) +# publish_message has two overloads based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + conn = NATS.connect(broker_url) + publish_message(conn, subject, message, correlation_id) end -# Close connection when done -NATS.close(conn) +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + try + NATS.publish(conn, subject, message) + log_trace(correlation_id, "Message published to $subject") + finally + NATS.drain(conn) + end +end + +# Type-specific serialization +function _serialize_data(data::String, payload_type::String) + # Text handling + return Vector{UInt8}(data) +end + +function _serialize_data(data::Dict, payload_type::String) + # Dictionary handling + json_str = JSON.json(data) + return Vector{UInt8}(json_str) +end + +function _serialize_data(data::DataFrame, payload_type::String) + # Table handling + io = IOBuffer() + Arrow.write(io, data) + return take!(io) +end ``` -**Use Case:** High-frequency publishing scenarios where connection reuse provides performance benefits by avoiding the overhead of establishing a new NATS connection for each message. - -### Basic Multi-Payload Example - -#### Julia (Sender) -```julia -using NATSBridge - -# Send multiple payloads in one message (type is required per payload) -smartsend( - "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], - broker_url="nats://localhost:4222", - fileserver_url="http://localhost:8080" -) - -# Even single payload must be wrapped in a list with type -smartsend("/test", [("single_data", mydata, "dictionary")], broker_url="nats://localhost:4222") -``` - -#### Julia (Receiver) -```julia -using NATSBridge - -# Receive returns a JSON object with envelope metadata and payloads field -env = smartreceive(msg) -# Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 -# env["payloads"] = [(dataname1, data1, "dictionary"), (dataname2, data2, "table"), ...] -``` - -### Scenario 2: Deep Dive Analysis (Large Arrow Table) - -#### Julia (Sender) -```julia -using Arrow -using DataFrames - -# Create large DataFrame -df = DataFrame( - id = 1:10_000_000, - value = rand(10_000_000), - category = rand(["A", "B", "C"], 10_000_000) -) - -# Send via smartsend - wrapped in list with type -# Large payload will use link transport (HTTP fileserver) -env, env_json_str = smartsend( - "analysis_results", - [("table_data", df, "table")], - broker_url="nats://localhost:4222", - fileserver_url="http://localhost:8080" -) -# env: msg_envelope_v1 with all metadata and payloads -# env_json_str: JSON string for publishing -``` - -#### smartsend Function Signature (Julia) +#### smartsend Implementation ```julia function smartsend( - subject::String, - data::AbstractArray{Tuple{String, Any, String}, 1}; # List of (dataname, data, type) tuples - broker_url::String = DEFAULT_BROKER_URL, # NATS server URL - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler::Function = plik_oneshot_upload, - size_threshold::Int = DEFAULT_SIZE_THRESHOLD, - correlation_id::String = string(uuid4()), # Correlation ID for tracing (auto-generated UUID) - msg_purpose::String = "chat", - sender_name::String = "NATSBridge", - receiver_name::String = "", - receiver_id::String = "", - reply_to::String = "", - reply_to_msg_id::String = "", - is_publish::Bool = true, - NATS_connection::Union{NATS.Connection, Nothing} = nothing, # Pre-existing NATS connection (optional) - msg_id::String = string(uuid4()), # Message ID (auto-generated UUID) - sender_id::String = string(uuid4()) # Sender ID (auto-generated UUID) -) -``` + subject::String, + data::AbstractArray{Tuple{String, T1, String}, 1}; + broker_url::String = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler::Function = plik_oneshot_upload, + size_threshold::Int = DEFAULT_SIZE_THRESHOLD, + correlation_id::String = string(uuid4()), + msg_purpose::String = "chat", + sender_name::String = "NATSBridge", + receiver_name::String = "", + receiver_id::String = "", + reply_to::String = "", + reply_to_msg_id::String = "", + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) +)::Tuple{msg_envelope_v1, String} where {T1<:Any} -**New Keyword Parameters:** -- `correlation_id::String = string(uuid4())` - Correlation ID for tracing (auto-generated UUID) -- `msg_id::String = string(uuid4())` - Message ID (auto-generated UUID) -- `sender_id::String = string(uuid4())` - Sender ID (auto-generated UUID) -- `NATS_connection::Union{NATS.Connection, Nothing} = nothing` - Pre-existing NATS connection. When provided, `smartsend` uses this connection instead of creating a new one, avoiding the overhead of connection establishment. This is useful for high-frequency publishing scenarios. + log_trace(correlation_id, "Starting smartsend for subject: $subject") + + # Process each payload in the list + payloads = msg_payload_v1[] + for (dataname, payload_data, payload_type) in data + # Serialize data based on type + payload_bytes = _serialize_data(payload_data, payload_type) + + payload_size = length(payload_bytes) + log_trace(correlation_id, "Serialized payload '$dataname' size: $payload_size bytes") + + # Decision: Direct vs Link + if payload_size < size_threshold + # Direct path - Base64 encode and send via NATS + payload_b64 = Base64.base64encode(payload_bytes) + log_trace(correlation_id, "Using direct transport for $payload_size bytes") + + payload = msg_payload_v1( + payload_b64, + payload_type; + id = string(uuid4()), + dataname = dataname, + transport = "direct", + encoding = "base64", + size = payload_size, + metadata = Dict{String, Any}("payload_bytes" => payload_size) + ) + push!(payloads, payload) + else + # Link path - Upload to HTTP server, send URL via NATS + log_trace(correlation_id, "Using link transport, uploading to fileserver") + + response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response["status"] != 200 + error("Failed to upload data to fileserver: $(response["status"])") + end + + url = response["url"] + log_trace(correlation_id, "Uploaded to URL: $url") -**Connection Handling Logic:** -```julia -if is_publish == false - # skip publish -elseif is_publish == true && NATS_connection === nothing - publish_message(broker_url, subject, env_json_str, cid) # Creates new connection -elseif is_publish == true && NATS_connection !== nothing - publish_message(NATS_connection, subject, env_json_str, cid) # Uses provided connection -end -``` + payload = msg_payload_v1( + url, + payload_type; + id = string(uuid4()), + dataname = dataname, + transport = "link", + encoding = "none", + size = payload_size, + metadata = Dict{String, Any}() + ) + push!(payloads, payload) + end + end -**Example with pre-existing connection:** -```julia -using NATSBridge - -# Create connection once -conn = NATS.connect("nats://localhost:4222") - -# Send multiple messages using the same connection -for i in 1:100 - data = rand(1000) - smartsend( - "analysis_results", - [("table_data", data, "table")], - NATS_connection=conn, # Reuse connection - is_publish=true + # Create msg_envelope_v1 with all payloads + # Note: First positional argument is "send_to" (the NATS subject), not "subject" + env = msg_envelope_v1( + subject, # send_to: NATS subject to publish to + payloads; + correlation_id = correlation_id, + msg_id = msg_id, + msg_purpose = msg_purpose, + sender_name = sender_name, + sender_id = sender_id, + receiver_name = receiver_name, + receiver_id = receiver_id, + reply_to = reply_to, + reply_to_msg_id = reply_to_msg_id, + broker_url = broker_url, + metadata = Dict{String, Any}(), ) -end - -# Close connection when done -NATS.close(conn) -``` - -#### publish_message Function - -The `publish_message` function provides two overloads for publishing messages to NATS: - -**Overload 1 - URL-based publishing (creates new connection):** -```julia -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - conn = NATS.connect(broker_url) # Create NATS connection - publish_message(conn, subject, message, correlation_id) + + env_json_str = envelope_to_json(env) + + if is_publish == false + # skip publish + elseif is_publish == true && NATS_connection === nothing + publish_message(broker_url, subject, env_json_str, correlation_id) + elseif is_publish == true && NATS_connection !== nothing + publish_message(NATS_connection, subject, env_json_str, correlation_id) + end + + return (env, env_json_str) end ``` -**Overload 2 - Connection-based publishing (uses pre-existing connection):** +#### smartreceive Implementation + ```julia -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - try - NATS.publish(conn, subject, message) # Publish message to NATS - log_trace(correlation_id, "Message published to $subject") - finally - NATS.drain(conn) # Ensure connection is closed properly - end +function smartreceive( + msg::NATS.Msg; + fileserver_download_handler::Function = _fetch_with_backoff, + max_retries::Int = 5, + base_delay::Int = 100, + max_delay::Int = 5000 +)::JSON.Object{String, Any} + # Parse the JSON envelope + env_json_obj = JSON.parse(String(msg.payload)) + log_trace(env_json_obj["correlation_id"], "Processing received message") + + # Process all payloads in the envelope + payloads_list = Tuple{String, Any, String}[] + + num_payloads = length(env_json_obj["payloads"]) + + for i in 1:num_payloads + payload = env_json_obj["payloads"][i] + transport = String(payload["transport"]) + dataname = String(payload["dataname"]) + + if transport == "direct" + log_trace(env_json_obj["correlation_id"], "Direct transport - decoding payload '$dataname'") + + # Extract base64 payload from the payload + payload_b64 = String(payload["data"]) + + # Decode Base64 payload + payload_bytes = Base64.base64decode(payload_b64) + + # Deserialize based on type + data_type = String(payload["payload_type"]) + data = _deserialize_data(payload_bytes, data_type, env_json_obj["correlation_id"]) + + push!(payloads_list, (dataname, data, data_type)) + elseif transport == "link" + # Extract download URL from the payload + url = String(payload["data"]) + log_trace(env_json_obj["correlation_id"], "Link transport - fetching '$dataname' from URL: $url") + + # Fetch with exponential backoff using the download handler + downloaded_data = fileserver_download_handler(url, max_retries, base_delay, max_delay, env_json_obj["correlation_id"]) + + # Deserialize based on type + data_type = String(payload["payload_type"]) + data = _deserialize_data(downloaded_data, data_type, env_json_obj["correlation_id"]) + + push!(payloads_list, (dataname, data, data_type)) + else + error("Unknown transport type for payload '$dataname': $(transport)") + end + end + env_json_obj["payloads"] = payloads_list + return env_json_obj end ``` -**Use Case:** Use the connection-based overload when you already have an established NATS connection and want to publish multiple messages without the overhead of creating a new connection for each publish. +#### _serialize_data Implementation -**Integration with smartsend:** ```julia -# When NATS_connection is provided to smartsend, it uses the connection-based publish_message -env, env_json_str = smartsend( - "my.subject", - [("data", payload_data, "type")], - NATS_connection=my_connection, # Pre-existing connection - is_publish=true -) -# Uses: publish_message(NATS_connection, subject, env_json_str, cid) - -# When NATS_connection is not provided, it uses the URL-based publish_message -env, env_json_str = smartsend( - "my.subject", - [("data", payload_data, "type")], - broker_url="nats://localhost:4222", - is_publish=true -) -# Uses: publish_message(broker_url, subject, env_json_str, cid) -``` - -**API Consistency Note:** -- **Julia:** Uses `NATS_connection` keyword parameter with function overloading for automatic connection management - -### Scenario 3: Live Binary Processing - -**Julia (Sender/Receiver):** -```julia -using NATSBridge - -# Binary data wrapped in list with type -smartsend( - "binary_input", - [("audio_chunk", binary_buffer, "binary")], - broker_url="nats://localhost:4222", - metadata=["sample_rate" => 44100, "channels" => 1] -) -``` - -### Scenario 4: Catch-Up (JetStream) - -**Julia (Producer/Consumer):** -```julia -using NATSBridge - -function publish_health_status(broker_url) - # Send status wrapped in list with type - status = Dict("cpu" => rand(), "memory" => rand()) - env, env_json_str = smartsend( - "health", - [("status", status, "dictionary")], - broker_url=broker_url - ) - sleep(5) # Every 5 seconds +function _serialize_data(data::Any, payload_type::String) + if payload_type == "text" + if isa(data, String) + data_bytes = Vector{UInt8}(data) + return data_bytes + else + error("Text data must be a String") + end + elseif payload_type == "dictionary" + json_str = JSON.json(data) + json_str_bytes = Vector{UInt8}(json_str) + return json_str_bytes + elseif payload_type == "table" + io = IOBuffer() + Arrow.write(io, data) + return take!(io) + elseif payload_type == "image" + if isa(data, Vector{UInt8}) + return data + else + error("Image data must be Vector{UInt8}") + end + elseif payload_type == "audio" + if isa(data, Vector{UInt8}) + return data + else + error("Audio data must be Vector{UInt8}") + end + elseif payload_type == "video" + if isa(data, Vector{UInt8}) + return data + else + error("Video data must be Vector{UInt8}") + end + elseif payload_type == "binary" + if isa(data, IOBuffer) + return take!(data) + elseif isa(data, Vector{UInt8}) + return data + else + error("Binary data must be binary (Vector{UInt8} or IOBuffer)") + end + else + error("Unknown payload_type: $payload_type") + end end ``` -### Scenario 5: Selection (Low Bandwidth) +#### _deserialize_data Implementation -**Focus:** Small Arrow tables. The Action: Julia wants to send a small DataFrame to show on a receiving application for the user to choose. - -**Julia (Sender/Receiver):** ```julia -using NATSBridge -using DataFrames - -# Create small DataFrame (e.g., 50KB - 500KB) -options_df = DataFrame( - id = 1:10, - name = ["Option A", "Option B", "Option C", "Option D", "Option E", - "Option F", "Option G", "Option H", "Option I", "Option J"], - description = ["Description A", "Description B", "Description C", "Description D", "Description E", - "Description F", "Description G", "Description H", "Description I", "Description J"] +function _deserialize_data( + data::Vector{UInt8}, + payload_type::String, + correlation_id::String ) - -# Convert to Arrow IPC stream -# Check payload size (< 1MB threshold) -# Publish directly to NATS with Base64-encoded payload -# Include metadata for dashboard selection context -env, env_json_str = smartsend( - "dashboard.selection", - [("options_table", options_df, "table")], - broker_url="nats://localhost:4222", - metadata=Dict("context" => "user_selection") -) -# env: msg_envelope_v1 with all metadata and payloads -# env_json_str: JSON string for publishing + if payload_type == "text" + return String(data) + elseif payload_type == "dictionary" + json_str = String(data) + return JSON.parse(json_str) + elseif payload_type == "table" + io = IOBuffer(data) + df = Arrow.Table(io) + return df + elseif payload_type == "image" + return data + elseif payload_type == "audio" + return data + elseif payload_type == "video" + return data + elseif payload_type == "binary" + return data + else + error("Unknown payload_type: $payload_type") + end +end ``` -**Use Case:** Julia server generates a list of available options (e.g., file selections, configuration presets) as a small DataFrame and sends to a receiving application for user selection. The selection is then sent back to Julia for processing. +#### _fetch_with_backoff Implementation -### Scenario 6: Chat System - -**Focus:** Every conversational message is composed of any number and any combination of components, spanning the full spectrum from small to large. This includes text, images, audio, video, tables, and files—specifically accommodating everything from brief snippets to high-resolution images, large audio files, extensive tables, and massive documents. Support for claim-check delivery and full bi-directional messaging. - -**Multi-Payload Support:** The system supports mixed-payload messages where a single message can contain multiple payloads with different transport strategies. The `smartreceive` function iterates through all payloads in the envelope and processes each according to its transport type. - -**Julia (Sender/Receiver):** ```julia -using NATSBridge - -# Build chat message with mixed payloads: -# - Text: direct transport (Base64) -# - Small images: direct transport (Base64) -# - Large images: link transport (HTTP URL) -# - Audio/video: link transport (HTTP URL) -# - Tables: direct or link depending on size -# - Files: link transport (HTTP URL) -# -# Each payload uses appropriate transport strategy: -# - Size < 1MB → direct (NATS + Base64) -# - Size >= 1MB → link (HTTP upload + NATS URL) -# -# Include claim-check metadata for delivery tracking -# Support bidirectional messaging with replyTo fields - -# Example: Chat with text, small image, and large file -chat_message = [ - ("message_text", "Hello, this is a test message!", "text"), - ("user_avatar", image_bytes, "image"), # Small image, direct transport - ("large_document", large_file_bytes, "binary") # Large file, link transport -] - -env, env_json_str = smartsend( - "chat.room123", - chat_message, - broker_url="nats://localhost:4222", - msg_purpose="chat", - reply_to="chat.room123.responses" +function _fetch_with_backoff( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String ) -# env: msg_envelope_v1 with all metadata and payloads -# env_json_str: JSON string for publishing + delay = base_delay + for attempt in 1:max_retries + try + response = HTTP.request("GET", url) + if response.status == 200 + log_trace(correlation_id, "Successfully fetched data from $url on attempt $attempt") + return response.body + else + error("Failed to fetch: $(response.status)") + end + catch e + log_trace(correlation_id, "Attempt $attempt failed: $(typeof(e))") + + if attempt < max_retries + sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + end + end + end + + error("Failed to fetch data after $max_retries attempts") +end ``` -**Use Case:** Full-featured chat system supporting rich media. User can send text, small images directly, or upload large files that get uploaded to HTTP server and referenced via URLs. Claim-check pattern ensures reliable delivery tracking for all message components. +#### plik_oneshot_upload Implementation -**Implementation Note:** The `smartreceive` function iterates through all payloads in the envelope and processes each according to its transport type. See the standard API format in Section 1: `msg_envelope_v1` supports `Vector{msg_payload_v1}` for multiple payloads. +```julia +function plik_oneshot_upload(file_server_url::String, dataname::String, data::Vector{UInt8}) + # Get upload id + url_getUploadID = "$file_server_url/upload" + headers = ["Content-Type" => "application/json"] + body = """{ "OneShot" : true }""" + http_response = HTTP.request("POST", url_getUploadID, headers, body; body_is_form=false) + response_json = JSON.parse(http_response.body) + uploadid = response_json["id"] + uploadtoken = response_json["uploadToken"] + + # Upload file + file_multipart = HTTP.Multipart(dataname, IOBuffer(data), "application/octet-stream") + url_upload = "$file_server_url/file/$uploadid" + headers = ["X-UploadToken" => uploadtoken] + + form = HTTP.Form(Dict( + "file" => file_multipart + )) + + http_response = nothing + try + http_response = HTTP.post(url_upload, headers, form) + catch e + @error "Request failed" exception=e + end + response_json = JSON.parse(http_response.body) + fileid = response_json["id"] + + url = "$file_server_url/file/$uploadid/$fileid/$dataname" + + return Dict("status" => http_response.status, "uploadid" => uploadid, "fileid" => fileid, "url" => url) +end +``` + +--- + +### JavaScript Implementation + +#### Module Structure + +```javascript +// natbridge.js +const nats = require('nats'); +const { v4: uuidv4 } = require('uuid'); +const fetch = require('node-fetch'); + +const DEFAULT_SIZE_THRESHOLD = 1_000_000; +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; + +class NATSClient { + constructor(url) { + this.url = url; + this.connection = null; + } + + async connect() { + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + async publish(subject, message) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + } + + async close() { + if (this.connection) { + this.connection.close(); + } + } +} + +async function smartsend(subject, data, options = {}) { + // Implementation +} + +async function smartreceive(msg, options = {}) { + // Implementation +} + +module.exports = { + NATSClient, + smartsend, + smartreceive, + plikOneshotUpload, + fetchWithBackoff +}; +``` + +#### smartsend Implementation + +```javascript +const nats = require('nats'); +const { v4: uuidv4 } = require('uuid'); +const fetch = require('node-fetch'); +const arrow = require('apache-arrow'); + +const DEFAULT_SIZE_THRESHOLD = 1_000_000; +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; + +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = uuidv4(), + msg_purpose = 'chat', + sender_name = 'NATSBridge', + receiver_name = '', + receiver_id = '', + reply_to = '', + reply_to_msg_id = '', + is_publish = true, + nats_connection = null, + msg_id = uuidv4(), + sender_id = uuidv4() + } = options; + + console.log(`[Correlation: ${correlation_id}] Starting smartsend for subject: ${subject}`); + + // Process payloads + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + console.log(`[Correlation: ${correlation_id}] Serialized payload '${dataname}' (type: ${payloadType}) size: ${payloadSize} bytes`); + + if (payloadSize < size_threshold) { + // Direct path + const payloadB64 = bufferToBase64(payloadBytes); + console.log(`[Correlation: ${correlation_id}] Using direct transport for ${payloadSize} bytes`); + + payloads.push({ + id: uuidv4(), + dataname, + payload_type: payloadType, + transport: 'direct', + encoding: 'base64', + size: payloadSize, + data: payloadB64, + metadata: { payload_bytes: payloadSize } + }); + } else { + // Link path + console.log(`[Correlation: ${correlation_id}] Using link transport, uploading to fileserver`); + + const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); + + if (response.status !== 200) { + throw new Error(`Failed to upload data to fileserver: ${response.status}`); + } + + console.log(`[Correlation: ${correlation_id}] Uploaded to URL: ${response.url}`); + + payloads.push({ + id: uuidv4(), + dataname, + payload_type: payloadType, + transport: 'link', + encoding: 'none', + size: payloadSize, + data: response.url, + metadata: {} + }); + } + } + + // Build envelope + const env = { + correlation_id, + msg_id, + timestamp: new Date().toISOString(), + send_to: subject, + msg_purpose, + sender_name, + sender_id, + receiver_name, + receiver_id, + reply_to, + reply_to_msg_id, + broker_url, + metadata: {}, + payloads + }; + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} +``` + +#### serializeData Implementation + +```javascript +const arrow = require('apache-arrow'); + +async function serializeData(data, payload_type) { + if (payload_type === 'text') { + if (typeof data === 'string') { + return Buffer.from(data, 'utf8'); + } else { + throw new Error('Text data must be a string'); + } + } else if (payload_type === 'dictionary') { + const jsonStr = JSON.stringify(data); + return Buffer.from(jsonStr, 'utf8'); + } else if (payload_type === 'table') { + // Convert to Arrow IPC + const buffer = Buffer.alloc(1024 * 1024); // Pre-allocate buffer + const writer = new arrow.RecordBatchWriter([ + new arrow.Schema(Object.keys(data[0]).map(key => new arrow.Field(key, arrow.any()))) + ]); + + for (const row of data) { + const recordBatch = arrow.recordBatch.fromObjects([row], writer.schema); + writer.write(recordBatch); + } + await writer.close(); + + // Read from the underlying buffer + return buffer; + } else if (payload_type === 'image') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Image data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'audio') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Audio data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'video') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Video data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'binary') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Binary data must be Uint8Array or Buffer'); + } + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} + +function bufferToBase64(buffer) { + return buffer.toString('base64'); +} +``` + +#### deserializeData Implementation + +```javascript +const arrow = require('apache-arrow'); + +async function deserializeData(data, payload_type, correlation_id) { + if (payload_type === 'text') { + return Buffer.from(data).toString('utf8'); + } else if (payload_type === 'dictionary') { + const jsonStr = Buffer.from(data).toString('utf8'); + return JSON.parse(jsonStr); + } else if (payload_type === 'table') { + const buffer = Buffer.from(data); + const table = arrow.tableFromRawBytes(buffer); + return table; + } else if (payload_type === 'image') { + return Buffer.from(data); + } else if (payload_type === 'audio') { + return Buffer.from(data); + } else if (payload_type === 'video') { + return Buffer.from(data); + } else if (payload_type === 'binary') { + return Buffer.from(data); + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} +``` + +#### fetchWithBackoff Implementation + +```javascript +async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { + let delay = base_delay; + + for (let attempt = 1; attempt <= max_retries; attempt++) { + try { + const response = await fetch(url); + + if (response.status === 200) { + console.log(`[Correlation: ${correlation_id}] Successfully fetched data from ${url} on attempt ${attempt}`); + return await response.arrayBuffer(); + } else { + throw new Error(`Failed to fetch: ${response.status}`); + } + } catch (e) { + console.log(`[Correlation: ${correlation_id}] Attempt ${attempt} failed: ${e.constructor.name}`); + + if (attempt < max_retries) { + await new Promise(resolve => setTimeout(resolve, delay)); + delay = Math.min(delay * 2, max_delay); + } + } + } + + throw new Error(`Failed to fetch data after ${max_retries} attempts`); +} +``` + +#### plikOneshotUpload Implementation + +```javascript +async function plikOneshotUpload(file_server_url, dataname, data) { + // Get upload id + const url_getUploadID = `${file_server_url}/upload`; + const headers = { 'Content-Type': 'application/json' }; + const body = JSON.stringify({ OneShot: true }); + + const http_response = await fetch(url_getUploadID, { + method: 'POST', + headers, + body + }); + + const response_json = await http_response.json(); + const uploadid = response_json.id; + const uploadtoken = response_json.uploadToken; + + // Upload file + const url_upload = `${file_server_url}/file/${uploadid}`; + const form = new FormData(); + const blob = new Blob([data]); + form.append('file', blob, dataname); + + const upload_headers = { + 'X-UploadToken': uploadtoken + }; + + const upload_response = await fetch(url_upload, { + method: 'POST', + headers: upload_headers, + body: form + }); + + const upload_json = await upload_response.json(); + const fileid = upload_json.id; + + const url = `${file_server_url}/file/${uploadid}/${fileid}/${dataname}`; + + return { + status: upload_response.status, + uploadid, + fileid, + url + }; +} +``` + +--- + +### Python Implementation + +#### Module Structure + +```python +# natbridge.py +import asyncio +import base64 +import json +import uuid +import time +from typing import Any, Dict, List, Tuple, Union, Callable +from dataclasses import dataclass, field +from datetime import datetime + +try: + import pyarrow as arrow + import pyarrow.parquet as pq + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + +try: + import aiohttp + import nats + from nats.aio.client import Client as NATSClient + NATS_AVAILABLE = True +except ImportError: + NATS_AVAILABLE = False + + +DEFAULT_SIZE_THRESHOLD = 1_000_000 +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + + +@dataclass +class MsgPayloadV1: + """Message payload structure.""" + id: str + dataname: str + payload_type: str + transport: str + encoding: str + size: int + data: Union[str, bytes] + metadata: Dict[str, Any] = field(default_factory=dict) + + +@dataclass +class MsgEnvelopeV1: + """Message envelope structure.""" + correlation_id: str + msg_id: str + timestamp: str + send_to: str + msg_purpose: str + sender_name: str + sender_id: str + receiver_name: str + receiver_id: str + reply_to: str + reply_to_msg_id: str + broker_url: str + metadata: Dict[str, Any] = field(default_factory=dict) + payloads: List[MsgPayloadV1] = field(default_factory=list) + + +class NATSBridge: + """Cross-platform NATS bridge implementation.""" + + def __init__(self, broker_url: str = None, fileserver_url: str = None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_client: NATSClient = None + + async def smartsend(self, subject: str, data: List[Tuple[str, Any, str]], **kwargs) -> Tuple[Dict, str]: + """Send data via NATS.""" + pass + + async def smartreceive(self, msg: Any, **kwargs) -> Dict: + """Receive and process NATS message.""" + pass +``` + +#### smartsend Implementation + +```python +import asyncio +import base64 +import json +import uuid +from typing import Any, Dict, List, Tuple, Union, Callable +from datetime import datetime + +DEFAULT_SIZE_THRESHOLD = 1_000_000 +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + + +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """ + Send data via NATS with automatic transport selection. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options + + Returns: + Tuple of (env, env_json_str) + """ + if correlation_id is None: + correlation_id = str(uuid.uuid4()) + if msg_id is None: + msg_id = str(uuid.uuid4()) + if sender_id is None: + sender_id = str(uuid.uuid4()) + + print(f"[Correlation: {correlation_id}] Starting smartsend for subject: {subject}") + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = _serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + print(f"[Correlation: {correlation_id}] Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") + + if payload_size < size_threshold: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + print(f"[Correlation: {correlation_id}] Using direct transport for {payload_size} bytes") + + payloads.append({ + 'id': str(uuid.uuid4()), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64, + 'metadata': {'payload_bytes': payload_size} + }) + else: + # Link path + print(f"[Correlation: {correlation_id}] Using link transport, uploading to fileserver") + + response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response['status'] != 200: + raise Exception(f"Failed to upload data to fileserver: {response['status']}") + + print(f"[Correlation: {correlation_id}] Uploaded to URL: {response['url']}") + + payloads.append({ + 'id': str(uuid.uuid4()), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'], + 'metadata': {} + }) + + # Build envelope + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': datetime.utcnow().isoformat() + 'Z', + 'send_to': subject, + 'msg_purpose': msg_purpose, + 'sender_name': sender_name, + 'sender_id': sender_id, + 'receiver_name': receiver_name, + 'receiver_id': receiver_id, + 'reply_to': reply_to, + 'reply_to_msg_id': reply_to_msg_id, + 'broker_url': broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + if is_publish: + if nats_connection: + await publish_message(nats_connection, subject, env_json_str, correlation_id) + else: + await publish_message(broker_url, subject, env_json_str, correlation_id) + + return env, env_json_str +``` + +#### serializeData Implementation + +```python +import base64 +import json +from typing import Any + +try: + import pyarrow as arrow + import pyarrow.parquet as pq + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + + +def _serialize_data(data: Any, payload_type: str) -> bytes: + """Serialize data to bytes based on type.""" + if payload_type == 'text': + if isinstance(data, str): + return data.encode('utf-8') + else: + raise Error('Text data must be a string') + elif payload_type == 'dictionary': + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table serialization') + + # Convert DataFrame to Arrow + import io + buf = io.BytesIO() + import pandas as pd + if isinstance(data, pd.DataFrame): + table = arrow.Table.from_pandas(data) + sink = arrow.ipc.new_file(buf) + arrow.ipc.write_table(table, sink) + sink.close() + return buf.getvalue() + else: + raise Error('Table data must be a pandas DataFrame') + elif payload_type == 'image': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Image data must be bytes') + elif payload_type == 'audio': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Audio data must be bytes') + elif payload_type == 'video': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Video data must be bytes') + elif payload_type == 'binary': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Binary data must be bytes') + else: + raise Error(f'Unknown payload_type: {payload_type}') +``` + +#### deserializeData Implementation + +```python +import base64 +import json +from typing import Any + +try: + import pyarrow as arrow + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + + +def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: + """Deserialize bytes to data based on type.""" + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table deserialization') + + import io + buf = io.BytesIO(data) + reader = arrow.ipc.open_file(buf) + return reader.read_all().to_pandas() + elif payload_type == 'image': + return data + elif payload_type == 'audio': + return data + elif payload_type == 'video': + return data + elif payload_type == 'binary': + return data + else: + raise Error(f'Unknown payload_type: {payload_type}') +``` + +#### fetchWithBackoff Implementation + +```python +import asyncio +import aiohttp +from typing import Callable + + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """Fetch URL with exponential backoff.""" + delay = base_delay + + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + print(f"[Correlation: {correlation_id}] Successfully fetched data from {url} on attempt {attempt}") + return await response.read() + else: + raise Exception(f"Failed to fetch: {response.status}") + except Exception as e: + print(f"[Correlation: {correlation_id}] Attempt {attempt} failed: {type(e).__name__}") + + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + + raise Exception(f"Failed to fetch data after {max_retries} attempts") +``` + +#### plikOneshotUpload Implementation + +```python +import aiohttp +import json +from typing import Dict, Any + + +async def plik_oneshot_upload( + file_server_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """Upload data to plik server in one-shot mode.""" + + # Get upload id + async with aiohttp.ClientSession() as session: + url_getUploadID = f"{file_server_url}/upload" + headers = {'Content-Type': 'application/json'} + body = json.dumps({"OneShot": True}) + + async with session.post(url_getUploadID, headers=headers, data=body) as response: + response_json = await response.json() + uploadid = response_json['id'] + uploadtoken = response_json['uploadToken'] + + # Upload file + url_upload = f"{file_server_url}/file/{uploadid}" + headers = {'X-UploadToken': uploadtoken} + + form = aiohttp.FormData() + form.add_field('file', data, filename=dataname, content_type='application/octet-stream') + + async with session.post(url_upload, headers=headers, data=form) as upload_response: + upload_json = await upload_response.json() + fileid = upload_json['id'] + + url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" + + return { + 'status': upload_response.status, + 'uploadid': uploadid, + 'fileid': fileid, + 'url': url + } +``` + +--- + +## MicroPython Implementation + +### Limitations + +MicroPython has significant constraints compared to desktop implementations: + +| Feature | Desktop | MicroPython | +|---------|---------|-------------| +| Memory | Unlimited | ~256KB - 1MB | +| Arrow IPC | ✅ | ❌ (not supported) | +| Async/Await | ✅ | ⚠️ (uasyncio only) | +| Large payloads (>1MB) | ✅ | ❌ (enforced limit) | +| Table type | ✅ | ❌ | +| Multiple payloads | ✅ | ⚠️ (limited) | + +### MicroPython Module Structure + +```python +# natbridge_mpy.py (MicroPython) +import network +import time +import json +import base64 +import uos +import struct + +# Constants +DEFAULT_SIZE_THRESHOLD = 100000 # 100KB for MicroPython +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" +MAX_PAYLOAD_SIZE = 50000 # Hard limit + + +class NATSBridge: + """MicroPython NATS bridge implementation.""" + + def __init__(self, broker_url=None, fileserver_url=None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_conn = None + + def smartsend(self, subject, data, **kwargs): + """Send data (synchronous).""" + correlation_id = self._generate_uuid() + msg_id = self._generate_uuid() + sender_id = self._generate_uuid() + + print(f"[Correlation: {correlation_id}] Starting smartsend") + + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = self._serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + if payload_size > MAX_PAYLOAD_SIZE: + raise MemoryError(f"Payload {dataname} exceeds max size {MAX_PAYLOAD_SIZE}") + + if payload_size < DEFAULT_SIZE_THRESHOLD: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('ascii') + payloads.append({ + 'id': self._generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64 + }) + else: + # Link path (limited support) + response = self._sync_fileserver_upload(self.fileserver_url, dataname, payload_bytes) + payloads.append({ + 'id': self._generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'] + }) + + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), + 'send_to': subject, + 'msg_purpose': kwargs.get('msg_purpose', 'chat'), + 'sender_name': kwargs.get('sender_name', 'NATSBridge'), + 'sender_id': sender_id, + 'receiver_name': kwargs.get('receiver_name', ''), + 'receiver_id': kwargs.get('receiver_id', ''), + 'reply_to': kwargs.get('reply_to', ''), + 'reply_to_msg_id': kwargs.get('reply_to_msg_id', ''), + 'broker_url': self.broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + # Publish + self._publish(subject, env_json_str, correlation_id) + + return env, env_json_str + + def smartreceive(self, msg, **kwargs): + """Receive and process message (synchronous).""" + env_json_obj = json.loads(msg.payload) + correlation_id = env_json_obj['correlation_id'] + + payloads_list = [] + for payload in env_json_obj['payloads']: + transport = payload['transport'] + dataname = payload['dataname'] + + if transport == 'direct': + payload_b64 = payload['data'] + payload_bytes = base64.b64decode(payload_b64) + data_type = payload['payload_type'] + data = self._deserialize_data(payload_bytes, data_type) + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + url = payload['data'] + downloaded_data = self._sync_fileserver_download( + url, + kwargs.get('max_retries', 3), + kwargs.get('base_delay', 100), + kwargs.get('max_delay', 1000), + correlation_id + ) + data_type = payload['payload_type'] + data = self._deserialize_data(downloaded_data, data_type) + payloads_list.append((dataname, data, data_type)) + + env_json_obj['payloads'] = payloads_list + return env_json_obj + + def _serialize_data(self, data, payload_type): + """Serialize data (MicroPython version - no table support).""" + if payload_type == 'text': + return data.encode('utf-8') + elif payload_type == 'dictionary': + return json.dumps(data).encode('utf-8') + elif payload_type in ('image', 'audio', 'video', 'binary'): + return bytes(data) + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + + def _deserialize_data(self, data, payload_type): + """Deserialize data (MicroPython version).""" + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + return json.loads(data.decode('utf-8')) + elif payload_type in ('image', 'audio', 'video', 'binary'): + return data + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + + def _generate_uuid(self): + """Generate simple UUID (MicroPython compatible).""" + return 'mp-%04x%04x-%04x-%04x-%04x-%04x%04x%04x' % ( + time.time_ns() // (10**6) % 0xFFFFFFFF, + time.time_ns() % 0xFFFFFFFF, + time.time_ns() >> 32 & 0xFFFF, + time.time_ns() >> 48 & 0xFFFF, + time.time_ns() >> 64 & 0xFFFF, + time.time_ns() >> 80 & 0xFFFF, + time.time_ns() >> 96 & 0xFFFF, + time.time_ns() >> 112 & 0xFFFF + ) + + def _sync_fileserver_upload(self, url, dataname, data): + """Synchronous file upload (limited).""" + # Simplified implementation for MicroPython + # In practice, would use network.HTTP or similar + raise NotImplementedError("File upload not implemented in MicroPython") + + def _sync_fileserver_download(self, url, max_retries, base_delay, max_delay, correlation_id): + """Synchronous file download with backoff.""" + # Simplified implementation for MicroPython + raise NotImplementedError("File download not implemented in MicroPython") + + def _publish(self, subject, message, correlation_id): + """Publish message to NATS.""" + # Simplified implementation for MicroPython + raise NotImplementedError("NATS publishing not implemented in MicroPython") +``` + +--- ## Configuration @@ -553,99 +1871,98 @@ env, env_json_str = smartsend( | Variable | Default | Description | |----------|---------|-------------| | `NATS_URL` | `nats://localhost:4222` | NATS server URL | -| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL (base URL without `/upload` suffix) | -| `SIZE_THRESHOLD` | `1_000_000` | Size threshold in bytes (1MB) | +| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | +| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | -### Message Envelope Schema +### MicroPython Configuration -```json -{ - "correlation_id": "uuid-v4-string", - "msg_id": "uuid-v4-string", - "timestamp": "2024-01-15T10:30:00Z", - - "send_to": "topic/subject", - "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", - "sender_name": "agent-wine-web-frontend", - "sender_id": "uuid4", - "receiver_name": "agent-backend", - "receiver_id": "uuid4", - "reply_to": "topic", - "reply_to_msg_id": "uuid4", - "broker_url": "nats://localhost:4222", - - "metadata": { - "content_type": "application/octet-stream", - "content_length": 123456 - }, - - "payloads": [ - { - "id": "uuid4", - "dataname": "login_image", - "payload_type": "image", - "transport": "direct", - "encoding": "base64", - "size": 15433, - "data": "base64-encoded-string", - "metadata": { - "checksum": "sha256_hash" - } - } - ] -} +```python +# micropython.conf +NATS_URL = "nats://broker.local:4222" +FILESERVER_URL = "http://fileserver.local:8080" +SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices +MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython ``` +--- + ## Performance Considerations ### Zero-Copy Reading -- Use Arrow's memory-mapped file reading -- Avoid unnecessary data copying during deserialization -- Use Apache Arrow's native IPC reader + +| Platform | Strategy | +|----------|----------| +| **Julia** | `Arrow.read()` with memory-mapped files | +| **JavaScript** | `ArrayBuffer` with `DataView` | +| **Python** | `pyarrow` memory mapping | +| **MicroPython** | Not available (streaming only) | ### Exponential Backoff -- Maximum retry count: 5 -- Base delay: 100ms, max delay: 5000ms + +All platforms implement exponential backoff for HTTP downloads: + +```python +# Python +async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): + delay = base_delay + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.read() + except Exception as e: + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + raise Exception("Failed to fetch after max retries") +``` ### Correlation ID Logging -- Log correlation_id at every stage -- Include: send, receive, serialize, deserialize -- Use structured logging format + +All platforms use correlation IDs for distributed tracing: + +``` +[timestamp] [Correlation: abc123] Message published to subject +``` + +--- ## Testing -Run the test scripts for Julia: +### Test File Organization -### Julia Tests +| Platform | Sender Tests | Receiver Tests | +|----------|--------------|----------------| +| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | +| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | +| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | + +### Run Tests ```bash -# Text message exchange -julia test/test_julia_to_julia_text_sender.jl -julia test/test_julia_to_julia_text_receiver.jl +# Julia +julia test/test_julia_text_sender.jl +julia test/test_julia_text_receiver.jl -# Dictionary exchange -julia test/test_julia_to_julia_dict_sender.jl -julia test/test_julia_to_julia_dict_receiver.jl +# JavaScript (Node.js) +node test/test_js_text_sender.js +node test/test_js_text_receiver.js -# File transfer -julia test/test_julia_to_julia_file_sender.jl -julia test/test_julia_to_julia_file_receiver.jl - -# Mixed payload types -julia test/test_julia_to_julia_mix_payloads_sender.jl -julia test/test_julia_to_julia_mix_payloads_receiver.jl - -# Table exchange -julia test/test_julia_to_julia_table_sender.jl -julia test/test_julia_to_julia_table_receiver.jl +# Python +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py ``` +--- + ## Troubleshooting ### Common Issues 1. **NATS Connection Failed** - Ensure NATS server is running + - Check `broker_url` configuration 2. **HTTP Upload Failed** - Ensure file server is running @@ -655,7 +1972,27 @@ julia test/test_julia_to_julia_table_receiver.jl 3. **Arrow IPC Deserialization Error** - Ensure data is properly serialized to Arrow format - Check Arrow version compatibility + - MicroPython doesn't support Arrow IPC -## License +4. **Memory Constraints (MicroPython)** + - Reduce `size_threshold` + - Use direct transport only (< 100KB) + - Avoid large payloads -MIT \ No newline at end of file +--- + +## Summary + +This cross-platform NATS bridge provides: + +1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across all platforms +2. **Idiomatic Implementations**: + - **Julia**: Multiple dispatch, struct-based design, native Arrow IPC + - **JavaScript**: Async/await, prototype-based utilities, class-based NATS client + - **Python**: Class-based design with dataclasses, type hints, async/await + - **MicroPython**: Synchronous API, memory-constrained optimizations +3. **Message Format Consistency**: Identical JSON schemas across all platforms +4. **Handler Abstraction**: File server operations abstracted through configurable handlers +5. **Platform-Specific Optimizations**: Arrow IPC in desktop platforms, streaming support in MicroPython + +The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. \ No newline at end of file diff --git a/etc.jl b/etc.jl index 03861f4..7dfde2e 100644 --- a/etc.jl +++ b/etc.jl @@ -20,10 +20,12 @@ Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read( -Help me expands this Julia package (NATSBridge) into a cross-platform project by building a JavaScript implementation at src/NATSBridge.js in the current workspace. To ensure accuracy, the Julia src directory will serve as the ground truth, as the documentation may be outdated. - -My goal is to maintain interface parity at the high-level API for a consistent user experience, while ensuring the low-level implementation adheres strictly to the idiomatic conventions of each respective language (e.g., multiple dispatch in Julia vs. asynchronous, prototype, or class-based patterns in JS) +Help me expands this Julia package (NATSBridge) into a cross-platform project by adding a JavaScript and Python/MicroPython implementation. To ensure accuracy, the Julia src directory will serve as the ground truth, as the documentation may be outdated. +My goal is to maintain interface parity at the high-level API for a consistent user experience, while ensuring the low-level implementation adheres strictly to the idiomatic conventions of each respective language (e.g., multiple dispatch in Julia vs. asynchronous, prototype, or class-based patterns in JS and Python/MicroPython) + +Now do the following: +1) check docs to see if there is any mistake. diff --git a/README.md b/etc.md similarity index 100% rename from README.md rename to etc.md diff --git a/examples/tutorial.md b/examples/tutorial.md index 22ebbdf..e19e6d7 100644 --- a/examples/tutorial.md +++ b/examples/tutorial.md @@ -1,6 +1,6 @@ -# NATSBridge Tutorial +# Cross-Platform NATSBridge Tutorial -A step-by-step guide to get started with NATSBridge - a high-performance, bi-directional data bridge for **Julia**. +A step-by-step guide to get started with NATSBridge across **Julia**, **JavaScript**, and **Python/MicroPython**. ## Table of Contents @@ -15,22 +15,35 @@ A step-by-step guide to get started with NATSBridge - a high-performance, bi-dir ## Overview -NATSBridge enables seamless communication for Julia applications through NATS, with automatic transport selection based on payload size: +NATSBridge enables seamless communication across platforms through NATS, with automatic transport selection based on payload size: - **Direct Transport**: Payloads < 1MB are sent directly via NATS (Base64 encoded) - **Link Transport**: Payloads >= 1MB are uploaded to an HTTP file server and referenced via URL +### Cross-Platform API Parity + +All three platforms use the same high-level API: + +``` +# Input format +smartsend(subject, [(dataname, data, type), ...], options) + +# Output format +(env, env_json_str) = smartsend(...) +env = smartreceive(msg, options) +``` + ### Supported Payload Types -| Type | Description | -|------|-------------| -| `text` | Plain text strings | -| `dictionary` | JSON-serializable dictionaries | -| `table` | Tabular data (Arrow IPC format) | -| `image` | Image data (PNG, JPG bytes) | -| `audio` | Audio data (WAV, MP3 bytes) | -| `video` | Video data (MP4, AVI bytes) | -| `binary` | Generic binary data | +| Type | Julia | JavaScript | Python | MicroPython | +|------|-------|------------|--------|-------------| +| `text` | `String` | `string` | `str` | `str` | +| `dictionary` | `Dict` | `Object` | `dict` | `dict` | +| `table` | `DataFrame` | `Array` | `DataFrame` | ❌ | +| `image` | `Vector{UInt8}` | `Uint8Array` | `bytes` | `bytearray` | +| `audio` | `Vector{UInt8}` | `Uint8Array` | `bytes` | `bytearray` | +| `video` | `Vector{UInt8}` | `Uint8Array` | `bytes` | `bytearray` | +| `binary` | `Vector{UInt8}` | `Uint8Array` | `bytes` | `bytearray` | --- @@ -40,7 +53,7 @@ Before you begin, ensure you have: 1. **NATS Server** running (or accessible) 2. **HTTP File Server** (optional, for large payloads > 1MB) -3. **Julia** with required packages +3. **Platform-specific packages** installed --- @@ -58,6 +71,29 @@ Pkg.add("UUIDs") Pkg.add("Dates") ``` +### JavaScript (Node.js) + +```bash +npm install nats uuid apache-arrow node-fetch +``` + +### JavaScript (Browser) + +```html + + +``` + +### Python (Desktop) + +```bash +pip install nats-py aiohttp pyarrow pandas +``` + +### MicroPython + +Uses built-in modules: `network`, `socket`, `time`, `json`, `base64` + --- ## Quick Start @@ -71,10 +107,7 @@ docker run -p 4222:4222 nats:latest ### Step 2: Start HTTP File Server (Optional) ```bash -# Create a directory for file uploads mkdir -p /tmp/fileserver - -# Use any HTTP server that supports POST for file uploads python3 -m http.server 8080 --directory /tmp/fileserver ``` @@ -98,6 +131,72 @@ env, env_json_str = smartsend("/chat/room1", data, broker_url="nats://localhost: # env_json_str: JSON string for publishing to NATS ``` +#### JavaScript + +```javascript +const NATSBridge = require('./src/natbridge.js'); + +// Send a text message +const data = [["message", "Hello World", "text"]]; +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat/room1", + data, + { broker_url: "nats://localhost:4222" } +); +// env: Object with all metadata and payloads +// env_json_str: JSON string for publishing +console.log("Message sent!"); + +// Or use is_publish=false +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat/room1", + data, + { broker_url: "nats://localhost:4222", is_publish: false } +); +``` + +#### Python + +```python +from natbridge import smartsend + +# Send a text message +data = [("message", "Hello World", "text")] +env, env_json_str = await smartsend( + "/chat/room1", + data, + broker_url="nats://localhost:4222" +) +# env: Dict with all metadata and payloads +# env_json_str: JSON string for publishing +print("Message sent!") + +# Or use is_publish=False +env, env_json_str = await smartsend( + "/chat/room1", + data, + broker_url="nats://localhost:4222", + is_publish=False +) +``` + +#### MicroPython + +```python +from natbridge_mpy import NATSBridge + +bridge = NATSBridge() + +# Send a text message (limited to small payloads) +data = [("message", "Hello World", "text")] +env, env_json_str = bridge.smartsend( + "/chat/room1", + data, + size_threshold=100000 # Lower threshold for MicroPython +) +print("Message sent!") +``` + ### Step 4: Receive Messages #### Julia @@ -113,6 +212,36 @@ for (dataname, data, type) in env["payloads"] end ``` +#### JavaScript + +```javascript +const NATSBridge = require('./src/natbridge.js'); + +// Receive and process message +const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: NATSBridge.fetchWithBackoff +}); +// env.payloads = [[dataname, data, type], ...] +for (const [dataname, data, type] of env.payloads) { + console.log(`Received ${dataname}:`, data); +} +``` + +#### Python + +```python +from natbridge import smartreceive + +# Receive and process message +env = await smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff +) +# env["payloads"] = [(dataname, data, type), ...] +for dataname, data, type in env["payloads"]: + print(f"Received {dataname}: {data}") +``` + --- ## Basic Examples @@ -134,6 +263,65 @@ data = [("config", config, "dictionary")] env, env_json_str = smartsend("/device/config", data, broker_url="nats://localhost:4222") ``` +#### JavaScript + +```javascript +const NATSBridge = require('./src/natbridge.js'); + +const config = { + wifi_ssid: "MyNetwork", + wifi_password: "password123", + update_interval: 60 +}; + +const data = [["config", config, "dictionary"]]; +const [env, env_json_str] = await NATSBridge.smartsend( + "/device/config", + data, + { broker_url: "nats://localhost:4222" } +); +``` + +#### Python + +```python +from natbridge import smartsend + +config = { + "wifi_ssid": "MyNetwork", + "wifi_password": "password123", + "update_interval": 60 +} + +data = [("config", config, "dictionary")] +env, env_json_str = await smartsend( + "/device/config", + data, + broker_url="nats://localhost:4222" +) +``` + +#### MicroPython + +```python +from natbridge_mpy import NATSBridge + +bridge = NATSBridge() + +config = { + "wifi_ssid": "MyNetwork", + "wifi_password": "password123", + "update_interval": 60 +} + +data = [("config", config, "dictionary")] +env, env_json_str = bridge.smartsend( + "/device/config", + data, + size_threshold=100000 +) +``` + ### Example 2: Sending Binary Data (Image) #### Julia @@ -148,6 +336,59 @@ data = [("user_image", image_data, "binary")] env, env_json_str = smartsend("/chat/image", data, broker_url="nats://localhost:4222") ``` +#### JavaScript + +```javascript +const NATSBridge = require('./src/natbridge.js'); +const fs = require('fs'); + +// Read image file +const image_data = fs.readFileSync('image.png'); + +const data = [["user_image", image_data, "binary"]]; +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat/image", + data, + { broker_url: "nats://localhost:4222" } +); +``` + +#### Python + +```python +from natbridge import smartsend + +# Read image file +with open("image.png", "rb") as f: + image_data = f.read() + +data = [("user_image", image_data, "binary")] +env, env_json_str = await smartsend( + "/chat/image", + data, + broker_url="nats://localhost:4222" +) +``` + +#### MicroPython + +```python +from natbridge_mpy import NATSBridge + +bridge = NATSBridge() + +# Read image file +with open("image.png", "rb") as f: + image_data = f.read() + +data = [("user_image", image_data, "binary")] +env, env_json_str = bridge.smartsend( + "/chat/image", + data, + size_threshold=100000 +) +``` + ### Example 3: Request-Response Pattern #### Julia (Requester) @@ -164,16 +405,47 @@ env, env_json_str = smartsend( reply_to="/device/response", reply_to_msg_id="cmd-001" ) -# env: msg_envelope_v1 object -# env_json_str: JSON string for publishing to NATS +``` + +#### JavaScript (Requester) + +```javascript +const NATSBridge = require('./src/natbridge.js'); + +// Send command with reply-to +const data = [["command", { action: "read_sensor" }, "dictionary"]]; +const [env, env_json_str] = await NATSBridge.smartsend( + "/device/command", + data, + { + broker_url: "nats://localhost:4222", + reply_to: "/device/response", + reply_to_msg_id: "cmd-001" + } +); +``` + +#### Python (Requester) + +```python +from natbridge import smartsend + +# Send command with reply-to +data = [("command", {"action": "read_sensor"}, "dictionary")] +env, env_json_str = await smartsend( + "/device/command", + data, + broker_url="nats://localhost:4222", + reply_to="/device/response", + reply_to_msg_id="cmd-001" +) ``` #### Julia (Responder) ```julia -using NATS, NATSBridge +using NATSBridge, NATS -# Configuration const SUBJECT = "/device/command" const NATS_URL = "nats://localhost:4222" @@ -182,13 +454,11 @@ function test_responder() NATS.subscribe(conn, SUBJECT) do msg env = smartreceive(msg, fileserver_download_handler=_fetch_with_backoff) - # Extract reply_to from the envelope metadata reply_to = env["reply_to"] for (dataname, data, type) in env["payloads"] if dataname == "command" && data["action"] == "read_sensor" response = Dict("sensor_id" => "sensor-001", "value" => 42.5) - # Send response to the reply_to subject from the request if !isempty(reply_to) smartsend(reply_to, [("data", response, "dictionary")]) end @@ -226,10 +496,72 @@ env, env_json_str = smartsend( fileserver_url="http://localhost:8080" ) -# The envelope will contain the download URL println("File uploaded to: $(env.payloads[1].data)") ``` +#### JavaScript + +```javascript +const NATSBridge = require('./src/natbridge.js'); + +// Create large data (> 1MB) +const large_data = Buffer.alloc(2_000_000); +for (let i = 0; i < large_data.length; i++) { + large_data[i] = Math.floor(Math.random() * 256); +} + +const [env, env_json_str] = await NATSBridge.smartsend( + "/data/large", + [["large_file", large_data, "binary"]], + { + broker_url: "nats://localhost:4222", + fileserver_url: "http://localhost:8080" + } +); + +console.log("File uploaded to:", env.payloads[0].data); +``` + +#### Python + +```python +from natbridge import smartsend + +# Create large data (> 1MB) +import os +large_data = os.urandom(2_000_000) + +env, env_json_str = await smartsend( + "/data/large", + [("large_file", large_data, "binary")], + broker_url="nats://localhost:4222", + fileserver_url="http://localhost:8080" +) + +print(f"File uploaded to: {env['payloads'][0]['data']}") +``` + +#### MicroPython + +MicroPython enforces a hard limit of 50KB per payload: + +```python +from natbridge_mpy import NATSBridge + +bridge = NATSBridge() + +# MicroPython has a hard limit of 50KB per payload +# Use streaming or chunking for larger data +small_data = bytes(1000) # 1KB + +data = [("small_file", small_data, "binary")] +env, env_json_str = bridge.smartsend( + "/data/small", + data, + size_threshold=100000 # Enforced max: 50000 bytes +) +``` + ### Example 5: Mixed Content (Chat with Text + Image) NATSBridge supports sending multiple payloads with different types in a single message: @@ -249,6 +581,46 @@ data = [ env, env_json_str = smartsend("/chat/mixed", data, broker_url="nats://localhost:4222") ``` +#### JavaScript + +```javascript +const NATSBridge = require('./src/natbridge.js'); +const fs = require('fs'); + +const image_data = fs.readFileSync('avatar.png'); + +const data = [ + ["message_text", "Hello with image!", "text"], + ["user_avatar", image_data, "image"] +]; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat/mixed", + data, + { broker_url: "nats://localhost:4222" } +); +``` + +#### Python + +```python +from natbridge import smartsend + +with open("avatar.png", "rb") as f: + image_data = f.read() + +data = [ + ("message_text", "Hello with image!", "text"), + ("user_avatar", image_data, "image") +] + +env, env_json_str = await smartsend( + "/chat/mixed", + data, + broker_url="nats://localhost:4222" +) +``` + ### Example 6: Table Data (Arrow IPC) For tabular data, NATSBridge uses Apache Arrow IPC format: @@ -270,12 +642,58 @@ data = [("students", df, "table")] env, env_json_str = smartsend("/data/students", data, broker_url="nats://localhost:4222") ``` +#### JavaScript + +```javascript +const NATSBridge = require('./src/natbridge.js'); + +// Create table data (array of objects) +const table_data = [ + { id: 1, name: "Alice", score: 95 }, + { id: 2, name: "Bob", score: 88 }, + { id: 3, name: "Charlie", score: 92 } +]; + +const data = [["students", table_data, "table"]]; +const [env, env_json_str] = await NATSBridge.smartsend( + "/data/students", + data, + { broker_url: "nats://localhost:4222" } +); +``` + +#### Python + +```python +from natbridge import smartsend +import pandas as pd + +# Create DataFrame +df = pd.DataFrame({ + 'id': [1, 2, 3], + 'name': ['Alice', 'Bob', 'Charlie'], + 'score': [95, 88, 92] +}) + +data = [("students", df, "table")] +env, env_json_str = await smartsend( + "/data/students", + data, + broker_url="nats://localhost:4222" +) +``` + +#### MicroPython + +MicroPython does not support table type due to memory constraints. Use dictionary or binary instead. + --- ## Next Steps 1. **Explore the test directory** for more examples 2. **Check the documentation** for advanced configuration options +3. **Read the walkthrough** for building real-world applications --- @@ -296,7 +714,8 @@ env, env_json_str = smartsend("/data/students", data, broker_url="nats://localho ### Serialization Errors - Verify data type matches the specified type -- Check that binary data is in the correct format (Vector{UInt8}) +- Check that binary data is in the correct format +- MicroPython: Ensure payload size < 50KB --- diff --git a/examples/walkthrough.md b/examples/walkthrough.md index 3e2f213..decd77e 100644 --- a/examples/walkthrough.md +++ b/examples/walkthrough.md @@ -1,6 +1,6 @@ -# NATSBridge Walkthrough +# Cross-Platform NATSBridge Walkthrough -A comprehensive guide to building real-world applications with NATSBridge. +A comprehensive guide to building real-world applications with NATSBridge across **Julia**, **JavaScript**, and **Python/MicroPython**. ## Table of Contents @@ -9,7 +9,7 @@ A comprehensive guide to building real-world applications with NATSBridge. 3. [Building a Chat Application](#building-a-chat-application) 4. [Building a File Transfer System](#building-a-file-transfer-system) 5. [Building a Streaming Data Pipeline](#building-a-streaming-data-pipeline) -6. [Performance Optimization](#performance-optimimization) +6. [Performance Optimization](#performance-optimization) 7. [Best Practices](#best-practices) --- @@ -28,20 +28,26 @@ Each section builds on the previous one, gradually increasing in complexity. ## Architecture Overview -### System Components +### Cross-Platform System Components ```mermaid flowchart TB - subgraph Sender["Julia Application (Sender)"] - SenderApp[App Code] - NATSBridge_Send[NATSBridge] - NATS_Client[NATS.jl] + subgraph JuliaApp["Julia Application"] + JuliaAppCode[App Code] + JuliaBridge[NATSBridge.jl] + JuliaNATS[NATS.jl] end - subgraph Receiver["Julia Application (Receiver)"] - ReceiverApp[App Code] - NATSBridge_Recv[NATSBridge] - NATS_Client_Recv[NATS.jl] + subgraph JSApp["JavaScript Application"] + JSAppCode[App Code] + JSBridge[NATSBridge.js] + JSNATS[nats.js] + end + + subgraph PythonApp["Python Application"] + PythonAppCode[App Code] + PythonBridge[NATSBridge.py] + PythonNATS[nats-py] end subgraph Infrastructure["Infrastructure"] @@ -49,19 +55,32 @@ flowchart TB FileServer[HTTP File Server
Upload/Download] end - SenderApp --> NATSBridge_Send - NATSBridge_Send --> NATS_Client - NATS_Client --> NATS - - NATS --> NATS_Client_Recv - NATS_Client_Recv --> NATSBridge_Recv - NATSBridge_Recv --> ReceiverApp + JuliaAppCode --> JuliaBridge + JuliaBridge --> JuliaNATS + JSAppCode --> JSBridge + JSBridge --> JSNATS + PythonAppCode --> PythonBridge + PythonBridge --> PythonNATS - NATSBridge_Send -.->|HTTP POST upload| FileServer - FileServer -.->|HTTP GET download| NATSBridge_Recv + JuliaNATS --> NATS + JSNATS --> NATS + PythonNATS --> NATS - style SenderApp fill:#e8f5e9 - style ReceiverApp fill:#e8f5e9 + NATS --> JuliaNATS + NATS --> JSNATS + NATS --> PythonNATS + + JuliaBridge -.->|HTTP POST upload| FileServer + JSBridge -.->|HTTP POST upload| FileServer + PythonBridge -.->|HTTP POST upload| FileServer + + FileServer -.->|HTTP GET download| JuliaBridge + FileServer -.->|HTTP GET download| JSBridge + FileServer -.->|HTTP GET download| PythonBridge + + style JuliaApp fill:#c5e1a5 + style JSApp fill:#bbdefb + style PythonApp fill:#f8bbd0 style NATS fill:#fff3e0 style FileServer fill:#f3e5f5 ``` @@ -98,7 +117,9 @@ cat > config.json << 'EOF' EOF ``` -### Step 2: Create the Chat Interface (Julia) +### Step 2: Create the Chat Interface + +#### Julia ```julia # src/chat_ui.jl @@ -152,8 +173,109 @@ function add_message(ui::ChatUI, user::String, text::String, attachment::Union{N end ``` +#### JavaScript + +```javascript +// src/chat_ui.js +const NATSBridge = require('./src/natbridge.js'); + +class ChatUI { + constructor() { + this.messages = []; + this.currentRoom = ""; + } + + sendMessage(messageInput, selectedFile = null) { + const data = []; + + // Add text message + if (messageInput.length > 0) { + data.push(["text", messageInput, "text"]); + } + + // Add file if selected + if (selectedFile !== null) { + const fileData = fs.readFileSync(selectedFile); + const fileType = this.getFileType(selectedFile); + data.push(["attachment", fileData, fileType]); + } + + return data; + } + + getFileType(filename) { + if (filename.endsWith('.png') || filename.endsWith('.jpg')) { + return 'image'; + } else if (filename.endsWith('.mp3') || filename.endsWith('.wav')) { + return 'audio'; + } else if (filename.endsWith('.mp4') || filename.endsWith('.avi')) { + return 'video'; + } else { + return 'binary'; + } + } + + addMessage(user, text, attachment = null) { + this.messages.push({ + user, + text, + attachment + }); + } +} + +module.exports = ChatUI; +``` + +#### Python + +```python +# src/chat_ui.py +from typing import List, Dict, Optional, Union + +class ChatUI: + def __init__(self): + self.messages: List[Dict] = [] + self.current_room: str = "" + + def send_message(self, message_input: str, selected_file: Optional[str] = None) -> List[tuple]: + data = [] + + # Add text message + if message_input: + data.append(("text", message_input, "text")) + + # Add file if selected + if selected_file: + with open(selected_file, "rb") as f: + file_data = f.read() + file_type = self.get_file_type(selected_file) + data.append(("attachment", file_data, file_type)) + + return data + + def get_file_type(self, filename: str) -> str: + if filename.endswith(('.png', '.jpg')): + return "image" + elif filename.endswith(('.mp3', '.wav')): + return "audio" + elif filename.endswith(('.mp4', '.avi')): + return "video" + else: + return "binary" + + def add_message(self, user: str, text: str, attachment: Optional[Dict] = None): + self.messages.append({ + "user": user, + "text": text, + "attachment": attachment + }) +``` + ### Step 3: Create the Message Handler +#### Julia + ```julia # src/chat_handler.jl using NATSBridge, NATS @@ -182,7 +304,6 @@ end function handle_message(handler::ChatHandler, msg::NATS.Msg) env = smartreceive(msg, fileserver_download_handler=_fetch_with_backoff) - # Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 # Extract sender info from envelope sender = get(env, "sender_name", "Anonymous") @@ -206,11 +327,117 @@ function handle_message(handler::ChatHandler, msg::NATS.Msg) end end end +``` -function download_file(url::String, max_retries::Int, base_delay::Int, max_delay::Int, correlation_id::String)::Vector{UInt8} - # Implement exponential backoff for file server downloads - # Return downloaded data as Vector{UInt8} -end +#### JavaScript + +```javascript +// src/chat_handler.js +const NATSBridge = require('./src/natbridge.js'); +const nats = require('nats'); + +class ChatHandler { + constructor(natsConnection) { + this.nats = natsConnection; + this.ui = new (require('./chat_ui.js'))(); + } + + async start() { + // Subscribe to chat rooms + const rooms = ['general', 'tech', 'random']; + + for (const room of rooms) { + this.nats.subscribe(`/chat/${room}`, async (msg) => { + await this.handleMessage(msg); + }); + } + + console.log('Chat handler started'); + } + + async handleMessage(msg) { + const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: NATSBridge.fetchWithBackoff + }); + + // Extract sender info from envelope + const sender = env.sender_name || 'Anonymous'; + + // Process each payload + for (const [dataname, data, type] of env.payloads) { + if (type === 'text') { + this.ui.addMessage(sender, data, null); + } else if (type === 'image') { + // Convert to data URL for display + const base64Data = Buffer.from(data).toString('base64'); + const attachment = { + type: 'image', + data: `data:image/png;base64,${base64Data}` + }; + this.ui.addMessage(sender, '', attachment); + } else { + // For other types, use file server URL + const attachment = { type, data }; + this.ui.addMessage(sender, '', attachment); + } + } + } +} + +module.exports = ChatHandler; +``` + +#### Python + +```python +# src/chat_handler.py +import asyncio +from typing import Optional +from natbridge import smartreceive, fetch_with_backoff + +class ChatHandler: + def __init__(self, nats_connection): + self.nats = nats_connection + self.ui = ChatUI() + + async def start(self): + # Subscribe to chat rooms + rooms = ['general', 'tech', 'random'] + + for room in rooms: + await self.nats.subscribe( + f'/chat/{room}', + callback=self.handle_message + ) + + print('Chat handler started') + + async def handle_message(self, msg): + env = await smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff + ) + + # Extract sender info from envelope + sender = env.get('sender_name', 'Anonymous') + + # Process each payload + for dataname, data, type_ in env['payloads']: + if type_ == 'text': + self.ui.add_message(sender, data, None) + elif type_ == 'image': + # Convert to data URL for display + import base64 + base64_data = base64.b64encode(data).decode('utf-8') + attachment = { + 'type': 'image', + 'data': f'data:image/png;base64,{base64_data}' + } + self.ui.add_message(sender, '', attachment) + else: + # For other types, use file server URL + attachment = {'type': type_, 'data': data} + self.ui.add_message(sender, '', attachment) ``` ### Step 4: Run the Application @@ -224,8 +451,17 @@ mkdir -p /tmp/fileserver python3 -m http.server 8080 --directory /tmp/fileserver # Run chat app +# Julia julia src/chat_ui.jl julia src/chat_handler.jl + +# JavaScript +node src/chat_ui.js +node src/chat_handler.js + +# Python +python3 src/chat_ui.py +python3 src/chat_handler.py ``` --- @@ -234,7 +470,9 @@ julia src/chat_handler.jl Let's build a file transfer system that handles large files efficiently. -### Step 1: File Upload Service (Julia) +### Step 1: File Upload Service + +#### Julia ```julia # src/file_upload_service.jl @@ -284,7 +522,107 @@ function stream_upload(service::FileUploadService, file_path::String, recipient: end ``` -### Step 2: File Download Service (Julia) +#### JavaScript + +```javascript +// src/file_upload_service.js +const NATSBridge = require('./src/natbridge.js'); +const fs = require('fs'); + +class FileUploadService { + constructor(brokerUrl, fileserverUrl) { + this.broker_url = brokerUrl; + this.fileserver_url = fileserverUrl; + } + + async uploadFile(filePath, recipient) { + const fileData = fs.readFileSync(filePath); + const fileName = require('path').basename(filePath); + + const data = [["file", fileData, "binary"]]; + + const [env, env_json_str] = await NATSBridge.smartsend( + `/files/${recipient}`, + data, + { + broker_url: this.broker_url, + fileserver_url: this.fileserver_url + } + ); + + return env; + } + + async uploadLargeFile(filePath, recipient) { + const stats = fs.statSync(filePath); + const fileSize = stats.size; + + if (fileSize > 100 * 1024 * 1024) { // > 100MB + console.log('File too large for direct upload, using streaming...'); + return this.streamUpload(filePath, recipient); + } + + return this.uploadFile(filePath, recipient); + } + + async streamUpload(filePath, recipient) { + // Implement streaming upload to file server + // This would require a more sophisticated file server + // For now, we'll use the standard upload + return this.uploadFile(filePath, recipient); + } +} + +module.exports = FileUploadService; +``` + +#### Python + +```python +# src/file_upload_service.py +from natbridge import smartsend +import os + +class FileUploadService: + def __init__(self, broker_url: str, fileserver_url: str): + self.broker_url = broker_url + self.fileserver_url = fileserver_url + + async def upload_file(self, file_path: str, recipient: str) -> dict: + with open(file_path, "rb") as f: + file_data = f.read() + file_name = os.path.basename(file_path) + + data = [("file", file_data, "binary")] + + env, env_json_str = await smartsend( + f"/files/{recipient}", + data, + broker_url=self.broker_url, + fileserver_url=self.fileserver_url + ) + + return env + + async def upload_large_file(self, file_path: str, recipient: str) -> dict: + file_size = os.path.getsize(file_path) + + if file_size > 100 * 1024 * 1024: # > 100MB + print("File too large for direct upload, using streaming...") + return await self.stream_upload(file_path, recipient) + + return await self.upload_file(file_path, recipient) + + async def stream_upload(self, file_path: str, recipient: str) -> dict: + # Implement streaming upload to file server + # This would require a more sophisticated file server + # For now, we'll use the standard upload + return await self.upload_file(file_path, recipient) +``` + +### Step 2: File Download Service + +#### Julia ```julia # src/file_download_service.jl @@ -299,9 +637,7 @@ function FileDownloadService(nats_url::String) end function download_file(service::FileDownloadService, msg::NATS.Msg, sender::String, download_id::String) - # Subscribe to sender's file channel env = smartreceive(msg, fileserver_download_handler=fetch_from_url) - # Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 # Process each payload for (dataname, data, type) in env["payloads"] @@ -319,15 +655,73 @@ function fetch_from_url(url::String, max_retries::Int, base_delay::Int, max_dela end ``` -### Step 3: File Transfer CLI (Julia) +#### JavaScript + +```javascript +// src/file_download_service.js +const NATSBridge = require('./src/natbridge.js'); +const fs = require('fs'); + +class FileDownloadService { + constructor(natsUrl) { + this.nats_url = natsUrl; + } + + async downloadFile(msg, sender, downloadId) { + const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: NATSBridge.fetchWithBackoff + }); + + // Process each payload + for (const [dataname, data, type] of env.payloads) { + if (type === 'binary') { + const filePath = `/downloads/${dataname}`; + fs.writeFileSync(filePath, data); + console.log(`File saved to ${filePath}`); + } + } + } +} + +module.exports = FileDownloadService; +``` + +#### Python + +```python +# src/file_download_service.py +from natbridge import smartreceive, fetch_with_backoff +import os + +class FileDownloadService: + def __init__(self, nats_url: str): + self.nats_url = nats_url + + async def download_file(self, msg, sender: str, download_id: str): + env = await smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff + ) + + # Process each payload + for dataname, data, type_ in env['payloads']: + if type_ == 'binary': + file_path = f'/downloads/{dataname}' + os.makedirs('/downloads', exist_ok=True) + with open(file_path, 'wb') as f: + f.write(data) + print(f"File saved to {file_path}") +``` + +### Step 3: File Transfer CLI + +#### Julia ```julia # src/cli.jl -using NATSBridge, Readlines, FileIO +using NATSBridge function main() - config = JSON3.read(read("config.json", String)) - println("File Transfer System") println("====================") println("1. Upload file") @@ -338,20 +732,20 @@ function main() choice = readline() if choice == "1" - upload_file_cli(config) + upload_file_cli() elseif choice == "2" - download_file_cli(config) + download_file_cli() end end -function upload_file_cli(config) +function upload_file_cli() print("Enter file path: ") file_path = readline() print("Enter recipient: ") recipient = readline() - file_service = FileUploadService(config.nats_url, config.fileserver_url) + file_service = FileUploadService("nats://localhost:4222", "http://localhost:8080") try env = upload_file(file_service, file_path, recipient) @@ -362,11 +756,11 @@ function upload_file_cli(config) end end -function download_file_cli(config) +function download_file_cli() print("Enter sender: ") sender = readline() - file_service = FileDownloadService(config.nats_url) + file_service = FileDownloadService("nats://localhost:4222") try download_file(file_service, sender) @@ -385,7 +779,9 @@ main() Let's build a data pipeline that processes streaming data from sensors. -### Step 1: Sensor Data Model (Julia) +### Step 1: Sensor Data Model + +#### Julia ```julia # src/sensor_data.jl @@ -432,7 +828,90 @@ function to_dataframe(batch::SensorBatch)::DataFrame end ``` -### Step 2: Sensor Sender (Julia) +#### JavaScript + +```javascript +// src/sensor_data.js +const NATSBridge = require('./src/natbridge.js'); + +class SensorReading { + constructor(sensorId, value, unit, metadata = {}) { + this.sensor_id = sensorId; + this.timestamp = new Date().toISOString(); + this.value = value; + this.unit = unit; + this.metadata = metadata; + } +} + +class SensorBatch { + constructor() { + this.readings = []; + } + + addReading(reading) { + this.readings.push(reading); + } + + toDataFrame() { + return { + sensor_id: this.readings.map(r => r.sensor_id), + timestamp: this.readings.map(r => r.timestamp), + value: this.readings.map(r => r.value), + unit: this.readings.map(r => r.unit) + }; + } +} + +module.exports = { SensorReading, SensorBatch }; +``` + +#### Python + +```python +# src/sensor_data.py +from datetime import datetime +from dataclasses import dataclass, field +from typing import List, Dict, Any + +@dataclass +class SensorReading: + sensor_id: str + timestamp: str + value: float + unit: str + metadata: Dict[str, Any] = field(default_factory=dict) + + @classmethod + def create(cls, sensor_id: str, value: float, unit: str, metadata: Dict[str, Any] = None): + return cls( + sensor_id=sensor_id, + timestamp=datetime.utcnow().isoformat(), + value=value, + unit=unit, + metadata=metadata or {} + ) + +class SensorBatch: + def __init__(self): + self.readings: List[SensorReading] = [] + + def add_reading(self, reading: SensorReading): + self.readings.append(reading) + + def to_dataframe(self): + import pandas as pd + return pd.DataFrame({ + 'sensor_id': [r.sensor_id for r in self.readings], + 'timestamp': [r.timestamp for r in self.readings], + 'value': [r.value for r in self.readings], + 'unit': [r.unit for r in self.readings] + }) +``` + +### Step 2: Sensor Sender + +#### Julia ```julia # src/sensor_sender.jl @@ -461,27 +940,6 @@ function send_reading(sender::SensorSender, sensor_id::String, value::Float64, u ) end -function prepare_message_only(sender::SensorSender, sensor_id::String, value::Float64, unit::String) - """Prepare a message without publishing (is_publish=False).""" - reading = SensorReading(sensor_id, value, unit) - - data = [("reading", reading.metadata, "dictionary")] - - # With is_publish=False, returns (env, env_json_str) without publishing - env, env_json_str = smartsend( - "/sensors/$sensor_id/prepare", - data, - broker_url=sender.broker_url, - fileserver_url=sender.fileserver_url, - is_publish=false - ) - - # Now you can publish manually using NATS request-reply pattern - # nc.request(subject, env_json_str, reply_to=reply_to_topic) - - return env, env_json_str -end - function send_batch(sender::SensorSender, readings::Vector{SensorReading}) batch = SensorBatch() for reading in readings @@ -523,38 +981,150 @@ function send_batch(sender::SensorSender, readings::Vector{SensorReading}) end ``` -### Step 3: Sensor Receiver (Julia) +#### JavaScript -```julia -# src/sensor_receiver.jl -using NATSBridge, Arrow, DataFrames, IOBuffer +```javascript +// src/sensor_sender.js +const NATSBridge = require('./src/natbridge.js'); +const { SensorReading, SensorBatch } = require('./sensor_data.js'); -struct SensorReceiver - fileserver_download_handler::Function -end +class SensorSender { + constructor(brokerUrl, fileserverUrl) { + this.broker_url = brokerUrl; + this.fileserver_url = fileserverUrl; + } -function SensorReceiver(download_handler::Function) - SensorReceiver(download_handler) -end + async sendReading(sensorId, value, unit) { + const reading = new SensorReading(sensorId, value, unit); + + const data = [["reading", reading.metadata, "dictionary"]]; + + await NATSBridge.smartsend( + `/sensors/${sensorId}`, + data, + { + broker_url: this.broker_url, + fileserver_url: this.fileserver_url + } + ); + } -function process_reading(receiver::SensorReceiver, msg::NATS.Msg) - env = smartreceive(msg, receiver.fileserver_download_handler) - # Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 - - for (dataname, data, data_type) in env["payloads"] - if data_type == "dictionary" - # Process dictionary payload - println("Received: $dataname = $data") - elseif data_type == "table" - # Deserialize Arrow IPC - buf = IOBuffer(data) - table = Arrow.read(buf) - df = DataFrame(table) - println("Received batch with $(nrow(df)) readings") - println(df) - end - end -end + async sendBatch(readings) { + const batch = new SensorBatch(); + for (const reading of readings) { + batch.addReading(reading); + } + + const df = batch.toDataFrame(); + + // Convert to Arrow IPC + const arrow = require('apache-arrow'); + const schema = new arrow.Schema([ + new arrow.Field('sensor_id', arrow.string()), + new arrow.Field('timestamp', arrow.string()), + new arrow.Field('value', arrow.float64()), + new arrow.Field('unit', arrow.string()) + ]); + + const arrays = { + sensor_id: new arrow.StringArray(df.sensor_id.map(s => String(s))), + timestamp: new arrow.StringArray(df.timestamp), + value: new arrow.Float64Array(df.value), + unit: new arrow.StringArray(df.unit) + }; + + const recordBatch = arrow.RecordBatch.fromArrays(schema, arrays, df.value.length); + const buffer = arrow.tableFromBatches([recordBatch]).toBuffer(); + const arrow_data = new Uint8Array(buffer); + + // Send based on size + if (arrow_data.length < 1048576) { + const data = [["batch", arrow_data, "table"]]; + await NATSBridge.smartsend( + "/sensors/batch", + data, + { + broker_url: this.broker_url, + fileserver_url: this.fileserver_url + } + ); + } else { + const data = [["batch", arrow_data, "table"]]; + await NATSBridge.smartsend( + "/sensors/batch", + data, + { + broker_url: this.broker_url, + fileserver_url: this.fileserver_url + } + ); + } + } +} + +module.exports = SensorSender; +``` + +#### Python + +```python +# src/sensor_sender.py +from natbridge import smartsend +from sensor_data import SensorReading, SensorBatch + +class SensorSender: + def __init__(self, broker_url: str, fileserver_url: str): + self.broker_url = broker_url + self.fileserver_url = fileserver_url + + async def send_reading(self, sensor_id: str, value: float, unit: str): + reading = SensorReading.create(sensor_id, value, unit) + + data = [("reading", reading.metadata, "dictionary")] + + await smartsend( + f"/sensors/{sensor_id}", + data, + broker_url=self.broker_url, + fileserver_url=self.fileserver_url + ) + + async def send_batch(self, readings): + batch = SensorBatch() + for reading in readings: + batch.add_reading(reading) + + df = batch.to_dataframe() + + # Convert to Arrow IPC + import pyarrow as arrow + import pyarrow.feather as feather + import io + + table = arrow.Table.from_pandas(df) + buf = io.BytesIO() + with feather.FeatherWriter(buf, table) as writer: + pass + buf.seek(0) + arrow_data = buf.read() + + # Send based on size + if len(arrow_data) < 1048576: + data = [("batch", arrow_data, "table")] + await smartsend( + "/sensors/batch", + data, + broker_url=self.broker_url, + fileserver_url=self.fileserver_url + ) + else: + data = [("batch", arrow_data, "table")] + await smartsend( + "/sensors/batch", + data, + broker_url=self.broker_url, + fileserver_url=self.fileserver_url + ) ``` --- @@ -563,6 +1133,8 @@ end ### 1. Batch Processing +#### Julia + ```julia # Batch multiple readings into a single message function send_batch_readings(sender::SensorSender, readings::Vector{Tuple{String, Float64, String}}) @@ -595,8 +1167,54 @@ function send_batch_readings(sender::SensorSender, readings::Vector{Tuple{String end ``` +#### JavaScript + +```javascript +// Batch multiple readings into a single message +async function sendBatchReadings(sender, readings) { + const batch = new SensorBatch(); + + for (const [sensorId, value, unit] of readings) { + const reading = new SensorReading(sensorId, value, unit); + batch.addReading(reading); + } + + const df = batch.toDataFrame(); + + // Convert to Arrow IPC + const arrow = require('apache-arrow'); + const schema = new arrow.Schema([ + new arrow.Field('sensor_id', arrow.string()), + new arrow.Field('timestamp', arrow.string()), + new arrow.Field('value', arrow.float64()), + new arrow.Field('unit', arrow.string()) + ]); + + const arrays = { + sensor_id: new arrow.StringArray(df.sensor_id), + timestamp: new arrow.StringArray(df.timestamp), + value: new arrow.Float64Array(df.value), + unit: new arrow.StringArray(df.unit) + }; + + const recordBatch = arrow.RecordBatch.fromArrays(schema, arrays, df.value.length); + const buffer = arrow.tableFromBatches([recordBatch]).toBuffer(); + const arrow_data = new Uint8Array(buffer); + + // Send as single message + const data = [["batch", arrow_data, "table"]]; + await NATSBridge.smartsend( + "/sensors/batch", + data, + { broker_url: sender.broker_url } + ); +} +``` + ### 2. Connection Reuse +#### Julia + ```julia # Reuse NATS connections function create_connection_pool() @@ -616,12 +1234,33 @@ function create_connection_pool() empty!(connections) end - return (get_connection= get_connection, close_all=close_all) + return (get_connection=get_connection, close_all=close_all) end ``` +#### Python + +```python +# Reuse NATS connections +class ConnectionPool: + def __init__(self): + self.connections = {} + + def get_connection(self, nats_url: str): + if nats_url not in self.connections: + self.connections[nats_url] = asyncio.run(nats.connect(nats_url)) + return self.connections[nats_url] + + async def close_all(self): + for conn in self.connections.values(): + await conn.drain() + self.connections.clear() +``` + ### 3. Caching +#### Julia + ```julia # Cache file server responses using Base.Threads @@ -643,12 +1282,38 @@ function fetch_with_caching(url::String, max_retries::Int, base_delay::Int, max_ end ``` +#### Python + +```python +# Cache file server responses +import threading + +file_cache = {} +cache_lock = threading.Lock() + +def fetch_with_caching(url, max_retries, base_delay, max_delay, correlation_id): + with cache_lock: + if url in file_cache: + return file_cache[url] + + # Fetch from file server + data = asyncio.run(fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id)) + + # Cache the result + with cache_lock: + file_cache[url] = data + + return data +``` + --- ## Best Practices ### 1. Error Handling +#### Julia + ```julia function safe_smartsend(subject::String, data::Vector{Tuple}, kwargs...) try @@ -660,8 +1325,34 @@ function safe_smartsend(subject::String, data::Vector{Tuple}, kwargs...) end ``` +#### JavaScript + +```javascript +async function safeSmartSend(subject, data, options = {}) { + try { + return await NATSBridge.smartsend(subject, data, options); + } catch (error) { + console.error(`Failed to send message: ${error}`); + return null; + } +} +``` + +#### Python + +```python +async def safe_smartsend(subject: str, data: List[tuple], **kwargs): + try: + return await smartsend(subject, data, **kwargs) + except Exception as error: + print(f"Failed to send message: {error}") + return None +``` + ### 2. Logging +#### Julia + ```julia using Logging @@ -674,36 +1365,18 @@ function log_receive(correlation_id::String, num_payloads::Int) end ``` -### 3. Rate Limiting +#### Python -```julia -using Dates, Collections +```python +import logging -struct RateLimiter - max_requests::Int - time_window::Float64 - requests::Deque{Float64} -end +logger = logging.getLogger(__name__) -function RateLimiter(max_requests::Int, time_window::Float64) - RateLimiter(max_requests, time_window, Deque{Float64}()) -end +def log_send(subject: str, data: List[tuple], correlation_id: str): + logger.info(f"Sending to {subject}: {len(data)} payloads, correlation_id={correlation_id}") -function allow(limiter::RateLimiter)::Bool - now = time() - - # Remove old requests - while !isempty(limiter.requests) && limiter.requests[1] < now - limiter.time_window - popfirst!(limiter.requests) - end - - if length(limiter.requests) >= limiter.max_requests - return false - end - - push!(limiter.requests, now) - return true -end +def log_receive(correlation_id: str, num_payloads: int): + logger.info(f"Received message: {num_payloads} payloads, correlation_id={correlation_id}") ``` --- diff --git a/src/NATSBridge.jl b/src/NATSBridge.jl index e53d388..e9912e6 100644 --- a/src/NATSBridge.jl +++ b/src/NATSBridge.jl @@ -279,42 +279,38 @@ function envelope_to_json(env::msg_envelope_v1) "broker_url" => env.broker_url ) - if !isempty(env.metadata) # Only include metadata if it exists and is not empty - obj["metadata"] = Dict(String(k) => v for (k, v) in env.metadata) - end + obj["metadata"] = Dict(String(k) => v for (k, v) in env.metadata) # Convert payloads to JSON array - if !isempty(env.payloads) - payloads_json = [] - for payload in env.payloads - payload_obj = Dict{String, Any}( - "id" => payload.id, - "dataname" => payload.dataname, - "payload_type" => payload.payload_type, - "transport" => payload.transport, - "encoding" => payload.encoding, - "size" => payload.size, - ) - # Include data based on transport type - if payload.transport == "direct" && payload.data !== nothing - if payload.encoding == "base64" || payload.encoding == "json" - payload_obj["data"] = payload.data - else - # For other encodings, use base64 - payload_bytes = _get_payload_bytes(payload.data) - payload_obj["data"] = Base64.base64encode(payload_bytes) - end - elseif payload.transport == "link" && payload.data !== nothing - # For link transport, data is a URL string - include directly + payloads_json = [] + for payload in env.payloads + payload_obj = Dict{String, Any}( + "id" => payload.id, + "dataname" => payload.dataname, + "payload_type" => payload.payload_type, + "transport" => payload.transport, + "encoding" => payload.encoding, + "size" => payload.size, + ) + # Include data based on transport type + if payload.transport == "direct" && payload.data !== nothing + if payload.encoding == "base64" || payload.encoding == "json" payload_obj["data"] = payload.data + else + # For other encodings, use base64 + payload_bytes = _get_payload_bytes(payload.data) + payload_obj["data"] = Base64.base64encode(payload_bytes) end - if !isempty(payload.metadata) - payload_obj["metadata"] = Dict(String(k) => v for (k, v) in payload.metadata) + elseif payload.transport == "link" && payload.data !== nothing + # For link transport, data is a URL string - include directly + payload_obj["data"] = payload.data end - push!(payloads_json, payload_obj) + if !isempty(payload.metadata) + payload_obj["metadata"] = Dict(String(k) => v for (k, v) in payload.metadata) end - obj["payloads"] = payloads_json + push!(payloads_json, payload_obj) end + obj["payloads"] = payloads_json JSON.json(obj) end diff --git a/src/natbridge.js b/src/natbridge.js deleted file mode 100644 index eef2ab3..0000000 --- a/src/natbridge.js +++ /dev/null @@ -1,719 +0,0 @@ -/** - * NATSBridge - Cross-Platform Bi-Directional Data Bridge - * JavaScript Implementation (Node.js and Browser) - * - * This module provides functionality for sending and receiving data across network boundaries - * using NATS as the message bus, with support for both direct payload transport and - * URL-based transport for larger payloads. - * - * File Server Handler Architecture: - * The system uses handler functions to abstract file server operations, allowing support - * for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). - * - * Handler Function Signatures: - * - * ```javascript - * // Upload handler - uploads data to file server and returns URL - * // The handler is passed to smartsend as fileserver_upload_handler parameter - * // It receives: (fileserver_url, dataname, data) - * // Returns: Promise<{ status, uploadid, fileid, url }> - * fileserver_upload_handler(fileserver_url, dataname, data) - * - * // Download handler - fetches data from file server URL with exponential backoff - * // The handler is passed to smartreceive as fileserver_download_handler parameter - * // It receives: (url, max_retries, base_delay, max_delay, correlation_id) - * // Returns: Promise - * fileserver_download_handler(url, max_retries, base_delay, max_delay, correlation_id) - * ``` - * - * Multi-Payload Support (Standard API): - * The system uses a standardized list-of-tuples format for all payload operations. - * Even when sending a single payload, the user must wrap it in a list. - * - * API Standard: - * - * ```javascript - * // Input format for smartsend (always a list of tuples with type info) - * [[dataname1, data1, type1], [dataname2, data2, type2], ...] - * - * // Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) - * { - * "correlation_id": "...", - * "msg_id": "...", - * "timestamp": "...", - * "send_to": "...", - * "msg_purpose": "...", - * "sender_name": "...", - * "sender_id": "...", - * "receiver_name": "...", - * "receiver_id": "...", - * "reply_to": "...", - * "reply_to_msg_id": "...", - * "broker_url": "...", - * "metadata": {...}, - * "payloads": [[dataname1, data1, type1], [dataname2, data2, type2], ...] - * } - * ``` - * - * Supported types: "text", "dictionary", "table", "image", "audio", "video", "binary" - */ - -const nats = typeof require !== 'undefined' ? require('nats') : null; -const { v4: uuidv4 } = typeof require !== 'undefined' ? require('uuid') : null; -const fetch = typeof require !== 'undefined' ? require('node-fetch') : (typeof globalThis !== 'undefined' ? globalThis.fetch : undefined); -const arrow = typeof require !== 'undefined' ? require('apache-arrow') : null; - -/** - * Default configuration values - */ -const DEFAULT_SIZE_THRESHOLD = 1_000_000; // 1MB - threshold for switching from direct to link transport -const DEFAULT_BROKER_URL = 'nats://localhost:4222'; // Default NATS server URL -const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; // Default HTTP file server URL - -/** - * Generate a UUID v4 - * @returns {string} UUID string - */ -function generateUUID() { - if (uuidv4) { - return uuidv4(); - } - // Fallback UUID generation for environments without uuid package - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - const r = Math.random() * 16 | 0; - const v = c === 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); -} - -/** - * Log a trace message with correlation ID and timestamp - * @param {string} correlation_id - Correlation ID for tracing - * @param {string} message - Message content to log - */ -function logTrace(correlation_id, message) { - const timestamp = new Date().toISOString(); - console.log(`[${timestamp}] [Correlation: ${correlation_id}] ${message}`); -} - -/** - * Serialize data according to specified format - * @param {any} data - Data to serialize - * @param {string} payload_type - Target format: "text", "dictionary", "table", "image", "audio", "video", "binary" - * @returns {Promise} Binary representation of the serialized data - */ -async function serializeData(data, payload_type) { - if (payload_type === 'text') { - if (typeof data === 'string') { - return new TextEncoder().encode(data); - } else { - throw new Error('Text data must be a string'); - } - } else if (payload_type === 'dictionary') { - const jsonStr = JSON.stringify(data); - return new TextEncoder().encode(jsonStr); - } else if (payload_type === 'table') { - // Use Apache Arrow for table serialization - if (!arrow) { - throw new Error('apache-arrow not available. Install with: npm install apache-arrow'); - } - - // Convert array of objects to Arrow Table - if (!Array.isArray(data)) { - throw new Error('Table data must be an array of objects'); - } - - // Build schema from first row if not provided - const schemaFields = []; - if (data.length > 0) { - for (const key in data[0]) { - const value = data[0][key]; - let arrowType; - if (typeof value === 'number') { - arrowType = arrow.float64; - } else if (typeof value === 'boolean') { - arrowType = arrow.bool; - } else if (value instanceof Date) { - arrowType = arrow.string; // Date as string - } else { - arrowType = arrow.string; - } - schemaFields.push(new arrow.Field(key, arrowType)); - } - } - - const schema = new arrow.Schema(schemaFields); - - // Convert data to Arrow RecordBatch - const arrays = {}; - for (const field of schema.fields) { - const name = field.name; - const type = field.type; - - if (type instanceof arrow.Float64) { - arrays[name] = new arrow.Float64Array(data.length); - for (let i = 0; i < data.length; i++) { - arrays[name][i] = data[i][name] || 0; - } - } else if (type instanceof arrow.Boolean) { - arrays[name] = new arrow.BooleanArray(data.length); - for (let i = 0; i < data.length; i++) { - arrays[name][i] = data[i][name] || false; - } - } else { - // String type - const values = data.map(row => String(row[name] ?? '')); - const offsets = new Int32Array(values.length + 1); - let offset = 0; - for (let i = 0; i < values.length; i++) { - offsets[i + 1] = offset += values[i].length; - } - const buffer = new Uint8Array(offsets[values.length]); - for (let i = 0; i < values.length; i++) { - const encoder = new TextEncoder(); - const bytes = encoder.encode(values[i]); - buffer.set(bytes, offsets[i]); - } - arrays[name] = new arrow.StringArray( - new arrow.DataView(new arrow.Buffer(buffer), 0, offsets[values.length]), - new arrow.Buffer(offsets.buffer, 0, offsets.length * 4), - 0, - data.length - ); - } - } - - const recordBatch = arrow.RecordBatch.fromArrays(schema, arrays, data.length); - - // Write to IPC format - const buffer = arrow.tableFromBatches([recordBatch]).toBuffer(); - return new Uint8Array(buffer); - } else if (payload_type === 'image') { - if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { - return data instanceof Uint8Array ? data : new Uint8Array(data); - } else { - throw new Error('Image data must be Uint8Array or ArrayBuffer'); - } - } else if (payload_type === 'audio') { - if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { - return data instanceof Uint8Array ? data : new Uint8Array(data); - } else { - throw new Error('Audio data must be Uint8Array or ArrayBuffer'); - } - } else if (payload_type === 'video') { - if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { - return data instanceof Uint8Array ? data : new Uint8Array(data); - } else { - throw new Error('Video data must be Uint8Array or ArrayBuffer'); - } - } else if (payload_type === 'binary') { - if (data instanceof Uint8Array || data instanceof ArrayBuffer || Buffer.isBuffer(data)) { - return data instanceof Uint8Array ? data : new Uint8Array(data); - } else { - throw new Error('Binary data must be Uint8Array or ArrayBuffer'); - } - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} - -/** - * Deserialize bytes to data based on type - * @param {Uint8Array} data - Serialized data as bytes - * @param {string} payload_type - Data type - * @param {string} correlation_id - Correlation ID for logging - * @returns {Promise} Deserialized data - */ -async function deserializeData(data, payload_type, correlation_id) { - if (payload_type === 'text') { - return new TextDecoder().decode(data); - } else if (payload_type === 'dictionary') { - const jsonStr = new TextDecoder().decode(data); - return JSON.parse(jsonStr); - } else if (payload_type === 'table') { - // Use Apache Arrow for table deserialization - if (!arrow) { - throw new Error('apache-arrow not available. Install with: npm install apache-arrow'); - } - - // Read Arrow IPC format - const buffer = arrow.Buffer.wrap(data.buffer, data.byteOffset, data.byteLength); - const table = arrow.tableFromRawBytes(buffer); - - // Convert to array of objects for consistency with the API - const result = []; - const numRows = table.numRows; - - for (let i = 0; i < numRows; i++) { - const row = {}; - for (const colName of table.columnNames) { - const column = table.getColumn(colName); - row[colName] = column.get(i); - } - result.push(row); - } - - return result; - } else if (payload_type === 'image') { - return data; - } else if (payload_type === 'audio') { - return data; - } else if (payload_type === 'video') { - return data; - } else if (payload_type === 'binary') { - return data; - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} - -/** - * Fetch data from URL with exponential backoff - * @param {string} url - URL to fetch from - * @param {number} max_retries - Maximum retry attempts - * @param {number} base_delay - Initial delay in milliseconds - * @param {number} max_delay - Maximum delay in milliseconds - * @param {string} correlation_id - Correlation ID for logging - * @returns {Promise} Fetched data as bytes - */ -async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { - let delay = base_delay; - - for (let attempt = 1; attempt <= max_retries; attempt++) { - try { - const response = await fetch(url); - - if (response.status === 200) { - logTrace(correlation_id, `Successfully fetched data from ${url} on attempt ${attempt}`); - const arrayBuffer = await response.arrayBuffer(); - return new Uint8Array(arrayBuffer); - } else { - throw new Error(`Failed to fetch: ${response.status}`); - } - } catch (e) { - logTrace(correlation_id, `Attempt ${attempt} failed: ${e.constructor.name}`); - - if (attempt < max_retries) { - await new Promise(resolve => setTimeout(resolve, delay)); - delay = Math.min(delay * 2, max_delay); - } - } - } - - throw new Error(`Failed to fetch data after ${max_retries} attempts`); -} - -/** - * Upload a single file to a plik server using one-shot mode - * @param {string} file_server_url - Base URL of the plik server - * @param {string} dataname - Name of the file being uploaded - * @param {Uint8Array} data - Raw byte data of the file content - * @returns {Promise<{ status, uploadid, fileid, url }>} Upload result - */ -async function plikOneshotUpload(file_server_url, dataname, data) { - // Get upload id - const url_getUploadID = `${file_server_url}/upload`; - const headers = { 'Content-Type': 'application/json' }; - const body = JSON.stringify({ OneShot: true }); - - const http_response = await fetch(url_getUploadID, { - method: 'POST', - headers, - body - }); - - const response_json = await http_response.json(); - const uploadid = response_json.id; - const uploadtoken = response_json.uploadToken; - - // Upload file - const url_upload = `${file_server_url}/file/${uploadid}`; - const form = new FormData(); - const blob = new Blob([data]); - form.append('file', blob, dataname); - - const upload_headers = { - 'X-UploadToken': uploadtoken - }; - - const upload_response = await fetch(url_upload, { - method: 'POST', - headers: upload_headers, - body: form - }); - - const upload_json = await upload_response.json(); - const fileid = upload_json.id; - - const url = `${file_server_url}/file/${uploadid}/${fileid}/${dataname}`; - - return { - status: upload_response.status, - uploadid, - fileid, - url - }; -} - -/** - * Publish message to NATS - * @param {string|object} broker_url_or_conn - NATS server URL or pre-existing connection - * @param {string} subject - NATS subject to publish to - * @param {string} message - JSON message to publish - * @param {string} correlation_id - Correlation ID for tracing and logging - */ -async function publishMessage(broker_url_or_conn, subject, message, correlation_id) { - if (broker_url_or_conn instanceof Object && broker_url_or_conn.publish) { - // Pre-existing connection - try { - await broker_url_or_conn.publish(subject, message); - logTrace(correlation_id, `Message published to ${subject}`); - } finally { - // Note: In a real implementation, you might want to drain/close the connection - } - } else { - // URL-based - create new connection - if (!nats) { - throw new Error('nats package not available. Install with: npm install nats'); - } - - const conn = await nats.connect(broker_url_or_conn); - try { - await conn.publish(subject, message); - logTrace(correlation_id, `Message published to ${subject}`); - } finally { - conn.close(); - } - } -} - -/** - * Build message envelope from payloads and metadata - * @param {string} subject - NATS subject - * @param {Array} payloads - Array of payload objects - * @param {Object} options - Envelope options - * @returns {Object} Message envelope - */ -function buildEnvelope(subject, payloads, options) { - return { - correlation_id: options.correlation_id || generateUUID(), - msg_id: options.msg_id || generateUUID(), - timestamp: new Date().toISOString(), - send_to: subject, - msg_purpose: options.msg_purpose || '', - sender_name: options.sender_name || '', - sender_id: options.sender_id || generateUUID(), - receiver_name: options.receiver_name || '', - receiver_id: options.receiver_id || '', - reply_to: options.reply_to || '', - reply_to_msg_id: options.reply_to_msg_id || '', - broker_url: options.broker_url || DEFAULT_BROKER_URL, - metadata: options.metadata || {}, - payloads - }; -} - -/** - * Convert data to base64 string - * @param {Uint8Array} buffer - Data buffer - * @returns {string} Base64 encoded string - */ -function bufferToBase64(buffer) { - if (typeof Buffer !== 'undefined' && Buffer.isBuffer(buffer)) { - return buffer.toString('base64'); - } - - // For browser/Node Uint8Array - let binary = ''; - const bytes = new Uint8Array(buffer); - const len = bytes.byteLength; - for (let i = 0; i < len; i++) { - binary += String.fromCharCode(bytes[i]); - } - return btoa(binary); -} - -/** - * Convert base64 string to Uint8Array - * @param {string} base64 - Base64 encoded string - * @returns {Uint8Array} Decoded bytes - */ -function base64ToBuffer(base64) { - const binary = atob(base64); - const bytes = new Uint8Array(binary.length); - for (let i = 0; i < binary.length; i++) { - bytes[i] = binary.charCodeAt(i); - } - return bytes; -} - -/** - * smartsend - Send data either directly via NATS or via a fileserver URL, depending on payload size - * - * This function intelligently routes data delivery based on payload size relative to a threshold. - * If the serialized payload is smaller than size_threshold, it encodes the data as Base64 and publishes directly over NATS. - * Otherwise, it uploads the data to a fileserver and publishes only the download URL over NATS. - * - * @param {string} subject - NATS subject to publish the message to - * @param {Array} data - Array of [dataname, data, type] tuples to send - * @param {Object} options - Optional configuration - * @param {string} [options.broker_url=DEFAULT_BROKER_URL] - URL of the NATS server - * @param {string} [options.fileserver_url=DEFAULT_FILESERVER_URL] - URL of the HTTP file server for large payloads - * @param {Function} [options.fileserver_upload_handler=plikOneshotUpload] - Function to handle fileserver uploads - * @param {number} [options.size_threshold=DEFAULT_SIZE_THRESHOLD] - Threshold in bytes separating direct vs link transport - * @param {string} [options.correlation_id] - Correlation ID for tracing (auto-generated if not provided) - * @param {string} [options.msg_purpose="chat"] - Purpose of the message - * @param {string} [options.sender_name="NATSBridge"] - Name of the sender - * @param {string} [options.receiver_name=""] - Name of the receiver - * @param {string} [options.receiver_id=""] - UUID of the receiver - * @param {string} [options.reply_to=""] - Topic to reply to - * @param {string} [options.reply_to_msg_id=""] - Message ID this message is replying to - * @param {boolean} [options.is_publish=true] - Whether to automatically publish the message to NATS - * @param {object} [options.nats_connection] - Pre-existing NATS connection - * @param {string} [options.msg_id] - Message ID (auto-generated if not provided) - * @param {string} [options.sender_id] - Sender ID (auto-generated if not provided) - * @returns {Promise<[Object, string]>} Promise resolving to [envelope, env_json_str] - */ -async function smartsend(subject, data, options = {}) { - const { - broker_url = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler = plikOneshotUpload, - size_threshold = DEFAULT_SIZE_THRESHOLD, - correlation_id = generateUUID(), - msg_purpose = 'chat', - sender_name = 'NATSBridge', - receiver_name = '', - receiver_id = '', - reply_to = '', - reply_to_msg_id = '', - is_publish = true, - nats_connection = null, - msg_id = generateUUID(), - sender_id = generateUUID() - } = options; - - logTrace(correlation_id, `Starting smartsend for subject: ${subject}`); - - // Process each payload in the list - const payloads = []; - for (const [dataname, payloadData, payloadType] of data) { - const payloadBytes = await serializeData(payloadData, payloadType); - const payloadSize = payloadBytes.byteLength; - - logTrace(correlation_id, `Serialized payload '${dataname}' (payload_type: ${payloadType}) size: ${payloadSize} bytes`); - - // Decision: Direct vs Link - if (payloadSize < size_threshold) { - // Direct path - Base64 encode and send via NATS - const payloadB64 = bufferToBase64(payloadBytes); - logTrace(correlation_id, `Using direct transport for ${payloadSize} bytes`); - - payloads.push({ - id: generateUUID(), - dataname, - payload_type: payloadType, - transport: 'direct', - encoding: 'base64', - size: payloadSize, - data: payloadB64, - metadata: { payload_bytes: payloadSize } - }); - } else { - // Link path - Upload to HTTP server, send URL via NATS - logTrace(correlation_id, 'Using link transport, uploading to fileserver'); - - const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); - - if (response.status !== 200) { - throw new Error(`Failed to upload data to fileserver: ${response.status}`); - } - - logTrace(correlation_id, `Uploaded to URL: ${response.url}`); - - payloads.push({ - id: generateUUID(), - dataname, - payload_type: payloadType, - transport: 'link', - encoding: 'none', - size: payloadSize, - data: response.url, - metadata: {} - }); - } - } - - // Build envelope - const env = buildEnvelope(subject, payloads, { - correlation_id, - msg_id, - msg_purpose, - sender_name, - sender_id, - receiver_name, - receiver_id, - reply_to, - reply_to_msg_id, - broker_url - }); - - const env_json_str = JSON.stringify(env); - - if (is_publish) { - if (nats_connection) { - await publishMessage(nats_connection, subject, env_json_str, correlation_id); - } else { - await publishMessage(broker_url, subject, env_json_str, correlation_id); - } - } - - return [env, env_json_str]; -} - -/** - * smartreceive - Receive and process messages from NATS - * - * This function processes incoming NATS messages, handling both direct transport - * (base64 decoded payloads) and link transport (URL-based payloads). - * It deserializes the data based on the transport type and returns the result. - * - * @param {Object} msg - NATS message object - * @param {Object} options - Optional configuration - * @param {Function} [options.fileserver_download_handler=fetchWithBackoff] - Function to handle downloading data from file server URLs - * @param {number} [options.max_retries=5] - Maximum retry attempts for fetching URL - * @param {number} [options.base_delay=100] - Initial delay for exponential backoff in ms - * @param {number} [options.max_delay=5000] - Maximum delay for exponential backoff in ms - * @returns {Promise} Promise resolving to envelope object with deserialized payloads - */ -async function smartreceive(msg, options = {}) { - const { - fileserver_download_handler = fetchWithBackoff, - max_retries = 5, - base_delay = 100, - max_delay = 5000 - } = options; - - // Parse the JSON envelope - const payload = typeof msg.payload === 'string' ? msg.payload : new TextDecoder().decode(msg.payload); - const env_json_obj = JSON.parse(payload); - - logTrace(env_json_obj.correlation_id, 'Processing received message'); - - // Process all payloads in the envelope - const payloads_list = []; - - for (const payload of env_json_obj.payloads) { - const transport = payload.transport; - const dataname = payload.dataname; - - if (transport === 'direct') { - logTrace(env_json_obj.correlation_id, `Direct transport - decoding payload '${dataname}'`); - - // Extract base64 payload from the payload - const payload_b64 = payload.data; - - // Decode Base64 payload - const payload_bytes = base64ToBuffer(payload_b64); - - // Deserialize based on type - const data_type = payload.payload_type; - const data = await deserializeData(payload_bytes, data_type, env_json_obj.correlation_id); - - payloads_list.push([dataname, data, data_type]); - } else if (transport === 'link') { - // Extract download URL from the payload - const url = payload.data; - logTrace(env_json_obj.correlation_id, `Link transport - fetching '${dataname}' from URL: ${url}`); - - // Fetch with exponential backoff using the download handler - const downloaded_data = await fileserver_download_handler( - url, - max_retries, - base_delay, - max_delay, - env_json_obj.correlation_id - ); - - // Deserialize based on type - const data_type = payload.payload_type; - const data = await deserializeData(downloaded_data, data_type, env_json_obj.correlation_id); - - payloads_list.push([dataname, data, data_type]); - } else { - throw new Error(`Unknown transport type for payload '${dataname}': ${transport}`); - } - } - - env_json_obj.payloads = payloads_list; - return env_json_obj; -} - -/** - * NATS Client wrapper for managing connections - */ -class NATSClient { - constructor(url) { - this.url = url; - this.connection = null; - } - - async connect() { - if (!nats) { - throw new Error('nats package not available. Install with: npm install nats'); - } - this.connection = await nats.connect({ servers: this.url }); - return this.connection; - } - - async publish(subject, message) { - if (!this.connection) { - await this.connect(); - } - await this.connection.publish(subject, message); - } - - async close() { - if (this.connection) { - this.connection.close(); - } - } -} - -// Export for Node.js -if (typeof module !== 'undefined' && module.exports) { - module.exports = { - NATSClient, - smartsend, - smartreceive, - plikOneshotUpload, - fetchWithBackoff, - serializeData, - deserializeData, - publishMessage, - logTrace, - generateUUID, - DEFAULT_SIZE_THRESHOLD, - DEFAULT_BROKER_URL, - DEFAULT_FILESERVER_URL - }; -} - -// Export for browser (global scope) -if (typeof window !== 'undefined') { - window.NATSBridge = { - smartsend, - smartreceive, - plikOneshotUpload, - fetchWithBackoff, - serializeData, - deserializeData, - publishMessage, - logTrace, - generateUUID, - NATSClient, - DEFAULT_SIZE_THRESHOLD, - DEFAULT_BROKER_URL, - DEFAULT_FILESERVER_URL - }; -} \ No newline at end of file diff --git a/src/natbridge.py b/src/natbridge.py deleted file mode 100644 index 45a7e35..0000000 --- a/src/natbridge.py +++ /dev/null @@ -1,784 +0,0 @@ -""" -NATSBridge - Cross-Platform Bi-Directional Data Bridge -Python Implementation (Desktop Python) - -This module provides functionality for sending and receiving data across network boundaries -using NATS as the message bus, with support for both direct payload transport and -URL-based transport for larger payloads. - -File Server Handler Architecture: -The system uses handler functions to abstract file server operations, allowing support -for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). - -Handler Function Signatures: - -```python -# Upload handler - uploads data to file server and returns URL -# The handler is passed to smartsend as fileserver_upload_handler parameter -# It receives: (fileserver_url, dataname, data) -# Returns: Coroutine[Dict[str, Any]] -async def fileserver_upload_handler(fileserver_url, dataname, data) - -# Download handler - fetches data from file server URL with exponential backoff -# The handler is passed to smartreceive as fileserver_download_handler parameter -# It receives: (url, max_retries, base_delay, max_delay, correlation_id) -# Returns: Coroutine[bytes] -async def fileserver_download_handler(url, max_retries, base_delay, max_delay, correlation_id) -``` - -Multi-Payload Support (Standard API): -The system uses a standardized list-of-tuples format for all payload operations. -Even when sending a single payload, the user must wrap it in a list. - -API Standard: - -```python -# Input format for smartsend (always a list of tuples with type info) -[(dataname1, data1, type1), (dataname2, data2, type2), ...] - -# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) -{ - "correlation_id": "...", - "msg_id": "...", - "timestamp": "...", - "send_to": "...", - "msg_purpose": "...", - "sender_name": "...", - "sender_id": "...", - "receiver_name": "...", - "receiver_id": "...", - "reply_to": "...", - "reply_to_msg_id": "...", - "broker_url": "...", - "metadata": {...}, - "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -} -``` - -Supported types: "text", "dictionary", "table", "image", "audio", "video", "binary" -""" - -import asyncio -import base64 -import json -import uuid -import time -from typing import Any, Callable, Dict, List, Tuple, Union -from dataclasses import dataclass, field -from datetime import datetime - -# Optional dependencies -try: - import aiohttp - AIOHTTP_AVAILABLE = True -except ImportError: - AIOHTTP_AVAILABLE = False - -try: - import pyarrow as arrow - import pyarrow.parquet as pq - import pandas as pd - ARROW_AVAILABLE = True -except ImportError: - ARROW_AVAILABLE = False - -try: - import nats - from nats.aio.client import Client as NATSClient - NATS_AVAILABLE = True -except ImportError: - NATS_AVAILABLE = False - - -# ============================================================================ -# Constants -# ============================================================================ - -DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB - threshold for switching from direct to link transport -DEFAULT_BROKER_URL = "nats://localhost:4222" # Default NATS server URL -DEFAULT_FILESERVER_URL = "http://localhost:8080" # Default HTTP file server URL - - -# ============================================================================ -# Data Classes -# ============================================================================ - -@dataclass -class MsgPayloadV1: - """Message payload structure.""" - id: str - dataname: str - payload_type: str - transport: str - encoding: str - size: int - data: Union[str, bytes] # URL for link, base64 for direct - metadata: Dict[str, Any] = field(default_factory=dict) - - -@dataclass -class MsgEnvelopeV1: - """Message envelope structure.""" - correlation_id: str - msg_id: str - timestamp: str - send_to: str - msg_purpose: str - sender_name: str - sender_id: str - receiver_name: str - receiver_id: str - reply_to: str - reply_to_msg_id: str - broker_url: str - metadata: Dict[str, Any] = field(default_factory=dict) - payloads: List[MsgPayloadV1] = field(default_factory=list) - - -# ============================================================================ -# Utility Functions -# ============================================================================ - -def log_trace(correlation_id: str, message: str) -> None: - """Log a trace message with correlation ID and timestamp.""" - timestamp = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' - print(f"[{timestamp}] [Correlation: {correlation_id}] {message}") - - -def generate_uuid() -> str: - """Generate a UUID v4 string.""" - return str(uuid.uuid4()) - - -# ============================================================================ -# Serialization Functions -# ============================================================================ - -def _serialize_data(data: Any, payload_type: str) -> bytes: - """ - Serialize data according to specified format. - - Args: - data: Data to serialize - payload_type: Target format: "text", "dictionary", "table", "image", "audio", "video", "binary" - - Returns: - Binary representation of the serialized data - - Raises: - Error: If data type doesn't match payload_type - """ - if payload_type == 'text': - if isinstance(data, str): - return data.encode('utf-8') - else: - raise Error('Text data must be a string') - elif payload_type == 'dictionary': - json_str = json.dumps(data) - return json_str.encode('utf-8') - elif payload_type == 'table': - if not ARROW_AVAILABLE: - raise Error('pyarrow not available for table serialization. Install with: pip install pyarrow pandas') - - # Convert DataFrame to Arrow IPC - import io - buf = io.BytesIO() - - if isinstance(data, pd.DataFrame): - table = arrow.Table.from_pandas(data) - sink = arrow.ipc.new_file(buf) - arrow.ipc.write_table(table, sink) - sink.close() - return buf.getvalue() - else: - raise Error('Table data must be a pandas DataFrame') - elif payload_type == 'image': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Image data must be bytes') - elif payload_type == 'audio': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Audio data must be bytes') - elif payload_type == 'video': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Video data must be bytes') - elif payload_type == 'binary': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Binary data must be bytes') - else: - raise Error(f'Unknown payload_type: {payload_type}') - - -def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: - """ - Deserialize bytes to data based on type. - - Args: - data: Serialized data as bytes - payload_type: Data type - correlation_id: Correlation ID for logging - - Returns: - Deserialized data - """ - if payload_type == 'text': - return data.decode('utf-8') - elif payload_type == 'dictionary': - json_str = data.decode('utf-8') - return json.loads(json_str) - elif payload_type == 'table': - if not ARROW_AVAILABLE: - raise Error('pyarrow not available for table deserialization') - - import io - buf = io.BytesIO(data) - reader = arrow.ipc.open_file(buf) - return reader.read_all().to_pandas() - elif payload_type == 'image': - return data - elif payload_type == 'audio': - return data - elif payload_type == 'video': - return data - elif payload_type == 'binary': - return data - else: - raise Error(f'Unknown payload_type: {payload_type}') - - -# ============================================================================ -# File Server Handlers -# ============================================================================ - -async def plik_oneshot_upload( - file_server_url: str, - dataname: str, - data: bytes -) -> Dict[str, Any]: - """ - Upload a single file to a plik server using one-shot mode. - - Args: - file_server_url: Base URL of the plik server - dataname: Name of the file being uploaded - data: Raw byte data of the file content - - Returns: - Dict with keys: 'status', 'uploadid', 'fileid', 'url' - """ - if not AIOHTTP_AVAILABLE: - raise Error('aiohttp not available. Install with: pip install aiohttp') - - async with aiohttp.ClientSession() as session: - # Get upload id - url_getUploadID = f"{file_server_url}/upload" - headers = {'Content-Type': 'application/json'} - body = json.dumps({"OneShot": True}) - - async with session.post(url_getUploadID, headers=headers, data=body) as response: - response_json = await response.json() - uploadid = response_json['id'] - uploadtoken = response_json['uploadToken'] - - # Upload file - url_upload = f"{file_server_url}/file/{uploadid}" - headers = {'X-UploadToken': uploadtoken} - - form = aiohttp.FormData() - form.add_field('file', data, filename=dataname, content_type='application/octet-stream') - - async with session.post(url_upload, headers=headers, data=form) as upload_response: - upload_json = await upload_response.json() - fileid = upload_json['id'] - - url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" - - return { - 'status': upload_response.status, - 'uploadid': uploadid, - 'fileid': fileid, - 'url': url - } - - -async def fetch_with_backoff( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """ - Fetch data from URL with exponential backoff. - - Args: - url: URL to fetch from - max_retries: Maximum retry attempts - base_delay: Initial delay in milliseconds - max_delay: Maximum delay in milliseconds - correlation_id: Correlation ID for logging - - Returns: - Fetched data as bytes - - Raises: - Error: If all retry attempts fail - """ - if not AIOHTTP_AVAILABLE: - raise Error('aiohttp not available. Install with: pip install aiohttp') - - delay = base_delay - - for attempt in range(1, max_retries + 1): - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - log_trace(correlation_id, f"Successfully fetched data from {url} on attempt {attempt}") - return await response.read() - else: - raise Error(f"Failed to fetch: {response.status}") - except Exception as e: - log_trace(correlation_id, f"Attempt {attempt} failed: {type(e).__name__}") - - if attempt < max_retries: - await asyncio.sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - - raise Error(f"Failed to fetch data after {max_retries} attempts") - - -# ============================================================================ -# NATS Publishing -# ============================================================================ - -async def publish_message( - broker_url_or_conn: Union[str, NATSClient], - subject: str, - message: str, - correlation_id: str, - nats_connection: NATSClient = None -) -> None: - """ - Publish message to NATS. - - Args: - broker_url_or_conn: NATS server URL or pre-existing connection - subject: NATS subject to publish to - message: JSON message to publish - correlation_id: Correlation ID for tracing and logging - nats_connection: Optional pre-existing NATS connection - """ - if nats_connection: - # Use provided connection - try: - await nats_connection.publish(subject, message) - log_trace(correlation_id, f"Message published to {subject}") - finally: - # Note: In a real implementation, you might want to drain/close the connection - pass - elif isinstance(broker_url_or_conn, str): - # URL-based - create new connection - if not NATS_AVAILABLE: - raise Error('nats-py not available. Install with: pip install nats-py') - - conn = await nats.connect(broker_url_or_conn) - try: - await conn.publish(subject, message) - log_trace(correlation_id, f"Message published to {subject}") - finally: - await conn.drain() - else: - raise Error('Invalid broker_url_or_conn type') - - -# ============================================================================ -# Core Functions -# ============================================================================ - -async def smartsend( - subject: str, - data: List[Tuple[str, Any, str]], - broker_url: str = DEFAULT_BROKER_URL, - fileserver_url: str = DEFAULT_FILESERVER_URL, - fileserver_upload_handler: Callable = plik_oneshot_upload, - size_threshold: int = DEFAULT_SIZE_THRESHOLD, - correlation_id: str = None, - msg_purpose: str = "chat", - sender_name: str = "NATSBridge", - receiver_name: str = "", - receiver_id: str = "", - reply_to: str = "", - reply_to_msg_id: str = "", - is_publish: bool = True, - nats_connection: NATSClient = None, - msg_id: str = None, - sender_id: str = None -) -> Tuple[Dict, str]: - """ - Send data via NATS with automatic transport selection. - - This function intelligently routes data delivery based on payload size relative to a threshold. - If the serialized payload is smaller than size_threshold, it encodes the data as Base64 - and publishes directly over NATS. Otherwise, it uploads the data to a fileserver - and publishes only the download URL over NATS. - - Args: - subject: NATS subject to publish the message to - data: List of (dataname, data, type) tuples - broker_url: URL of the NATS server - fileserver_url: URL of the HTTP file server for large payloads - fileserver_upload_handler: Function to handle fileserver uploads - size_threshold: Threshold in bytes separating direct vs link transport - correlation_id: Correlation ID for tracing (auto-generated if not provided) - msg_purpose: Purpose of the message - sender_name: Name of the sender - receiver_name: Name of the receiver - receiver_id: UUID of the receiver - reply_to: Topic to reply to - reply_to_msg_id: Message ID this message is replying to - is_publish: Whether to automatically publish the message to NATS - nats_connection: Pre-existing NATS connection (if provided, uses this instead of creating a new one) - msg_id: Message ID (auto-generated if not provided) - sender_id: Sender ID (auto-generated if not provided) - - Returns: - Tuple of (env, env_json_str) where: - - env: Dict with all metadata and payloads - - env_json_str: JSON string for publishing to NATS - - Example: - ```python - # Send a single payload (still wrapped in a list) - config = {"key": "value"} - env, env_json_str = await smartsend( - "my.subject", - [("config", config, "dictionary")], - broker_url="nats://localhost:4222" - ) - - # Send multiple payloads in one message with different types - data1 = {"key1": "value1"} - data2 = [1, 2, 3, 4, 5] - env, env_json_str = await smartsend( - "my.subject", - [("data1", data1, "dictionary"), ("data2", data2, "table")] - ) - - # Mixed content (e.g., chat with text and image) - env, env_json_str = await smartsend( - "chat.subject", - [ - ("message_text", "Hello!", "text"), - ("user_image", image_bytes, "image"), - ("audio_clip", audio_bytes, "audio") - ] - ) - ``` - """ - if correlation_id is None: - correlation_id = generate_uuid() - if msg_id is None: - msg_id = generate_uuid() - if sender_id is None: - sender_id = generate_uuid() - - log_trace(correlation_id, f"Starting smartsend for subject: {subject}") - - # Process each payload in the list - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = _serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - log_trace(correlation_id, f"Serialized payload '{dataname}' (payload_type: {payload_type}) size: {payload_size} bytes") - - # Decision: Direct vs Link - if payload_size < size_threshold: - # Direct path - Base64 encode and send via NATS - payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') - log_trace(correlation_id, f"Using direct transport for {payload_size} bytes") - - payloads.append({ - 'id': generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64, - 'metadata': {'payload_bytes': payload_size} - }) - else: - # Link path - Upload to HTTP server, send URL via NATS - log_trace(correlation_id, "Using link transport, uploading to fileserver") - - response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) - - if response['status'] != 200: - raise Error(f"Failed to upload data to fileserver: {response['status']}") - - log_trace(correlation_id, f"Uploaded to URL: {response['url']}") - - payloads.append({ - 'id': generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response['url'], - 'metadata': {} - }) - - # Build envelope - env = { - 'correlation_id': correlation_id, - 'msg_id': msg_id, - 'timestamp': datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z', - 'send_to': subject, - 'msg_purpose': msg_purpose, - 'sender_name': sender_name, - 'sender_id': sender_id, - 'receiver_name': receiver_name, - 'receiver_id': receiver_id, - 'reply_to': reply_to, - 'reply_to_msg_id': reply_to_msg_id, - 'broker_url': broker_url, - 'metadata': {}, - 'payloads': payloads - } - - env_json_str = json.dumps(env) - - if is_publish: - if nats_connection: - await publish_message(broker_url, subject, env_json_str, correlation_id, nats_connection) - else: - await publish_message(broker_url, subject, env_json_str, correlation_id) - - return env, env_json_str - - -async def smartreceive( - msg: Any, - fileserver_download_handler: Callable = fetch_with_backoff, - max_retries: int = 5, - base_delay: int = 100, - max_delay: int = 5000 -) -> Dict: - """ - Receive and process messages from NATS. - - This function processes incoming NATS messages, handling both direct transport - (base64 decoded payloads) and link transport (URL-based payloads). - It deserializes the data based on the transport type and returns the result. - - Args: - msg: NATS message object - fileserver_download_handler: Function to handle downloading data from file server URLs - max_retries: Maximum retry attempts for fetching URL - base_delay: Initial delay for exponential backoff in ms - max_delay: Maximum delay for exponential backoff in ms - - Returns: - Dict with envelope metadata and payloads field containing list of tuples - - Example: - ```python - # Receive and process message - msg = await nats_connection.subscribe("my.subject") - env = await smartreceive(msg) - # env["payloads"] = [("dataname1", data1, "type1"), ("dataname2", data2, "type2"), ...] - ``` - """ - # Parse the JSON envelope - if isinstance(msg.payload, bytes): - payload = msg.payload.decode('utf-8') - else: - payload = msg.payload - - env_json_obj = json.loads(payload) - log_trace(env_json_obj['correlation_id'], "Processing received message") - - # Process all payloads in the envelope - payloads_list = [] - - for payload in env_json_obj['payloads']: - transport = payload['transport'] - dataname = payload['dataname'] - - if transport == 'direct': - log_trace(env_json_obj['correlation_id'], f"Direct transport - decoding payload '{dataname}'") - - # Extract base64 payload from the payload - payload_b64 = payload['data'] - - # Decode Base64 payload - payload_bytes = base64.b64decode(payload_b64) - - # Deserialize based on type - data_type = payload['payload_type'] - data = _deserialize_data(payload_bytes, data_type, env_json_obj['correlation_id']) - - payloads_list.append((dataname, data, data_type)) - elif transport == 'link': - # Extract download URL from the payload - url = payload['data'] - log_trace(env_json_obj['correlation_id'], f"Link transport - fetching '{dataname}' from URL: {url}") - - # Fetch with exponential backoff using the download handler - downloaded_data = await fileserver_download_handler( - url, - max_retries, - base_delay, - max_delay, - env_json_obj['correlation_id'] - ) - - # Deserialize based on type - data_type = payload['payload_type'] - data = _deserialize_data(downloaded_data, data_type, env_json_obj['correlation_id']) - - payloads_list.append((dataname, data, data_type)) - else: - raise Error(f"Unknown transport type for payload '{dataname}': {transport}") - - env_json_obj['payloads'] = payloads_list - return env_json_obj - - -# ============================================================================ -# NATS Client Wrapper -# ============================================================================ - -class NATSBridge: - """ - Cross-platform NATS bridge implementation. - - Provides a class-based interface for NATSBridge functionality. - """ - - def __init__(self, broker_url: str = None, fileserver_url: str = None): - """ - Initialize the NATSBridge client. - - Args: - broker_url: NATS server URL (defaults to DEFAULT_BROKER_URL) - fileserver_url: HTTP file server URL (defaults to DEFAULT_FILESERVER_URL) - """ - self.broker_url = broker_url or DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL - self._nats_client: NATSClient = None - - async def connect(self, broker_url: str = None) -> NATSClient: - """ - Connect to NATS server. - - Args: - broker_url: NATS server URL (optional, uses instance broker_url if not provided) - - Returns: - NATS connection client - """ - url = broker_url or self.broker_url - if not NATS_AVAILABLE: - raise Error('nats-py not available. Install with: pip install nats-py') - self._nats_client = await nats.connect(url) - return self._nats_client - - async def smartsend( - self, - subject: str, - data: List[Tuple[str, Any, str]], - **kwargs - ) -> Tuple[Dict, str]: - """ - Send data via NATS using instance configuration. - - Args: - subject: NATS subject to publish to - data: List of (dataname, data, type) tuples - **kwargs: Additional options (broker_url, fileserver_url, etc.) - - Returns: - Tuple of (env, env_json_str) - """ - # Merge instance config with kwargs - options = { - 'broker_url': kwargs.get('broker_url', self.broker_url), - 'fileserver_url': kwargs.get('fileserver_url', self.fileserver_url), - **kwargs - } - return await smartsend(subject, data, **options) - - async def smartreceive( - self, - msg: Any, - **kwargs - ) -> Dict: - """ - Receive and process NATS message using instance configuration. - - Args: - msg: NATS message object - **kwargs: Additional options - - Returns: - Dict with envelope metadata and payloads - """ - return await smartreceive(msg, **kwargs) - - async def close(self): - """Close the NATS connection.""" - if self._nats_client: - await self._nats_client.close() - self._nats_client = None - - -# ============================================================================ -# Module Exports -# ============================================================================ - -__all__ = [ - # Core functions - 'smartsend', - 'smartreceive', - - # Utility functions - 'log_trace', - 'generate_uuid', - '_serialize_data', - '_deserialize_data', - - # File server handlers - 'plik_oneshot_upload', - 'fetch_with_backoff', - - # NATS publishing - 'publish_message', - - # Data classes - 'MsgPayloadV1', - 'MsgEnvelopeV1', - - # Client class - 'NATSBridge', - - # Constants - 'DEFAULT_SIZE_THRESHOLD', - 'DEFAULT_BROKER_URL', - 'DEFAULT_FILESERVER_URL', - - # Availability flags - 'ARROW_AVAILABLE', - 'AIOHTTP_AVAILABLE', - 'NATS_AVAILABLE', -] \ No newline at end of file diff --git a/src/natbridge_mpy.py b/src/natbridge_mpy.py deleted file mode 100644 index e5cd464..0000000 --- a/src/natbridge_mpy.py +++ /dev/null @@ -1,728 +0,0 @@ -""" -NATSBridge - Cross-Platform Bi-Directional Data Bridge -MicroPython Implementation - -This module provides functionality for sending and receiving data across network boundaries -using NATS as the message bus, with support for both direct payload transport and -URL-based transport for larger payloads. - -MicroPython Limitations: -- No Arrow IPC support (memory constraints) -- Only direct transport (< 100KB threshold enforced) -- Synchronous API (no async/await) -- Limited UUID generation -- Simplified file server handlers - -Handler Function Signatures: - -```python -# Upload handler - uploads data to file server and returns URL -# The handler is passed to smartsend as fileserver_upload_handler parameter -# It receives: (fileserver_url, dataname, data) -# Returns: Dict with keys: 'status', 'url' (MicroPython simplified) -def fileserver_upload_handler(fileserver_url, dataname, data) - -# Download handler - fetches data from file server URL with exponential backoff -# The handler is passed to smartreceive as fileserver_download_handler parameter -# It receives: (url, max_retries, base_delay, max_delay, correlation_id) -# Returns: bytearray -def fileserver_download_handler(url, max_retries, base_delay, max_delay, correlation_id) -``` - -Multi-Payload Support (Standard API): -The system uses a standardized list-of-tuples format for all payload operations. - -API Standard: - -```python -# Input format for smartsend (always a list of tuples with type info) -[(dataname1, data1, type1), (dataname2, data2, type2), ...] - -# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) -{ - "correlation_id": "...", - "msg_id": "...", - "timestamp": "...", - "send_to": "...", - "msg_purpose": "...", - "sender_name": "...", - "sender_id": "...", - "receiver_name": "...", - "receiver_id": "...", - "reply_to": "...", - "reply_to_msg_id": "...", - "broker_url": "...", - "metadata": {...}, - "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -} -``` - -Supported types: "text", "dictionary", "image", "audio", "video", "binary" -Note: "table" type is NOT supported in MicroPython due to memory constraints -""" - -import network -import socket -import time -import json -import base64 -import uos - -# ============================================================================ -# Constants -# ============================================================================ - -# MicroPython-specific lower thresholds due to memory constraints -DEFAULT_SIZE_THRESHOLD = 100000 # 100KB for MicroPython (vs 1MB on desktop) -DEFAULT_BROKER_URL = "nats://localhost:4222" -DEFAULT_FILESERVER_URL = "http://localhost:8080" -MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython to prevent OOM - -# NATS connection settings -NATS_SERVER_HOST = "localhost" -NATS_SERVER_PORT = 4222 -NATS_RECONNECT_DELAY = 5000 # 5 seconds - - -# ============================================================================ -# Utility Functions -# ============================================================================ - -def log_trace(correlation_id, message): - """Log a trace message with correlation ID and timestamp.""" - try: - timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()) - print(f"[{timestamp}] [Correlation: {correlation_id}] {message}") - except Exception: - # Fallback for MicroPython - print(f"[Correlation: {correlation_id}] {message}") - - -def generate_uuid(): - """ - Generate a simple UUID for MicroPython. - - Note: This is not a true UUID v4, but provides uniqueness for tracing. - """ - # Use time-based unique identifier - tick = time.ticks_ms() - random_byte = __builtins__.chr(tick % 256) if hasattr(__builtins__, 'chr') else chr(tick % 256) - return f"mp-{tick:08x}-{random_byte}" - - -def _serialize_data(data, payload_type): - """ - Serialize data to bytes based on type. - - MicroPython version - no table support. - - Args: - data: Data to serialize - payload_type: Target format: "text", "dictionary", "image", "audio", "video", "binary" - - Returns: - bytes: Serialized data - - Raises: - ValueError: If payload_type is unknown - """ - if payload_type == 'text': - if isinstance(data, str): - return data.encode('utf-8') - else: - raise ValueError('Text data must be a string') - elif payload_type == 'dictionary': - json_str = json.dumps(data) - return json_str.encode('utf-8') - elif payload_type in ('image', 'audio', 'video', 'binary'): - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise ValueError(f'{payload_type} data must be bytes') - else: - raise ValueError(f'Unknown payload_type: {payload_type}') - - -def _deserialize_data(data, payload_type): - """ - Deserialize bytes to data based on type. - - MicroPython version - no table support. - - Args: - data: Serialized data as bytes - payload_type: Data type - - Returns: - Deserialized data - """ - if payload_type == 'text': - return data.decode('utf-8') - elif payload_type == 'dictionary': - json_str = data.decode('utf-8') - return json.loads(json_str) - elif payload_type in ('image', 'audio', 'video', 'binary'): - return data - else: - raise ValueError(f'Unknown payload_type: {payload_type}') - - -# ============================================================================ -# File Server Handlers (Simplified for MicroPython) -# ============================================================================ - -def _http_request(method, url, headers=None, data=None): - """ - Make an HTTP request (simplified for MicroPython). - - Args: - method: HTTP method ('GET' or 'POST') - url: URL to request - headers: Optional headers dict - data: Optional request body - - Returns: - tuple: (status_code, response_body, headers_dict) - """ - # Parse URL - # Simple parsing: http://host:port/path - try: - # Remove protocol - url = url.replace('http://', '').replace('https://', '') - - # Split host and path - if '/' in url: - host_part, path = url.split('/', 1) - path = '/' + path - else: - host_part = url - path = '/' - - # Split host and port - if ':' in host_part: - host, port = host_part.split(':') - port = int(port) - else: - host = host_part - port = 80 - - # Connect - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.settimeout(10) # 10 second timeout - sock.connect((host, port)) - - # Build request - request_lines = [f"{method} {path} HTTP/1.1"] - request_lines.append(f"Host: {host}") - request_lines.append("Connection: close") - - if headers: - for key, value in headers.items(): - request_lines.append(f"{key}: {value}") - - request_lines.append("") - - request = '\r\n'.join(request_lines) - if data: - request += data.decode('utf-8') if isinstance(data, bytes) else data - - sock.send(request.encode('utf-8')) - - # Read response - response = b'' - while True: - try: - chunk = sock.recv(1024) - if not chunk: - break - response += chunk - except Exception: - break - - sock.close() - - # Parse response - if b'\r\n\r\n' in response: - header_part, body = response.split(b'\r\n\r\n', 1) - header_lines = header_part.decode('utf-8', errors='ignore').split('\r\n') - else: - header_lines = response.decode('utf-8', errors='ignore').split('\r\n') - body = b'' - - # Parse status line - status_line = header_lines[0] - status_code = int(status_line.split(' ')[1]) if len(status_line.split(' ')) > 1 else 200 - - # Parse headers - headers_dict = {} - for line in header_lines[1:]: - if ':' in line: - key, value = line.split(':', 1) - headers_dict[key.strip()] = value.strip() - - return status_code, body, headers_dict - - except Exception as e: - # Return error indicator - return 0, b'', {'error': str(e)} - - -def _simple_fileserver_upload(fileserver_url, dataname, data): - """ - Simple file upload handler for MicroPython (simplified plik-style). - - Note: This is a basic implementation. For production, use a proper - file server with the same API as plik. - - Args: - fileserver_url: Base URL of file server - dataname: Name of the file - data: Binary data - - Returns: - Dict with keys: 'status', 'url' - """ - # Simple implementation: return a constructed URL - # In practice, you'd need to implement actual upload logic - - # For MicroPython, we'll use a simple approach - # Generate a unique ID based on timestamp and dataname - unique_id = f"{int(time.time())}-{abs(hash(dataname)) % 10000:04d}" - - # Construct download URL - url = f"{fileserver_url}/file/{unique_id}/{dataname}" - - # In a real implementation, you would: - # 1. POST to /upload to get upload ID - # 2. POST file data to /file/{upload_id} - # 3. Return the download URL - - # For now, return a mock response - return { - 'status': 200, - 'url': url - } - - -def _simple_fileserver_download(url, max_retries, base_delay, max_delay, correlation_id): - """ - Simple file download handler with exponential backoff. - - Args: - url: URL to download from - max_retries: Maximum retry attempts - base_delay: Initial delay in milliseconds - max_delay: Maximum delay in milliseconds - correlation_id: Correlation ID for logging - - Returns: - bytearray: Downloaded data - """ - delay = base_delay - - for attempt in range(1, max_retries + 1): - try: - status_code, body, headers = _http_request('GET', url) - - if status_code == 200: - log_trace(correlation_id, f"Successfully fetched data from {url} on attempt {attempt}") - return bytearray(body) - else: - log_trace(correlation_id, f"Download failed with status {status_code}") - if attempt < max_retries: - time.sleep_ms(delay) - delay = min(delay * 2, max_delay) - else: - raise RuntimeError(f"Download failed with status {status_code}") - except Exception as e: - log_trace(correlation_id, f"Attempt {attempt} failed: {type(e).__name__}") - if attempt < max_retries: - time.sleep_ms(delay) - delay = min(delay * 2, max_delay) - else: - raise RuntimeError(f"Failed to download after {max_retries} attempts: {e}") - - return bytearray() - - -# ============================================================================ -# NATS Connection (Simplified for MicroPython) -# ============================================================================ - -class NATSConnection: - """ - Simplified NATS connection for MicroPython. - - Note: This is a basic implementation. For production use, consider - using a proper MicroPython NATS client or the full Python implementation. - """ - - def __init__(self, host=NATS_SERVER_HOST, port=NATS_SERVER_PORT): - self.host = host - self.port = port - self.sock = None - self.connected = False - - def connect(self): - """Connect to NATS server.""" - try: - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.settimeout(10) - self.sock.connect((self.host, self.port)) - self.connected = True - - # Send CONNECT command (simplified) - connect_cmd = b'\x08CONNECT{"verbose":false,"protocol":1,"version":"1.0.2","auth_token":"","lang":"mpy"}\r\n' - self.sock.send(connect_cmd) - - # Wait for PONG - response = self.sock.recv(1024) - return True - except Exception as e: - self.connected = False - raise RuntimeError(f"Failed to connect to NATS: {e}") - - def publish(self, subject, message): - """Publish a message to a subject.""" - if not self.connected or not self.sock: - raise RuntimeError("Not connected to NATS") - - # Publish command: PUB subject size\r\nmessage\r\n - msg_bytes = message.encode('utf-8') if isinstance(message, str) else message - pub_cmd = f"PUB {subject} {len(msg_bytes)}\r\n".encode('utf-8') - pub_cmd += msg_bytes + b'\r\n' - - self.sock.send(pub_cmd) - - # Wait for +OK response (simplified) - try: - self.sock.recv(4) - except Exception: - pass - - def close(self): - """Close the connection.""" - if self.sock: - try: - self.sock.close() - except Exception: - pass - self.sock = None - self.connected = False - - -# ============================================================================ -# Core Functions -# ============================================================================ - -def smartsend( - subject, - data, - broker_url=DEFAULT_BROKER_URL, - fileserver_url=DEFAULT_FILESERVER_URL, - fileserver_upload_handler=_simple_fileserver_upload, - size_threshold=DEFAULT_SIZE_THRESHOLD, - correlation_id=None, - msg_purpose="chat", - sender_name="NATSBridge", - receiver_name="", - receiver_id="", - reply_to="", - reply_to_msg_id="", - is_publish=True, - msg_id=None, - sender_id=None -): - """ - Send data via NATS with automatic transport selection. - - MicroPython version - synchronous, limited features. - - Args: - subject: NATS subject to publish to - data: List of (dataname, data, type) tuples - broker_url: NATS server URL - fileserver_url: HTTP file server URL - fileserver_upload_handler: Function to handle fileserver uploads - size_threshold: Threshold in bytes (enforced MAX_PAYLOAD_SIZE) - correlation_id: Correlation ID for tracing - msg_purpose: Purpose of the message - sender_name: Name of the sender - receiver_name: Name of the receiver - receiver_id: UUID of the receiver - reply_to: Topic to reply to - reply_to_msg_id: Message ID this message is replying to - is_publish: Whether to automatically publish the message - msg_id: Message ID - sender_id: Sender ID - - Returns: - Tuple of (env, env_json_str) - - Example: - ```python - from natbridge_mpy import NATSBridge - - bridge = NATSBridge() - env, env_json_str = bridge.smartsend( - "/chat", - [("message", "Hello!", "text"), ("data", data_bytes, "binary")], - size_threshold=100000 # Lower threshold for MicroPython - ) - ``` - """ - if correlation_id is None: - correlation_id = generate_uuid() - if msg_id is None: - msg_id = generate_uuid() - if sender_id is None: - sender_id = generate_uuid() - - # Enforce MAX_PAYLOAD_SIZE for MicroPython - effective_threshold = min(size_threshold, MAX_PAYLOAD_SIZE) - - log_trace(correlation_id, f"Starting smartsend for subject: {subject}") - - # Process each payload - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = _serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - # Check against hard limit - if payload_size > MAX_PAYLOAD_SIZE: - raise MemoryError(f"Payload '{dataname}' exceeds max size {MAX_PAYLOAD_SIZE} bytes") - - log_trace(correlation_id, f"Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") - - # Always use direct transport in MicroPython (link transport not fully supported) - # But respect size_threshold for smaller payloads - if payload_size < effective_threshold: - # Direct path - Base64 encode - payload_b64 = base64.b64encode(payload_bytes).decode('ascii') - log_trace(correlation_id, f"Using direct transport for {payload_size} bytes") - - payloads.append({ - 'id': generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64, - 'metadata': {'payload_bytes': payload_size} - }) - else: - # Link path (limited support) - log_trace(correlation_id, "Using link transport, uploading to fileserver") - - response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) - - log_trace(correlation_id, f"Uploaded to URL: {response.get('url', 'N/A')}") - - payloads.append({ - 'id': generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response.get('url', ''), - 'metadata': {} - }) - - # Build envelope - env = { - 'correlation_id': correlation_id, - 'msg_id': msg_id, - 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), - 'send_to': subject, - 'msg_purpose': msg_purpose, - 'sender_name': sender_name, - 'sender_id': sender_id, - 'receiver_name': receiver_name, - 'receiver_id': receiver_id, - 'reply_to': reply_to, - 'reply_to_msg_id': reply_to_msg_id, - 'broker_url': broker_url, - 'metadata': {}, - 'payloads': payloads - } - - env_json_str = json.dumps(env) - - # Publish if requested - if is_publish: - try: - conn = NATSConnection() - conn.connect() - conn.publish(subject, env_json_str) - conn.close() - log_trace(correlation_id, f"Message published to {subject}") - except Exception as e: - log_trace(correlation_id, f"Failed to publish: {e}") - # Don't raise - MicroPython should be resilient - - return env, env_json_str - - -def smartreceive(msg, fileserver_download_handler=None, max_retries=3, base_delay=100, max_delay=1000): - """ - Receive and process NATS message. - - MicroPython version - synchronous. - - Args: - msg: Message object with 'payload' attribute - fileserver_download_handler: Function to handle fileserver downloads - max_retries: Maximum retry attempts - base_delay: Initial delay in milliseconds - max_delay: Maximum delay in milliseconds - - Returns: - Dict with envelope metadata and payloads - """ - if fileserver_download_handler is None: - fileserver_download_handler = _simple_fileserver_download - - # Parse envelope - if isinstance(msg.payload, bytes): - payload = msg.payload.decode('utf-8') - else: - payload = msg.payload - - try: - env_json_obj = json.loads(payload) - except Exception: - # Handle cases where payload might be a bytearray - payload_str = str(msg.payload) - env_json_obj = json.loads(payload_str) - - correlation_id = env_json_obj.get('correlation_id', 'unknown') - log_trace(correlation_id, "Processing received message") - - # Process payloads - payloads_list = [] - - for payload in env_json_obj.get('payloads', []): - transport = payload.get('transport', 'direct') - dataname = payload.get('dataname', 'unknown') - - if transport == 'direct': - log_trace(correlation_id, f"Direct transport - decoding payload '{dataname}'") - - payload_b64 = payload.get('data', '') - payload_bytes = base64.b64decode(payload_b64) - - data_type = payload.get('payload_type', 'text') - data = _deserialize_data(payload_bytes, data_type) - - payloads_list.append((dataname, data, data_type)) - elif transport == 'link': - url = payload.get('data', '') - log_trace(correlation_id, f"Link transport - fetching '{dataname}' from URL: {url}") - - downloaded_data = fileserver_download_handler( - url, max_retries, base_delay, max_delay, correlation_id - ) - - data_type = payload.get('payload_type', 'binary') - data = _deserialize_data(downloaded_data, data_type) - - payloads_list.append((dataname, data, data_type)) - else: - log_trace(correlation_id, f"Unknown transport type: {transport}") - - env_json_obj['payloads'] = payloads_list - return env_json_obj - - -# ============================================================================ -# NATSBridge Class (MicroPython) -# ============================================================================ - -class NATSBridge: - """ - MicroPython NATS bridge implementation. - - Provides a class-based interface for NATSBridge functionality. - Optimized for memory-constrained devices. - """ - - def __init__(self, broker_url=None, fileserver_url=None): - """ - Initialize the NATSBridge client. - - Args: - broker_url: NATS server URL (defaults to DEFAULT_BROKER_URL) - fileserver_url: HTTP file server URL (defaults to DEFAULT_FILESERVER_URL) - """ - self.broker_url = broker_url or DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL - self._nats_conn = None - - def smartsend(self, subject, data, **kwargs): - """ - Send data via NATS. - - Args: - subject: NATS subject to publish to - data: List of (dataname, data, type) tuples - **kwargs: Additional options - - Returns: - Tuple of (env, env_json_str) - """ - # Merge with defaults - options = { - 'broker_url': kwargs.get('broker_url', self.broker_url), - 'fileserver_url': kwargs.get('fileserver_url', self.fileserver_url), - **kwargs - } - return smartsend(subject, data, **options) - - def smartreceive(self, msg, **kwargs): - """ - Receive and process NATS message. - - Args: - msg: Message object with 'payload' attribute - **kwargs: Additional options - - Returns: - Dict with envelope metadata and payloads - """ - return smartreceive(msg, **kwargs) - - -# ============================================================================ -# Module Exports -# ============================================================================ - -__all__ = [ - # Core functions - 'smartsend', - 'smartreceive', - - # Utility functions - 'generate_uuid', - '_serialize_data', - '_deserialize_data', - - # File server handlers - '_simple_fileserver_upload', - '_simple_fileserver_download', - - # NATS connection - 'NATSConnection', - 'NATSBridge', - - # Constants - 'DEFAULT_SIZE_THRESHOLD', - 'DEFAULT_BROKER_URL', - 'DEFAULT_FILESERVER_URL', - 'MAX_PAYLOAD_SIZE', - 'NATS_SERVER_HOST', - 'NATS_SERVER_PORT', - 'NATS_RECONNECT_DELAY', -] \ No newline at end of file -- 2.49.1 From 1ecc55f8aa52da631a8c90fe8b4cd9a204d744b8 Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 17:54:36 +0700 Subject: [PATCH 09/43] update --- docs/architecture.md | 2 +- docs/implementation.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index ed547e5..b04a771 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -55,7 +55,7 @@ All three platforms expose the same high-level API: |------|-------|------------|-------------------| | `text` | `String` | `string` | `str` | | `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | -| `table` | `DataFrame`, `Arrow.Table` | `Array`, `Buffer` (Arrow) | `pandas.DataFrame`, `bytes` (Arrow) | +| `table` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | | `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | | `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | | `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | diff --git a/docs/implementation.md b/docs/implementation.md index 89dbfe9..88d9af3 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -177,7 +177,7 @@ The system uses a **standardized list-of-tuples format** for all payload operati |------|-------|------------|--------|-------------| | `text` | `String` | `string` | `str` | `str` | | `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | -| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ (not supported) | +| `table` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | ❌ (not supported) | | `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | | `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | | `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | -- 2.49.1 From 4614f99358835fcf935dc45c4549c650bb4f9e1b Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 5 Mar 2026 20:17:36 +0700 Subject: [PATCH 10/43] update --- etc.jl | 4 +- src/natbridge.js | 674 ++++++++++++++++++++++ src/natbridge.py | 815 +++++++++++++++++++++++++++ src/natbridge_mpy.py | 673 ++++++++++++++++++++++ test/test_js_binary_receiver.js | 215 +++++++ test/test_js_binary_sender.js | 173 ++++++ test/test_js_dictionary_receiver.js | 220 ++++++++ test/test_js_dictionary_sender.js | 178 ++++++ test/test_js_mix_payloads_sender.js | 204 +++++++ test/test_js_table_receiver.js | 172 ++++++ test/test_js_table_sender.js | 179 ++++++ test/test_js_text_receiver.js | 206 +++++++ test/test_js_text_sender.js | 169 ++++++ test/test_mpy_binary_receiver.py | 185 ++++++ test/test_mpy_binary_sender.py | 163 ++++++ test/test_mpy_dictionary_receiver.py | 224 ++++++++ test/test_mpy_dictionary_sender.py | 177 ++++++ test/test_mpy_text_receiver.py | 209 +++++++ test/test_mpy_text_sender.py | 205 +++++++ test/test_py_binary_receiver.py | 184 ++++++ test/test_py_binary_sender.py | 183 ++++++ test/test_py_dictionary_receiver.py | 220 ++++++++ test/test_py_dictionary_sender.py | 172 ++++++ test/test_py_mix_payloads_sender.py | 199 +++++++ test/test_py_table_sender.py | 167 ++++++ test/test_py_text_receiver.py | 205 +++++++ test/test_py_text_sender.py | 164 ++++++ 27 files changed, 6536 insertions(+), 3 deletions(-) create mode 100644 src/natbridge.js create mode 100644 src/natbridge.py create mode 100644 src/natbridge_mpy.py create mode 100644 test/test_js_binary_receiver.js create mode 100644 test/test_js_binary_sender.js create mode 100644 test/test_js_dictionary_receiver.js create mode 100644 test/test_js_dictionary_sender.js create mode 100644 test/test_js_mix_payloads_sender.js create mode 100644 test/test_js_table_receiver.js create mode 100644 test/test_js_table_sender.js create mode 100644 test/test_js_text_receiver.js create mode 100644 test/test_js_text_sender.js create mode 100644 test/test_mpy_binary_receiver.py create mode 100644 test/test_mpy_binary_sender.py create mode 100644 test/test_mpy_dictionary_receiver.py create mode 100644 test/test_mpy_dictionary_sender.py create mode 100644 test/test_mpy_text_receiver.py create mode 100644 test/test_mpy_text_sender.py create mode 100644 test/test_py_binary_receiver.py create mode 100644 test/test_py_binary_sender.py create mode 100644 test/test_py_dictionary_receiver.py create mode 100644 test/test_py_dictionary_sender.py create mode 100644 test/test_py_mix_payloads_sender.py create mode 100644 test/test_py_table_sender.py create mode 100644 test/test_py_text_receiver.py create mode 100644 test/test_py_text_sender.py diff --git a/etc.jl b/etc.jl index 7dfde2e..629840e 100644 --- a/etc.jl +++ b/etc.jl @@ -20,7 +20,7 @@ Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read( -Help me expands this Julia package (NATSBridge) into a cross-platform project by adding a JavaScript and Python/MicroPython implementation. To ensure accuracy, the Julia src directory will serve as the ground truth, as the documentation may be outdated. +Help me expands this Julia package (NATSBridge) into a cross-platform project by adding a JavaScript and Python/MicroPython implementation. To ensure accuracy, NATSBridge.jl will serve as the ground truth, as the documentation may be outdated. My goal is to maintain interface parity at the high-level API for a consistent user experience, while ensuring the low-level implementation adheres strictly to the idiomatic conventions of each respective language (e.g., multiple dispatch in Julia vs. asynchronous, prototype, or class-based patterns in JS and Python/MicroPython) @@ -36,5 +36,3 @@ Now do the following: - - diff --git a/src/natbridge.js b/src/natbridge.js new file mode 100644 index 0000000..7414e9a --- /dev/null +++ b/src/natbridge.js @@ -0,0 +1,674 @@ +/** + * NATSBridge - Cross-Platform Bi-Directional Data Bridge + * JavaScript/Node.js Implementation + * + * This module provides functionality for sending and receiving data across network boundaries + * using NATS as the message bus, with support for both direct payload transport and + * URL-based transport for larger payloads. + * + * @module NATSBridge + */ + +const nats = require('nats'); +const { v4: uuidv4 } = require('uuid'); +const fetch = require('node-fetch'); +const arrow = require('apache-arrow'); + +// ---------------------------------------------- Constants ---------------------------------------------- // + +/** + * Default size threshold for switching from direct to link transport (1MB) + */ +const DEFAULT_SIZE_THRESHOLD = 1_000_000; + +/** + * Default NATS server URL + */ +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; + +/** + * Default HTTP file server URL for link transport + */ +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; + +// ---------------------------------------------- Utility Functions ---------------------------------------------- // + +/** + * Convert Buffer to Base64 string + * @param {Buffer} buffer - Buffer to encode + * @returns {string} Base64 encoded string + */ +function bufferToBase64(buffer) { + return buffer.toString('base64'); +} + +/** + * Log a trace message with correlation ID and timestamp + * @param {string} correlationId - Correlation ID for tracing + * @param {string} message - Message content to log + */ +function logTrace(correlationId, message) { + const timestamp = new Date().toISOString(); + console.log(`[${timestamp}] [Correlation: ${correlationId}] ${message}`); +} + +// ---------------------------------------------- Serialization Functions ---------------------------------------------- // + +/** + * Serialize data according to specified format + * @param {any} data - Data to serialize + * @param {string} payloadType - Target format: "text", "dictionary", "table", "image", "audio", "video", "binary" + * @returns {Buffer} Binary representation of the serialized data + */ +async function serializeData(data, payloadType) { + if (payloadType === 'text') { + if (typeof data === 'string') { + return Buffer.from(data, 'utf8'); + } else { + throw new Error('Text data must be a string'); + } + } else if (payloadType === 'dictionary') { + const jsonStr = JSON.stringify(data); + return Buffer.from(jsonStr, 'utf8'); + } else if (payloadType === 'table') { + // Convert array of objects to Arrow IPC format + if (!Array.isArray(data) || data.length === 0) { + throw new Error('Table data must be a non-empty array of objects'); + } + + return serializeArrowTable(data); + } else if (payloadType === 'image') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Image data must be Uint8Array or Buffer'); + } + } else if (payloadType === 'audio') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Audio data must be Uint8Array or Buffer'); + } + } else if (payloadType === 'video') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Video data must be Uint8Array or Buffer'); + } + } else if (payloadType === 'binary') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Binary data must be Uint8Array or Buffer'); + } + } else { + throw new Error(`Unknown payload_type: ${payloadType}`); + } +} + +/** + * Helper function to properly serialize table data to Arrow IPC + * @param {Array} data - Array of objects representing table rows + * @returns {Buffer} Arrow IPC formatted buffer + */ +function serializeArrowTable(data) { + if (!Array.isArray(data) || data.length === 0) { + throw new Error('Table data must be a non-empty array of objects'); + } + + // Build schema from first row + const fields = Object.keys(data[0]).map(key => { + const value = data[0][key]; + let arrowType; + if (typeof value === 'number') { + arrowType = Number.isInteger(value) ? arrow.Int64 : arrow.Float64; + } else if (typeof value === 'boolean') { + arrowType = arrow.Boolean; + } else if (value instanceof Date) { + arrowType = arrow.Date; + } else { + arrowType = arrow.Utf8; + } + return new arrow.Field(key, arrowType, true); + }); + + const schema = new arrow.Schema(fields); + const batches = []; + + // Create record batches + for (const row of data) { + const batch = arrow.recordBatch.fromObjects([row], schema); + batches.push(batch); + } + + // Write to buffer using IPC format + const buffers = arrow.ipc.recordBatchesToMessage(batches, schema).buffers; + const combined = new Uint8Array(buffers.reduce((acc, b) => acc + b.byteLength, 0)); + let offset = 0; + for (const buf of buffers) { + combined.set(new Uint8Array(buf), offset); + offset += buf.byteLength; + } + + return Buffer.from(combined); +} + +/** + * Deserialize bytes to data based on type + * @param {Buffer|Uint8Array} data - Serialized data as bytes + * @param {string} payloadType - Data type + * @param {string} correlationId - Correlation ID for logging + * @returns {any} Deserialized data + */ +async function deserializeData(data, payloadType, correlationId) { + const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data); + + if (payloadType === 'text') { + return buffer.toString('utf8'); + } else if (payloadType === 'dictionary') { + const jsonStr = buffer.toString('utf8'); + return JSON.parse(jsonStr); + } else if (payloadType === 'table') { + const table = arrow.tableFromRawBytes(buffer); + return table; + } else if (payloadType === 'image') { + return buffer; + } else if (payloadType === 'audio') { + return buffer; + } else if (payloadType === 'video') { + return buffer; + } else if (payloadType === 'binary') { + return buffer; + } else { + throw new Error(`Unknown payload_type: ${payloadType}`); + } +} + +// ---------------------------------------------- File Server Handlers ---------------------------------------------- // + +/** + * Upload data to plik server in one-shot mode + * @param {string} fileServerUrl - Base URL of the plik server + * @param {string} dataname - Name of the file being uploaded + * @param {Buffer|Uint8Array} data - Raw byte data of the file content + * @returns {Promise<{status: number, uploadid: string, fileid: string, url: string}>} + */ +async function plikOneshotUpload(fileServerUrl, dataname, data) { + const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data); + + // Get upload id + const urlGetUploadID = `${fileServerUrl}/upload`; + const headers = { 'Content-Type': 'application/json' }; + const body = JSON.stringify({ OneShot: true }); + + const httpResponse = await fetch(urlGetUploadID, { + method: 'POST', + headers, + body + }); + + const responseJson = await httpResponse.json(); + const uploadid = responseJson.id; + const uploadtoken = responseJson.uploadToken; + + // Upload file + const urlUpload = `${fileServerUrl}/file/${uploadid}`; + const form = new FormData(); + const blob = new Blob([buffer], { type: 'application/octet-stream' }); + form.append('file', blob, dataname); + + const uploadHeaders = { + 'X-UploadToken': uploadtoken + }; + + const uploadResponse = await fetch(urlUpload, { + method: 'POST', + headers: uploadHeaders, + body: form + }); + + const uploadJson = await uploadResponse.json(); + const fileid = uploadJson.id; + + const url = `${fileServerUrl}/file/${uploadid}/${fileid}/${dataname}`; + + return { + status: uploadResponse.status, + uploadid, + fileid, + url + }; +} + +/** + * Fetch data from URL with exponential backoff + * @param {string} url - URL to fetch from + * @param {number} maxRetries - Maximum number of retry attempts + * @param {number} baseDelay - Initial delay in milliseconds + * @param {number} maxDelay - Maximum delay in milliseconds + * @param {string} correlationId - Correlation ID for logging + * @returns {Promise} Fetched data as bytes + */ +async function fetchWithBackoff(url, maxRetries, baseDelay, maxDelay, correlationId) { + let delay = baseDelay; + + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + const response = await fetch(url); + + if (response.status === 200) { + logTrace(correlationId, `Successfully fetched data from ${url} on attempt ${attempt}`); + const arrayBuffer = await response.arrayBuffer(); + return new Uint8Array(arrayBuffer); + } else { + throw new Error(`Failed to fetch: ${response.status}`); + } + } catch (e) { + logTrace(correlationId, `Attempt ${attempt} failed: ${e.constructor.name}`); + + if (attempt < maxRetries) { + await new Promise(resolve => setTimeout(resolve, delay)); + delay = Math.min(delay * 2, maxDelay); + } + } + } + + throw new Error(`Failed to fetch data after ${maxRetries} attempts`); +} + +// ---------------------------------------------- NATS Client ---------------------------------------------- // + +/** + * NATS client wrapper for connection management + */ +class NATSClient { + /** + * Create a new NATS client + * @param {string} url - NATS server URL + */ + constructor(url) { + this.url = url; + this.connection = null; + } + + /** + * Connect to NATS server + * @returns {Promise} + */ + async connect() { + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + /** + * Publish message to NATS subject + * @param {string} subject - NATS subject to publish to + * @param {string} message - Message to publish + * @param {string} correlationId - Correlation ID for logging + */ + async publish(subject, message, correlationId) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + logTrace(correlationId, `Message published to ${subject}`); + } + + /** + * Close the NATS connection + */ + async close() { + if (this.connection) { + this.connection.close(); + } + } +} + +// ---------------------------------------------- Core Functions ---------------------------------------------- // + +/** + * Publish message to NATS + * @param {string|NATSClient|NATS.Connection} brokerUrlOrClient - NATS URL, client, or connection + * @param {string} subject - NATS subject to publish to + * @param {string} message - JSON message to publish + * @param {string} correlationId - Correlation ID for tracing + */ +async function publishMessage(brokerUrlOrClient, subject, message, correlationId) { + let conn; + + if (brokerUrlOrClient instanceof NATSClient) { + conn = brokerUrlOrClient; + } else if (brokerUrlOrClient instanceof nats.Connection) { + // Create a wrapper for direct connection + conn = { + async publish(subj, msg) { + await brokerUrlOrClient.publish(subj, msg); + }, + async close() { + await brokerUrlOrClient.close(); + } + }; + } else { + // String URL - create new client + const client = new NATSClient(brokerUrlOrClient); + conn = client; + } + + await conn.publish(subject, message, correlationId); + + if (conn instanceof NATSClient) { + await conn.close(); + } +} + +/** + * Build message envelope from payloads and metadata + * @param {string} subject - NATS subject + * @param {Array} payloads - Array of payload objects + * @param {Object} options - Envelope metadata options + * @returns {Object} Envelope object + */ +function buildEnvelope(subject, payloads, options) { + return { + correlation_id: options.correlation_id, + msg_id: options.msg_id, + timestamp: new Date().toISOString(), + send_to: subject, + msg_purpose: options.msg_purpose, + sender_name: options.sender_name, + sender_id: options.sender_id, + receiver_name: options.receiver_name, + receiver_id: options.receiver_id, + reply_to: options.reply_to, + reply_to_msg_id: options.reply_to_msg_id, + broker_url: options.broker_url, + metadata: options.metadata || {}, + payloads: payloads + }; +} + +/** + * Build payload object from serialized data + * @param {string} dataname - Name of the payload + * @param {string} payloadType - Type of the payload + * @param {Buffer} payloadBytes - Serialized payload bytes + * @param {string} transport - Transport type ("direct" or "link") + * @param {string} data - Data (base64 for direct, URL for link) + * @returns {Object} Payload object + */ +function buildPayload(dataname, payloadType, payloadBytes, transport, data) { + return { + id: uuidv4(), + dataname, + payload_type: payloadType, + transport, + encoding: transport === 'direct' ? 'base64' : 'none', + size: payloadBytes.byteLength, + data, + metadata: transport === 'direct' ? { payload_bytes: payloadBytes.byteLength } : {} + }; +} + +/** + * Send data via NATS with automatic transport selection + * + * This function intelligently routes data delivery based on payload size. + * If the serialized payload is smaller than size_threshold, it encodes the data as Base64 + * and publishes directly over NATS. Otherwise, it uploads the data to a fileserver + * and publishes only the download URL over NATS. + * + * @param {string} subject - NATS subject to publish the message to + * @param {Array} data - List of [dataname, data, type] tuples to send + * @param {Object} options - Optional configuration + * @param {string} [options.broker_url=DEFAULT_BROKER_URL] - URL of the NATS server + * @param {string} [options.fileserver_url=DEFAULT_FILESERVER_URL] - URL of the HTTP file server + * @param {Function} [options.fileserver_upload_handler=plikOneshotUpload] - Function to handle fileserver uploads + * @param {number} [options.size_threshold=DEFAULT_SIZE_THRESHOLD] - Threshold separating direct vs link transport + * @param {string} [options.correlation_id=uuidv4()] - Correlation ID for tracing + * @param {string} [options.msg_purpose="chat"] - Purpose of the message + * @param {string} [options.sender_name="NATSBridge"] - Name of the sender + * @param {string} [options.receiver_name=""] - Name of the receiver (empty means broadcast) + * @param {string} [options.receiver_id=""] - UUID of the receiver (empty means broadcast) + * @param {string} [options.reply_to=""] - Topic to reply to + * @param {string} [options.reply_to_msg_id=""] - Message ID this message is replying to + * @param {boolean} [options.is_publish=true] - Whether to automatically publish the message + * @param {NATSClient|NATS.Connection} [options.nats_connection=null] - Pre-existing NATS connection + * @param {string} [options.msg_id=uuidv4()] - Message ID + * @param {string} [options.sender_id=uuidv4()] - Sender ID + * @returns {Promise<[Object, string]>} Tuple of [env, env_json_str] + * + * @example + * // Send a single payload + * const [env, envJsonStr] = await smartsend( + * "/test", + * [["dataname1", data1, "dictionary"]], + * { broker_url: "nats://localhost:4222" } + * ); + * + * // Send multiple payloads + * const [env, envJsonStr] = await smartsend( + * "/test", + * [ + * ["dataname1", data1, "dictionary"], + * ["dataname2", data2, "table"] + * ], + * { broker_url: "nats://localhost:4222" } + * ); + * + * // Send with pre-existing connection + * const client = await NATSBridge.NATSClient.connect("nats://localhost:4222"); + * const [env, envJsonStr] = await smartsend( + * "/test", + * [["data", myData, "text"]], + * { nats_connection: client } + * ); + */ +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = uuidv4(), + msg_purpose = 'chat', + sender_name = 'NATSBridge', + receiver_name = '', + receiver_id = '', + reply_to = '', + reply_to_msg_id = '', + is_publish = true, + nats_connection = null, + msg_id = uuidv4(), + sender_id = uuidv4() + } = options; + + logTrace(correlation_id, `Starting smartsend for subject: ${subject}`); + + // Process payloads + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + logTrace(correlation_id, `Serialized payload '${dataname}' (type: ${payloadType}) size: ${payloadSize} bytes`); + + if (payloadSize < size_threshold) { + // Direct path + const payloadB64 = bufferToBase64(payloadBytes); + logTrace(correlation_id, `Using direct transport for ${payloadSize} bytes`); + + const payload = buildPayload(dataname, payloadType, payloadBytes, 'direct', payloadB64); + payloads.push(payload); + } else { + // Link path + logTrace(correlation_id, `Using link transport, uploading to fileserver`); + + const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); + + if (response.status !== 200) { + throw new Error(`Failed to upload data to fileserver: ${response.status}`); + } + + logTrace(correlation_id, `Uploaded to URL: ${response.url}`); + + const payload = buildPayload(dataname, payloadType, payloadBytes, 'link', response.url); + payloads.push(payload); + } + } + + // Build envelope + const env = buildEnvelope(subject, payloads, { + correlation_id, + msg_id, + msg_purpose, + sender_name, + sender_id, + receiver_name, + receiver_id, + reply_to, + reply_to_msg_id, + broker_url + }); + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} + +/** + * Receive and process NATS message + * + * This function processes incoming NATS messages, handling both direct transport + * (base64 decoded payloads) and link transport (URL-based payloads). + * It deserializes the data based on the transport type and returns the result. + * + * @param {Object} msg - NATS message object with payload property + * @param {Object} options - Optional configuration + * @param {Function} [options.fileserver_download_handler=fetchWithBackoff] - Function to handle fileserver downloads + * @param {number} [options.max_retries=5] - Maximum retry attempts for fetching URL + * @param {number} [options.base_delay=100] - Initial delay for exponential backoff in ms + * @param {number} [options.max_delay=5000] - Maximum delay for exponential backoff in ms + * @returns {Promise} Envelope object with processed payloads + * + * @example + * // Receive and process message + * const env = await smartreceive(msg, { + * fileserver_download_handler: fetchWithBackoff, + * max_retries: 5, + * base_delay: 100, + * max_delay: 5000 + * }); + * // env.payloads is an Array of [dataname, data, type] arrays + * for (const [dataname, data, type] of env.payloads) { + * console.log(`${dataname}: ${data} (type: ${type})`); + * } + */ +async function smartreceive(msg, options = {}) { + const { + fileserver_download_handler = fetchWithBackoff, + max_retries = 5, + base_delay = 100, + max_delay = 5000 + } = options; + + // Parse the JSON envelope + const payload = typeof msg.payload === 'string' ? msg.payload : Buffer.from(msg.payload).toString('utf8'); + const envJsonObj = JSON.parse(payload); + logTrace(envJsonObj.correlation_id, 'Processing received message'); + + // Process all payloads in the envelope + const payloadsList = []; + const numPayloads = envJsonObj.payloads.length; + + for (let i = 0; i < numPayloads; i++) { + const payloadObj = envJsonObj.payloads[i]; + const transport = payloadObj.transport; + const dataname = payloadObj.dataname; + + if (transport === 'direct') { + logTrace(envJsonObj.correlation_id, `Direct transport - decoding payload '${dataname}'`); + + // Extract base64 payload from the payload + const payloadB64 = payloadObj.data; + + // Decode Base64 payload + const payloadBytes = Buffer.from(payloadB64, 'base64'); + + // Deserialize based on type + const dataType = payloadObj.payload_type; + const data = await deserializeData(payloadBytes, dataType, envJsonObj.correlation_id); + + payloadsList.push([dataname, data, dataType]); + } else if (transport === 'link') { + // Extract download URL from the payload + const url = payloadObj.data; + logTrace(envJsonObj.correlation_id, `Link transport - fetching '${dataname}' from URL: ${url}`); + + // Fetch with exponential backoff using the download handler + const downloadedData = await fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + envJsonObj.correlation_id + ); + + // Deserialize based on type + const dataType = payloadObj.payload_type; + const data = await deserializeData(downloadedData, dataType, envJsonObj.correlation_id); + + payloadsList.push([dataname, data, dataType]); + } else { + throw new Error(`Unknown transport type for payload '${dataname}': ${transport}`); + } + } + + envJsonObj.payloads = payloadsList; + return envJsonObj; +} + +// ---------------------------------------------- Module Exports ---------------------------------------------- // + +const NATSBridge = { + /** + * NATS client class for connection management + */ + NATSClient, + + /** + * Send data via NATS with automatic transport selection + */ + smartsend, + + /** + * Receive and process NATS message + */ + smartreceive, + + /** + * Upload data to plik server in one-shot mode + */ + plikOneshotUpload, + + /** + * Fetch data from URL with exponential backoff + */ + fetchWithBackoff, + + /** + * Default constants + */ + DEFAULT_SIZE_THRESHOLD, + DEFAULT_BROKER_URL, + DEFAULT_FILESERVER_URL +}; + +module.exports = NATSBridge; \ No newline at end of file diff --git a/src/natbridge.py b/src/natbridge.py new file mode 100644 index 0000000..ee94bb0 --- /dev/null +++ b/src/natbridge.py @@ -0,0 +1,815 @@ +""" +NATSBridge - Cross-Platform Bi-Directional Data Bridge +Python Desktop Implementation + +This module provides functionality for sending and receiving data across network boundaries +using NATS as the message bus, with support for both direct payload transport and +URL-based transport for larger payloads. + +@package natbridge +""" + +import asyncio +import base64 +import json +import uuid +from datetime import datetime +from typing import Any, Callable, Dict, List, Tuple, Union +import aiohttp + +try: + import pyarrow as arrow + import pyarrow.ipc as ipc + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + +try: + import nats + from nats.aio.client import Client as NATSClient + NATS_AVAILABLE = True +except ImportError: + NATS_AVAILABLE = False + +# ---------------------------------------------- Constants ---------------------------------------------- # + +""" +Default size threshold for switching from direct to link transport (1MB) +""" +DEFAULT_SIZE_THRESHOLD = 1_000_000 + +""" +Default NATS server URL +""" +DEFAULT_BROKER_URL = "nats://localhost:4222" + +""" +Default HTTP file server URL for link transport +""" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + + +# ---------------------------------------------- Utility Functions ---------------------------------------------- # + +def log_trace(correlation_id: str, message: str) -> None: + """ + Log a trace message with correlation ID and timestamp. + + Args: + correlation_id: Correlation ID for tracing + message: Message content to log + """ + timestamp = datetime.utcnow().isoformat() + 'Z' + print(f"[{timestamp}] [Correlation: {correlation_id}] {message}") + + +# ---------------------------------------------- Serialization Functions ---------------------------------------------- # + +def _serialize_data(data: Any, payload_type: str) -> bytes: + """ + Serialize data according to specified format. + + Args: + data: Data to serialize (string for "text", JSON-serializable for "dictionary", + table-like for "table", binary for "image", "audio", "video", "binary") + payload_type: Target format: "text", "dictionary", "table", "image", "audio", "video", "binary" + + Returns: + Binary representation of the serialized data + + Raises: + Error: If payload_type is not one of the supported types + Error: If payload_type is "image", "audio", or "video" but data is not bytes + Error: If payload_type is "table" but data is not a pandas DataFrame or pyarrow Table + """ + if payload_type == 'text': + if isinstance(data, str): + return data.encode('utf-8') + else: + raise ValueError('Text data must be a string') + elif payload_type == 'dictionary': + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise RuntimeError('pyarrow not available for table serialization') + + import io + buf = io.BytesIO() + + import pandas as pd + if isinstance(data, pd.DataFrame): + table = arrow.Table.from_pandas(data) + sink = ipc.new_file(buf, table.schema) + ipc.write_table(table, sink) + sink.close() + return buf.getvalue() + elif isinstance(data, arrow.Table): + sink = ipc.new_file(buf, data.schema) + ipc.write_table(data, sink) + sink.close() + return buf.getvalue() + else: + raise ValueError('Table data must be a pandas DataFrame or pyarrow Table') + elif payload_type == 'image': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise ValueError('Image data must be bytes') + elif payload_type == 'audio': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise ValueError('Audio data must be bytes') + elif payload_type == 'video': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise ValueError('Video data must be bytes') + elif payload_type == 'binary': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise ValueError('Binary data must be bytes') + else: + raise ValueError(f'Unknown payload_type: {payload_type}') + + +def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: + """ + Deserialize bytes to data based on type. + + Args: + data: Serialized data as bytes + payload_type: Data type ("text", "dictionary", "table", "image", "audio", "video", "binary") + correlation_id: Correlation ID for logging + + Returns: + Deserialized data (String for "text", DataFrame for "table", JSON data for "dictionary", + bytes for "image", "audio", "video", "binary") + + Raises: + Error: If payload_type is not one of the supported types + """ + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type == 'table': + if not ARROW_AVAILABLE: + raise RuntimeError('pyarrow not available for table deserialization') + + import io + buf = io.BytesIO(data) + reader = ipc.open_file(buf) + return reader.read_all().to_pandas() + elif payload_type == 'image': + return data + elif payload_type == 'audio': + return data + elif payload_type == 'video': + return data + elif payload_type == 'binary': + return data + else: + raise ValueError(f'Unknown payload_type: {payload_type}') + + +# ---------------------------------------------- File Server Handlers ---------------------------------------------- # + +async def plik_oneshot_upload( + file_server_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload data to plik server in one-shot mode. + + This function uploads a raw byte array to a plik server in one-shot mode (no upload session). + It first creates a one-shot upload session by sending a POST request with {"OneShot": true}, + retrieves an upload ID and token, then uploads the file data as multipart form data using the token. + + Args: + file_server_url: Base URL of the plik server (e.g., "http://localhost:8080") + dataname: Name of the file being uploaded + data: Raw byte data of the file content + + Returns: + Dict with keys: + - "status": HTTP server response status + - "uploadid": ID of the one-shot upload session + - "fileid": ID of the uploaded file within the session + - "url": Full URL to download the uploaded file + + Example: + >>> fileserver_url = "http://localhost:8080" + >>> dataname = "test.txt" + >>> data = b"hello world" + >>> result = await plik_oneshot_upload(file_server_url, dataname, data) + >>> result["status"], result["uploadid"], result["fileid"], result["url"] + """ + async with aiohttp.ClientSession() as session: + # Get upload id + url_getUploadID = f"{file_server_url}/upload" + headers = {'Content-Type': 'application/json'} + body = json.dumps({"OneShot": True}) + + async with session.post(url_getUploadID, headers=headers, data=body) as response: + response_json = await response.json() + uploadid = response_json['id'] + uploadtoken = response_json['uploadToken'] + + # Upload file + url_upload = f"{file_server_url}/file/{uploadid}" + headers = {'X-UploadToken': uploadtoken} + + form = aiohttp.FormData() + form.add_field('file', data, filename=dataname, content_type='application/octet-stream') + + async with session.post(url_upload, headers=headers, data=form) as upload_response: + upload_json = await upload_response.json() + fileid = upload_json['id'] + + url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" + + return { + 'status': upload_response.status, + 'uploadid': uploadid, + 'fileid': fileid, + 'url': url + } + + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Fetch data from URL with exponential backoff. + + This internal function retrieves data from a URL with retry logic using + exponential backoff to handle transient failures. + + Args: + url: URL to fetch from + max_retries: Maximum number of retry attempts + base_delay: Initial delay in milliseconds + max_delay: Maximum delay in milliseconds + correlation_id: Correlation ID for logging + + Returns: + Fetched data as bytes + + Raises: + Error: If all retry attempts fail + + Example: + >>> data = await fetch_with_backoff("http://example.com/file.zip", 5, 100, 5000, "correlation123") + """ + delay = base_delay + + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + log_trace(correlation_id, f"Successfully fetched data from {url} on attempt {attempt}") + return await response.read() + else: + raise Exception(f"Failed to fetch: {response.status}") + except Exception as e: + log_trace(correlation_id, f"Attempt {attempt} failed: {type(e).__name__}") + + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + + raise Exception(f"Failed to fetch data after {max_retries} attempts") + + +# ---------------------------------------------- NATS Client ---------------------------------------------- # + +class NATSClient: + """NATS client wrapper for connection management.""" + + def __init__(self, url: str = DEFAULT_BROKER_URL): + """ + Create a new NATS client. + + Args: + url: NATS server URL + """ + self.url = url + self._client: NATSClient = None + + async def connect(self) -> NATSClient: + """ + Connect to NATS server. + + Returns: + NATS client instance + """ + if NATS_AVAILABLE: + self._client = nats.connect(self.url) + await self._client + else: + raise Error('nats-py not available') + return self._client + + async def publish(self, subject: str, message: str, correlation_id: str = "") -> None: + """ + Publish message to NATS subject. + + Args: + subject: NATS subject to publish to + message: Message to publish + correlation_id: Correlation ID for logging + """ + if self._client: + await self._client.publish(subject, message) + if correlation_id: + log_trace(correlation_id, f"Message published to {subject}") + + async def close(self) -> None: + """Close the NATS connection.""" + if self._client: + await self._client.drain() + await self._client.close() + + +# ---------------------------------------------- Core Functions ---------------------------------------------- # + +def _build_envelope( + subject: str, + payloads: List[Dict[str, Any]], + options: Dict[str, Any] +) -> Dict[str, Any]: + """ + Build message envelope from payloads and metadata. + + Args: + subject: NATS subject + payloads: Array of payload objects + options: Envelope metadata options + + Returns: + Envelope object + """ + return { + 'correlation_id': options['correlation_id'], + 'msg_id': options['msg_id'], + 'timestamp': datetime.utcnow().isoformat() + 'Z', + 'send_to': subject, + 'msg_purpose': options['msg_purpose'], + 'sender_name': options['sender_name'], + 'sender_id': options['sender_id'], + 'receiver_name': options['receiver_name'], + 'receiver_id': options['receiver_id'], + 'reply_to': options['reply_to'], + 'reply_to_msg_id': options['reply_to_msg_id'], + 'broker_url': options['broker_url'], + 'metadata': options.get('metadata', {}), + 'payloads': payloads + } + + +def _build_payload( + dataname: str, + payload_type: str, + payload_bytes: bytes, + transport: str, + data: Union[str, bytes] +) -> Dict[str, Any]: + """ + Build payload object from serialized data. + + Args: + dataname: Name of the payload + payload_type: Type of the payload + payload_bytes: Serialized payload bytes + transport: Transport type ("direct" or "link") + data: Data (base64 for direct, URL for link) + + Returns: + Payload object + """ + return { + 'id': str(uuid.uuid4()), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': transport, + 'encoding': 'base64' if transport == 'direct' else 'none', + 'size': len(payload_bytes), + 'data': data, + 'metadata': {'payload_bytes': len(payload_bytes)} if transport == 'direct' else {} + } + + +async def publish_message( + broker_url_or_client: Union[str, NATSClient, Any], + subject: str, + message: str, + correlation_id: str +) -> None: + """ + Publish message to NATS. + + Args: + broker_url_or_client: NATS URL, client, or connection + subject: NATS subject to publish to + message: JSON message to publish + correlation_id: Correlation ID for tracing + """ + if isinstance(broker_url_or_client, NATSClient): + client = broker_url_or_client + elif NATS_AVAILABLE and hasattr(broker_url_or_client, 'publish'): + # Direct NATS client connection + await broker_url_or_client.publish(subject, message) + log_trace(correlation_id, f"Message published to {subject}") + return + else: + # String URL - create new client + client = NATSClient(broker_url_or_client) + await client.connect() + + await client.publish(subject, message, correlation_id) + + if isinstance(broker_url_or_client, NATSClient): + await broker_url_or_client.close() + elif not (NATS_AVAILABLE and hasattr(broker_url_or_client, 'publish')): + await client.close() + + +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """ + Send data via NATS with automatic transport selection. + + This function intelligently routes data delivery based on payload size. + If the serialized payload is smaller than size_threshold, it encodes the data as Base64 + and publishes directly over NATS. Otherwise, it uploads the data to a fileserver + and publishes only the download URL over NATS. + + Args: + subject: NATS subject to publish the message to + data: List of (dataname, data, type) tuples to send + - dataname: Name of the payload + - data: The actual data to send + - type: Payload type: "text", "dictionary", "table", "image", "audio", "video", "binary" + broker_url: URL of the NATS server + fileserver_url: URL of the HTTP file server for large payloads + fileserver_upload_handler: Function to handle fileserver uploads (must return Dict with "status", + "uploadid", "fileid", "url" keys) + size_threshold: Threshold in bytes separating direct vs link transport + correlation_id: Correlation ID for tracing (auto-generated UUID if not provided) + msg_purpose: Purpose of the message: "ACK", "NACK", "updateStatus", "shutdown", "chat", etc. + sender_name: Name of the sender + receiver_name: Name of the receiver (empty string means broadcast) + receiver_id: UUID of the receiver (empty string means broadcast) + reply_to: Topic to reply to (empty string if no reply expected) + reply_to_msg_id: Message ID this message is replying to + is_publish: Whether to automatically publish the message to NATS + nats_connection: Pre-existing NATS connection (if provided, uses this connection instead of + creating a new one; saves connection establishment overhead) + msg_id: Message ID (auto-generated UUID if not provided) + sender_id: Sender ID (auto-generated UUID if not provided) + + Returns: + Tuple of (env, env_json_str) where: + - env: Dict containing all metadata and payloads + - env_json_str: JSON string for publishing to NATS + + Example: + >>> # Send a single payload (still wrapped in a list) + >>> data = {"key": "value"} + >>> env, env_json_str = await smartsend( + ... "my.subject", + ... [("dataname1", data, "dictionary")], + ... broker_url="nats://localhost:4222" + ... ) + >>> + >>> # Send multiple payloads with different types + >>> data1 = {"key1": "value1"} + >>> data2 = [1, 2, 3, 4, 5] + >>> env, env_json_str = await smartsend( + ... "my.subject", + ... [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")] + ... ) + >>> + >>> # Send a large array using fileserver upload + >>> data = list(range(10_000_000)) # ~80 MB + >>> env, env_json_str = await smartsend( + ... "large.data", + ... [("large_table", data, "table")] + ... ) + >>> + >>> # Mixed content (e.g., chat with text and image) + >>> env, env_json_str = await smartsend( + ... "chat.subject", + ... [ + ... ("message_text", "Hello!", "text"), + ... ("user_image", image_data, "image"), + ... ("audio_clip", audio_data, "audio") + ... ] + ... ) + >>> + >>> # Publish the JSON string directly using NATS request-reply pattern + >>> # reply = await nats.request(broker_url, subject, env_json_str, reply_to=reply_to_topic) + """ + if correlation_id is None: + correlation_id = str(uuid.uuid4()) + if msg_id is None: + msg_id = str(uuid.uuid4()) + if sender_id is None: + sender_id = str(uuid.uuid4()) + + log_trace(correlation_id, f"Starting smartsend for subject: {subject}") + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = _serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + log_trace(correlation_id, f"Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") + + if payload_size < size_threshold: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + log_trace(correlation_id, f"Using direct transport for {payload_size} bytes") + + payload = _build_payload(dataname, payload_type, payload_bytes, 'direct', payload_b64) + payloads.append(payload) + else: + # Link path + log_trace(correlation_id, "Using link transport, uploading to fileserver") + + response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response['status'] != 200: + raise Exception(f"Failed to upload data to fileserver: {response['status']}") + + log_trace(correlation_id, f"Uploaded to URL: {response['url']}") + + payload = _build_payload(dataname, payload_type, payload_bytes, 'link', response['url']) + payloads.append(payload) + + # Build envelope + env = _build_envelope(subject, payloads, { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'msg_purpose': msg_purpose, + 'sender_name': sender_name, + 'sender_id': sender_id, + 'receiver_name': receiver_name, + 'receiver_id': receiver_id, + 'reply_to': reply_to, + 'reply_to_msg_id': reply_to_msg_id, + 'broker_url': broker_url + }) + + env_json_str = json.dumps(env) + + if is_publish: + if nats_connection: + await publish_message(nats_connection, subject, env_json_str, correlation_id) + else: + await publish_message(broker_url, subject, env_json_str, correlation_id) + + return env, env_json_str + + +async def smartreceive( + msg: Any, + fileserver_download_handler: Callable = fetch_with_backoff, + max_retries: int = 5, + base_delay: int = 100, + max_delay: int = 5000 +) -> Dict[str, Any]: + """ + Receive and process NATS messages. + + This function processes incoming NATS messages, handling both direct transport + (base64 decoded payloads) and link transport (URL-based payloads). + It deserializes the data based on the transport type and returns the result. + + Args: + msg: NATS message to process + fileserver_download_handler: Function to handle downloading data from file server URLs + max_retries: Maximum retry attempts for fetching URL + base_delay: Initial delay for exponential backoff in ms + max_delay: Maximum delay for exponential backoff in ms + + Returns: + Dict with envelope metadata and payloads field containing List[Tuple[str, Any, str]] + + Example: + >>> # Receive and process message + >>> env = await smartreceive(msg, fileserver_download_handler=fetch_with_backoff) + >>> # env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] + >>> # Access payloads: for dataname, data, type_ in env["payloads"] + >>> for dataname, data, type_ in env["payloads"]: + >>> print(f"{dataname}: {data} (type: {type_})") + """ + # Parse the JSON envelope + if isinstance(msg, dict): + # Already parsed + env_json_obj = msg + elif hasattr(msg, 'payload'): + # NATS message object + payload = msg.payload if isinstance(msg.payload, str) else msg.payload.decode('utf-8') + env_json_obj = json.loads(payload) + else: + # Assume it's already a JSON string or dict + env_json_obj = json.loads(msg) if isinstance(msg, str) else msg + + log_trace(env_json_obj['correlation_id'], "Processing received message") + + # Process all payloads in the envelope + payloads_list = [] + num_payloads = len(env_json_obj['payloads']) + + for i in range(num_payloads): + payload_obj = env_json_obj['payloads'][i] + transport = payload_obj['transport'] + dataname = payload_obj['dataname'] + + if transport == 'direct': + log_trace(env_json_obj['correlation_id'], f"Direct transport - decoding payload '{dataname}'") + + # Extract base64 payload from the payload + payload_b64 = payload_obj['data'] + + # Decode Base64 payload + payload_bytes = base64.b64decode(payload_b64) + + # Deserialize based on type + data_type = payload_obj['payload_type'] + data = _deserialize_data(payload_bytes, data_type, env_json_obj['correlation_id']) + + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + # Extract download URL from the payload + url = payload_obj['data'] + log_trace(env_json_obj['correlation_id'], f"Link transport - fetching '{dataname}' from URL: {url}") + + # Fetch with exponential backoff using the download handler + downloaded_data = await fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + env_json_obj['correlation_id'] + ) + + # Deserialize based on type + data_type = payload_obj['payload_type'] + data = _deserialize_data(downloaded_data, data_type, env_json_obj['correlation_id']) + + payloads_list.append((dataname, data, data_type)) + else: + raise Exception(f"Unknown transport type for payload '{dataname}': {transport}") + + env_json_obj['payloads'] = payloads_list + return env_json_obj + + +# ---------------------------------------------- Module Exports ---------------------------------------------- # + +class NATSBridge: + """ + Cross-platform NATS bridge implementation. + + This class provides a convenient interface for NATSBridge functionality, + encapsulating the main functions and providing a class-based API. + """ + + DEFAULT_SIZE_THRESHOLD = DEFAULT_SIZE_THRESHOLD + DEFAULT_BROKER_URL = DEFAULT_BROKER_URL + DEFAULT_FILESERVER_URL = DEFAULT_FILESERVER_URL + + def __init__(self, broker_url: str = None, fileserver_url: str = None): + """ + Initialize NATSBridge. + + Args: + broker_url: NATS server URL (defaults to DEFAULT_BROKER_URL) + fileserver_url: HTTP file server URL (defaults to DEFAULT_FILESERVER_URL) + """ + self.broker_url = broker_url or self.DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or self.DEFAULT_FILESERVER_URL + + async def smartsend( + self, + subject: str, + data: List[Tuple[str, Any, str]], + **kwargs + ) -> Tuple[Dict, str]: + """ + Send data via NATS. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options passed to smartsend + + Returns: + Tuple of (env, env_json_str) + """ + kwargs['broker_url'] = kwargs.get('broker_url', self.broker_url) + kwargs['fileserver_url'] = kwargs.get('fileserver_url', self.fileserver_url) + return await smartsend(subject, data, **kwargs) + + async def smartreceive( + self, + msg: Any, + **kwargs + ) -> Dict[str, Any]: + """ + Receive and process NATS message. + + Args: + msg: NATS message to process + **kwargs: Additional options passed to smartreceive + + Returns: + Dict with envelope metadata and payloads + """ + return await smartreceive(msg, **kwargs) + + +# Convenience functions for module-level usage +def send( + subject: str, + data: List[Tuple[str, Any, str]], + **kwargs +) -> Tuple[Dict, str]: + """ + Convenience function for sending data. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options + + Returns: + Tuple of (env, env_json_str) + """ + return asyncio.run(smartsend(subject, data, **kwargs)) + + +def receive( + msg: Any, + **kwargs +) -> Dict[str, Any]: + """ + Convenience function for receiving messages. + + Args: + msg: NATS message to process + **kwargs: Additional options + + Returns: + Dict with envelope metadata and payloads + """ + return asyncio.run(smartreceive(msg, **kwargs)) + + +__all__ = [ + 'smartsend', + 'smartreceive', + 'plik_oneshot_upload', + 'fetch_with_backoff', + 'NATSBridge', + 'send', + 'receive', + 'DEFAULT_SIZE_THRESHOLD', + 'DEFAULT_BROKER_URL', + 'DEFAULT_FILESERVER_URL', + 'NATSClient', + '_serialize_data', + '_deserialize_data', + 'log_trace', + 'publish_message' +] \ No newline at end of file diff --git a/src/natbridge_mpy.py b/src/natbridge_mpy.py new file mode 100644 index 0000000..d99631f --- /dev/null +++ b/src/natbridge_mpy.py @@ -0,0 +1,673 @@ +""" +NATSBridge - Cross-Platform Bi-Directional Data Bridge +MicroPython Implementation + +This module provides functionality for sending and receiving data across network boundaries +using NATS as the message bus, with support for both direct payload transport and +URL-based transport for larger payloads. + +Note: MicroPython has significant constraints compared to desktop implementations: +- Limited memory (~256KB - 1MB) +- No Arrow IPC support (memory constraints) +- Synchronous API (no async/await) +- Lower size threshold for direct transport +""" + +import network +import time +import json +import base64 +import uos +import struct +import random + +# ---------------------------------------------- Constants ---------------------------------------------- # + +""" +Default size threshold for switching from direct to link transport (100KB for MicroPython) +""" +DEFAULT_SIZE_THRESHOLD = 100000 + +""" +Default NATS server URL +""" +DEFAULT_BROKER_URL = "nats://localhost:4222" + +""" +Default HTTP file server URL for link transport +""" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + +""" +Hard limit for payload size in MicroPython (50KB) +""" +MAX_PAYLOAD_SIZE = 50000 + + +# ---------------------------------------------- Utility Functions ---------------------------------------------- # + +def log_trace(correlation_id, message): + """ + Log a trace message with correlation ID and timestamp. + + Args: + correlation_id: Correlation ID for tracing + message: Message content to log + """ + timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()) + print(f"[{timestamp}] [Correlation: {correlation_id}] {message}") + + +def _generate_uuid(): + """ + Generate a simple UUID compatible with MicroPython. + + Returns: + UUID string + """ + # Generate a simple UUID-like string + # Format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + hex_chars = '0123456789abcdef' + uuid_str = ''.join([random.choice(hex_chars) for _ in range(32)]) + # Insert hyphens at proper positions + return f"{uuid_str[:8]}-{uuid_str[8:12]}-{uuid_str[12:16]}-{uuid_str[16:20]}-{uuid_str[20:]}" + + +# ---------------------------------------------- Serialization Functions ---------------------------------------------- # + +def _serialize_data(data, payload_type): + """ + Serialize data according to specified format. + + Args: + data: Data to serialize (string for "text", dict for "dictionary", + bytes for "image", "audio", "video", "binary") + payload_type: Target format: "text", "dictionary", "image", "audio", "video", "binary" + + Returns: + Binary representation of the serialized data + + Note: + MicroPython does not support "table" type due to memory constraints. + + Raises: + ValueError: If payload_type is not one of the supported types + """ + if payload_type == 'text': + if isinstance(data, str): + return data.encode('utf-8') + else: + raise ValueError('Text data must be a string') + elif payload_type == 'dictionary': + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type in ('image', 'audio', 'video', 'binary'): + if isinstance(data, (bytes, bytearray, memoryview)): + return bytes(data) + else: + raise ValueError(f'{payload_type} data must be bytes') + else: + raise ValueError(f'Unknown payload_type: {payload_type}') + + +def _deserialize_data(data, payload_type): + """ + Deserialize bytes to data based on type. + + Args: + data: Serialized data as bytes + payload_type: Data type ("text", "dictionary", "image", "audio", "video", "binary") + + Returns: + Deserialized data (String for "text", dict for "dictionary", bytes for others) + + Note: + MicroPython does not support "table" type due to memory constraints. + + Raises: + ValueError: If payload_type is not one of the supported types + """ + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type in ('image', 'audio', 'video', 'binary'): + return data + else: + raise ValueError(f'Unknown payload_type: {payload_type}') + + +# ---------------------------------------------- File Server Handlers ---------------------------------------------- # + +def _sync_fileserver_upload(file_server_url, dataname, data): + """ + Synchronous file upload to HTTP server. + + Note: + This is a simplified implementation for MicroPython. + In practice, would use network.HTTP or similar. + Currently raises NotImplementedError as file upload is not fully supported. + + Args: + file_server_url: Base URL of the file server + dataname: Name of the file being uploaded + data: Raw byte data of the file content + + Returns: + Dict with keys: 'status', 'url' + + Raises: + NotImplementedError: File upload is not implemented in MicroPython + """ + raise NotImplementedError("File upload not fully implemented in MicroPython. " + "Use direct transport only for memory-constrained devices.") + + +def _sync_fileserver_download(url, max_retries, base_delay, max_delay, correlation_id): + """ + Synchronous file download with exponential backoff. + + Note: + This is a simplified implementation for MicroPython. + In practice, would use network.HTTP or similar. + Currently raises NotImplementedError as file download is not fully supported. + + Args: + url: URL to download from + max_retries: Maximum retry attempts + base_delay: Initial delay in ms + max_delay: Maximum delay in ms + correlation_id: Correlation ID for logging + + Returns: + Downloaded bytes + + Raises: + NotImplementedError: File download is not implemented in MicroPython + """ + raise NotImplementedError("File download not fully implemented in MicroPython. " + "Use direct transport only for memory-constrained devices.") + + +# ---------------------------------------------- NATS Client ---------------------------------------------- # + +class NATSClient: + """ + NATS client wrapper for MicroPython. + + Note: + This is a simplified implementation for MicroPython. + Full NATS client implementation would require additional network stack support. + """ + + def __init__(self, url=DEFAULT_BROKER_URL): + """ + Initialize NATS client. + + Args: + url: NATS server URL + """ + self.url = url + self._connected = False + + def connect(self): + """ + Connect to NATS server. + + Note: + This is a placeholder implementation. + Actual NATS client would require network stack support. + + Returns: + True if connected, False otherwise + """ + # Placeholder - actual implementation would connect to NATS server + self._connected = True + return self._connected + + def publish(self, subject, message): + """ + Publish message to NATS subject. + + Note: + This is a placeholder implementation. + Actual NATS client would require network stack support. + + Args: + subject: NATS subject to publish to + message: Message to publish + """ + if not self._connected: + raise RuntimeError("Not connected to NATS server") + # Placeholder - actual implementation would publish to NATS + print(f"[NATS] Publish to {subject}: {message[:50]}...") + + def close(self): + """Close the NATS connection.""" + self._connected = False + + +# ---------------------------------------------- Core Functions ---------------------------------------------- # + +def _build_envelope(subject, payloads, options): + """ + Build message envelope from payloads and metadata. + + Args: + subject: NATS subject + payloads: Array of payload objects + options: Envelope metadata options + + Returns: + Envelope dict + """ + return { + 'correlation_id': options['correlation_id'], + 'msg_id': options['msg_id'], + 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), + 'send_to': subject, + 'msg_purpose': options['msg_purpose'], + 'sender_name': options['sender_name'], + 'sender_id': options['sender_id'], + 'receiver_name': options['receiver_name'], + 'receiver_id': options['receiver_id'], + 'reply_to': options['reply_to'], + 'reply_to_msg_id': options['reply_to_msg_id'], + 'broker_url': options['broker_url'], + 'metadata': {}, + 'payloads': payloads + } + + +def _build_payload(dataname, payload_type, payload_bytes, transport, data): + """ + Build payload object from serialized data. + + Args: + dataname: Name of the payload + payload_type: Type of the payload + payload_bytes: Serialized payload bytes + transport: Transport type ("direct" or "link") + data: Data (base64 for direct, URL for link) + + Returns: + Payload dict + """ + return { + 'id': _generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': transport, + 'encoding': 'base64' if transport == 'direct' else 'none', + 'size': len(payload_bytes), + 'data': data, + 'metadata': {'payload_bytes': len(payload_bytes)} if transport == 'direct' else {} + } + + +def _publish(subject, message, correlation_id): + """ + Publish message to NATS. + + Note: + This is a simplified implementation for MicroPython. + + Args: + subject: NATS subject to publish to + message: JSON message to publish + correlation_id: Correlation ID for logging + """ + log_trace(correlation_id, f"Publishing to {subject}") + # Placeholder - actual implementation would use NATSClient + # client = NATSClient() + # client.connect() + # client.publish(subject, message) + # client.close() + + +def smartsend(subject, data, **kwargs): + """ + Send data via NATS with automatic transport selection. + + This function intelligently routes data delivery based on payload size. + If the serialized payload is smaller than size_threshold, it encodes the data as Base64 + and publishes directly over NATS. Otherwise, it uploads the data to a fileserver + and publishes only the download URL over NATS. + + Note: + MicroPython has memory constraints, so the default size_threshold is lower (100KB). + Table type is not supported due to memory constraints. + + Args: + subject: NATS subject to publish the message to + data: List of (dataname, data, type) tuples to send + - dataname: Name of the payload + - data: The actual data to send + - type: Payload type: "text", "dictionary", "image", "audio", "video", "binary" + broker_url: NATS server URL (default: DEFAULT_BROKER_URL) + fileserver_url: HTTP file server URL (default: DEFAULT_FILESERVER_URL) + fileserver_upload_handler: Function to handle fileserver uploads (default: _sync_fileserver_upload) + size_threshold: Threshold in bytes separating direct vs link transport (default: 100000) + correlation_id: Correlation ID for tracing (auto-generated if not provided) + msg_purpose: Purpose of the message (default: "chat") + sender_name: Name of the sender (default: "NATSBridge") + receiver_name: Name of the receiver (empty means broadcast) + receiver_id: UUID of the receiver (empty means broadcast) + reply_to: Topic to reply to (empty if no reply expected) + reply_to_msg_id: Message ID this message is replying to + is_publish: Whether to automatically publish the message (default: True) + msg_id: Message ID (auto-generated if not provided) + sender_id: Sender ID (auto-generated if not provided) + + Returns: + Tuple of (env, env_json_str) where: + - env: Dict containing all metadata and payloads + - env_json_str: JSON string for publishing to NATS + + Example: + >>> # Send text payload + >>> env, env_json_str = NATSBridge.smartsend( + ... "/chat", + ... [("message", "Hello!", "text")], + ... broker_url="nats://localhost:4222" + ... ) + >>> + >>> # Send dictionary payload + >>> env, env_json_str = NATSBridge.smartsend( + ... "/config", + ... [("config", {"key": "value"}, "dictionary")], + ... broker_url="nats://localhost:4222" + ... ) + >>> + >>> # Send binary payload (image, audio, video) + >>> env, env_json_str = NATSBridge.smartsend( + ... "/media", + ... [("image", image_bytes, "image")], + ... broker_url="nats://localhost:4222" + ... ) + """ + # Extract options with defaults + correlation_id = kwargs.get('correlation_id', _generate_uuid()) + msg_id = kwargs.get('msg_id', _generate_uuid()) + sender_id = kwargs.get('sender_id', _generate_uuid()) + broker_url = kwargs.get('broker_url', DEFAULT_BROKER_URL) + fileserver_url = kwargs.get('fileserver_url', DEFAULT_FILESERVER_URL) + size_threshold = kwargs.get('size_threshold', DEFAULT_SIZE_THRESHOLD) + msg_purpose = kwargs.get('msg_purpose', 'chat') + sender_name = kwargs.get('sender_name', 'NATSBridge') + receiver_name = kwargs.get('receiver_name', '') + receiver_id = kwargs.get('receiver_id', '') + reply_to = kwargs.get('reply_to', '') + reply_to_msg_id = kwargs.get('reply_to_msg_id', '') + is_publish = kwargs.get('is_publish', True) + fileserver_upload_handler = kwargs.get('fileserver_upload_handler', _sync_fileserver_upload) + + log_trace(correlation_id, f"Starting smartsend for subject: {subject}") + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = _serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + # Check against hard limit for MicroPython + if payload_size > MAX_PAYLOAD_SIZE: + raise MemoryError(f"Payload '{dataname}' exceeds max size {MAX_PAYLOAD_SIZE} bytes") + + log_trace(correlation_id, f"Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") + + if payload_size < size_threshold: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('ascii') + log_trace(correlation_id, f"Using direct transport for {payload_size} bytes") + + payload = _build_payload(dataname, payload_type, payload_bytes, 'direct', payload_b64) + payloads.append(payload) + else: + # Link path (limited support) + log_trace(correlation_id, "Using link transport, uploading to fileserver") + + try: + response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + log_trace(correlation_id, f"Uploaded to URL: {response['url']}") + + payload = _build_payload(dataname, payload_type, payload_bytes, 'link', response['url']) + payloads.append(payload) + except NotImplementedError: + # Fall back to direct transport if file upload not available + log_trace(correlation_id, "File upload not available, using direct transport") + payload_b64 = base64.b64encode(payload_bytes).decode('ascii') + payload = _build_payload(dataname, payload_type, payload_bytes, 'direct', payload_b64) + payloads.append(payload) + + # Build envelope + env = _build_envelope(subject, payloads, { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'msg_purpose': msg_purpose, + 'sender_name': sender_name, + 'sender_id': sender_id, + 'receiver_name': receiver_name, + 'receiver_id': receiver_id, + 'reply_to': reply_to, + 'reply_to_msg_id': reply_to_msg_id, + 'broker_url': broker_url + }) + + env_json_str = json.dumps(env) + + if is_publish: + _publish(subject, env_json_str, correlation_id) + + return env, env_json_str + + +def smartreceive(msg, **kwargs): + """ + Receive and process NATS message. + + This function processes incoming NATS messages, handling both direct transport + (base64 decoded payloads) and link transport (URL-based payloads). + It deserializes the data based on the transport type and returns the result. + + Note: + MicroPython has memory constraints, so large payloads should be avoided. + Table type is not supported due to memory constraints. + + Args: + msg: NATS message to process (can be string, dict, or object with 'payload' attribute) + fileserver_download_handler: Function to handle downloading data from file server URLs + max_retries: Maximum retry attempts (default: 3) + base_delay: Initial delay in ms (default: 100) + max_delay: Maximum delay in ms (default: 1000) + + Returns: + Dict with envelope metadata and payloads field containing List[Tuple[str, Any, str]] + + Example: + >>> # Receive and process message + >>> env = NATSBridge.smartreceive(msg, fileserver_download_handler=_sync_fileserver_download) + >>> # env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] + >>> for dataname, data, type_ in env["payloads"]: + ... print(f"{dataname}: {data} (type: {type_})") + """ + # Parse the JSON envelope + if isinstance(msg, dict): + # Already parsed + env_json_obj = msg + elif hasattr(msg, 'payload'): + # Object with payload attribute + payload = msg.payload if isinstance(msg.payload, str) else msg.payload.decode('utf-8') + env_json_obj = json.loads(payload) + else: + # Assume it's already a JSON string or dict + env_json_obj = json.loads(msg) if isinstance(msg, str) else msg + + correlation_id = env_json_obj['correlation_id'] + log_trace(correlation_id, "Processing received message") + + # Process all payloads in the envelope + payloads_list = [] + num_payloads = len(env_json_obj['payloads']) + + for i in range(num_payloads): + payload_obj = env_json_obj['payloads'][i] + transport = payload_obj['transport'] + dataname = payload_obj['dataname'] + + if transport == 'direct': + log_trace(correlation_id, f"Direct transport - decoding payload '{dataname}'") + + # Extract base64 payload from the payload + payload_b64 = payload_obj['data'] + + # Decode Base64 payload + payload_bytes = base64.b64decode(payload_b64) + + # Deserialize based on type + data_type = payload_obj['payload_type'] + data = _deserialize_data(payload_bytes, data_type) + + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + # Extract download URL from the payload + url = payload_obj['data'] + log_trace(correlation_id, f"Link transport - fetching '{dataname}' from URL: {url}") + + # Fetch with exponential backoff using the download handler + fileserver_download_handler = kwargs.get('fileserver_download_handler', _sync_fileserver_download) + max_retries = kwargs.get('max_retries', 3) + base_delay = kwargs.get('base_delay', 100) + max_delay = kwargs.get('max_delay', 1000) + + downloaded_data = fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + correlation_id + ) + + # Deserialize based on type + data_type = payload_obj['payload_type'] + data = _deserialize_data(downloaded_data, data_type) + + payloads_list.append((dataname, data, data_type)) + else: + raise ValueError(f"Unknown transport type for payload '{dataname}': {transport}") + + env_json_obj['payloads'] = payloads_list + return env_json_obj + + +# ---------------------------------------------- Module Exports ---------------------------------------------- # + +class NATSBridge: + """ + MicroPython NATS bridge implementation. + + This class provides a convenient interface for NATSBridge functionality, + encapsulating the main functions and providing a class-based API. + + Note: + MicroPython has significant constraints: + - No Arrow IPC support (memory constraints) + - Only direct transport (< 100KB threshold enforced) + - Simplified UUID generation + - No async/await (synchronous API) + """ + + DEFAULT_SIZE_THRESHOLD = DEFAULT_SIZE_THRESHOLD + DEFAULT_BROKER_URL = DEFAULT_BROKER_URL + DEFAULT_FILESERVER_URL = DEFAULT_FILESERVER_URL + MAX_PAYLOAD_SIZE = MAX_PAYLOAD_SIZE + + def __init__(self, broker_url=None, fileserver_url=None): + """ + Initialize NATSBridge. + + Args: + broker_url: NATS server URL (defaults to DEFAULT_BROKER_URL) + fileserver_url: HTTP file server URL (defaults to DEFAULT_FILESERVER_URL) + """ + self.broker_url = broker_url or self.DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or self.DEFAULT_FILESERVER_URL + + def smartsend(self, subject, data, **kwargs): + """ + Send data via NATS. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options passed to smartsend + + Returns: + Tuple of (env, env_json_str) + """ + kwargs['broker_url'] = kwargs.get('broker_url', self.broker_url) + kwargs['fileserver_url'] = kwargs.get('fileserver_url', self.fileserver_url) + return smartsend(subject, data, **kwargs) + + def smartreceive(self, msg, **kwargs): + """ + Receive and process NATS message. + + Args: + msg: NATS message to process + **kwargs: Additional options passed to smartreceive + + Returns: + Dict with envelope metadata and payloads + """ + return smartreceive(msg, **kwargs) + + +# Convenience functions for module-level usage +def send(subject, data, **kwargs): + """ + Convenience function for sending data. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options + + Returns: + Tuple of (env, env_json_str) + """ + return smartsend(subject, data, **kwargs) + + +def receive(msg, **kwargs): + """ + Convenience function for receiving messages. + + Args: + msg: NATS message to process + **kwargs: Additional options + + Returns: + Dict with envelope metadata and payloads + """ + return smartreceive(msg, **kwargs) + + +__all__ = [ + 'smartsend', + 'smartreceive', + 'NATSBridge', + 'send', + 'receive', + 'DEFAULT_SIZE_THRESHOLD', + 'DEFAULT_BROKER_URL', + 'DEFAULT_FILESERVER_URL', + 'MAX_PAYLOAD_SIZE', + 'NATSClient', + '_serialize_data', + '_deserialize_data', + 'log_trace', + '_sync_fileserver_upload', + '_sync_fileserver_download' +] \ No newline at end of file diff --git a/test/test_js_binary_receiver.js b/test/test_js_binary_receiver.js new file mode 100644 index 0000000..1d989f6 --- /dev/null +++ b/test/test_js_binary_receiver.js @@ -0,0 +1,215 @@ +/** + * JavaScript Binary Receiver Test + * Tests the smartreceive function with binary/image/audio/video payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Binary Receiver Test ===\n'); + + // Create mock NATS message with binary payloads + const binaryData = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); // PNG header + const audioData = Buffer.from([0x46, 0x4C, 0x41, 0x43, 0x00, 0x00, 0x00, 0x00]); // FLAC header + const videoData = Buffer.from([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]); // MP4 header + const genericBinary = Buffer.from([0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE]); + + const testData = { + correlation_id: 'js-binary-receiver-' + Date.now(), + msg_id: 'msg-' + Date.now(), + timestamp: new Date().toISOString(), + send_to: '/test/binary', + msg_purpose: 'test', + sender_name: 'js-binary-test', + sender_id: 'sender-' + Date.now(), + receiver_name: 'js-receiver', + receiver_id: 'receiver-' + Date.now(), + reply_to: '', + reply_to_msg_id: '', + broker_url: TEST_BROKER_URL, + metadata: {}, + payloads: [ + { + id: 'payload-1', + dataname: 'image', + payload_type: 'image', + transport: 'direct', + encoding: 'base64', + size: binaryData.length, + data: binaryData.toString('base64'), + metadata: { payload_bytes: binaryData.length } + }, + { + id: 'payload-2', + dataname: 'audio', + payload_type: 'audio', + transport: 'direct', + encoding: 'base64', + size: audioData.length, + data: audioData.toString('base64'), + metadata: { payload_bytes: audioData.length } + }, + { + id: 'payload-3', + dataname: 'video', + payload_type: 'video', + transport: 'direct', + encoding: 'base64', + size: videoData.length, + data: videoData.toString('base64'), + metadata: { payload_bytes: videoData.length } + }, + { + id: 'payload-4', + dataname: 'binary', + payload_type: 'binary', + transport: 'direct', + encoding: 'base64', + size: genericBinary.length, + data: genericBinary.toString('base64'), + metadata: { payload_bytes: genericBinary.length } + } + ] + }; + + const mockMsg = { + payload: JSON.stringify(testData) + }; + + console.log('Mock Message Created:'); + console.log(` Correlation ID: ${testData.correlation_id}`); + console.log(` Payloads: ${testData.payloads.length}`); + console.log(` Payload types: ${testData.payloads.map(p => p.payload_type).join(', ')}\n`); + + try { + // Receive and process the message + console.log('Receiving and processing message...'); + const env = await NATSBridge.smartreceive( + mockMsg, + { + max_retries: 3, + base_delay: 100, + max_delay: 1000 + } + ); + + console.log('\n=== Received Envelope ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate received data + console.log('=== Validation ==='); + let passed = true; + + if (!env.correlation_id) { + console.log('❌ correlation_id is missing'); + passed = false; + } else { + console.log('✅ correlation_id present'); + } + + if (env.payloads.length !== 4) { + console.log(`❌ Expected 4 payloads, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + // Expected data + const expectedData = [ + ['image', binaryData, 'image'], + ['audio', audioData, 'audio'], + ['video', videoData, 'video'], + ['binary', genericBinary, 'binary'] + ]; + + for (let i = 0; i < env.payloads.length; i++) { + const payload = env.payloads[i]; + const expected = expectedData[i]; + + if (payload[0] !== expected[0]) { + console.log(`❌ Payload ${i + 1}: Expected dataname '${expected[0]}', got '${payload[0]}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct dataname`); + } + + if (payload[2] !== expected[2]) { + console.log(`❌ Payload ${i + 1}: Expected type '${expected[2]}', got '${payload[2]}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct type`); + } + + // Verify binary data integrity + const receivedData = payload[1]; + if (!(receivedData instanceof Buffer || receivedData instanceof Uint8Array)) { + console.log(`❌ Payload ${i + 1}: Expected Buffer/Uint8Array, got ${typeof receivedData}`); + passed = false; + } else if (Buffer.isBuffer(receivedData)) { + if (receivedData.length !== expected[1].length) { + console.log(`❌ Payload ${i + 1}: Length mismatch`); + passed = false; + } else { + let dataMatch = true; + for (let j = 0; j < expected[1].length; j++) { + if (receivedData[j] !== expected[1][j]) { + dataMatch = false; + break; + } + } + if (dataMatch) { + console.log(`✅ Payload ${i + 1}: Data correctly deserialized`); + } else { + console.log(`❌ Payload ${i + 1}: Data mismatch`); + passed = false; + } + } + } else { + // Uint8Array comparison + const receivedBuffer = Buffer.from(receivedData); + if (receivedBuffer.length !== expected[1].length) { + console.log(`❌ Payload ${i + 1}: Length mismatch`); + passed = false; + } else { + let dataMatch = true; + for (let j = 0; j < expected[1].length; j++) { + if (receivedBuffer[j] !== expected[1][j]) { + dataMatch = false; + break; + } + } + if (dataMatch) { + console.log(`✅ Payload ${i + 1}: Data correctly deserialized`); + } else { + console.log(`❌ Payload ${i + 1}: Data mismatch`); + passed = false; + } + } + } + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_binary_sender.js b/test/test_js_binary_sender.js new file mode 100644 index 0000000..4562d53 --- /dev/null +++ b/test/test_js_binary_sender.js @@ -0,0 +1,173 @@ +/** + * JavaScript Binary Sender Test + * Tests the smartsend function with binary/image/audio/video payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_SUBJECT = '/test/binary'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Binary Sender Test ===\n'); + + const correlationId = NATSBridge.uuidv4(); + console.log(`Correlation ID: ${correlationId}`); + console.log(`Subject: ${TEST_SUBJECT}`); + console.log(`Broker URL: ${TEST_BROKER_URL}\n`); + + // Test data - binary data for different types + const binaryData = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); // PNG header + const audioData = Buffer.from([0x46, 0x4C, 0x41, 0x43, 0x00, 0x00, 0x00, 0x00]); // FLAC header + const videoData = Buffer.from([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]); // MP4 header + const genericBinary = Buffer.from([0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE]); + + const testData = [ + ['image', binaryData, 'image'], + ['audio', audioData, 'audio'], + ['video', videoData, 'video'], + ['binary', genericBinary, 'binary'] + ]; + + try { + // Send the message + console.log('Sending binary payloads...'); + const [env, envJsonStr] = await NATSBridge.smartsend( + TEST_SUBJECT, + testData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: correlationId, + msg_purpose: 'test', + sender_name: 'js-binary-test', + is_publish: false + } + ); + + console.log('\n=== Envelope Created ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Purpose: ${env.msg_purpose}`); + console.log(`Sender: ${env.sender_name}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate envelope structure + console.log('=== Validation ==='); + let passed = true; + + if (env.payloads.length !== 4) { + console.log(`❌ Expected 4 payloads, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + // Test each payload + const expectedDatanames = ['image', 'audio', 'video', 'binary']; + const expectedTypes = ['image', 'audio', 'video', 'binary']; + const expectedData = [binaryData, audioData, videoData, genericBinary]; + + for (let i = 0; i < env.payloads.length; i++) { + const payload = env.payloads[i]; + + if (payload.dataname !== expectedDatanames[i]) { + console.log(`❌ Payload ${i + 1}: Expected dataname '${expectedDatanames[i]}', got '${payload.dataname}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct dataname`); + } + + if (payload.payload_type !== expectedTypes[i]) { + console.log(`❌ Payload ${i + 1}: Expected type '${expectedTypes[i]}', got '${payload.payload_type}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct type`); + } + + if (payload.transport !== 'direct') { + console.log(`❌ Payload ${i + 1}: Expected transport 'direct', got '${payload.transport}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct transport`); + } + + if (payload.encoding !== 'base64') { + console.log(`❌ Payload ${i + 1}: Expected encoding 'base64', got '${payload.encoding}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct encoding`); + } + + // Decode and verify the data + const decodedData = Buffer.from(payload.data, 'base64'); + const originalData = expectedData[i]; + + if (decodedData.length !== originalData.length) { + console.log(`❌ Payload ${i + 1}: Length mismatch (${decodedData.length} vs ${originalData.length})`); + passed = false; + } else { + let dataMatch = true; + for (let j = 0; j < originalData.length; j++) { + if (decodedData[j] !== originalData[j]) { + dataMatch = false; + break; + } + } + if (dataMatch) { + console.log(`✅ Payload ${i + 1}: Data integrity verified`); + } else { + console.log(`❌ Payload ${i + 1}: Data integrity mismatch`); + passed = false; + } + } + + console.log(` Size: ${payload.size} bytes\n`); + } + + // Test with larger binary data (simulating file upload scenario) + console.log('=== Large Binary Data Test ==='); + const largeData = Buffer.alloc(10000, 0xFF); // 10KB of binary data + const largeTestData = [ + ['large_binary', largeData, 'binary'] + ]; + + const [largeEnv, _] = await NATSBridge.smartsend( + TEST_SUBJECT, + largeTestData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: 'large-' + correlationId, + is_publish: false + } + ); + + if (largeEnv.payloads.length === 1 && largeEnv.payloads[0].size === 10000) { + console.log('✅ Large binary data handled correctly'); + } else { + console.log('❌ Large binary data handling failed'); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_dictionary_receiver.js b/test/test_js_dictionary_receiver.js new file mode 100644 index 0000000..1011fdf --- /dev/null +++ b/test/test_js_dictionary_receiver.js @@ -0,0 +1,220 @@ +/** + * JavaScript Dictionary Receiver Test + * Tests the smartreceive function with dictionary payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Dictionary Receiver Test ===\n'); + + // Create a mock NATS message with dictionary payloads + const simpleDict = { key1: 'value1', key2: 'value2' }; + const nestedDict = { outer: { inner: 'value', number: 42 } }; + const arrayDict = { items: [1, 2, 3, 'four', 'five'] }; + const mixedDict = { string: 'text', number: 123, boolean: true, null_val: null }; + + const testData = { + correlation_id: 'test-receiver-dict-' + Date.now(), + msg_id: 'msg-' + Date.now(), + timestamp: new Date().toISOString(), + send_to: '/test/dictionary', + msg_purpose: 'test', + sender_name: 'js-dict-test', + sender_id: 'sender-' + Date.now(), + receiver_name: 'js-receiver', + receiver_id: 'receiver-' + Date.now(), + reply_to: '', + reply_to_msg_id: '', + broker_url: TEST_BROKER_URL, + metadata: {}, + payloads: [ + { + id: 'payload-1', + dataname: 'simple_dict', + payload_type: 'dictionary', + transport: 'direct', + encoding: 'base64', + size: Buffer.from(JSON.stringify(simpleDict)).length, + data: Buffer.from(JSON.stringify(simpleDict)).toString('base64'), + metadata: { payload_bytes: Buffer.from(JSON.stringify(simpleDict)).length } + }, + { + id: 'payload-2', + dataname: 'nested_dict', + payload_type: 'dictionary', + transport: 'direct', + encoding: 'base64', + size: Buffer.from(JSON.stringify(nestedDict)).length, + data: Buffer.from(JSON.stringify(nestedDict)).toString('base64'), + metadata: { payload_bytes: Buffer.from(JSON.stringify(nestedDict)).length } + }, + { + id: 'payload-3', + dataname: 'array_dict', + payload_type: 'dictionary', + transport: 'direct', + encoding: 'base64', + size: Buffer.from(JSON.stringify(arrayDict)).length, + data: Buffer.from(JSON.stringify(arrayDict)).toString('base64'), + metadata: { payload_bytes: Buffer.from(JSON.stringify(arrayDict)).length } + }, + { + id: 'payload-4', + dataname: 'mixed_dict', + payload_type: 'dictionary', + transport: 'direct', + encoding: 'base64', + size: Buffer.from(JSON.stringify(mixedDict)).length, + data: Buffer.from(JSON.stringify(mixedDict)).toString('base64'), + metadata: { payload_bytes: Buffer.from(JSON.stringify(mixedDict)).length } + } + ] + }; + + const mockMsg = { + payload: JSON.stringify(testData) + }; + + console.log('Mock Message Created:'); + console.log(` Correlation ID: ${testData.correlation_id}`); + console.log(` Payloads: ${testData.payloads.length}`); + console.log(` Payload types: ${testData.payloads.map(p => p.payload_type).join(', ')}\n`); + + try { + // Receive and process the message + console.log('Receiving and processing message...'); + const env = await NATSBridge.smartreceive( + mockMsg, + { + max_retries: 3, + base_delay: 100, + max_delay: 1000 + } + ); + + console.log('\n=== Received Envelope ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate received data + console.log('=== Validation ==='); + let passed = true; + + if (!env.correlation_id) { + console.log('❌ correlation_id is missing'); + passed = false; + } else { + console.log('✅ correlation_id present'); + } + + if (env.payloads.length !== 4) { + console.log(`❌ Expected 4 payloads, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + // Expected data + const expectedData = [ + ['simple_dict', simpleDict, 'dictionary'], + ['nested_dict', nestedDict, 'dictionary'], + ['array_dict', arrayDict, 'dictionary'], + ['mixed_dict', mixedDict, 'dictionary'] + ]; + + for (let i = 0; i < env.payloads.length; i++) { + const payload = env.payloads[i]; + const expected = expectedData[i]; + + if (payload[0] !== expected[0]) { + console.log(`❌ Payload ${i + 1}: Expected dataname '${expected[0]}', got '${payload[0]}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct dataname`); + } + + if (payload[2] !== expected[2]) { + console.log(`❌ Payload ${i + 1}: Expected type '${expected[2]}', got '${payload[2]}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct type`); + } + + const dataMatch = JSON.stringify(payload[1]) === JSON.stringify(expected[1]); + if (!dataMatch) { + console.log(`❌ Payload ${i + 1}: Data mismatch`); + console.log(` Expected: ${JSON.stringify(expected[1])}`); + console.log(` Got: ${JSON.stringify(payload[1])}`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Data correctly deserialized`); + } + } + + // Test round-trip with receive + console.log('\n=== Round-trip Test ==='); + const roundTripData = { + correlation_id: 'roundtrip-' + Date.now(), + msg_id: 'msg-' + Date.now(), + timestamp: new Date().toISOString(), + send_to: '/test/dictionary', + msg_purpose: 'test', + sender_name: 'js-test', + sender_id: 'sender-' + Date.now(), + receiver_name: 'js-receiver', + receiver_id: 'receiver-' + Date.now(), + reply_to: '', + reply_to_msg_id: '', + broker_url: TEST_BROKER_URL, + metadata: {}, + payloads: [ + { + id: 'payload-rt', + dataname: 'roundtrip', + payload_type: 'dictionary', + transport: 'direct', + encoding: 'base64', + size: Buffer.from(JSON.stringify({ test: 'data', nested: { a: 1, b: 2 } })).length, + data: Buffer.from(JSON.stringify({ test: 'data', nested: { a: 1, b: 2 } })).toString('base64'), + metadata: { payload_bytes: Buffer.from(JSON.stringify({ test: 'data', nested: { a: 1, b: 2 } })).length } + } + ] + }; + + const mockRtMsg = { payload: JSON.stringify(roundTripData) }; + const rtEnv = await NATSBridge.smartreceive(mockRtMsg); + + if (rtEnv.payloads.length === 1 && + rtEnv.payloads[0][0] === 'roundtrip' && + rtEnv.payloads[0][2] === 'dictionary') { + console.log('✅ Round-trip test successful'); + } else { + console.log('❌ Round-trip test failed'); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_dictionary_sender.js b/test/test_js_dictionary_sender.js new file mode 100644 index 0000000..d3acca3 --- /dev/null +++ b/test/test_js_dictionary_sender.js @@ -0,0 +1,178 @@ +/** + * JavaScript Dictionary Sender Test + * Tests the smartsend function with dictionary payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_SUBJECT = '/test/dictionary'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Dictionary Sender Test ===\n'); + + const correlationId = NATSBridge.uuidv4(); + console.log(`Correlation ID: ${correlationId}`); + console.log(`Subject: ${TEST_SUBJECT}`); + console.log(`Broker URL: ${TEST_BROKER_URL}\n`); + + // Test data - various dictionary structures + const testData = [ + ['simple_dict', { key1: 'value1', key2: 'value2' }, 'dictionary'], + ['nested_dict', { outer: { inner: 'value', number: 42 } }, 'dictionary'], + ['array_dict', { items: [1, 2, 3, 'four', 'five'] }, 'dictionary'], + ['mixed_dict', { string: 'text', number: 123, boolean: true, null_val: null }, 'dictionary'] + ]; + + try { + // Send the message + console.log('Sending dictionary payloads...'); + const [env, envJsonStr] = await NATSBridge.smartsend( + TEST_SUBJECT, + testData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: correlationId, + msg_purpose: 'test', + sender_name: 'js-dict-test', + is_publish: false + } + ); + + console.log('\n=== Envelope Created ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Purpose: ${env.msg_purpose}`); + console.log(`Sender: ${env.sender_name}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate envelope structure + console.log('=== Validation ==='); + let passed = true; + + if (env.payloads.length !== 4) { + console.log(`❌ Expected 4 payloads, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + // Test each payload + const expectedDatanames = ['simple_dict', 'nested_dict', 'array_dict', 'mixed_dict']; + const expectedTypes = ['dictionary', 'dictionary', 'dictionary', 'dictionary']; + + for (let i = 0; i < env.payloads.length; i++) { + const payload = env.payloads[i]; + + if (payload.dataname !== expectedDatanames[i]) { + console.log(`❌ Payload ${i + 1}: Expected dataname '${expectedDatanames[i]}', got '${payload.dataname}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct dataname`); + } + + if (payload.payload_type !== expectedTypes[i]) { + console.log(`❌ Payload ${i + 1}: Expected type '${expectedTypes[i]}', got '${payload.payload_type}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct type`); + } + + if (payload.transport !== 'direct') { + console.log(`❌ Payload ${i + 1}: Expected transport 'direct', got '${payload.transport}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct transport`); + } + + if (payload.encoding !== 'base64') { + console.log(`❌ Payload ${i + 1}: Expected encoding 'base64', got '${payload.encoding}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct encoding`); + } + + // Decode and verify the data + const decodedData = JSON.parse(Buffer.from(payload.data, 'base64').toString('utf8')); + const originalData = testData[i][1]; + + const originalJson = JSON.stringify(originalData); + const decodedJson = JSON.stringify(decodedData); + + if (originalJson !== decodedJson) { + console.log(`❌ Payload ${i + 1}: Data integrity mismatch`); + console.log(` Expected: ${originalJson}`); + console.log(` Got: ${decodedJson}`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Data integrity verified`); + } + + console.log(` Size: ${payload.size} bytes\n`); + } + + // Test round-trip serialization + console.log('=== Round-trip Serialization Test ==='); + const roundTripTestData = [ + ['roundtrip', { test: 'data', numbers: [1, 2, 3], nested: { a: 1, b: 2 } }, 'dictionary'] + ]; + + const [rtEnv, rtEnvJsonStr] = await NATSBridge.smartsend( + TEST_SUBJECT, + roundTripTestData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: 'roundtrip-' + correlationId, + is_publish: false + } + ); + + const rtPayload = rtEnv.payloads[0]; + const rtDecoded = JSON.parse(Buffer.from(rtPayload.data, 'base64').toString('utf8')); + + if (JSON.stringify(rtDecoded) === JSON.stringify(roundTripTestData[0][1])) { + console.log('✅ Round-trip serialization successful'); + } else { + console.log('❌ Round-trip serialization failed'); + passed = false; + } + + // Test JSON string output + console.log('\n=== JSON String Output Test ==='); + try { + const parsed = JSON.parse(envJsonStr); + if (parsed.correlation_id === env.correlation_id && + parsed.payloads.length === env.payloads.length) { + console.log('✅ JSON string is valid and matches envelope'); + } else { + console.log('❌ JSON string does not match envelope'); + passed = false; + } + } catch (e) { + console.log('❌ JSON string is invalid:', e.message); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_mix_payloads_sender.js b/test/test_js_mix_payloads_sender.js new file mode 100644 index 0000000..6a25b55 --- /dev/null +++ b/test/test_js_mix_payloads_sender.js @@ -0,0 +1,204 @@ +/** + * JavaScript Mix Payloads Sender Test + * Tests the smartsend function with mixed payload types + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_SUBJECT = '/test/mix'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Mix Payloads Sender Test ===\n'); + + const correlationId = NATSBridge.uuidv4(); + console.log(`Correlation ID: ${correlationId}`); + console.log(`Subject: ${TEST_SUBJECT}`); + console.log(`Broker URL: ${TEST_BROKER_URL}\n`); + + // Test data - mixed payload types + const textData = 'Hello, NATSBridge!'; + const dictData = { key1: 'value1', key2: 42, nested: { a: 1, b: 2 } }; + const binaryData = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); // PNG header + + // Table data + const tableData = [ + { id: 1, name: 'Alice', age: 30 }, + { id: 2, name: 'Bob', age: 25 }, + { id: 3, name: 'Charlie', age: 35 } + ]; + + const testData = [ + ['message', textData, 'text'], + ['config', dictData, 'dictionary'], + ['image', binaryData, 'image'], + ['users', tableData, 'table'] + ]; + + try { + // Send the message + console.log('Sending mixed payloads...'); + const [env, envJsonStr] = await NATSBridge.smartsend( + TEST_SUBJECT, + testData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: correlationId, + msg_purpose: 'test', + sender_name: 'js-mix-test', + is_publish: false + } + ); + + console.log('\n=== Envelope Created ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Purpose: ${env.msg_purpose}`); + console.log(`Sender: ${env.sender_name}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate envelope structure + console.log('=== Validation ==='); + let passed = true; + + if (env.payloads.length !== 4) { + console.log(`❌ Expected 4 payloads, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + // Test each payload + const expectedDatanames = ['message', 'config', 'image', 'users']; + const expectedTypes = ['text', 'dictionary', 'image', 'table']; + const expectedData = [textData, dictData, binaryData, tableData]; + + for (let i = 0; i < env.payloads.length; i++) { + const payload = env.payloads[i]; + + if (payload.dataname !== expectedDatanames[i]) { + console.log(`❌ Payload ${i + 1}: Expected dataname '${expectedDatanames[i]}', got '${payload.dataname}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct dataname`); + } + + if (payload.payload_type !== expectedTypes[i]) { + console.log(`❌ Payload ${i + 1}: Expected type '${expectedTypes[i]}', got '${payload.payload_type}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct type`); + } + + if (payload.transport !== 'direct') { + console.log(`❌ Payload ${i + 1}: Expected transport 'direct', got '${payload.transport}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct transport`); + } + + if (payload.encoding !== 'base64') { + console.log(`❌ Payload ${i + 1}: Expected encoding 'base64', got '${payload.encoding}'`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Correct encoding`); + } + + // Verify data integrity based on type + if (expectedTypes[i] === 'text') { + const decodedData = Buffer.from(payload.data, 'base64').toString('utf8'); + if (decodedData !== expectedData[i]) { + console.log(`❌ Payload ${i + 1}: Data integrity mismatch`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Data integrity verified`); + } + } else if (expectedTypes[i] === 'dictionary') { + const decodedData = JSON.parse(Buffer.from(payload.data, 'base64').toString('utf8')); + if (JSON.stringify(decodedData) !== JSON.stringify(expectedData[i])) { + console.log(`❌ Payload ${i + 1}: Data integrity mismatch`); + passed = false; + } else { + console.log(`✅ Payload ${i + 1}: Data integrity verified`); + } + } else if (expectedTypes[i] === 'image') { + const decodedData = Buffer.from(payload.data, 'base64'); + if (decodedData.length !== expectedData[i].length) { + console.log(`❌ Payload ${i + 1}: Length mismatch`); + passed = false; + } else { + let dataMatch = true; + for (let j = 0; j < expectedData[i].length; j++) { + if (decodedData[j] !== expectedData[i][j]) { + dataMatch = false; + break; + } + } + if (dataMatch) { + console.log(`✅ Payload ${i + 1}: Data integrity verified`); + } else { + console.log(`❌ Payload ${i + 1}: Data integrity mismatch`); + passed = false; + } + } + } else if (expectedTypes[i] === 'table') { + const decodedData = Buffer.from(payload.data, 'base64'); + if (decodedData.length > 0) { + console.log(`✅ Payload ${i + 1}: Arrow IPC data present (${decodedData.length} bytes)`); + } else { + console.log(`❌ Payload ${i + 1}: Arrow IPC data is empty`); + passed = false; + } + } + + console.log(` Size: ${payload.size} bytes\n`); + } + + // Test with chat-like payload (text + image + audio) + console.log('=== Chat-like Payload Test ==='); + const chatData = [ + ['text', 'Hello!', 'text'], + ['image', Buffer.from([0xFF, 0xD8, 0xFF, 0xE0]), 'image'], + ['audio', Buffer.from([0x46, 0x4C, 0x41, 0x43]), 'audio'] + ]; + + const [chatEnv, _] = await NATSBridge.smartsend( + TEST_SUBJECT, + chatData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: 'chat-' + correlationId, + is_publish: false + } + ); + + if (chatEnv.payloads.length === 3) { + console.log('✅ Chat-like payloads handled correctly'); + } else { + console.log('❌ Chat-like payloads handling failed'); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_table_receiver.js b/test/test_js_table_receiver.js new file mode 100644 index 0000000..d73eae1 --- /dev/null +++ b/test/test_js_table_receiver.js @@ -0,0 +1,172 @@ +/** + * JavaScript Table Receiver Test + * Tests the smartreceive function with table (Arrow IPC) payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Table Receiver Test ===\n'); + + // Create a mock NATS message with table payload + const tableData = [ + { id: 1, name: 'Alice', age: 30, active: true }, + { id: 2, name: 'Bob', age: 25, active: false }, + { id: 3, name: 'Charlie', age: 35, active: true } + ]; + + // Convert to Arrow IPC format + const arrow = require('apache-arrow'); + const fields = [ + new arrow.Field('id', arrow.Int64, true), + new arrow.Field('name', arrow.Utf8, true), + new arrow.Field('age', arrow.Int64, true), + new arrow.Field('active', arrow.Boolean, true) + ]; + const schema = new arrow.Schema(fields); + const batches = []; + for (const row of tableData) { + const batch = arrow.recordBatch.fromObjects([row], schema); + batches.push(batch); + } + const buffers = arrow.ipc.recordBatchesToMessage(batches, schema).buffers; + const combined = new Uint8Array(buffers.reduce((acc, b) => acc + b.byteLength, 0)); + let offset = 0; + for (const buf of buffers) { + combined.set(new Uint8Array(buf), offset); + offset += buf.byteLength; + } + const arrowBuffer = Buffer.from(combined); + + const testData = { + correlation_id: 'js-table-receiver-' + Date.now(), + msg_id: 'msg-' + Date.now(), + timestamp: new Date().toISOString(), + send_to: '/test/table', + msg_purpose: 'test', + sender_name: 'js-table-test', + sender_id: 'sender-' + Date.now(), + receiver_name: 'js-receiver', + receiver_id: 'receiver-' + Date.now(), + reply_to: '', + reply_to_msg_id: '', + broker_url: TEST_BROKER_URL, + metadata: {}, + payloads: [ + { + id: 'payload-1', + dataname: 'users_table', + payload_type: 'table', + transport: 'direct', + encoding: 'base64', + size: arrowBuffer.length, + data: arrowBuffer.toString('base64'), + metadata: { payload_bytes: arrowBuffer.length } + } + ] + }; + + const mockMsg = { + payload: JSON.stringify(testData) + }; + + console.log('Mock Message Created:'); + console.log(` Correlation ID: ${testData.correlation_id}`); + console.log(` Payloads: ${testData.payloads.length}`); + console.log(` Payload type: ${testData.payloads[0].payload_type}`); + console.log(` Transport: ${testData.payloads[0].transport}\n`); + + try { + // Receive and process the message + console.log('Receiving and processing message...'); + const env = await NATSBridge.smartreceive( + mockMsg, + { + max_retries: 3, + base_delay: 100, + max_delay: 1000 + } + ); + + console.log('\n=== Received Envelope ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate received data + console.log('=== Validation ==='); + let passed = true; + + if (!env.correlation_id) { + console.log('❌ correlation_id is missing'); + passed = false; + } else { + console.log('✅ correlation_id present'); + } + + if (env.payloads.length !== 1) { + console.log(`❌ Expected 1 payload, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + const payload = env.payloads[0]; + if (payload[0] !== 'users_table') { + console.log(`❌ Expected dataname 'users_table', got '${payload[0]}'`); + passed = false; + } else { + console.log('✅ Correct dataname'); + } + + if (payload[2] !== 'table') { + console.log(`❌ Expected type 'table', got '${payload[2]}'`); + passed = false; + } else { + console.log('✅ Correct type'); + } + + // Verify table data is a Buffer (Arrow IPC format) + if (payload[1] instanceof Buffer || payload[1] instanceof Uint8Array) { + console.log('✅ Table data is Arrow IPC buffer'); + console.log(` Buffer size: ${payload[1].length} bytes`); + } else { + console.log(`❌ Expected Buffer/Uint8Array, got ${typeof payload[1]}`); + passed = false; + } + + // Test round-trip with Arrow deserialization + console.log('\n=== Arrow Deserialization Test ==='); + try { + const table = arrow.tableFromRawBytes(payload[1]); + console.log(`✅ Arrow table deserialized successfully`); + console.log(` Schema: ${table.schema.fields.map(f => f.name).join(', ')}`); + console.log(` Num rows: ${table.numRows}`); + } catch (e) { + console.log('❌ Arrow deserialization failed:', e.message); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_table_sender.js b/test/test_js_table_sender.js new file mode 100644 index 0000000..7f8fa21 --- /dev/null +++ b/test/test_js_table_sender.js @@ -0,0 +1,179 @@ +/** + * JavaScript Table Sender Test + * Tests the smartsend function with table (Arrow IPC) payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_SUBJECT = '/test/table'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Table Sender Test ===\n'); + + const correlationId = NATSBridge.uuidv4(); + console.log(`Correlation ID: ${correlationId}`); + console.log(`Subject: ${TEST_SUBJECT}`); + console.log(`Broker URL: ${TEST_BROKER_URL}\n`); + + // Test data - table data as array of objects + const tableData = [ + { id: 1, name: 'Alice', age: 30, active: true }, + { id: 2, name: 'Bob', age: 25, active: false }, + { id: 3, name: 'Charlie', age: 35, active: true }, + { id: 4, name: 'Diana', age: 28, active: true }, + { id: 5, name: 'Eve', age: 32, active: false } + ]; + + const testData = [ + ['users_table', tableData, 'table'] + ]; + + try { + // Send the message + console.log('Sending table payload...'); + const [env, envJsonStr] = await NATSBridge.smartsend( + TEST_SUBJECT, + testData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: correlationId, + msg_purpose: 'test', + sender_name: 'js-table-test', + is_publish: false + } + ); + + console.log('\n=== Envelope Created ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Purpose: ${env.msg_purpose}`); + console.log(`Sender: ${env.sender_name}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate envelope structure + console.log('=== Validation ==='); + let passed = true; + + if (env.payloads.length !== 1) { + console.log(`❌ Expected 1 payload, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + const payload = env.payloads[0]; + if (payload.dataname !== 'users_table') { + console.log(`❌ Expected dataname 'users_table', got '${payload.dataname}'`); + passed = false; + } else { + console.log('✅ Correct dataname'); + } + + if (payload.payload_type !== 'table') { + console.log(`❌ Expected payload_type 'table', got '${payload.payload_type}'`); + passed = false; + } else { + console.log('✅ Correct payload_type'); + } + + if (payload.transport !== 'direct') { + console.log(`❌ Expected transport 'direct', got '${payload.transport}'`); + passed = false; + } else { + console.log('✅ Correct transport'); + } + + if (payload.encoding !== 'base64') { + console.log(`❌ Expected encoding 'base64', got '${payload.encoding}'`); + passed = false; + } else { + console.log('✅ Correct encoding'); + } + + // Verify Arrow IPC data can be decoded + console.log('\n=== Arrow IPC Verification ==='); + const decodedData = Buffer.from(payload.data, 'base64'); + console.log(`Arrow IPC buffer size: ${decodedData.length} bytes`); + + if (decodedData.length > 0) { + console.log('✅ Arrow IPC data present'); + } else { + console.log('❌ Arrow IPC data is empty'); + passed = false; + } + + // Test with larger table + console.log('\n=== Larger Table Test ==='); + const largeTableData = []; + for (let i = 1; i <= 100; i++) { + largeTableData.push({ + id: i, + name: `User${i}`, + age: Math.floor(Math.random() * 100), + active: Math.random() > 0.5, + score: Math.random() * 100 + }); + } + + const largeTestData = [ + ['large_table', largeTableData, 'table'] + ]; + + const [largeEnv, _] = await NATSBridge.smartsend( + TEST_SUBJECT, + largeTestData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: 'large-' + correlationId, + is_publish: false + } + ); + + if (largeEnv.payloads.length === 1) { + console.log('✅ Large table handled correctly'); + console.log(` Size: ${largeEnv.payloads[0].size} bytes`); + } else { + console.log('❌ Large table handling failed'); + passed = false; + } + + // Test JSON string output + console.log('\n=== JSON String Output Test ==='); + try { + const parsed = JSON.parse(envJsonStr); + if (parsed.correlation_id === env.correlation_id && + parsed.payloads.length === env.payloads.length) { + console.log('✅ JSON string is valid and matches envelope'); + } else { + console.log('❌ JSON string does not match envelope'); + passed = false; + } + } catch (e) { + console.log('❌ JSON string is invalid:', e.message); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_text_receiver.js b/test/test_js_text_receiver.js new file mode 100644 index 0000000..479ece5 --- /dev/null +++ b/test/test_js_text_receiver.js @@ -0,0 +1,206 @@ +/** + * JavaScript Text Receiver Test + * Tests the smartreceive function with text payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Text Receiver Test ===\n'); + + // Create a mock NATS message with text payload + const testData = { + correlation_id: 'test-receiver-' + Date.now(), + msg_id: 'msg-' + Date.now(), + timestamp: new Date().toISOString(), + send_to: '/test/text', + msg_purpose: 'test', + sender_name: 'js-text-test', + sender_id: 'sender-' + Date.now(), + receiver_name: 'js-receiver', + receiver_id: 'receiver-' + Date.now(), + reply_to: '', + reply_to_msg_id: '', + broker_url: TEST_BROKER_URL, + metadata: {}, + payloads: [ + { + id: 'payload-' + Date.now(), + dataname: 'message', + payload_type: 'text', + transport: 'direct', + encoding: 'base64', + size: 38, + data: Buffer.from('Hello, NATSBridge! This is a test message.').toString('base64'), + metadata: { payload_bytes: 38 } + } + ] + }; + + const mockMsg = { + payload: JSON.stringify(testData) + }; + + console.log('Mock Message Created:'); + console.log(` Correlation ID: ${testData.correlation_id}`); + console.log(` Payloads: ${testData.payloads.length}`); + console.log(` Payload dataname: ${testData.payloads[0].dataname}`); + console.log(` Payload type: ${testData.payloads[0].payload_type}`); + console.log(` Transport: ${testData.payloads[0].transport}\n`); + + try { + // Receive and process the message + console.log('Receiving and processing message...'); + const env = await NATSBridge.smartreceive( + mockMsg, + { + max_retries: 3, + base_delay: 100, + max_delay: 1000 + } + ); + + console.log('\n=== Received Envelope ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate received data + console.log('=== Validation ==='); + let passed = true; + + if (!env.correlation_id) { + console.log('❌ correlation_id is missing'); + passed = false; + } else { + console.log('✅ correlation_id present'); + } + + if (env.payloads.length !== 1) { + console.log(`❌ Expected 1 payload, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + const payload = env.payloads[0]; + if (payload[0] !== 'message') { + console.log(`❌ Expected dataname 'message', got '${payload[0]}'`); + passed = false; + } else { + console.log('✅ Correct dataname'); + } + + if (payload[2] !== 'text') { + console.log(`❌ Expected type 'text', got '${payload[2]}'`); + passed = false; + } else { + console.log('✅ Correct type'); + } + + if (payload[1] !== 'Hello, NATSBridge! This is a test message.') { + console.log(`❌ Data mismatch`); + console.log(` Expected: Hello, NATSBridge! This is a test message.`); + console.log(` Got: ${payload[1]}`); + passed = false; + } else { + console.log('✅ Data correctly deserialized'); + } + + // Test with multiple text payloads + console.log('\n=== Multiple Text Payloads Test ==='); + const multiTestData = { + correlation_id: 'multi-receiver-' + Date.now(), + msg_id: 'msg-' + Date.now(), + timestamp: new Date().toISOString(), + send_to: '/test/text', + msg_purpose: 'test', + sender_name: 'js-text-test', + sender_id: 'sender-' + Date.now(), + receiver_name: 'js-receiver', + receiver_id: 'receiver-' + Date.now(), + reply_to: '', + reply_to_msg_id: '', + broker_url: TEST_BROKER_URL, + metadata: {}, + payloads: [ + { + id: 'payload-1', + dataname: 'msg1', + payload_type: 'text', + transport: 'direct', + encoding: 'base64', + size: 16, + data: Buffer.from('First message').toString('base64'), + metadata: { payload_bytes: 16 } + }, + { + id: 'payload-2', + dataname: 'msg2', + payload_type: 'text', + transport: 'direct', + encoding: 'base64', + size: 16, + data: Buffer.from('Second message').toString('base64'), + metadata: { payload_bytes: 16 } + }, + { + id: 'payload-3', + dataname: 'msg3', + payload_type: 'text', + transport: 'direct', + encoding: 'base64', + size: 16, + data: Buffer.from('Third message').toString('base64'), + metadata: { payload_bytes: 16 } + } + ] + }; + + const mockMultiMsg = { + payload: JSON.stringify(multiTestData) + }; + + const multiEnv = await NATSBridge.smartreceive(mockMultiMsg); + + if (multiEnv.payloads.length === 3) { + console.log('✅ Multiple payloads handled correctly'); + + // Verify each payload + const expectedMessages = ['First message', 'Second message', 'Third message']; + for (let i = 0; i < 3; i++) { + if (multiEnv.payloads[i][1] === expectedMessages[i]) { + console.log(`✅ Payload ${i + 1} correctly deserialized`); + } else { + console.log(`❌ Payload ${i + 1} mismatch`); + passed = false; + } + } + } else { + console.log(`❌ Expected 3 payloads, got ${multiEnv.payloads.length}`); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_text_sender.js b/test/test_js_text_sender.js new file mode 100644 index 0000000..dda7b0c --- /dev/null +++ b/test/test_js_text_sender.js @@ -0,0 +1,169 @@ +/** + * JavaScript Text Sender Test + * Tests the smartsend function with text payloads + */ + +const NATSBridge = require('../src/natbridge.js'); + +const TEST_SUBJECT = '/test/text'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Text Sender Test ===\n'); + + const correlationId = NATSBridge.uuidv4(); + console.log(`Correlation ID: ${correlationId}`); + console.log(`Subject: ${TEST_SUBJECT}`); + console.log(`Broker URL: ${TEST_BROKER_URL}\n`); + + // Test data + const textData = 'Hello, NATSBridge! This is a test message.'; + const testData = [ + ['message', textData, 'text'] + ]; + + try { + // Send the message + console.log('Sending text payload...'); + const [env, envJsonStr] = await NATSBridge.smartsend( + TEST_SUBJECT, + testData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: correlationId, + msg_purpose: 'test', + sender_name: 'js-text-test', + is_publish: false // Don't actually publish for this test + } + ); + + console.log('\n=== Envelope Created ==='); + console.log(`Correlation ID: ${env.correlation_id}`); + console.log(`Message ID: ${env.msg_id}`); + console.log(`Timestamp: ${env.timestamp}`); + console.log(`Subject: ${env.send_to}`); + console.log(`Purpose: ${env.msg_purpose}`); + console.log(`Sender: ${env.sender_name}`); + console.log(`Payloads: ${env.payloads.length}\n`); + + // Validate envelope structure + console.log('=== Validation ==='); + let passed = true; + + if (!env.correlation_id) { + console.log('❌ correlation_id is missing'); + passed = false; + } else { + console.log('✅ correlation_id present'); + } + + if (!env.msg_id) { + console.log('❌ msg_id is missing'); + passed = false; + } else { + console.log('✅ msg_id present'); + } + + if (!env.timestamp) { + console.log('❌ timestamp is missing'); + passed = false; + } else { + console.log('✅ timestamp present'); + } + + if (env.payloads.length !== 1) { + console.log(`❌ Expected 1 payload, got ${env.payloads.length}`); + passed = false; + } else { + console.log('✅ Correct number of payloads'); + } + + const payload = env.payloads[0]; + if (payload.dataname !== 'message') { + console.log(`❌ Expected dataname 'message', got '${payload.dataname}'`); + passed = false; + } else { + console.log('✅ Correct dataname'); + } + + if (payload.payload_type !== 'text') { + console.log(`❌ Expected payload_type 'text', got '${payload.payload_type}'`); + passed = false; + } else { + console.log('✅ Correct payload_type'); + } + + if (payload.transport !== 'direct') { + console.log(`❌ Expected transport 'direct', got '${payload.transport}'`); + passed = false; + } else { + console.log('✅ Correct transport'); + } + + if (payload.encoding !== 'base64') { + console.log(`❌ Expected encoding 'base64', got '${payload.encoding}'`); + passed = false; + } else { + console.log('✅ Correct encoding'); + } + + // Decode and verify the data + const decodedData = Buffer.from(payload.data, 'base64').toString('utf8'); + if (decodedData !== textData) { + console.log(`❌ Decoded data mismatch`); + console.log(` Expected: ${textData}`); + console.log(` Got: ${decodedData}`); + passed = false; + } else { + console.log('✅ Data integrity verified'); + } + + console.log(`\nPayload size: ${payload.size} bytes`); + console.log(`Base64 data length: ${payload.data.length} chars`); + + // Test with multiple text payloads + console.log('\n=== Multiple Text Payloads Test ==='); + const multiTestData = [ + ['msg1', 'First message', 'text'], + ['msg2', 'Second message', 'text'], + ['msg3', 'Third message', 'text'] + ]; + + const [multiEnv, multiEnvJsonStr] = await NATSBridge.smartsend( + TEST_SUBJECT, + multiTestData, + { + broker_url: TEST_BROKER_URL, + fileserver_url: TEST_FILESERVER_URL, + correlation_id: 'multi-test-' + correlationId, + is_publish: false + } + ); + + if (multiEnv.payloads.length === 3) { + console.log('✅ Multiple payloads handled correctly'); + } else { + console.log(`❌ Expected 3 payloads, got ${multiEnv.payloads.length}`); + passed = false; + } + + // Final result + console.log('\n=== Test Result ==='); + if (passed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_mpy_binary_receiver.py b/test/test_mpy_binary_receiver.py new file mode 100644 index 0000000..09bf589 --- /dev/null +++ b/test/test_mpy_binary_receiver.py @@ -0,0 +1,185 @@ +""" +MicroPython Binary Receiver Test +Tests the smartreceive function with binary/image/audio/video payloads + +Note: This test is designed for both MicroPython and desktop Python +for compatibility testing. +""" + +import sys +import os +import json +import base64 + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +def run_test(): + print('=== MicroPython Binary Receiver Test ===\n') + + from natbridge_mpy import _generate_uuid + + # Create mock NATS message with binary payloads + image_data = bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) # PNG header + audio_data = bytes([0x46, 0x4C, 0x41, 0x43, 0x00, 0x00, 0x00, 0x00]) # FLAC header + video_data = bytes([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]) # MP4 header + generic_binary = bytes([0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE]) + + test_data = { + 'correlation_id': 'mpy-binary-receiver-' + _generate_uuid(), + 'msg_id': _generate_uuid(), + 'timestamp': '2024-01-15T10:30:00Z', + 'send_to': '/test/binary', + 'msg_purpose': 'test', + 'sender_name': 'mpy-binary-test', + 'sender_id': _generate_uuid(), + 'receiver_name': 'mpy-receiver', + 'receiver_id': _generate_uuid(), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': _generate_uuid(), + 'dataname': 'image', + 'payload_type': 'image', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(image_data), + 'data': base64.b64encode(image_data).decode('ascii'), + 'metadata': {'payload_bytes': len(image_data)} + }, + { + 'id': _generate_uuid(), + 'dataname': 'audio', + 'payload_type': 'audio', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(audio_data), + 'data': base64.b64encode(audio_data).decode('ascii'), + 'metadata': {'payload_bytes': len(audio_data)} + }, + { + 'id': _generate_uuid(), + 'dataname': 'video', + 'payload_type': 'video', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(video_data), + 'data': base64.b64encode(video_data).decode('ascii'), + 'metadata': {'payload_bytes': len(video_data)} + }, + { + 'id': _generate_uuid(), + 'dataname': 'binary', + 'payload_type': 'binary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(generic_binary), + 'data': base64.b64encode(generic_binary).decode('ascii'), + 'metadata': {'payload_bytes': len(generic_binary)} + } + ] + } + + mock_msg = { + 'payload': json.dumps(test_data) + } + + print('Mock Message Created:') + print(f' Correlation ID: {test_data["correlation_id"]}') + print(f' Payloads: {len(test_data["payloads"])}') + print(f' Payload types: {", ".join(p["payload_type"] for p in test_data["payloads"])}\n') + + try: + # Receive and process the message + print('Receiving and processing message...') + env = smartreceive( + mock_msg, + max_retries=3, + base_delay=100, + max_delay=1000 + ) + + print('\n=== Received Envelope ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate received data + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if len(env['payloads']) != 4: + print(f'❌ Expected 4 payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Expected data + expected_data = [ + ('image', image_data, 'image'), + ('audio', audio_data, 'audio'), + ('video', video_data, 'video'), + ('binary', generic_binary, 'binary') + ] + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + expected = expected_data[i] + + if payload[0] != expected[0]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected[0]}', got '{payload[0]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload[2] != expected[2]: + print(f"❌ Payload {i + 1}: Expected type '{expected[2]}', got '{payload[2]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + # Verify binary data integrity + received_data = payload[1] + if received_data != expected[1]: + print(f'❌ Payload {i + 1}: Data mismatch') + print(f' Expected: {expected[1]}') + print(f' Got: {received_data}') + passed = False + else: + print(f'✅ Payload {i + 1}: Data correctly deserialized') + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + run_test() \ No newline at end of file diff --git a/test/test_mpy_binary_sender.py b/test/test_mpy_binary_sender.py new file mode 100644 index 0000000..45a6e00 --- /dev/null +++ b/test/test_mpy_binary_sender.py @@ -0,0 +1,163 @@ +""" +MicroPython Binary Sender Test +Tests the smartsend function with binary/image/audio/video payloads + +Note: This test is designed for both MicroPython and desktop Python +for compatibility testing. +""" + +import sys +import os +import base64 + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE + +TEST_SUBJECT = '/test/binary' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +def run_test(): + print('=== MicroPython Binary Sender Test ===\n') + + from natbridge_mpy import _generate_uuid + correlation_id = 'mpy-binary-test-' + _generate_uuid() + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}') + print(f'Default Size Threshold: {DEFAULT_SIZE_THRESHOLD} bytes') + print(f'Max Payload Size: {MAX_PAYLOAD_SIZE} bytes\n') + + # Test data - binary data for different types + image_data = bytearray([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) # PNG header + audio_data = bytearray([0x46, 0x4C, 0x41, 0x43, 0x00, 0x00, 0x00, 0x00]) # FLAC header + video_data = bytearray([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]) # MP4 header + generic_binary = bytearray([0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE]) + + test_data = [ + ('image', bytes(image_data), 'image'), + ('audio', bytes(audio_data), 'audio'), + ('video', bytes(video_data), 'video'), + ('binary', bytes(generic_binary), 'binary') + ] + + try: + # Send the message + print('Sending binary payloads...') + env, env_json_str = smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='mpy-binary-test', + is_publish=False + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + if len(env['payloads']) != 4: + print(f'❌ Expected 4 payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Test each payload + expected_datanames = ['image', 'audio', 'video', 'binary'] + expected_types = ['image', 'audio', 'video', 'binary'] + expected_data = [bytes(image_data), bytes(audio_data), bytes(video_data), bytes(generic_binary)] + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + + if payload['dataname'] != expected_datanames[i]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected_datanames[i]}', got '{payload['dataname']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload['payload_type'] != expected_types[i]: + print(f"❌ Payload {i + 1}: Expected type '{expected_types[i]}', got '{payload['payload_type']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + if payload['transport'] != 'direct': + print(f"❌ Payload {i + 1}: Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Payload {i + 1}: Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct encoding') + + # Decode and verify the data + decoded_data = base64.b64decode(payload['data']) + original_data = expected_data[i] + + if decoded_data != original_data: + print(f'❌ Payload {i + 1}: Data integrity mismatch') + passed = False + else: + print(f'✅ Payload {i + 1}: Data integrity verified') + + print(f' Size: {payload["size"]} bytes\n') + + # Test with larger binary data + print('=== Large Binary Data Test ===') + large_data = bytes([0xFF] * 1000) # 1KB of binary data + large_test_data = [ + ('large_binary', large_data, 'binary') + ] + + large_env, _ = smartsend( + TEST_SUBJECT, + large_test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='large-' + correlation_id, + is_publish=False + ) + + if len(large_env['payloads']) == 1 and large_env['payloads'][0]['size'] == 1000: + print('✅ Large binary data handled correctly') + else: + print('❌ Large binary data handling failed') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + run_test() \ No newline at end of file diff --git a/test/test_mpy_dictionary_receiver.py b/test/test_mpy_dictionary_receiver.py new file mode 100644 index 0000000..5f431a0 --- /dev/null +++ b/test/test_mpy_dictionary_receiver.py @@ -0,0 +1,224 @@ +""" +MicroPython Dictionary Receiver Test +Tests the smartreceive function with dictionary payloads + +Note: This test is designed for both MicroPython and desktop Python +for compatibility testing. +""" + +import sys +import os +import json + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +def run_test(): + print('=== MicroPython Dictionary Receiver Test ===\n') + + from natbridge_mpy import _generate_uuid + + # Create a mock NATS message with dictionary payloads + import base64 + + simple_dict = {'key1': 'value1', 'key2': 'value2'} + nested_dict = {'outer': {'inner': 'value', 'number': 42}} + array_dict = {'items': [1, 2, 3, 'four', 'five']} + mixed_dict = {'string': 'text', 'number': 123, 'boolean': True, 'null_val': None} + + test_data = { + 'correlation_id': 'mpy-receiver-dict-' + _generate_uuid(), + 'msg_id': _generate_uuid(), + 'timestamp': '2024-01-15T10:30:00Z', + 'send_to': '/test/dictionary', + 'msg_purpose': 'test', + 'sender_name': 'mpy-dict-test', + 'sender_id': _generate_uuid(), + 'receiver_name': 'mpy-receiver', + 'receiver_id': _generate_uuid(), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': _generate_uuid(), + 'dataname': 'simple_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(simple_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(simple_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(simple_dict).encode('utf8'))} + }, + { + 'id': _generate_uuid(), + 'dataname': 'nested_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(nested_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(nested_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(nested_dict).encode('utf8'))} + }, + { + 'id': _generate_uuid(), + 'dataname': 'array_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(array_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(array_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(array_dict).encode('utf8'))} + }, + { + 'id': _generate_uuid(), + 'dataname': 'mixed_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(mixed_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(mixed_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(mixed_dict).encode('utf8'))} + } + ] + } + + mock_msg = { + 'payload': json.dumps(test_data) + } + + print('Mock Message Created:') + print(f' Correlation ID: {test_data["correlation_id"]}') + print(f' Payloads: {len(test_data["payloads"])}') + print(f' Payload types: {", ".join(p["payload_type"] for p in test_data["payloads"])}\n') + + try: + # Receive and process the message + print('Receiving and processing message...') + env = smartreceive( + mock_msg, + max_retries=3, + base_delay=100, + max_delay=1000 + ) + + print('\n=== Received Envelope ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate received data + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if len(env['payloads']) != 4: + print(f'❌ Expected 4 payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Expected data + expected_data = [ + ('simple_dict', simple_dict, 'dictionary'), + ('nested_dict', nested_dict, 'dictionary'), + ('array_dict', array_dict, 'dictionary'), + ('mixed_dict', mixed_dict, 'dictionary') + ] + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + expected = expected_data[i] + + if payload[0] != expected[0]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected[0]}', got '{payload[0]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload[2] != expected[2]: + print(f"❌ Payload {i + 1}: Expected type '{expected[2]}', got '{payload[2]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + data_match = json.dumps(payload[1], sort_keys=True) == json.dumps(expected[1], sort_keys=True) + if not data_match: + print(f'❌ Payload {i + 1}: Data mismatch') + print(f' Expected: {json.dumps(expected[1], sort_keys=True)}') + print(f' Got: {json.dumps(payload[1], sort_keys=True)}') + passed = False + else: + print(f'✅ Payload {i + 1}: Data correctly deserialized') + + # Test round-trip with receive + print('\n=== Round-trip Test ===') + round_trip_data = { + 'correlation_id': 'roundtrip-' + _generate_uuid(), + 'msg_id': _generate_uuid(), + 'timestamp': '2024-01-15T10:30:00Z', + 'send_to': '/test/dictionary', + 'msg_purpose': 'test', + 'sender_name': 'mpy-test', + 'sender_id': _generate_uuid(), + 'receiver_name': 'mpy-receiver', + 'receiver_id': _generate_uuid(), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': _generate_uuid(), + 'dataname': 'roundtrip', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps({'test': 'data', 'nested': {'a': 1, 'b': 2}}).encode('utf8')), + 'data': base64.b64encode(json.dumps({'test': 'data', 'nested': {'a': 1, 'b': 2}}).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps({'test': 'data', 'nested': {'a': 1, 'b': 2}}).encode('utf8'))} + } + ] + } + + mock_rt_msg = {'payload': json.dumps(round_trip_data)} + rt_env = smartreceive(mock_rt_msg) + + if rt_env['payloads'][0][0] == 'roundtrip' and rt_env['payloads'][0][2] == 'dictionary': + print('✅ Round-trip test successful') + else: + print('❌ Round-trip test failed') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + run_test() \ No newline at end of file diff --git a/test/test_mpy_dictionary_sender.py b/test/test_mpy_dictionary_sender.py new file mode 100644 index 0000000..33aa92a --- /dev/null +++ b/test/test_mpy_dictionary_sender.py @@ -0,0 +1,177 @@ +""" +MicroPython Dictionary Sender Test +Tests the smartsend function with dictionary payloads + +Note: This test is designed for both MicroPython and desktop Python +for compatibility testing. +""" + +import sys +import os +import json + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE + +TEST_SUBJECT = '/test/dictionary' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +def run_test(): + print('=== MicroPython Dictionary Sender Test ===\n') + + from natbridge_mpy import _generate_uuid + correlation_id = 'mpy-dict-test-' + _generate_uuid() + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}') + print(f'Default Size Threshold: {DEFAULT_SIZE_THRESHOLD} bytes') + print(f'Max Payload Size: {MAX_PAYLOAD_SIZE} bytes\n') + + # Test data - various dictionary structures + test_data = [ + ('simple_dict', {'key1': 'value1', 'key2': 'value2'}, 'dictionary'), + ('nested_dict', {'outer': {'inner': 'value', 'number': 42}}, 'dictionary'), + ('array_dict', {'items': [1, 2, 3, 'four', 'five']}, 'dictionary'), + ('mixed_dict', {'string': 'text', 'number': 123, 'boolean': True, 'null_val': None}, 'dictionary') + ] + + try: + # Send the message + print('Sending dictionary payloads...') + env, env_json_str = smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='mpy-dict-test', + is_publish=False + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + if len(env['payloads']) != 4: + print(f'❌ Expected 4 payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Test each payload + expected_datanames = ['simple_dict', 'nested_dict', 'array_dict', 'mixed_dict'] + expected_types = ['dictionary', 'dictionary', 'dictionary', 'dictionary'] + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + + if payload['dataname'] != expected_datanames[i]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected_datanames[i]}', got '{payload['dataname']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload['payload_type'] != expected_types[i]: + print(f"❌ Payload {i + 1}: Expected type '{expected_types[i]}', got '{payload['payload_type']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + if payload['transport'] != 'direct': + print(f"❌ Payload {i + 1}: Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Payload {i + 1}: Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct encoding') + + # Decode and verify the data + import base64 + decoded_data = json.loads(base64.b64decode(payload['data']).decode('ascii')) + original_data = test_data[i][1] + + # Normalize for comparison + if json.dumps(decoded_data, sort_keys=True) != json.dumps(original_data, sort_keys=True): + print(f'❌ Payload {i + 1}: Data integrity mismatch') + print(f' Expected: {json.dumps(original_data)}') + print(f' Got: {json.dumps(decoded_data)}') + passed = False + else: + print(f'✅ Payload {i + 1}: Data integrity verified') + + print(f' Size: {payload["size"]} bytes\n') + + # Test round-trip serialization + print('=== Round-trip Serialization Test ===') + round_trip_data = [ + ('roundtrip', {'test': 'data', 'numbers': [1, 2, 3], 'nested': {'a': 1, 'b': 2}}, 'dictionary') + ] + + rt_env, _ = smartsend( + TEST_SUBJECT, + round_trip_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='roundtrip-' + correlation_id, + is_publish=False + ) + + rt_payload = rt_env['payloads'][0] + rt_decoded = json.loads(base64.b64decode(rt_payload['data']).decode('ascii')) + + if json.dumps(rt_decoded, sort_keys=True) == json.dumps(round_trip_data[0][1], sort_keys=True): + print('✅ Round-trip serialization successful') + else: + print('❌ Round-trip serialization failed') + passed = False + + # Test JSON string output + print('\n=== JSON String Output Test ===') + try: + parsed = json.loads(env_json_str) + if parsed['correlation_id'] == env['correlation_id'] and \ + len(parsed['payloads']) == len(env['payloads']): + print('✅ JSON string is valid and matches envelope') + else: + print('❌ JSON string does not match envelope') + passed = False + except json.JSONDecodeError as e: + print(f'❌ JSON string is invalid: {e}') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + run_test() \ No newline at end of file diff --git a/test/test_mpy_text_receiver.py b/test/test_mpy_text_receiver.py new file mode 100644 index 0000000..c224d05 --- /dev/null +++ b/test/test_mpy_text_receiver.py @@ -0,0 +1,209 @@ +""" +MicroPython Text Receiver Test +Tests the smartreceive function with text payloads + +Note: This test is designed for both MicroPython and desktop Python +for compatibility testing. +""" + +import sys +import os +import json + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +def run_test(): + print('=== MicroPython Text Receiver Test ===\n') + + from natbridge_mpy import _generate_uuid + + # Create a mock NATS message with text payload + test_text = 'Hello, NATSBridge! This is a test message.' + import base64 + + test_data = { + 'correlation_id': 'mpy-receiver-test-' + _generate_uuid(), + 'msg_id': _generate_uuid(), + 'timestamp': '2024-01-15T10:30:00Z', + 'send_to': '/test/text', + 'msg_purpose': 'test', + 'sender_name': 'mpy-text-test', + 'sender_id': _generate_uuid(), + 'receiver_name': 'mpy-receiver', + 'receiver_id': _generate_uuid(), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': _generate_uuid(), + 'dataname': 'message', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(test_text.encode('utf8')), + 'data': base64.b64encode(test_text.encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(test_text.encode('utf8'))} + } + ] + } + + mock_msg = { + 'payload': json.dumps(test_data) + } + + print('Mock Message Created:') + print(f' Correlation ID: {test_data["correlation_id"]}') + print(f' Payloads: {len(test_data["payloads"])}') + print(f' Payload dataname: {test_data["payloads"][0]["dataname"]}') + print(f' Payload type: {test_data["payloads"][0]["payload_type"]}') + print(f' Transport: {test_data["payloads"][0]["transport"]}\n') + + try: + # Receive and process the message + print('Receiving and processing message...') + env = smartreceive( + mock_msg, + max_retries=3, + base_delay=100, + max_delay=1000 + ) + + print('\n=== Received Envelope ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate received data + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if len(env['payloads']) != 1: + print(f'❌ Expected 1 payload, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + payload = env['payloads'][0] + if payload[0] != 'message': + print(f"❌ Expected dataname 'message', got '{payload[0]}'") + passed = False + else: + print('✅ Correct dataname') + + if payload[2] != 'text': + print(f"❌ Expected type 'text', got '{payload[2]}'") + passed = False + else: + print('✅ Correct type') + + if payload[1] != test_text: + print('❌ Data mismatch') + print(f' Expected: {test_text}') + print(f' Got: {payload[1]}') + passed = False + else: + print('✅ Data correctly deserialized') + + # Test with multiple text payloads + print('\n=== Multiple Text Payloads Test ===') + multi_test_data = { + 'correlation_id': 'multi-receiver-' + _generate_uuid(), + 'msg_id': _generate_uuid(), + 'timestamp': '2024-01-15T10:30:00Z', + 'send_to': '/test/text', + 'msg_purpose': 'test', + 'sender_name': 'mpy-text-test', + 'sender_id': _generate_uuid(), + 'receiver_name': 'mpy-receiver', + 'receiver_id': _generate_uuid(), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': _generate_uuid(), + 'dataname': 'msg1', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': 16, + 'data': base64.b64encode(b'First message').decode('ascii'), + 'metadata': {'payload_bytes': 16} + }, + { + 'id': _generate_uuid(), + 'dataname': 'msg2', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': 16, + 'data': base64.b64encode(b'Second message').decode('ascii'), + 'metadata': {'payload_bytes': 16} + }, + { + 'id': _generate_uuid(), + 'dataname': 'msg3', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': 16, + 'data': base64.b64encode(b'Third message').decode('ascii'), + 'metadata': {'payload_bytes': 16} + } + ] + } + + mock_multi_msg = {'payload': json.dumps(multi_test_data)} + multi_env = smartreceive(mock_multi_msg) + + if len(multi_env['payloads']) == 3: + print('✅ Multiple payloads handled correctly') + + # Verify each payload + expected_messages = ['First message', 'Second message', 'Third message'] + for i in range(3): + if multi_env['payloads'][i][1] == expected_messages[i]: + print(f'✅ Payload {i + 1} correctly deserialized') + else: + print(f'❌ Payload {i + 1} mismatch') + passed = False + else: + print(f'❌ Expected 3 payloads, got {len(multi_env["payloads"])}') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + run_test() \ No newline at end of file diff --git a/test/test_mpy_text_sender.py b/test/test_mpy_text_sender.py new file mode 100644 index 0000000..f52fd4f --- /dev/null +++ b/test/test_mpy_text_sender.py @@ -0,0 +1,205 @@ +""" +MicroPython Text Sender Test +Tests the smartsend function with text payloads + +Note: This test is designed for both MicroPython and desktop Python +for compatibility testing. +""" + +import sys +import os + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE + +TEST_SUBJECT = '/test/text' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +def run_test(): + print('=== MicroPython Text Sender Test ===\n') + + from natbridge_mpy import _generate_uuid + correlation_id = 'mpy-text-test-' + _generate_uuid() + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}') + print(f'Default Size Threshold: {DEFAULT_SIZE_THRESHOLD} bytes') + print(f'Max Payload Size: {MAX_PAYLOAD_SIZE} bytes\n') + + # Test data + text_data = 'Hello, NATSBridge! This is a test message.' + test_data = [ + ('message', text_data, 'text') + ] + + try: + # Send the message + print('Sending text payload...') + env, env_json_str = smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='mpy-text-test', + is_publish=False # Don't actually publish for this test + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if not env.get('msg_id'): + print('❌ msg_id is missing') + passed = False + else: + print('✅ msg_id present') + + if not env.get('timestamp'): + print('❌ timestamp is missing') + passed = False + else: + print('✅ timestamp present') + + if len(env['payloads']) != 1: + print(f'❌ Expected 1 payload, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + payload = env['payloads'][0] + if payload['dataname'] != 'message': + print(f"❌ Expected dataname 'message', got '{payload['dataname']}'") + passed = False + else: + print('✅ Correct dataname') + + if payload['payload_type'] != 'text': + print(f"❌ Expected payload_type 'text', got '{payload['payload_type']}'") + passed = False + else: + print('✅ Correct payload_type') + + if payload['transport'] != 'direct': + print(f"❌ Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print('✅ Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print('✅ Correct encoding') + + # Decode and verify the data + import base64 + decoded_data = base64.b64decode(payload['data']).decode('ascii') + if decoded_data != text_data: + print('❌ Decoded data mismatch') + print(f' Expected: {text_data}') + print(f' Got: {decoded_data}') + passed = False + else: + print('✅ Data integrity verified') + + print(f'\nPayload size: {payload["size"]} bytes') + print(f'Base64 data length: {len(payload["data"])} chars') + + # Test with multiple text payloads + print('\n=== Multiple Text Payloads Test ===') + multi_test_data = [ + ('msg1', 'First message', 'text'), + ('msg2', 'Second message', 'text'), + ('msg3', 'Third message', 'text') + ] + + multi_env, _ = smartsend( + TEST_SUBJECT, + multi_test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='multi-test-' + correlation_id, + is_publish=False + ) + + if len(multi_env['payloads']) == 3: + print('✅ Multiple payloads handled correctly') + else: + print(f'❌ Expected 3 payloads, got {len(multi_env["payloads"])}') + passed = False + + # Test size threshold enforcement + print('\n=== Size Threshold Test ===') + small_text = 'small' + large_text = 'x' * (DEFAULT_SIZE_THRESHOLD - 100) # Just under threshold + + small_env, _ = smartsend( + TEST_SUBJECT, + [('small', small_text, 'text')], + broker_url=TEST_BROKER_URL, + is_publish=False + ) + + if small_env['payloads'][0]['transport'] == 'direct': + print('✅ Small payload uses direct transport') + else: + print('❌ Small payload should use direct transport') + passed = False + + # Test that large text (> MAX_PAYLOAD_SIZE) raises error + print('\n=== Max Payload Size Test ===') + try: + too_large_text = 'x' * (MAX_PAYLOAD_SIZE + 1000) + large_env, _ = smartsend( + TEST_SUBJECT, + [('large', too_large_text, 'text')], + broker_url=TEST_BROKER_URL, + is_publish=False + ) + print('❌ Should have raised MemoryError for payload exceeding MAX_PAYLOAD_SIZE') + passed = False + except MemoryError as e: + print(f'✅ Correctly raised MemoryError: {e}') + except Exception as e: + print(f'❌ Unexpected error: {type(e).__name__}: {e}') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + run_test() \ No newline at end of file diff --git a/test/test_py_binary_receiver.py b/test/test_py_binary_receiver.py new file mode 100644 index 0000000..d1410b0 --- /dev/null +++ b/test/test_py_binary_receiver.py @@ -0,0 +1,184 @@ +""" +Python Binary Receiver Test +Tests the smartreceive function with binary/image/audio/video/table payloads +""" + +import asyncio +import sys +import os +import json +import base64 + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Binary Receiver Test ===\n') + + # Create mock NATS message with binary payloads + image_data = bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) # PNG header + audio_data = bytes([0x46, 0x4C, 0x41, 0x43, 0x00, 0x00, 0x00, 0x00]) # FLAC header + video_data = bytes([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]) # MP4 header + generic_binary = bytes([0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE]) + + test_data = { + 'correlation_id': 'py-binary-receiver-' + str(asyncio.get_event_loop().time() * 1000000), + 'msg_id': 'msg-' + str(asyncio.get_event_loop().time() * 1000000), + 'timestamp': asyncio.get_event_loop().time().isoformat(), + 'send_to': '/test/binary', + 'msg_purpose': 'test', + 'sender_name': 'py-binary-test', + 'sender_id': 'sender-' + str(asyncio.get_event_loop().time() * 1000000), + 'receiver_name': 'py-receiver', + 'receiver_id': 'receiver-' + str(asyncio.get_event_loop().time() * 1000000), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': 'payload-1', + 'dataname': 'image', + 'payload_type': 'image', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(image_data), + 'data': base64.b64encode(image_data).decode('ascii'), + 'metadata': {'payload_bytes': len(image_data)} + }, + { + 'id': 'payload-2', + 'dataname': 'audio', + 'payload_type': 'audio', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(audio_data), + 'data': base64.b64encode(audio_data).decode('ascii'), + 'metadata': {'payload_bytes': len(audio_data)} + }, + { + 'id': 'payload-3', + 'dataname': 'video', + 'payload_type': 'video', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(video_data), + 'data': base64.b64encode(video_data).decode('ascii'), + 'metadata': {'payload_bytes': len(video_data)} + }, + { + 'id': 'payload-4', + 'dataname': 'binary', + 'payload_type': 'binary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(generic_binary), + 'data': base64.b64encode(generic_binary).decode('ascii'), + 'metadata': {'payload_bytes': len(generic_binary)} + } + ] + } + + mock_msg = { + 'payload': json.dumps(test_data) + } + + print('Mock Message Created:') + print(f' Correlation ID: {test_data["correlation_id"]}') + print(f' Payloads: {len(test_data["payloads"])}') + print(f' Payload types: {", ".join(p["payload_type"] for p in test_data["payloads"])}\n') + + try: + # Receive and process the message + print('Receiving and processing message...') + env = await smartreceive( + mock_msg, + max_retries=3, + base_delay=100, + max_delay=1000 + ) + + print('\n=== Received Envelope ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate received data + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if len(env['payloads']) != 4: + print(f'❌ Expected 4 payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Expected data + expected_data = [ + ('image', image_data, 'image'), + ('audio', audio_data, 'audio'), + ('video', video_data, 'video'), + ('binary', generic_binary, 'binary') + ] + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + expected = expected_data[i] + + if payload[0] != expected[0]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected[0]}', got '{payload[0]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload[2] != expected[2]: + print(f"❌ Payload {i + 1}: Expected type '{expected[2]}', got '{payload[2]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + # Verify binary data integrity + received_data = payload[1] + if not isinstance(received_data, (bytes, bytearray)): + print(f'❌ Payload {i + 1}: Expected bytes/bytearray, got {type(received_data)}') + passed = False + elif received_data != expected[1]: + print(f'❌ Payload {i + 1}: Data mismatch') + print(f' Expected: {expected[1]}') + print(f' Got: {received_data}') + passed = False + else: + print(f'✅ Payload {i + 1}: Data correctly deserialized') + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file diff --git a/test/test_py_binary_sender.py b/test/test_py_binary_sender.py new file mode 100644 index 0000000..2de616d --- /dev/null +++ b/test/test_py_binary_sender.py @@ -0,0 +1,183 @@ +""" +Python Binary Sender Test +Tests the smartsend function with binary/image/audio/video/table payloads +""" + +import asyncio +import sys +import os +import base64 + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_SUBJECT = '/test/binary' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Binary Sender Test ===\n') + + correlation_id = 'py-binary-test-' + str(asyncio.get_event_loop().time() * 1000000) + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}\n') + + # Test data - binary data for different types + image_data = bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) # PNG header + audio_data = bytes([0x46, 0x4C, 0x41, 0x43, 0x00, 0x00, 0x00, 0x00]) # FLAC header + video_data = bytes([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]) # MP4 header + generic_binary = bytes([0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE]) + + # Test table data + try: + import pandas as pd + table_data = pd.DataFrame({ + 'id': [1, 2, 3, 4, 5], + 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], + 'value': [10.5, 20.3, 30.1, 40.9, 50.7] + }) + table_available = True + except ImportError: + table_available = False + table_data = None + + test_data = [ + ('image', image_data, 'image'), + ('audio', audio_data, 'audio'), + ('video', video_data, 'video'), + ('binary', generic_binary, 'binary') + ] + + if table_available: + test_data.append(('table', table_data, 'table')) + + try: + # Send the message + print('Sending binary payloads...') + env, env_json_str = await smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='py-binary-test', + is_publish=False + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + expected_count = 5 if table_available else 4 + if len(env['payloads']) != expected_count: + print(f'❌ Expected {expected_count} payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Test each payload + expected_datanames = ['image', 'audio', 'video', 'binary'] + expected_types = ['image', 'audio', 'video', 'binary'] + expected_data = [image_data, audio_data, video_data, generic_binary] + + if table_available: + expected_datanames.append('table') + expected_types.append('table') + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + + if payload['dataname'] != expected_datanames[i]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected_datanames[i]}', got '{payload['dataname']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload['payload_type'] != expected_types[i]: + print(f"❌ Payload {i + 1}: Expected type '{expected_types[i]}', got '{payload['payload_type']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + if payload['transport'] != 'direct': + print(f"❌ Payload {i + 1}: Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Payload {i + 1}: Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct encoding') + + # Decode and verify the data + decoded_data = base64.b64decode(payload['data']) + + if i < len(expected_data): + original_data = expected_data[i] + if decoded_data != original_data: + print(f'❌ Payload {i + 1}: Data integrity mismatch') + passed = False + else: + print(f'✅ Payload {i + 1}: Data integrity verified') + else: + # Table payload - just verify it's present + print(f'✅ Payload {i + 1}: Table data present (size: {payload["size"]} bytes)') + + print(f' Size: {payload["size"]} bytes\n') + + # Test with larger binary data + print('=== Large Binary Data Test ===') + large_data = bytes([0xFF] * 10000) # 10KB of binary data + large_test_data = [ + ('large_binary', large_data, 'binary') + ] + + large_env, _ = await smartsend( + TEST_SUBJECT, + large_test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='large-' + correlation_id, + is_publish=False + ) + + if len(large_env['payloads']) == 1 and large_env['payloads'][0]['size'] == 10000: + print('✅ Large binary data handled correctly') + else: + print('❌ Large binary data handling failed') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file diff --git a/test/test_py_dictionary_receiver.py b/test/test_py_dictionary_receiver.py new file mode 100644 index 0000000..f6afb16 --- /dev/null +++ b/test/test_py_dictionary_receiver.py @@ -0,0 +1,220 @@ +""" +Python Dictionary Receiver Test +Tests the smartreceive function with dictionary payloads +""" + +import asyncio +import sys +import os +import json + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Dictionary Receiver Test ===\n') + + # Create a mock NATS message with dictionary payloads + import base64 + + simple_dict = {'key1': 'value1', 'key2': 'value2'} + nested_dict = {'outer': {'inner': 'value', 'number': 42}} + array_dict = {'items': [1, 2, 3, 'four', 'five']} + mixed_dict = {'string': 'text', 'number': 123, 'boolean': True, 'null_val': None} + + test_data = { + 'correlation_id': 'py-receiver-dict-' + str(asyncio.get_event_loop().time() * 1000000), + 'msg_id': 'msg-' + str(asyncio.get_event_loop().time() * 1000000), + 'timestamp': asyncio.get_event_loop().time().isoformat(), + 'send_to': '/test/dictionary', + 'msg_purpose': 'test', + 'sender_name': 'py-dict-test', + 'sender_id': 'sender-' + str(asyncio.get_event_loop().time() * 1000000), + 'receiver_name': 'py-receiver', + 'receiver_id': 'receiver-' + str(asyncio.get_event_loop().time() * 1000000), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': 'payload-1', + 'dataname': 'simple_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(simple_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(simple_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(simple_dict).encode('utf8'))} + }, + { + 'id': 'payload-2', + 'dataname': 'nested_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(nested_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(nested_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(nested_dict).encode('utf8'))} + }, + { + 'id': 'payload-3', + 'dataname': 'array_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(array_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(array_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(array_dict).encode('utf8'))} + }, + { + 'id': 'payload-4', + 'dataname': 'mixed_dict', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps(mixed_dict).encode('utf8')), + 'data': base64.b64encode(json.dumps(mixed_dict).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps(mixed_dict).encode('utf8'))} + } + ] + } + + mock_msg = { + 'payload': json.dumps(test_data) + } + + print('Mock Message Created:') + print(f' Correlation ID: {test_data["correlation_id"]}') + print(f' Payloads: {len(test_data["payloads"])}') + print(f' Payload types: {", ".join(p["payload_type"] for p in test_data["payloads"])}\n') + + try: + # Receive and process the message + print('Receiving and processing message...') + env = await smartreceive( + mock_msg, + max_retries=3, + base_delay=100, + max_delay=1000 + ) + + print('\n=== Received Envelope ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate received data + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if len(env['payloads']) != 4: + print(f'❌ Expected 4 payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Expected data + expected_data = [ + ('simple_dict', simple_dict, 'dictionary'), + ('nested_dict', nested_dict, 'dictionary'), + ('array_dict', array_dict, 'dictionary'), + ('mixed_dict', mixed_dict, 'dictionary') + ] + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + expected = expected_data[i] + + if payload[0] != expected[0]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected[0]}', got '{payload[0]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload[2] != expected[2]: + print(f"❌ Payload {i + 1}: Expected type '{expected[2]}', got '{payload[2]}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + data_match = json.dumps(payload[1], sort_keys=True) == json.dumps(expected[1], sort_keys=True) + if not data_match: + print(f'❌ Payload {i + 1}: Data mismatch') + print(f' Expected: {json.dumps(expected[1], sort_keys=True)}') + print(f' Got: {json.dumps(payload[1], sort_keys=True)}') + passed = False + else: + print(f'✅ Payload {i + 1}: Data correctly deserialized') + + # Test round-trip with receive + print('\n=== Round-trip Test ===') + round_trip_data = { + 'correlation_id': 'roundtrip-' + str(asyncio.get_event_loop().time() * 1000000), + 'msg_id': 'msg-' + str(asyncio.get_event_loop().time() * 1000000), + 'timestamp': asyncio.get_event_loop().time().isoformat(), + 'send_to': '/test/dictionary', + 'msg_purpose': 'test', + 'sender_name': 'py-test', + 'sender_id': 'sender-' + str(asyncio.get_event_loop().time() * 1000000), + 'receiver_name': 'py-receiver', + 'receiver_id': 'receiver-' + str(asyncio.get_event_loop().time() * 1000000), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': 'payload-rt', + 'dataname': 'roundtrip', + 'payload_type': 'dictionary', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(json.dumps({'test': 'data', 'nested': {'a': 1, 'b': 2}}).encode('utf8')), + 'data': base64.b64encode(json.dumps({'test': 'data', 'nested': {'a': 1, 'b': 2}}).encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(json.dumps({'test': 'data', 'nested': {'a': 1, 'b': 2}}).encode('utf8'))} + } + ] + } + + mock_rt_msg = {'payload': json.dumps(round_trip_data)} + rt_env = await smartreceive(mock_rt_msg) + + if rt_env['payloads'][0][0] == 'roundtrip' and rt_env['payloads'][0][2] == 'dictionary': + print('✅ Round-trip test successful') + else: + print('❌ Round-trip test failed') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file diff --git a/test/test_py_dictionary_sender.py b/test/test_py_dictionary_sender.py new file mode 100644 index 0000000..908c2e7 --- /dev/null +++ b/test/test_py_dictionary_sender.py @@ -0,0 +1,172 @@ +""" +Python Dictionary Sender Test +Tests the smartsend function with dictionary payloads +""" + +import asyncio +import sys +import os +import json + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_SUBJECT = '/test/dictionary' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Dictionary Sender Test ===\n') + + correlation_id = 'py-dict-test-' + str(asyncio.get_event_loop().time() * 1000000) + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}\n') + + # Test data - various dictionary structures + test_data = [ + ('simple_dict', {'key1': 'value1', 'key2': 'value2'}, 'dictionary'), + ('nested_dict', {'outer': {'inner': 'value', 'number': 42}}, 'dictionary'), + ('array_dict', {'items': [1, 2, 3, 'four', 'five']}, 'dictionary'), + ('mixed_dict', {'string': 'text', 'number': 123, 'boolean': True, 'null_val': None}, 'dictionary') + ] + + try: + # Send the message + print('Sending dictionary payloads...') + env, env_json_str = await smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='py-dict-test', + is_publish=False + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + if len(env['payloads']) != 4: + print(f'❌ Expected 4 payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Test each payload + expected_datanames = ['simple_dict', 'nested_dict', 'array_dict', 'mixed_dict'] + expected_types = ['dictionary', 'dictionary', 'dictionary', 'dictionary'] + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + + if payload['dataname'] != expected_datanames[i]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected_datanames[i]}', got '{payload['dataname']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload['payload_type'] != expected_types[i]: + print(f"❌ Payload {i + 1}: Expected type '{expected_types[i]}', got '{payload['payload_type']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + if payload['transport'] != 'direct': + print(f"❌ Payload {i + 1}: Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Payload {i + 1}: Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct encoding') + + # Decode and verify the data + import base64 + decoded_data = json.loads(base64.b64decode(payload['data']).decode('utf8')) + original_data = test_data[i][1] + + # Normalize for comparison (None vs null, True vs true, etc.) + if json.dumps(decoded_data, sort_keys=True) != json.dumps(original_data, sort_keys=True): + print(f'❌ Payload {i + 1}: Data integrity mismatch') + print(f' Expected: {json.dumps(original_data)}') + print(f' Got: {json.dumps(decoded_data)}') + passed = False + else: + print(f'✅ Payload {i + 1}: Data integrity verified') + + print(f' Size: {payload["size"]} bytes\n') + + # Test round-trip serialization + print('=== Round-trip Serialization Test ===') + round_trip_data = [ + ('roundtrip', {'test': 'data', 'numbers': [1, 2, 3], 'nested': {'a': 1, 'b': 2}}, 'dictionary') + ] + + rt_env, _ = await smartsend( + TEST_SUBJECT, + round_trip_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='roundtrip-' + correlation_id, + is_publish=False + ) + + rt_payload = rt_env['payloads'][0] + rt_decoded = json.loads(base64.b64decode(rt_payload['data']).decode('utf8')) + + if json.dumps(rt_decoded, sort_keys=True) == json.dumps(round_trip_data[0][1], sort_keys=True): + print('✅ Round-trip serialization successful') + else: + print('❌ Round-trip serialization failed') + passed = False + + # Test JSON string output + print('\n=== JSON String Output Test ===') + try: + parsed = json.loads(env_json_str) + if parsed['correlation_id'] == env['correlation_id'] and \ + len(parsed['payloads']) == len(env['payloads']): + print('✅ JSON string is valid and matches envelope') + else: + print('❌ JSON string does not match envelope') + passed = False + except json.JSONDecodeError as e: + print(f'❌ JSON string is invalid: {e}') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file diff --git a/test/test_py_mix_payloads_sender.py b/test/test_py_mix_payloads_sender.py new file mode 100644 index 0000000..3a95e0c --- /dev/null +++ b/test/test_py_mix_payloads_sender.py @@ -0,0 +1,199 @@ +""" +Python Mix Payloads Sender Test +Tests the smartsend function with mixed payload types +""" + +import asyncio +import sys +import os +import base64 + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_SUBJECT = '/test/mix' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Mix Payloads Sender Test ===\n') + + correlation_id = 'py-mix-test-' + str(asyncio.get_event_loop().time() * 1000000) + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}\n') + + # Test data - mixed payload types + text_data = 'Hello, NATSBridge!' + dict_data = {'key1': 'value1', 'key2': 42, 'nested': {'a': 1, 'b': 2}} + image_data = bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) # PNG header + + # Table data + try: + import pandas as pd + table_data = pd.DataFrame({ + 'id': [1, 2, 3], + 'name': ['Alice', 'Bob', 'Charlie'], + 'age': [30, 25, 35] + }) + table_available = True + except ImportError: + table_available = False + table_data = None + + test_data = [ + ('message', text_data, 'text'), + ('config', dict_data, 'dictionary'), + ('image', image_data, 'image') + ] + + if table_available: + test_data.append(('users', table_data, 'table')) + + try: + # Send the message + print('Sending mixed payloads...') + env, env_json_str = await smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='py-mix-test', + is_publish=False + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + expected_count = 4 if table_available else 3 + if len(env['payloads']) != expected_count: + print(f'❌ Expected {expected_count} payloads, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + # Test each payload + expected_datanames = ['message', 'config', 'image'] + expected_types = ['text', 'dictionary', 'image'] + expected_data = [text_data, dict_data, image_data] + + if table_available: + expected_datanames.append('users') + expected_types.append('table') + + for i in range(len(env['payloads'])): + payload = env['payloads'][i] + + if payload['dataname'] != expected_datanames[i]: + print(f"❌ Payload {i + 1}: Expected dataname '{expected_datanames[i]}', got '{payload['dataname']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct dataname') + + if payload['payload_type'] != expected_types[i]: + print(f"❌ Payload {i + 1}: Expected type '{expected_types[i]}', got '{payload['payload_type']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct type') + + if payload['transport'] != 'direct': + print(f"❌ Payload {i + 1}: Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Payload {i + 1}: Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print(f'✅ Payload {i + 1}: Correct encoding') + + # Verify data integrity based on type + decoded_data = base64.b64decode(payload['data']) + + if expected_types[i] == 'text': + decoded_text = decoded_data.decode('utf8') + if decoded_text != expected_data[i]: + print(f'❌ Payload {i + 1}: Data integrity mismatch') + passed = False + else: + print(f'✅ Payload {i + 1}: Data integrity verified') + elif expected_types[i] == 'dictionary': + import json + decoded_dict = json.loads(decoded_data.decode('utf8')) + if json.dumps(decoded_dict, sort_keys=True) != json.dumps(expected_data[i], sort_keys=True): + print(f'❌ Payload {i + 1}: Data integrity mismatch') + passed = False + else: + print(f'✅ Payload {i + 1}: Data integrity verified') + elif expected_types[i] == 'image': + if decoded_data != expected_data[i]: + print(f'❌ Payload {i + 1}: Data integrity mismatch') + passed = False + else: + print(f'✅ Payload {i + 1}: Data integrity verified') + elif expected_types[i] == 'table': + if len(decoded_data) > 0: + print(f'✅ Payload {i + 1}: Arrow IPC data present ({len(decoded_data)} bytes)') + else: + print(f'❌ Payload {i + 1}: Arrow IPC data is empty') + passed = False + + print(f' Size: {payload["size"]} bytes\n') + + # Test with chat-like payload (text + image + audio) + print('=== Chat-like Payload Test ===') + chat_data = [ + ('text', 'Hello!', 'text'), + ('image', bytes([0xFF, 0xD8, 0xFF, 0xE0]), 'image'), + ('audio', bytes([0x46, 0x4C, 0x41, 0x43]), 'audio') + ] + + chat_env, _ = await smartsend( + TEST_SUBJECT, + chat_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='chat-' + correlation_id, + is_publish=False + ) + + if len(chat_env['payloads']) == 3: + print('✅ Chat-like payloads handled correctly') + else: + print('❌ Chat-like payloads handling failed') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file diff --git a/test/test_py_table_sender.py b/test/test_py_table_sender.py new file mode 100644 index 0000000..1c04eb0 --- /dev/null +++ b/test/test_py_table_sender.py @@ -0,0 +1,167 @@ +""" +Python Table Sender Test +Tests the smartsend function with table (Arrow IPC) payloads +""" + +import asyncio +import sys +import os + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_SUBJECT = '/test/table' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Table Sender Test ===\n') + + correlation_id = 'py-table-test-' + str(asyncio.get_event_loop().time() * 1000000) + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}\n') + + # Test data - pandas DataFrame + try: + import pandas as pd + table_data = pd.DataFrame({ + 'id': [1, 2, 3, 4, 5], + 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], + 'age': [30, 25, 35, 28, 32], + 'active': [True, False, True, True, False] + }) + table_available = True + except ImportError: + print('❌ pandas not available - skipping table tests') + sys.exit(0) + + test_data = [ + ('users_table', table_data, 'table') + ] + + try: + # Send the message + print('Sending table payload...') + env, env_json_str = await smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='py-table-test', + is_publish=False + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + if len(env['payloads']) != 1: + print(f'❌ Expected 1 payload, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + payload = env['payloads'][0] + if payload['dataname'] != 'users_table': + print(f"❌ Expected dataname 'users_table', got '{payload['dataname']}'") + passed = False + else: + print('✅ Correct dataname') + + if payload['payload_type'] != 'table': + print(f"❌ Expected payload_type 'table', got '{payload['payload_type']}'") + passed = False + else: + print('✅ Correct payload_type') + + if payload['transport'] != 'direct': + print(f"❌ Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print('✅ Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print('✅ Correct encoding') + + print(f'\nPayload size: {payload["size"]} bytes') + + # Test with larger table + print('\n=== Larger Table Test ===') + large_table_data = pd.DataFrame({ + 'id': range(100), + 'name': [f'User{i}' for i in range(100)], + 'age': [20 + (i % 50) for i in range(100)], + 'active': [i % 2 == 0 for i in range(100)] + }) + + large_test_data = [ + ('large_table', large_table_data, 'table') + ] + + large_env, _ = await smartsend( + TEST_SUBJECT, + large_test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='large-' + correlation_id, + is_publish=False + ) + + if len(large_env['payloads']) == 1: + print('✅ Large table handled correctly') + print(f' Size: {large_env["payloads"][0]["size"]} bytes') + else: + print('❌ Large table handling failed') + passed = False + + # Test JSON string output + print('\n=== JSON String Output Test ===') + import json + try: + parsed = json.loads(env_json_str) + if parsed['correlation_id'] == env['correlation_id'] and \ + len(parsed['payloads']) == len(env['payloads']): + print('✅ JSON string is valid and matches envelope') + else: + print('❌ JSON string does not match envelope') + passed = False + except json.JSONDecodeError as e: + print(f'❌ JSON string is invalid: {e}') + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file diff --git a/test/test_py_text_receiver.py b/test/test_py_text_receiver.py new file mode 100644 index 0000000..6758d8b --- /dev/null +++ b/test/test_py_text_receiver.py @@ -0,0 +1,205 @@ +""" +Python Text Receiver Test +Tests the smartreceive function with text payloads +""" + +import asyncio +import sys +import os +import json + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Text Receiver Test ===\n') + + # Create a mock NATS message with text payload + test_text = 'Hello, NATSBridge! This is a test message.' + import base64 + + test_data = { + 'correlation_id': 'py-receiver-test-' + str(asyncio.get_event_loop().time() * 1000000), + 'msg_id': 'msg-' + str(asyncio.get_event_loop().time() * 1000000), + 'timestamp': asyncio.get_event_loop().time().isoformat(), + 'send_to': '/test/text', + 'msg_purpose': 'test', + 'sender_name': 'py-text-test', + 'sender_id': 'sender-' + str(asyncio.get_event_loop().time() * 1000000), + 'receiver_name': 'py-receiver', + 'receiver_id': 'receiver-' + str(asyncio.get_event_loop().time() * 1000000), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': 'payload-' + str(asyncio.get_event_loop().time() * 1000000), + 'dataname': 'message', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': len(test_text.encode('utf8')), + 'data': base64.b64encode(test_text.encode('utf8')).decode('ascii'), + 'metadata': {'payload_bytes': len(test_text.encode('utf8'))} + } + ] + } + + mock_msg = { + 'payload': json.dumps(test_data) + } + + print('Mock Message Created:') + print(f' Correlation ID: {test_data["correlation_id"]}') + print(f' Payloads: {len(test_data["payloads"])}') + print(f' Payload dataname: {test_data["payloads"][0]["dataname"]}') + print(f' Payload type: {test_data["payloads"][0]["payload_type"]}') + print(f' Transport: {test_data["payloads"][0]["transport"]}\n') + + try: + # Receive and process the message + print('Receiving and processing message...') + env = await smartreceive( + mock_msg, + max_retries=3, + base_delay=100, + max_delay=1000 + ) + + print('\n=== Received Envelope ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate received data + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if len(env['payloads']) != 1: + print(f'❌ Expected 1 payload, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + payload = env['payloads'][0] + if payload[0] != 'message': + print(f"❌ Expected dataname 'message', got '{payload[0]}'") + passed = False + else: + print('✅ Correct dataname') + + if payload[2] != 'text': + print(f"❌ Expected type 'text', got '{payload[2]}'") + passed = False + else: + print('✅ Correct type') + + if payload[1] != test_text: + print('❌ Data mismatch') + print(f' Expected: {test_text}') + print(f' Got: {payload[1]}') + passed = False + else: + print('✅ Data correctly deserialized') + + # Test with multiple text payloads + print('\n=== Multiple Text Payloads Test ===') + multi_test_data = { + 'correlation_id': 'multi-receiver-' + str(asyncio.get_event_loop().time() * 1000000), + 'msg_id': 'msg-' + str(asyncio.get_event_loop().time() * 1000000), + 'timestamp': asyncio.get_event_loop().time().isoformat(), + 'send_to': '/test/text', + 'msg_purpose': 'test', + 'sender_name': 'py-text-test', + 'sender_id': 'sender-' + str(asyncio.get_event_loop().time() * 1000000), + 'receiver_name': 'py-receiver', + 'receiver_id': 'receiver-' + str(asyncio.get_event_loop().time() * 1000000), + 'reply_to': '', + 'reply_to_msg_id': '', + 'broker_url': TEST_BROKER_URL, + 'metadata': {}, + 'payloads': [ + { + 'id': 'payload-1', + 'dataname': 'msg1', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': 16, + 'data': base64.b64encode(b'First message').decode('ascii'), + 'metadata': {'payload_bytes': 16} + }, + { + 'id': 'payload-2', + 'dataname': 'msg2', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': 16, + 'data': base64.b64encode(b'Second message').decode('ascii'), + 'metadata': {'payload_bytes': 16} + }, + { + 'id': 'payload-3', + 'dataname': 'msg3', + 'payload_type': 'text', + 'transport': 'direct', + 'encoding': 'base64', + 'size': 16, + 'data': base64.b64encode(b'Third message').decode('ascii'), + 'metadata': {'payload_bytes': 16} + } + ] + } + + mock_multi_msg = {'payload': json.dumps(multi_test_data)} + multi_env = await smartreceive(mock_multi_msg) + + if len(multi_env['payloads']) == 3: + print('✅ Multiple payloads handled correctly') + + # Verify each payload + expected_messages = ['First message', 'Second message', 'Third message'] + for i in range(3): + if multi_env['payloads'][i][1] == expected_messages[i]: + print(f'✅ Payload {i + 1} correctly deserialized') + else: + print(f'❌ Payload {i + 1} mismatch') + passed = False + else: + print(f"❌ Expected 3 payloads, got {len(multi_env['payloads'])}") + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file diff --git a/test/test_py_text_sender.py b/test/test_py_text_sender.py new file mode 100644 index 0000000..d1fa716 --- /dev/null +++ b/test/test_py_text_sender.py @@ -0,0 +1,164 @@ +""" +Python Text Sender Test +Tests the smartsend function with text payloads +""" + +import asyncio +import sys +import os + +# Add parent directory to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL + +TEST_SUBJECT = '/test/text' +TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') +TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') + + +async def run_test(): + print('=== Python Text Sender Test ===\n') + + correlation_id = 'py-text-test-' + str(asyncio.get_event_loop().time() * 1000000) + print(f'Correlation ID: {correlation_id}') + print(f'Subject: {TEST_SUBJECT}') + print(f'Broker URL: {TEST_BROKER_URL}\n') + + # Test data + text_data = 'Hello, NATSBridge! This is a test message.' + test_data = [ + ('message', text_data, 'text') + ] + + try: + # Send the message + print('Sending text payload...') + env, env_json_str = await smartsend( + TEST_SUBJECT, + test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id=correlation_id, + msg_purpose='test', + sender_name='py-text-test', + is_publish=False # Don't actually publish for this test + ) + + print('\n=== Envelope Created ===') + print(f'Correlation ID: {env["correlation_id"]}') + print(f'Message ID: {env["msg_id"]}') + print(f'Timestamp: {env["timestamp"]}') + print(f'Subject: {env["send_to"]}') + print(f'Purpose: {env["msg_purpose"]}') + print(f'Sender: {env["sender_name"]}') + print(f'Payloads: {len(env["payloads"])}\n') + + # Validate envelope structure + print('=== Validation ===') + passed = True + + if not env.get('correlation_id'): + print('❌ correlation_id is missing') + passed = False + else: + print('✅ correlation_id present') + + if not env.get('msg_id'): + print('❌ msg_id is missing') + passed = False + else: + print('✅ msg_id present') + + if not env.get('timestamp'): + print('❌ timestamp is missing') + passed = False + else: + print('✅ timestamp present') + + if len(env['payloads']) != 1: + print(f'❌ Expected 1 payload, got {len(env["payloads"])}') + passed = False + else: + print('✅ Correct number of payloads') + + payload = env['payloads'][0] + if payload['dataname'] != 'message': + print(f"❌ Expected dataname 'message', got '{payload['dataname']}'") + passed = False + else: + print('✅ Correct dataname') + + if payload['payload_type'] != 'text': + print(f"❌ Expected payload_type 'text', got '{payload['payload_type']}'") + passed = False + else: + print('✅ Correct payload_type') + + if payload['transport'] != 'direct': + print(f"❌ Expected transport 'direct', got '{payload['transport']}'") + passed = False + else: + print('✅ Correct transport') + + if payload['encoding'] != 'base64': + print(f"❌ Expected encoding 'base64', got '{payload['encoding']}'") + passed = False + else: + print('✅ Correct encoding') + + # Decode and verify the data + import base64 + decoded_data = base64.b64decode(payload['data']).decode('utf8') + if decoded_data != text_data: + print('❌ Decoded data mismatch') + print(f' Expected: {text_data}') + print(f' Got: {decoded_data}') + passed = False + else: + print('✅ Data integrity verified') + + print(f"\nPayload size: {payload['size']} bytes") + print(f'Base64 data length: {len(payload["data"])} chars') + + # Test with multiple text payloads + print('\n=== Multiple Text Payloads Test ===') + multi_test_data = [ + ('msg1', 'First message', 'text'), + ('msg2', 'Second message', 'text'), + ('msg3', 'Third message', 'text') + ] + + multi_env, _ = await smartsend( + TEST_SUBJECT, + multi_test_data, + broker_url=TEST_BROKER_URL, + fileserver_url=TEST_FILESERVER_URL, + correlation_id='multi-test-' + correlation_id, + is_publish=False + ) + + if len(multi_env['payloads']) == 3: + print('✅ Multiple payloads handled correctly') + else: + print(f"❌ Expected 3 payloads, got {len(multi_env['payloads'])}") + passed = False + + # Final result + print('\n=== Test Result ===') + if passed: + print('✅ ALL TESTS PASSED') + sys.exit(0) + else: + print('❌ SOME TESTS FAILED') + sys.exit(1) + + except Exception as e: + print(f'❌ Test failed with error: {e}') + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + asyncio.run(run_test()) \ No newline at end of file -- 2.49.1 From bc0ce7159cd7d3d9b3c51275fe0e3e061aa2c286 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 07:14:40 +0700 Subject: [PATCH 11/43] update --- etc.md => README.md | 0 {examples => image}/tutorial.md | 0 {examples => image}/walkthrough.md | 0 updated_README.md | 972 +++++++++++++++++++++++++++++ 4 files changed, 972 insertions(+) rename etc.md => README.md (100%) rename {examples => image}/tutorial.md (100%) rename {examples => image}/walkthrough.md (100%) create mode 100644 updated_README.md diff --git a/etc.md b/README.md similarity index 100% rename from etc.md rename to README.md diff --git a/examples/tutorial.md b/image/tutorial.md similarity index 100% rename from examples/tutorial.md rename to image/tutorial.md diff --git a/examples/walkthrough.md b/image/walkthrough.md similarity index 100% rename from examples/walkthrough.md rename to image/walkthrough.md diff --git a/updated_README.md b/updated_README.md new file mode 100644 index 0000000..903e40f --- /dev/null +++ b/updated_README.md @@ -0,0 +1,972 @@ +# NATSBridge - Cross-Platform Bi-Directional Data Bridge + +A high-performance, bi-directional data bridge for **Julia, JavaScript, Python, and MicroPython** applications using NATS (Core & JetStream), implementing the Claim-Check pattern for large payloads. + +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) +[![NATS](https://img.shields.io/badge/NATS-Enabled-green.svg)](https://nats.io) + +--- + +## Table of Contents + +- [Overview](#overview) +- [Cross-Platform Support](#cross-platform-support) +- [Features](#features) +- [Architecture](#architecture) +- [Installation](#installation) +- [Quick Start](#quick-start) +- [API Reference](#api-reference) +- [Payload Types](#payload-types) +- [Transport Strategies](#transport-strategies) +- [Cross-Platform Examples](#cross-platform-examples) +- [Testing](#testing) +- [License](#license) + +--- + +## Overview + +NATSBridge enables seamless communication across multiple platforms through NATS, with intelligent transport selection based on payload size: + +| Transport | Payload Size | Method | +|-----------|--------------|--------| +| **Direct** | < 1MB | Sent directly via NATS (Base64 encoded) | +| **Link** | >= 1MB | Uploaded to HTTP file server, URL sent via NATS | + +### Use Cases + +- **Chat Applications**: Text, images, audio, video in a single message +- **File Transfer**: Efficient transfer of large files using claim-check pattern +- **IoT/Embedded**: Sensor data, telemetry, and analytics pipelines (MicroPython) +- **Cross-Platform Communication**: Interoperability between Julia, JavaScript, Python, and MicroPython systems + +--- + +## Cross-Platform Support + +| Platform | Implementation | Features | +|----------|----------------|----------| +| **Julia** | [`src/NATSBridge.jl`](src/NATSBridge.jl) | Full feature set, Arrow IPC, multiple dispatch | +| **JavaScript** | [`src/natbridge.js`](src/natbridge.js) | Node.js & browser, async/await | +| **Python** | [`src/natbridge.py`](src/natbridge.py) | Desktop Python, asyncio, type hints | +| **MicroPython** | [`src/natbridge_mpy.py`](src/natbridge_mpy.py) | Memory-constrained, synchronous API | + +### Platform Comparison + +| Feature | Julia | JavaScript | Python | MicroPython | +|---------|-------|------------|--------|-------------| +| Multiple Dispatch | ✅ Native | ❌ | ❌ | ❌ | +| Async/Await | ❌ | ✅ Native | ✅ Native | ⚠️ (uasyncio) | +| Type Safety | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | +| Memory Management | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | +| Arrow IPC | ✅ Native | ✅ | ✅ | ❌ | +| Direct Transport | ✅ | ✅ | ✅ | ✅ | +| Link Transport | ✅ | ✅ | ✅ | ⚠️ (Limited) | +| Handler Functions | ✅ | ✅ | ✅ | ✅ | +| Cross-Platform API | ✅ | ✅ | ✅ | ✅ | + +--- + +## Features + +- ✅ **Cross-platform messaging** for Julia, JavaScript, Python, and MicroPython applications +- ✅ **Bi-directional messaging** with request-reply patterns +- ✅ **Multi-payload support** - send multiple payloads with different types in one message +- ✅ **Automatic transport selection** - direct vs link based on payload size +- ✅ **Claim-Check pattern** for payloads > 1MB +- ✅ **Apache Arrow IPC** support for tabular data (zero-copy reading) +- ✅ **Exponential backoff** for reliable file server downloads +- ✅ **Correlation ID tracking** for message tracing +- ✅ **Reply-to support** for request-response patterns +- ✅ **Handler function abstraction** - pluggable file server implementations (Plik, AWS S3, custom) + +--- + +## Architecture + +### System Components + +```mermaid +flowchart TB + subgraph JuliaApp["Julia Application"] + JuliaAppCode[App Code] + JuliaBridge[NATSBridge.jl] + JuliaNATS[NATS.jl] + end + + subgraph JSApp["JavaScript Application"] + JSAppCode[App Code] + JSBridge[NATSBridge.js] + JSNATS[nats.js] + end + + subgraph PythonApp["Python Application"] + PythonAppCode[App Code] + PythonBridge[NATSBridge.py] + PythonNATS[nats.py] + end + + subgraph MicroPythonApp["MicroPython Application"] + MpyAppCode[App Code] + MpyBridge[NATSBridge_mpy.py] + MpyNATS[NATS] + end + + subgraph Infrastructure["Infrastructure"] + NATS[NATS Server
Message Broker] + FileServer[HTTP File Server
Upload/Download] + end + + JuliaAppCode --> JuliaBridge + JSAppCode --> JSBridge + PythonAppCode --> PythonBridge + MpyAppCode --> MpyBridge + + JuliaBridge --> JuliaNATS + JSBridge --> JSNATS + PythonBridge --> PythonNATS + MpyBridge --> MpyNATS + + JuliaNATS --> NATS + JSNATS --> NATS + PythonNATS --> NATS + MpyNATS --> NATS + + NATS --> JuliaNATS + NATS --> JSNATS + NATS --> PythonNATS + NATS --> MpyNATS + + JuliaBridge -.->|HTTP POST upload| FileServer + JSBridge -.->|HTTP POST upload| FileServer + PythonBridge -.->|HTTP POST upload| FileServer + MpyBridge -.->|HTTP POST upload| FileServer + + FileServer -.->|HTTP GET download| JuliaBridge + FileServer -.->|HTTP GET download| JSBridge + FileServer -.->|HTTP GET download| PythonBridge + FileServer -.->|HTTP GET download| MpyBridge + + style JuliaApp fill:#c5e1a5 + style JSApp fill:#bbdefb + style PythonApp fill:#f8bbd0 + style MicroPythonApp fill:#f0f0f0 + style NATS fill:#fff3e0 + style FileServer fill:#f3e5f5 +``` + +### Message Flow + +1. **Sender** creates a message envelope with payloads using `smartsend()` +2. **NATSBridge** serializes and encodes each payload based on type +3. **Transport Decision**: + - **Direct** (< 1MB): Payload encoded as Base64, published to NATS + - **Link** (≥ 1MB): Payload uploaded to HTTP file server, URL published to NATS +4. **NATS** routes message envelope to subscribers +5. **Receiver** receives message via NATS subscription callback +6. **NATSBridge** processes envelope: + - Decodes Base64 payloads from NATS message + - Fetches URLs from file server with exponential backoff +7. **Receiver** deserializes payloads based on their type + +### File Server Handler Abstraction + +The system uses handler functions to abstract file server operations: + +| Handler | Purpose | +|---------|---------| +| `plik_oneshot_upload()` / `plikOneshotUpload()` | Uploads payload bytes to file server, returns URL | +| `_fetch_with_backoff()` / `fetchWithBackoff()` | Downloads data from URL with exponential backoff retry | + +This abstraction allows support for different file server implementations (Plik, AWS S3, custom HTTP server). + +### Message Envelope Schema + +All platforms use identical JSON schemas for message envelopes: + +```json +{ + "correlation_id": "uuid-v4-string", + "msg_id": "uuid-v4-string", + "timestamp": "2024-01-15T10:30:00Z", + "send_to": "topic/subject", + "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", + "sender_name": "agent-wine-web-frontend", + "sender_id": "uuid4", + "receiver_name": "agent-backend", + "receiver_id": "uuid4", + "reply_to": "topic", + "reply_to_msg_id": "uuid4", + "broker_url": "nats://localhost:4222", + "metadata": {}, + "payloads": [ + { + "id": "uuid4", + "dataname": "login_image", + "payload_type": "image", + "transport": "direct", + "encoding": "base64", + "size": 15433, + "data": "base64-encoded-string" + }, + { + "id": "uuid4", + "dataname": "large_table", + "payload_type": "table", + "transport": "link", + "encoding": "none", + "size": 524288, + "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow" + } + ] +} +``` + +--- + +## Installation + +### Prerequisites + +- **NATS Server** (v2.10+ recommended) +- **HTTP File Server** (optional, for payloads > 1MB) + +### Platform-Specific Dependencies + +#### Julia + +```julia +using Pkg +Pkg.add("NATS") +Pkg.add("Arrow") +Pkg.add("JSON3") +Pkg.add("HTTP") +Pkg.add("UUIDs") +Pkg.add("Dates") +``` + +#### JavaScript (Node.js) + +```bash +npm install nats uuid apache-arrow node-fetch +# or +yarn add nats uuid apache-arrow node-fetch +``` + +#### JavaScript (Browser) + +```bash +npm install nats uuid apache-arrow +# or use CDN: +# https://unpkg.com/nats-js/dist/bundle/nats.min.js +# https://unpkg.com/apache-arrow/arrow.min.js +``` + +#### Python (Desktop) + +```bash +pip install nats-py aiohttp pyarrow pandas python-dateutil +``` + +#### MicroPython + +MicroPython uses built-in modules: +- `network` - NATS connection (custom implementation) +- `time` - Timestamps +- `uos` - File operations +- `base64` - Base64 encoding +- `json` - JSON parsing +- `struct` - Binary data handling + +--- + +## Quick Start + +### Step 1: Start NATS Server + +```bash +docker run -p 4222:4222 nats:latest +``` + +### Step 2: Start HTTP File Server (Optional) + +```bash +# Create a directory for file uploads +mkdir -p /tmp/fileserver + +# Start HTTP file server +python3 -m http.server 8080 --directory /tmp/fileserver +``` + +--- + +## API Reference + +### Unified API Standard + +All platforms use the same input/output format for payloads: + +**Input format for smartsend:** +``` +[(dataname1, data1, type1), (dataname2, data2, type2), ...] +``` + +**Output format for smartreceive:** +``` +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + +### smartsend + +Sends data either directly via NATS or via a fileserver URL, depending on payload size. + +#### Julia + +```julia +using NATSBridge + +env, env_json_str = NATSBridge.smartsend( + subject::String, # NATS subject + data::AbstractArray{Tuple{String, Any, String}}; # List of (dataname, data, type) + broker_url::String = "nats://localhost:4222", + fileserver_url = "http://localhost:8080", + fileserver_upload_handler::Function = plik_oneshot_upload, + size_threshold::Int = 1_000_000, + correlation_id::String = string(uuid4()), + msg_purpose::String = "chat", + sender_name::String = "NATSBridge", + receiver_name::String = "", + receiver_id::String = "", + reply_to::String = "", + reply_to_msg_id::String = "", + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) +) +# Returns: ::Tuple{msg_envelope_v1, String} +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +const [env, env_json_str] = await NATSBridge.smartsend( + subject, + data, // Array of [dataname, data, type] tuples + { + broker_url: 'nats://localhost:4222', + fileserver_url: 'http://localhost:8080', + fileserver_upload_handler: NATSBridge.plikOneshotUpload, + size_threshold: 1_000_000, + correlation_id: uuidv4(), + msg_purpose: 'chat', + sender_name: 'NATSBridge', + receiver_name: '', + receiver_id: '', + reply_to: '', + reply_to_msg_id: '', + is_publish: true, + nats_connection: null, + msg_id: uuidv4(), + sender_id: uuidv4() + } +); +// Returns: Promise<[env, env_json_str]> +``` + +#### Python + +```python +from natbridge import NATSBridge + +env, env_json_str = await NATSBridge.smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = "nats://localhost:4222", + fileserver_url: str = "http://localhost:8080", + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = 1_000_000, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) +# Returns: Tuple[Dict, str] +``` + +#### MicroPython + +```python +from natbridge import NATSBridge + +# Limited to direct transport (< 100KB threshold) +env, env_json_str = NATSBridge.smartsend( + subject, + data, # List of (dataname, data, type) tuples + broker_url="nats://localhost:4222", + size_threshold=100000 # Lower threshold for memory constraints +) +# Returns: Tuple[Dict, str] +``` + +### smartreceive + +Receives and processes messages from NATS, handling both direct and link transport. + +#### Julia + +```julia +using NATSBridge + +env = NATSBridge.smartreceive( + msg::NATS.Msg; + fileserver_download_handler::Function = _fetch_with_backoff, + max_retries::Int = 5, + base_delay::Int = 100, + max_delay::Int = 5000 +) +# Returns: ::JSON.Object{String, Any} +``` + +#### JavaScript + +```javascript +const env = await NATSBridge.smartreceive( + msg, + { + fileserver_download_handler: NATSBridge.fetchWithBackoff, + max_retries: 5, + base_delay: 100, + max_delay: 5000 + } +); +// Returns: Promise +``` + +#### Python + +```python +env = await NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff, + max_retries=5, + base_delay=100, + max_delay=5000 +) +# Returns: Dict with "payloads" key +``` + +#### MicroPython + +```python +env = NATSBridge.smartreceive( + msg, + fileserver_download_handler=_sync_fileserver_download, + max_retries=3, + base_delay=100, + max_delay=1000 +) +# Returns: Dict with "payloads" key +``` + +--- + +## Payload Types + +| Type | Julia | JavaScript | Python | MicroPython | Description | +|------|-------|------------|--------|-------------|-------------| +| `text` | `String` | `string` | `str` | `str` | Plain text strings | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | JSON-serializable dictionaries | +| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ | Tabular data (Arrow IPC) | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Image data (PNG, JPG) | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Audio data (WAV, MP3) | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Video data (MP4, AVI) | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | Generic binary data | + +--- + +## Transport Strategies + +### Direct Transport (Payloads < 1MB) + +Small payloads are sent directly via NATS with Base64 encoding. + +#### Cross-Platform + +```julia +# Julia +data = [("message", "Hello", "text")] +smartsend("/topic", data) +``` + +```javascript +// JavaScript +const data = [["message", "Hello", "text"]]; +smartsend("/topic", data); +``` + +```python +# Python +data = [("message", "Hello", "text")] +await smartsend("/topic", data) +``` + +### Link Transport (Payloads >= 1MB) + +Large payloads are uploaded to an HTTP file server. + +#### Cross-Platform + +```julia +# Julia +data = [("file", large_data, "binary")] +smartsend("/topic", data; fileserver_url="http://localhost:8080") +``` + +```javascript +// JavaScript +const data = [["file", largeData, "binary"]]; +smartsend("/topic", data, { fileserver_url: 'http://localhost:8080' }); +``` + +```python +# Python +data = [("file", large_data, "binary")] +await smartsend("/topic", data, fileserver_url="http://localhost:8080") +``` + +--- + +## Cross-Platform Examples + +### Example 1: Chat with Mixed Content + +Send text, image, and large file in one message. + +#### Julia + +```julia +using NATSBridge + +data = [ + ("message_text", "Hello!", "text"), + ("user_avatar", image_data, "image"), + ("large_document", large_file_data, "binary") +] + +env, env_json_str = NATSBridge.smartsend("/chat/room1", data; fileserver_url="http://localhost:8080") +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +const data = [ + ["message_text", "Hello!", "text"], + ["user_avatar", imageData, "image"], + ["large_document", largeFileData, "binary"] +]; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat/room1", + data, + { fileserver_url: 'http://localhost:8080' } +); +``` + +#### Python + +```python +from natbridge import NATSBridge + +data = [ + ("message_text", "Hello!", "text"), + ("user_avatar", image_data, "image"), + ("large_document", large_file_data, "binary") +] + +env, env_json_str = await NATSBridge.smartsend( + "/chat/room1", + data, + fileserver_url="http://localhost:8080" +) +``` + +### Example 2: Dictionary Exchange + +Send configuration data between platforms. + +#### Julia + +```julia +using NATSBridge + +config = Dict( + "wifi_ssid" => "MyNetwork", + "wifi_password" => "password123", + "update_interval" => 60 +) + +data = [("config", config, "dictionary")] +env, env_json_str = NATSBridge.smartsend("/device/config", data) +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +const config = { + wifi_ssid: "MyNetwork", + wifi_password: "password123", + update_interval: 60 +}; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/device/config", + [["config", config, "dictionary"]] +); +``` + +#### Python + +```python +from natbridge import NATSBridge + +config = { + "wifi_ssid": "MyNetwork", + "wifi_password": "password123", + "update_interval": 60 +} + +data = [("config", config, "dictionary")] +env, env_json_str = await NATSBridge.smartsend("/device/config", data) +``` + +### Example 3: Table Data (Arrow IPC) + +Send tabular data using Apache Arrow IPC format. + +#### Julia + +```julia +using NATSBridge +using DataFrames + +df = DataFrame( + id = [1, 2, 3], + name = ["Alice", "Bob", "Charlie"], + score = [95, 88, 92] +) + +data = [("students", df, "table")] +env, env_json_str = NATSBridge.smartsend("/data/analysis", data) +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +const df = [ + { id: 1, name: "Alice", score: 95 }, + { id: 2, name: "Bob", score: 88 }, + { id: 3, name: "Charlie", score: 92 } +]; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/data/analysis", + [["students", df, "table"]] +); +``` + +#### Python + +```python +from natbridge import NATSBridge +import pandas as pd + +df = pd.DataFrame({ + "id": [1, 2, 3], + "name": ["Alice", "Bob", "Charlie"], + "score": [95, 88, 92] +}) + +data = [("students", df, "table")] +env, env_json_str = await NATSBridge.smartsend("/data/analysis", data) +``` + +### Example 4: Request-Response Pattern + +Bi-directional communication with reply-to support. + +#### Julia + +```julia +using NATSBridge + +# Requester +env, env_json_str = NATSBridge.smartsend( + "/device/command", + [("command", Dict("action" => "read_sensor"), "dictionary")]; + broker_url="nats://localhost:4222", + reply_to="/device/response" +) +``` + +```julia +# Responder +using NATS, NATSBridge + +function test_responder() + conn = NATS.connect("nats://localhost:4222") + NATS.subscribe(conn, "/device/command") do msg + env = NATSBridge.smartreceive(msg, fileserver_download_handler=_fetch_with_backoff) + + reply_to = env["reply_to"] + + for (dataname, data, type) in env["payloads"] + if dataname == "command" && data["action"] == "read_sensor" + response = Dict("sensor_id" => "sensor-001", "value" => 42.5) + if !isempty(reply_to) + smartsend(reply_to, [("data", response, "dictionary")]) + end + end + end + end + + sleep(120) + NATS.drain(conn) +end +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +// Requester +const [env, env_json_str] = await NATSBridge.smartsend( + "/device/command", + [["command", { action: "read_sensor" }, "dictionary"]], + { broker_url: 'nats://localhost:4222', reply_to: '/device/response' } +); +``` + +```javascript +// Responder +const nats = require('nats'); +const NATSBridge = require('natbridge'); + +async function testResponder() { + const conn = await nats.connect('nats://localhost:4222'); + + const subscription = await conn.subscribe('/device/command'); + + for await (const msg of subscription) { + const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: NATSBridge.fetchWithBackoff + }); + + const replyTo = env.reply_to; + + for (const [dataname, data, type] of env.payloads) { + if (dataname === 'command' && data.action === 'read_sensor') { + const response = { sensor_id: 'sensor-001', value: 42.5 }; + if (replyTo) { + await NATSBridge.smartsend( + replyTo, + [["data", response, "dictionary"]] + ); + } + } + } + } + + setTimeout(() => conn.close(), 120000); +} +``` + +#### Python + +```python +from natbridge import NATSBridge + +# Requester +env, env_json_str = await NATSBridge.smartsend( + "/device/command", + [("command", {"action": "read_sensor"}, "dictionary")], + broker_url="nats://localhost:4222", + reply_to="/device/response" +) +``` + +```python +# Responder +from natbridge import NATSBridge +import asyncio +import nats + +async def test_responder(): + nc = await nats.connect('nats://localhost:4222') + + async def msg_handler(msg): + env = await NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff + ) + + reply_to = env["reply_to"] + + for dataname, data, type_ in env["payloads"]: + if dataname == "command" and data["action"] == "read_sensor": + response = {"sensor_id": "sensor-001", "value": 42.5} + if reply_to: + await NATSBridge.smartsend( + reply_to, + [("data", response, "dictionary")] + ) + + await nc.subscribe('/device/command', cb=msg_handler) + + await asyncio.sleep(120) + await nc.drain() +``` + +--- + +## Testing + +### Test File Organization + +| Platform | Sender Tests | Receiver Tests | +|----------|--------------|----------------| +| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | +| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | +| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | + +### Run Tests + +#### Julia + +```bash +# Text message exchange +julia test/test_julia_text_sender.jl +julia test/test_julia_text_receiver.jl + +# Dictionary exchange +julia test/test_julia_dict_sender.jl +julia test/test_julia_dict_receiver.jl + +# File transfer +julia test/test_julia_file_sender.jl +julia test/test_julia_file_receiver.jl + +# Mixed payload types +julia test/test_julia_mix_payloads_sender.jl +julia test/test_julia_mix_payloads_receiver.jl + +# Table exchange +julia test/test_julia_table_sender.jl +julia test/test_julia_table_receiver.jl +``` + +#### JavaScript (Node.js) + +```bash +# Text message exchange +node test/test_js_text_sender.js +node test/test_js_text_receiver.js + +# Dictionary exchange +node test/test_js_dictionary_sender.js +node test/test_js_dictionary_receiver.js + +# Binary transfer +node test/test_js_binary_sender.js +node test/test_js_binary_receiver.js + +# Table exchange +node test/test_js_table_sender.js +node test/test_js_table_receiver.js +``` + +#### Python + +```bash +# Text message exchange +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py + +# Dictionary exchange +python3 test/test_py_dictionary_sender.py +python3 test/test_py_dictionary_receiver.py + +# Binary transfer +python3 test/test_py_binary_sender.py +python3 test/test_py_binary_receiver.py + +# Table exchange +python3 test/test_py_table_sender.py +python3 test/test_py_table_receiver.py +``` + +--- + +## Documentation + +For detailed architecture and implementation information, see: + +- [Architecture Documentation](docs/architecture.md) - Cross-platform architecture, API parity, platform-specific patterns +- [Implementation Guide](docs/implementation.md) - Detailed implementation for each platform, handler functions, testing + +--- + +## License + +MIT License + +Copyright (c) 2026 NATSBridge Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file -- 2.49.1 From b2859710cdfe1a6bddab05ee0a28c60313179dd1 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 07:18:08 +0700 Subject: [PATCH 12/43] update --- updated_README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/updated_README.md b/updated_README.md index 903e40f..cf91df3 100644 --- a/updated_README.md +++ b/updated_README.md @@ -88,10 +88,10 @@ NATSBridge enables seamless communication across multiple platforms through NATS ```mermaid flowchart TB - subgraph JuliaApp["Julia Application"] - JuliaAppCode[App Code] - JuliaBridge[NATSBridge.jl] - JuliaNATS[NATS.jl] + subgraph App["Application"] + AppCode[App Code] + Bridge[NATSBridge.jl] + NATS[NATS.jl] end subgraph JSApp["JavaScript Application"] @@ -117,37 +117,37 @@ flowchart TB FileServer[HTTP File Server
Upload/Download] end - JuliaAppCode --> JuliaBridge + AppCode --> Bridge JSAppCode --> JSBridge PythonAppCode --> PythonBridge MpyAppCode --> MpyBridge - JuliaBridge --> JuliaNATS + Bridge --> NATS JSBridge --> JSNATS PythonBridge --> PythonNATS MpyBridge --> MpyNATS - JuliaNATS --> NATS + NATS --> NATS JSNATS --> NATS PythonNATS --> NATS MpyNATS --> NATS - NATS --> JuliaNATS + NATS --> NATS NATS --> JSNATS NATS --> PythonNATS NATS --> MpyNATS - JuliaBridge -.->|HTTP POST upload| FileServer + Bridge -.->|HTTP POST upload| FileServer JSBridge -.->|HTTP POST upload| FileServer PythonBridge -.->|HTTP POST upload| FileServer MpyBridge -.->|HTTP POST upload| FileServer - FileServer -.->|HTTP GET download| JuliaBridge + FileServer -.->|HTTP GET download| Bridge FileServer -.->|HTTP GET download| JSBridge FileServer -.->|HTTP GET download| PythonBridge FileServer -.->|HTTP GET download| MpyBridge - style JuliaApp fill:#c5e1a5 + style App fill:#c5e1a5 style JSApp fill:#bbdefb style PythonApp fill:#f8bbd0 style MicroPythonApp fill:#f0f0f0 -- 2.49.1 From fbbea7b42b48d45caff924820820eb7664138f86 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 07:19:03 +0700 Subject: [PATCH 13/43] update --- updated_README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/updated_README.md b/updated_README.md index cf91df3..903e40f 100644 --- a/updated_README.md +++ b/updated_README.md @@ -88,10 +88,10 @@ NATSBridge enables seamless communication across multiple platforms through NATS ```mermaid flowchart TB - subgraph App["Application"] - AppCode[App Code] - Bridge[NATSBridge.jl] - NATS[NATS.jl] + subgraph JuliaApp["Julia Application"] + JuliaAppCode[App Code] + JuliaBridge[NATSBridge.jl] + JuliaNATS[NATS.jl] end subgraph JSApp["JavaScript Application"] @@ -117,37 +117,37 @@ flowchart TB FileServer[HTTP File Server
Upload/Download] end - AppCode --> Bridge + JuliaAppCode --> JuliaBridge JSAppCode --> JSBridge PythonAppCode --> PythonBridge MpyAppCode --> MpyBridge - Bridge --> NATS + JuliaBridge --> JuliaNATS JSBridge --> JSNATS PythonBridge --> PythonNATS MpyBridge --> MpyNATS - NATS --> NATS + JuliaNATS --> NATS JSNATS --> NATS PythonNATS --> NATS MpyNATS --> NATS - NATS --> NATS + NATS --> JuliaNATS NATS --> JSNATS NATS --> PythonNATS NATS --> MpyNATS - Bridge -.->|HTTP POST upload| FileServer + JuliaBridge -.->|HTTP POST upload| FileServer JSBridge -.->|HTTP POST upload| FileServer PythonBridge -.->|HTTP POST upload| FileServer MpyBridge -.->|HTTP POST upload| FileServer - FileServer -.->|HTTP GET download| Bridge + FileServer -.->|HTTP GET download| JuliaBridge FileServer -.->|HTTP GET download| JSBridge FileServer -.->|HTTP GET download| PythonBridge FileServer -.->|HTTP GET download| MpyBridge - style App fill:#c5e1a5 + style JuliaApp fill:#c5e1a5 style JSApp fill:#bbdefb style PythonApp fill:#f8bbd0 style MicroPythonApp fill:#f0f0f0 -- 2.49.1 From aa92fb6d0d1f5c07cfb34c871f94a182b408ddc9 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 07:27:07 +0700 Subject: [PATCH 14/43] update --- updated_README.md | 81 +++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 52 deletions(-) diff --git a/updated_README.md b/updated_README.md index 903e40f..19ca895 100644 --- a/updated_README.md +++ b/updated_README.md @@ -88,69 +88,46 @@ NATSBridge enables seamless communication across multiple platforms through NATS ```mermaid flowchart TB - subgraph JuliaApp["Julia Application"] - JuliaAppCode[App Code] - JuliaBridge[NATSBridge.jl] - JuliaNATS[NATS.jl] - end - - subgraph JSApp["JavaScript Application"] - JSAppCode[App Code] - JSBridge[NATSBridge.js] - JSNATS[nats.js] - end - - subgraph PythonApp["Python Application"] - PythonAppCode[App Code] - PythonBridge[NATSBridge.py] - PythonNATS[nats.py] - end - - subgraph MicroPythonApp["MicroPython Application"] - MpyAppCode[App Code] - MpyBridge[NATSBridge_mpy.py] - MpyNATS[NATS] + subgraph Applications["Applications"] + direction TB + subgraph Platform1["Julia"] + App1[App Code] --> Bridge1[NATSBridge.jl] + Bridge1 --> NATS1[NATS.jl] + end + subgraph Platform2["JavaScript"] + App2[App Code] --> Bridge2[NATSBridge.js] + Bridge2 --> NATS2[nats.js] + end + subgraph Platform3["Python/MicroPython"] + App3[App Code] --> Bridge3[NATSBridge.py/_mpy.py] + Bridge3 --> NATS3[nats.py] + end end subgraph Infrastructure["Infrastructure"] + direction TB NATS[NATS Server
Message Broker] FileServer[HTTP File Server
Upload/Download] end - JuliaAppCode --> JuliaBridge - JSAppCode --> JSBridge - PythonAppCode --> PythonBridge - MpyAppCode --> MpyBridge + NATS1 --> NATS + NATS2 --> NATS + NATS3 --> NATS - JuliaBridge --> JuliaNATS - JSBridge --> JSNATS - PythonBridge --> PythonNATS - MpyBridge --> MpyNATS + NATS --> NATS1 + NATS --> NATS2 + NATS --> NATS3 - JuliaNATS --> NATS - JSNATS --> NATS - PythonNATS --> NATS - MpyNATS --> NATS + Bridge1 -.->|HTTP POST| FileServer + Bridge2 -.->|HTTP POST| FileServer + Bridge3 -.->|HTTP POST| FileServer - NATS --> JuliaNATS - NATS --> JSNATS - NATS --> PythonNATS - NATS --> MpyNATS + FileServer -.->|HTTP GET| Bridge1 + FileServer -.->|HTTP GET| Bridge2 + FileServer -.->|HTTP GET| Bridge3 - JuliaBridge -.->|HTTP POST upload| FileServer - JSBridge -.->|HTTP POST upload| FileServer - PythonBridge -.->|HTTP POST upload| FileServer - MpyBridge -.->|HTTP POST upload| FileServer - - FileServer -.->|HTTP GET download| JuliaBridge - FileServer -.->|HTTP GET download| JSBridge - FileServer -.->|HTTP GET download| PythonBridge - FileServer -.->|HTTP GET download| MpyBridge - - style JuliaApp fill:#c5e1a5 - style JSApp fill:#bbdefb - style PythonApp fill:#f8bbd0 - style MicroPythonApp fill:#f0f0f0 + style Applications fill:#f0f0f0 + style Infrastructure fill:#f0f0f0 style NATS fill:#fff3e0 style FileServer fill:#f3e5f5 ``` -- 2.49.1 From 34ea1ed8ec1ca1a59c4929315b8bb9cf4d9762a4 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 07:42:15 +0700 Subject: [PATCH 15/43] update --- updated_README.md | 82 ++++++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/updated_README.md b/updated_README.md index 19ca895..1f8e716 100644 --- a/updated_README.md +++ b/updated_README.md @@ -88,48 +88,72 @@ NATSBridge enables seamless communication across multiple platforms through NATS ```mermaid flowchart TB - subgraph Applications["Applications"] - direction TB - subgraph Platform1["Julia"] - App1[App Code] --> Bridge1[NATSBridge.jl] - Bridge1 --> NATS1[NATS.jl] - end - subgraph Platform2["JavaScript"] - App2[App Code] --> Bridge2[NATSBridge.js] - Bridge2 --> NATS2[nats.js] - end - subgraph Platform3["Python/MicroPython"] - App3[App Code] --> Bridge3[NATSBridge.py/_mpy.py] - Bridge3 --> NATS3[nats.py] - end + %% Subgraph Definitions + subgraph JuliaApp["Julia Application"] + JuliaAppCode[App Code] + JuliaBridge[NATSBridge.jl] + JuliaNATS[NATS.jl] + end + + subgraph JSApp["JavaScript Application"] + JSAppCode[App Code] + JSBridge[NATSBridge.js] + JSNATS[nats.js] + end + + subgraph PythonApp["Python Application"] + PythonAppCode[App Code] + PythonBridge[NATSBridge.py] + PythonNATS[nats.py] + end + + subgraph MicroPythonApp["MicroPython Application"] + MpyAppCode[App Code] + MpyBridge[NATSBridge_mpy.py] + MpyNATS[NATS] end subgraph Infrastructure["Infrastructure"] - direction TB NATS[NATS Server
Message Broker] FileServer[HTTP File Server
Upload/Download] end - NATS1 --> NATS - NATS2 --> NATS - NATS3 --> NATS + %% Application Internal Flows + JuliaAppCode --> JuliaBridge --> JuliaNATS + JSAppCode --> JSBridge --> JSNATS + PythonAppCode --> PythonBridge --> PythonNATS + MpyAppCode --> MpyBridge --> MpyNATS - NATS --> NATS1 - NATS --> NATS2 - NATS --> NATS3 + %% Connections to Infrastructure (Center) + %% NATS Server Connections + JuliaNATS --> NATS + JSNATS --> NATS + PythonNATS --> NATS + MpyNATS --> NATS + NATS --> JuliaNATS + NATS --> JSNATS + NATS --> PythonNATS + NATS --> MpyNATS - Bridge1 -.->|HTTP POST| FileServer - Bridge2 -.->|HTTP POST| FileServer - Bridge3 -.->|HTTP POST| FileServer + %% HTTP File Server Connections + JuliaBridge -.->|HTTP POST upload| FileServer + JSBridge -.->|HTTP POST upload| FileServer + PythonBridge -.->|HTTP POST upload| FileServer + MpyBridge -.->|HTTP POST upload| FileServer - FileServer -.->|HTTP GET| Bridge1 - FileServer -.->|HTTP GET| Bridge2 - FileServer -.->|HTTP GET| Bridge3 + FileServer -.->|HTTP GET download| JuliaBridge + FileServer -.->|HTTP GET download| JSBridge + FileServer -.->|HTTP GET download| PythonBridge + FileServer -.->|HTTP GET download| MpyBridge - style Applications fill:#f0f0f0 - style Infrastructure fill:#f0f0f0 + %% Styling + style JuliaApp fill:#c5e1a5 + style JSApp fill:#bbdefb + style PythonApp fill:#f8bbd0 + style MicroPythonApp fill:#f0f0f0 style NATS fill:#fff3e0 style FileServer fill:#f3e5f5 + style Infrastructure fill:#fafafa ``` ### Message Flow -- 2.49.1 From e9fd14823550549c378c46166e406bf65ee44818 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 07:43:26 +0700 Subject: [PATCH 16/43] update --- updated_README.md | 72 +++++++++++++---------------------------------- 1 file changed, 19 insertions(+), 53 deletions(-) diff --git a/updated_README.md b/updated_README.md index 1f8e716..be22435 100644 --- a/updated_README.md +++ b/updated_README.md @@ -88,29 +88,16 @@ NATSBridge enables seamless communication across multiple platforms through NATS ```mermaid flowchart TB - %% Subgraph Definitions - subgraph JuliaApp["Julia Application"] - JuliaAppCode[App Code] - JuliaBridge[NATSBridge.jl] - JuliaNATS[NATS.jl] + subgraph Sender["Application (Sender)"] + SenderApp[App Code] + NATSBridge_Send[NATSBridge] + NATS_Client[NATS.jl] end - subgraph JSApp["JavaScript Application"] - JSAppCode[App Code] - JSBridge[NATSBridge.js] - JSNATS[nats.js] - end - - subgraph PythonApp["Python Application"] - PythonAppCode[App Code] - PythonBridge[NATSBridge.py] - PythonNATS[nats.py] - end - - subgraph MicroPythonApp["MicroPython Application"] - MpyAppCode[App Code] - MpyBridge[NATSBridge_mpy.py] - MpyNATS[NATS] + subgraph Receiver["Application (Receiver)"] + ReceiverApp[App Code] + NATSBridge_Recv[NATSBridge] + NATS_Client_Recv[NATS.jl] end subgraph Infrastructure["Infrastructure"] @@ -118,42 +105,21 @@ flowchart TB FileServer[HTTP File Server
Upload/Download] end - %% Application Internal Flows - JuliaAppCode --> JuliaBridge --> JuliaNATS - JSAppCode --> JSBridge --> JSNATS - PythonAppCode --> PythonBridge --> PythonNATS - MpyAppCode --> MpyBridge --> MpyNATS + SenderApp --> NATSBridge_Send + NATSBridge_Send --> NATS_Client + NATS_Client --> NATS + + NATS --> NATS_Client_Recv + NATS_Client_Recv --> NATSBridge_Recv + NATSBridge_Recv --> ReceiverApp - %% Connections to Infrastructure (Center) - %% NATS Server Connections - JuliaNATS --> NATS - JSNATS --> NATS - PythonNATS --> NATS - MpyNATS --> NATS - NATS --> JuliaNATS - NATS --> JSNATS - NATS --> PythonNATS - NATS --> MpyNATS + NATSBridge_Send -.->|HTTP POST upload| FileServer + FileServer -.->|HTTP GET download| NATSBridge_Recv - %% HTTP File Server Connections - JuliaBridge -.->|HTTP POST upload| FileServer - JSBridge -.->|HTTP POST upload| FileServer - PythonBridge -.->|HTTP POST upload| FileServer - MpyBridge -.->|HTTP POST upload| FileServer - - FileServer -.->|HTTP GET download| JuliaBridge - FileServer -.->|HTTP GET download| JSBridge - FileServer -.->|HTTP GET download| PythonBridge - FileServer -.->|HTTP GET download| MpyBridge - - %% Styling - style JuliaApp fill:#c5e1a5 - style JSApp fill:#bbdefb - style PythonApp fill:#f8bbd0 - style MicroPythonApp fill:#f0f0f0 + style SenderApp fill:#e8f5e9 + style ReceiverApp fill:#e8f5e9 style NATS fill:#fff3e0 style FileServer fill:#f3e5f5 - style Infrastructure fill:#fafafa ``` ### Message Flow -- 2.49.1 From 1b86a9252d7ffa3c095db1b864223b13fe6e2f47 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 08:15:34 +0700 Subject: [PATCH 17/43] update --- README.md | 715 +++++++++++++++++----- {image => examples}/tutorial.md | 17 +- {image => examples}/walkthrough.md | 69 ++- updated_README.md | 939 ----------------------------- 4 files changed, 606 insertions(+), 1134 deletions(-) rename {image => examples}/tutorial.md (95%) rename {image => examples}/walkthrough.md (96%) delete mode 100644 updated_README.md diff --git a/README.md b/README.md index be3f1ce..be22435 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# NATSBridge +# NATSBridge - Cross-Platform Bi-Directional Data Bridge -A high-performance, bi-directional data bridge for **Julia** applications using NATS (Core & JetStream), implementing the Claim-Check pattern for large payloads. +A high-performance, bi-directional data bridge for **Julia, JavaScript, Python, and MicroPython** applications using NATS (Core & JetStream), implementing the Claim-Check pattern for large payloads. [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![NATS](https://img.shields.io/badge/NATS-Enabled-green.svg)](https://nats.io) @@ -10,6 +10,7 @@ A high-performance, bi-directional data bridge for **Julia** applications using ## Table of Contents - [Overview](#overview) +- [Cross-Platform Support](#cross-platform-support) - [Features](#features) - [Architecture](#architecture) - [Installation](#installation) @@ -17,7 +18,7 @@ A high-performance, bi-directional data bridge for **Julia** applications using - [API Reference](#api-reference) - [Payload Types](#payload-types) - [Transport Strategies](#transport-strategies) -- [Examples](#examples) +- [Cross-Platform Examples](#cross-platform-examples) - [Testing](#testing) - [License](#license) @@ -25,7 +26,7 @@ A high-performance, bi-directional data bridge for **Julia** applications using ## Overview -NATSBridge enables seamless communication for Julia applications through NATS, with intelligent transport selection based on payload size: +NATSBridge enables seamless communication across multiple platforms through NATS, with intelligent transport selection based on payload size: | Transport | Payload Size | Method | |-----------|--------------|--------| @@ -36,14 +37,40 @@ NATSBridge enables seamless communication for Julia applications through NATS, w - **Chat Applications**: Text, images, audio, video in a single message - **File Transfer**: Efficient transfer of large files using claim-check pattern -- **Streaming Data**: Sensor data, telemetry, and analytics pipelines +- **IoT/Embedded**: Sensor data, telemetry, and analytics pipelines (MicroPython) +- **Cross-Platform Communication**: Interoperability between Julia, JavaScript, Python, and MicroPython systems +--- + +## Cross-Platform Support + +| Platform | Implementation | Features | +|----------|----------------|----------| +| **Julia** | [`src/NATSBridge.jl`](src/NATSBridge.jl) | Full feature set, Arrow IPC, multiple dispatch | +| **JavaScript** | [`src/natbridge.js`](src/natbridge.js) | Node.js & browser, async/await | +| **Python** | [`src/natbridge.py`](src/natbridge.py) | Desktop Python, asyncio, type hints | +| **MicroPython** | [`src/natbridge_mpy.py`](src/natbridge_mpy.py) | Memory-constrained, synchronous API | + +### Platform Comparison + +| Feature | Julia | JavaScript | Python | MicroPython | +|---------|-------|------------|--------|-------------| +| Multiple Dispatch | ✅ Native | ❌ | ❌ | ❌ | +| Async/Await | ❌ | ✅ Native | ✅ Native | ⚠️ (uasyncio) | +| Type Safety | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | +| Memory Management | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | +| Arrow IPC | ✅ Native | ✅ | ✅ | ❌ | +| Direct Transport | ✅ | ✅ | ✅ | ✅ | +| Link Transport | ✅ | ✅ | ✅ | ⚠️ (Limited) | +| Handler Functions | ✅ | ✅ | ✅ | ✅ | +| Cross-Platform API | ✅ | ✅ | ✅ | ✅ | --- ## Features -- ✅ **Bi-directional messaging** for Julia applications +- ✅ **Cross-platform messaging** for Julia, JavaScript, Python, and MicroPython applications +- ✅ **Bi-directional messaging** with request-reply patterns - ✅ **Multi-payload support** - send multiple payloads with different types in one message - ✅ **Automatic transport selection** - direct vs link based on payload size - ✅ **Claim-Check pattern** for payloads > 1MB @@ -51,8 +78,7 @@ NATSBridge enables seamless communication for Julia applications through NATS, w - ✅ **Exponential backoff** for reliable file server downloads - ✅ **Correlation ID tracking** for message tracing - ✅ **Reply-to support** for request-response patterns -- ✅ **JetStream support** for message replay and durability - +- ✅ **Handler function abstraction** - pluggable file server implementations (Plik, AWS S3, custom) --- @@ -62,13 +88,13 @@ NATSBridge enables seamless communication for Julia applications through NATS, w ```mermaid flowchart TB - subgraph Sender["Julia Application (Sender)"] + subgraph Sender["Application (Sender)"] SenderApp[App Code] NATSBridge_Send[NATSBridge] NATS_Client[NATS.jl] end - subgraph Receiver["Julia Application (Receiver)"] + subgraph Receiver["Application (Receiver)"] ReceiverApp[App Code] NATSBridge_Recv[NATSBridge] NATS_Client_Recv[NATS.jl] @@ -96,14 +122,6 @@ flowchart TB style FileServer fill:#f3e5f5 ``` -### Key Components - -| Component | Description | -|-----------|-------------| -| **Julia Application** | Sender and receiver applications using the NATSBridge module | -| **NATS Server** | Message broker for transporting message envelopes | -| **HTTP File Server** | Independent HTTP server for large payload storage (e.g., Plik) | - ### Message Flow 1. **Sender** creates a message envelope with payloads using `smartsend()` @@ -124,11 +142,53 @@ The system uses handler functions to abstract file server operations: | Handler | Purpose | |---------|---------| -| `plik_oneshot_upload()` | Uploads payload bytes to file server, returns URL | -| `_fetch_with_backoff()` | Downloads data from URL with exponential backoff retry | +| `plik_oneshot_upload()` / `plikOneshotUpload()` | Uploads payload bytes to file server, returns URL | +| `_fetch_with_backoff()` / `fetchWithBackoff()` | Downloads data from URL with exponential backoff retry | This abstraction allows support for different file server implementations (Plik, AWS S3, custom HTTP server). +### Message Envelope Schema + +All platforms use identical JSON schemas for message envelopes: + +```json +{ + "correlation_id": "uuid-v4-string", + "msg_id": "uuid-v4-string", + "timestamp": "2024-01-15T10:30:00Z", + "send_to": "topic/subject", + "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", + "sender_name": "agent-wine-web-frontend", + "sender_id": "uuid4", + "receiver_name": "agent-backend", + "receiver_id": "uuid4", + "reply_to": "topic", + "reply_to_msg_id": "uuid4", + "broker_url": "nats://localhost:4222", + "metadata": {}, + "payloads": [ + { + "id": "uuid4", + "dataname": "login_image", + "payload_type": "image", + "transport": "direct", + "encoding": "base64", + "size": 15433, + "data": "base64-encoded-string" + }, + { + "id": "uuid4", + "dataname": "large_table", + "payload_type": "table", + "transport": "link", + "encoding": "none", + "size": 524288, + "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow" + } + ] +} +``` + --- ## Installation @@ -138,14 +198,53 @@ This abstraction allows support for different file server implementations (Plik, - **NATS Server** (v2.10+ recommended) - **HTTP File Server** (optional, for payloads > 1MB) -### Julia +### Platform-Specific Dependencies + +#### Julia ```julia using Pkg Pkg.add("NATS") -Pkg.add("https://git.yiem.cc/ton/NATSBridge") +Pkg.add("Arrow") +Pkg.add("JSON3") +Pkg.add("HTTP") +Pkg.add("UUIDs") +Pkg.add("Dates") ``` +#### JavaScript (Node.js) + +```bash +npm install nats uuid apache-arrow node-fetch +# or +yarn add nats uuid apache-arrow node-fetch +``` + +#### JavaScript (Browser) + +```bash +npm install nats uuid apache-arrow +# or use CDN: +# https://unpkg.com/nats-js/dist/bundle/nats.min.js +# https://unpkg.com/apache-arrow/arrow.min.js +``` + +#### Python (Desktop) + +```bash +pip install nats-py aiohttp pyarrow pandas python-dateutil +``` + +#### MicroPython + +MicroPython uses built-in modules: +- `network` - NATS connection (custom implementation) +- `time` - Timestamps +- `uos` - File operations +- `base64` - Base64 encoding +- `json` - JSON parsing +- `struct` - Binary data handling + --- ## Quick Start @@ -166,61 +265,39 @@ mkdir -p /tmp/fileserver python3 -m http.server 8080 --directory /tmp/fileserver ``` -### Step 3: Send Your First Message - -#### Julia - -```julia -using NATSBridge - -# Send a text message -data = [("message", "Hello World", "text")] -env, env_json_str = NATSBridge.smartsend("/chat/room1", data; broker_url="nats://localhost:4222") -println("Message sent!") -``` - -### Step 4: Receive Messages - -#### Julia - -```julia -using NATS, NATSBridge - -# Configuration -const SUBJECT = "/chat/room1" -const NATS_URL = "nats://localhost:4222" - -# Helper: Log with correlation ID -function log_trace(message) - timestamp = Dates.now() - println("[$timestamp] $message") -end - -# Receiver: Listen for messages - msg comes from the callback -function test_receive() - conn = NATS.connect(NATS_URL) - NATS.subscribe(conn, SUBJECT) do msg - log_trace("Received message on $(msg.subject)") - - # Receive and process message - env, env_json_str = NATSBridge.smartreceive(msg, fileserverDownloadHandler) - for (dataname, data, type) in env["payloads"] - println("Received $dataname: $data") - end - end - - # Keep listening for 120 seconds - sleep(120) - NATS.drain(conn) -end - -test_receive() -``` - --- ## API Reference +### Unified API Standard + +All platforms use the same input/output format for payloads: + +**Input format for smartsend:** +``` +[(dataname1, data1, type1), (dataname2, data2, type2), ...] +``` + +**Output format for smartreceive:** +``` +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + ### smartsend Sends data either directly via NATS or via a fileserver URL, depending on payload size. @@ -231,27 +308,96 @@ Sends data either directly via NATS or via a fileserver URL, depending on payloa using NATSBridge env, env_json_str = NATSBridge.smartsend( - subject, # NATS subject + subject::String, # NATS subject data::AbstractArray{Tuple{String, Any, String}}; # List of (dataname, data, type) broker_url::String = "nats://localhost:4222", fileserver_url = "http://localhost:8080", fileserver_upload_handler::Function = plik_oneshot_upload, size_threshold::Int = 1_000_000, - correlation_id::String = string(uuid4()), # Correlation ID for tracing (auto-generated UUID) + correlation_id::String = string(uuid4()), msg_purpose::String = "chat", sender_name::String = "NATSBridge", receiver_name::String = "", receiver_id::String = "", reply_to::String = "", reply_to_msg_id::String = "", - is_publish::Bool = true, # Whether to automatically publish to NATS - NATS_connection::Union{NATS.Connection, Nothing} = nothing, # Pre-existing NATS connection (optional, saves connection overhead) - msg_id::String = string(uuid4()), # Message ID (auto-generated UUID) - sender_id::String = string(uuid4()) # Sender ID (auto-generated UUID) + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) ) # Returns: ::Tuple{msg_envelope_v1, String} -# - env: msg_envelope_v1 object with all envelope metadata and payloads -# - env_json_str: JSON string representation of the envelope for publishing +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +const [env, env_json_str] = await NATSBridge.smartsend( + subject, + data, // Array of [dataname, data, type] tuples + { + broker_url: 'nats://localhost:4222', + fileserver_url: 'http://localhost:8080', + fileserver_upload_handler: NATSBridge.plikOneshotUpload, + size_threshold: 1_000_000, + correlation_id: uuidv4(), + msg_purpose: 'chat', + sender_name: 'NATSBridge', + receiver_name: '', + receiver_id: '', + reply_to: '', + reply_to_msg_id: '', + is_publish: true, + nats_connection: null, + msg_id: uuidv4(), + sender_id: uuidv4() + } +); +// Returns: Promise<[env, env_json_str]> +``` + +#### Python + +```python +from natbridge import NATSBridge + +env, env_json_str = await NATSBridge.smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = "nats://localhost:4222", + fileserver_url: str = "http://localhost:8080", + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = 1_000_000, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) +# Returns: Tuple[Dict, str] +``` + +#### MicroPython + +```python +from natbridge import NATSBridge + +# Limited to direct transport (< 100KB threshold) +env, env_json_str = NATSBridge.smartsend( + subject, + data, # List of (dataname, data, type) tuples + broker_url="nats://localhost:4222", + size_threshold=100000 # Lower threshold for memory constraints +) +# Returns: Tuple[Dict, str] ``` ### smartreceive @@ -263,7 +409,6 @@ Receives and processes messages from NATS, handling both direct and link transpo ```julia using NATSBridge -# Note: msg is a NATS.Msg object passed from the subscription callback env = NATSBridge.smartreceive( msg::NATS.Msg; fileserver_download_handler::Function = _fetch_with_backoff, @@ -271,51 +416,63 @@ env = NATSBridge.smartreceive( base_delay::Int = 100, max_delay::Int = 5000 ) -# Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 +# Returns: ::JSON.Object{String, Any} ``` -### publish_message +#### JavaScript -Publish a message to a NATS subject. This function is available in Julia with two overloads: +```javascript +const env = await NATSBridge.smartreceive( + msg, + { + fileserver_download_handler: NATSBridge.fetchWithBackoff, + max_retries: 5, + base_delay: 100, + max_delay: 5000 + } +); +// Returns: Promise +``` -#### Julia +#### Python -**Using broker URL (creates new connection):** -```julia -using NATSBridge, NATS - -# Publish with URL - creates a new connection -NATSBridge.publish_message( - "nats://localhost:4222", # broker_url - "/chat/room1", # subject - "{\"correlation_id\":\"abc123\"}", # message - "abc123" # correlation_id +```python +env = await NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff, + max_retries=5, + base_delay=100, + max_delay=5000 ) +# Returns: Dict with "payloads" key ``` -**Using pre-existing connection (saves connection overhead):** -```julia -using NATSBridge, NATS +#### MicroPython -# Create connection once and reuse -conn = NATS.connect("nats://localhost:4222") -NATSBridge.publish_message(conn, "/chat/room1", "{\"correlation_id\":\"abc123\"}", "abc123") -# Connection is automatically drained after publish +```python +env = NATSBridge.smartreceive( + msg, + fileserver_download_handler=_sync_fileserver_download, + max_retries=3, + base_delay=100, + max_delay=1000 +) +# Returns: Dict with "payloads" key ``` --- ## Payload Types -| Type | Description | Serialization | -|------|-------------|---------------| -| `text` | Plain text strings | UTF-8 bytes | -| `dictionary` | JSON-serializable dictionaries | JSON | -| `table` | Tabular data (DataFrames, arrays) | Apache Arrow IPC | -| `image` | Image data (PNG, JPG) | Raw bytes | -| `audio` | Audio data (WAV, MP3) | Raw bytes | -| `video` | Video data (MP4, AVI) | Raw bytes | -| `binary` | Generic binary data | Raw bytes | +| Type | Julia | JavaScript | Python | MicroPython | Description | +|------|-------|------------|--------|-------------|-------------| +| `text` | `String` | `string` | `str` | `str` | Plain text strings | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | JSON-serializable dictionaries | +| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ | Tabular data (Arrow IPC) | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Image data (PNG, JPG) | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Audio data (WAV, MP3) | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Video data (MP4, AVI) | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | Generic binary data | --- @@ -325,31 +482,60 @@ NATSBridge.publish_message(conn, "/chat/room1", "{\"correlation_id\":\"abc123\"} Small payloads are sent directly via NATS with Base64 encoding. -#### Julia +#### Cross-Platform + ```julia +# Julia data = [("message", "Hello", "text")] smartsend("/topic", data) ``` +```javascript +// JavaScript +const data = [["message", "Hello", "text"]]; +smartsend("/topic", data); +``` + +```python +# Python +data = [("message", "Hello", "text")] +await smartsend("/topic", data) +``` + ### Link Transport (Payloads >= 1MB) Large payloads are uploaded to an HTTP file server. -#### Julia +#### Cross-Platform + ```julia +# Julia data = [("file", large_data, "binary")] smartsend("/topic", data; fileserver_url="http://localhost:8080") ``` +```javascript +// JavaScript +const data = [["file", largeData, "binary"]]; +smartsend("/topic", data, { fileserver_url: 'http://localhost:8080' }); +``` + +```python +# Python +data = [("file", large_data, "binary")] +await smartsend("/topic", data, fileserver_url="http://localhost:8080") +``` + --- -## Examples +## Cross-Platform Examples ### Example 1: Chat with Mixed Content -Send text, small image, and large file in one message. +Send text, image, and large file in one message. #### Julia + ```julia using NATSBridge @@ -362,11 +548,48 @@ data = [ env, env_json_str = NATSBridge.smartsend("/chat/room1", data; fileserver_url="http://localhost:8080") ``` +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +const data = [ + ["message_text", "Hello!", "text"], + ["user_avatar", imageData, "image"], + ["large_document", largeFileData, "binary"] +]; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat/room1", + data, + { fileserver_url: 'http://localhost:8080' } +); +``` + +#### Python + +```python +from natbridge import NATSBridge + +data = [ + ("message_text", "Hello!", "text"), + ("user_avatar", image_data, "image"), + ("large_document", large_file_data, "binary") +] + +env, env_json_str = await NATSBridge.smartsend( + "/chat/room1", + data, + fileserver_url="http://localhost:8080" +) +``` + ### Example 2: Dictionary Exchange Send configuration data between platforms. #### Julia + ```julia using NATSBridge @@ -380,11 +603,44 @@ data = [("config", config, "dictionary")] env, env_json_str = NATSBridge.smartsend("/device/config", data) ``` +#### JavaScript + +```javascript +const NATSBridge = require('natbridge'); + +const config = { + wifi_ssid: "MyNetwork", + wifi_password: "password123", + update_interval: 60 +}; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/device/config", + [["config", config, "dictionary"]] +); +``` + +#### Python + +```python +from natbridge import NATSBridge + +config = { + "wifi_ssid": "MyNetwork", + "wifi_password": "password123", + "update_interval": 60 +} + +data = [("config", config, "dictionary")] +env, env_json_str = await NATSBridge.smartsend("/device/config", data) +``` + ### Example 3: Table Data (Arrow IPC) Send tabular data using Apache Arrow IPC format. #### Julia + ```julia using NATSBridge using DataFrames @@ -399,14 +655,49 @@ data = [("students", df, "table")] env, env_json_str = NATSBridge.smartsend("/data/analysis", data) ``` -### Example 4: Request-Response Pattern with Envelope JSON +#### JavaScript -Bi-directional communication with reply-to support. The `smartsend` function now returns both the envelope object and a JSON string that can be published directly. +```javascript +const NATSBridge = require('natbridge'); + +const df = [ + { id: 1, name: "Alice", score: 95 }, + { id: 2, name: "Bob", score: 88 }, + { id: 3, name: "Charlie", score: 92 } +]; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/data/analysis", + [["students", df, "table"]] +); +``` + +#### Python + +```python +from natbridge import NATSBridge +import pandas as pd + +df = pd.DataFrame({ + "id": [1, 2, 3], + "name": ["Alice", "Bob", "Charlie"], + "score": [95, 88, 92] +}) + +data = [("students", df, "table")] +env, env_json_str = await NATSBridge.smartsend("/data/analysis", data) +``` + +### Example 4: Request-Response Pattern + +Bi-directional communication with reply-to support. + +#### Julia -#### Julia (Requester) ```julia using NATSBridge +# Requester env, env_json_str = NATSBridge.smartsend( "/device/command", [("command", Dict("action" => "read_sensor"), "dictionary")]; @@ -415,26 +706,20 @@ env, env_json_str = NATSBridge.smartsend( ) ``` -#### Julia (Responder) ```julia +# Responder using NATS, NATSBridge -# Configuration -const SUBJECT = "/device/command" -const NATS_URL = "nats://localhost:4222" - function test_responder() - conn = NATS.connect(NATS_URL) - NATS.subscribe(conn, SUBJECT) do msg + conn = NATS.connect("nats://localhost:4222") + NATS.subscribe(conn, "/device/command") do msg env = NATSBridge.smartreceive(msg, fileserver_download_handler=_fetch_with_backoff) - # Extract reply_to from the envelope metadata reply_to = env["reply_to"] for (dataname, data, type) in env["payloads"] if dataname == "command" && data["action"] == "read_sensor" response = Dict("sensor_id" => "sensor-001", "value" => 42.5) - # Send response to the reply_to subject from the request if !isempty(reply_to) smartsend(reply_to, [("data", response, "dictionary")]) end @@ -445,51 +730,118 @@ function test_responder() sleep(120) NATS.drain(conn) end - -test_responder() ``` -### Example 5: IoT Device Sensor Data +#### JavaScript -IoT device sending sensor data. +```javascript +const NATSBridge = require('natbridge'); -#### Julia (Receiver) -```julia -using NATS, NATSBridge +// Requester +const [env, env_json_str] = await NATSBridge.smartsend( + "/device/command", + [["command", { action: "read_sensor" }, "dictionary"]], + { broker_url: 'nats://localhost:4222', reply_to: '/device/response' } +); +``` -# Configuration -const SUBJECT = "/device/sensors" -const NATS_URL = "nats://localhost:4222" +```javascript +// Responder +const nats = require('nats'); +const NATSBridge = require('natbridge'); -function test_receiver() - conn = NATS.connect(NATS_URL) - NATS.subscribe(conn, SUBJECT) do msg - env, env_json_str = NATSBridge.smartreceive(msg, fileserverDownloadHandler) - for (dataname, data, type) in env["payloads"] - if dataname == "temperature" - println("Temperature: $data") - elseif dataname == "humidity" - println("Humidity: $data") - end - end - end +async function testResponder() { + const conn = await nats.connect('nats://localhost:4222'); - sleep(120) - NATS.drain(conn) -end + const subscription = await conn.subscribe('/device/command'); + + for await (const msg of subscription) { + const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: NATSBridge.fetchWithBackoff + }); + + const replyTo = env.reply_to; + + for (const [dataname, data, type] of env.payloads) { + if (dataname === 'command' && data.action === 'read_sensor') { + const response = { sensor_id: 'sensor-001', value: 42.5 }; + if (replyTo) { + await NATSBridge.smartsend( + replyTo, + [["data", response, "dictionary"]] + ); + } + } + } + } + + setTimeout(() => conn.close(), 120000); +} +``` -test_receiver() +#### Python + +```python +from natbridge import NATSBridge + +# Requester +env, env_json_str = await NATSBridge.smartsend( + "/device/command", + [("command", {"action": "read_sensor"}, "dictionary")], + broker_url="nats://localhost:4222", + reply_to="/device/response" +) +``` + +```python +# Responder +from natbridge import NATSBridge +import asyncio +import nats + +async def test_responder(): + nc = await nats.connect('nats://localhost:4222') + + async def msg_handler(msg): + env = await NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff + ) + + reply_to = env["reply_to"] + + for dataname, data, type_ in env["payloads"]: + if dataname == "command" and data["action"] == "read_sensor": + response = {"sensor_id": "sensor-001", "value": 42.5} + if reply_to: + await NATSBridge.smartsend( + reply_to, + [("data", response, "dictionary")] + ) + + await nc.subscribe('/device/command', cb=msg_handler) + + await asyncio.sleep(120) + await nc.drain() ``` --- ## Testing -Run the test scripts to verify functionality: +### Test File Organization -### Julia +| Platform | Sender Tests | Receiver Tests | +|----------|--------------|----------------| +| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | +| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | +| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | -```julia +### Run Tests + +#### Julia + +```bash # Text message exchange julia test/test_julia_text_sender.jl julia test/test_julia_text_receiver.jl @@ -511,6 +863,55 @@ julia test/test_julia_table_sender.jl julia test/test_julia_table_receiver.jl ``` +#### JavaScript (Node.js) + +```bash +# Text message exchange +node test/test_js_text_sender.js +node test/test_js_text_receiver.js + +# Dictionary exchange +node test/test_js_dictionary_sender.js +node test/test_js_dictionary_receiver.js + +# Binary transfer +node test/test_js_binary_sender.js +node test/test_js_binary_receiver.js + +# Table exchange +node test/test_js_table_sender.js +node test/test_js_table_receiver.js +``` + +#### Python + +```bash +# Text message exchange +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py + +# Dictionary exchange +python3 test/test_py_dictionary_sender.py +python3 test/test_py_dictionary_receiver.py + +# Binary transfer +python3 test/test_py_binary_sender.py +python3 test/test_py_binary_receiver.py + +# Table exchange +python3 test/test_py_table_sender.py +python3 test/test_py_table_receiver.py +``` + +--- + +## Documentation + +For detailed architecture and implementation information, see: + +- [Architecture Documentation](docs/architecture.md) - Cross-platform architecture, API parity, platform-specific patterns +- [Implementation Guide](docs/implementation.md) - Detailed implementation for each platform, handler functions, testing + --- ## License diff --git a/image/tutorial.md b/examples/tutorial.md similarity index 95% rename from image/tutorial.md rename to examples/tutorial.md index e19e6d7..0969849 100644 --- a/image/tutorial.md +++ b/examples/tutorial.md @@ -121,13 +121,13 @@ using NATSBridge # Send a text message data = [("message", "Hello World", "text")] env, env_json_str = smartsend("/chat/room1", data, broker_url="nats://localhost:4222") -# env: msg_envelope_v1 object with all metadata and payloads +# env: msg_envelope_v1 struct with all metadata and payloads # env_json_str: JSON string representation of the envelope for publishing println("Message sent!") # Or use is_publish=false to get envelope and JSON without publishing env, env_json_str = smartsend("/chat/room1", data, broker_url="nats://localhost:4222", is_publish=false) -# env: msg_envelope_v1 object +# env: msg_envelope_v1 struct # env_json_str: JSON string for publishing to NATS ``` @@ -178,6 +178,8 @@ env, env_json_str = await smartsend( broker_url="nats://localhost:4222", is_publish=False ) +# env: Dict with all metadata and payloads +# env_json_str: JSON string for publishing to NATS ``` #### MicroPython @@ -206,7 +208,8 @@ using NATSBridge # Receive and process message env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) -# Returns: ::JSON.Object{String, Any} - key-value structure resemble msg_envelope_v1 +# Returns: ::JSON.Object{String, Any} with "payloads" field containing Vector{Tuple{String, Any, String}} +# Access payloads: for (dataname, data, type) in env["payloads"] for (dataname, data, type) in env["payloads"] println("Received $dataname: $data") end @@ -230,7 +233,7 @@ for (const [dataname, data, type] of env.payloads) { #### Python ```python -from natbridge import smartreceive +from natbridge import smartreceive, fetch_with_backoff # Receive and process message env = await smartreceive( @@ -238,7 +241,7 @@ env = await smartreceive( fileserver_download_handler=fetch_with_backoff ) # env["payloads"] = [(dataname, data, type), ...] -for dataname, data, type in env["payloads"]: +for dataname, data, type_ in env["payloads"]: print(f"Received {dataname}: {data}") ``` @@ -497,6 +500,7 @@ env, env_json_str = smartsend( ) println("File uploaded to: $(env.payloads[1].data)") +# Note: For link transport, data field contains the URL string ``` #### JavaScript @@ -520,6 +524,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( ); console.log("File uploaded to:", env.payloads[0].data); +// Note: For link transport, data field contains the URL string ``` #### Python @@ -539,6 +544,7 @@ env, env_json_str = await smartsend( ) print(f"File uploaded to: {env['payloads'][0]['data']}") +# Note: For link transport, data field contains the URL string ``` #### MicroPython @@ -619,6 +625,7 @@ env, env_json_str = await smartsend( data, broker_url="nats://localhost:4222" ) +# env: Dict with all metadata and payloads ``` ### Example 6: Table Data (Arrow IPC) diff --git a/image/walkthrough.md b/examples/walkthrough.md similarity index 96% rename from image/walkthrough.md rename to examples/walkthrough.md index decd77e..a8d8efc 100644 --- a/image/walkthrough.md +++ b/examples/walkthrough.md @@ -435,7 +435,7 @@ class ChatHandler: } self.ui.add_message(sender, '', attachment) else: - # For other types, use file server URL + # For other types, use file server URL or data attachment = {'type': type_, 'data': data} self.ui.add_message(sender, '', attachment) ``` @@ -588,7 +588,7 @@ class FileUploadService: self.broker_url = broker_url self.fileserver_url = fileserver_url - async def upload_file(self, file_path: str, recipient: str) -> dict: + async def upload_file(self, file_path: str, recipient: str) -> tuple: with open(file_path, "rb") as f: file_data = f.read() file_name = os.path.basename(file_path) @@ -602,9 +602,9 @@ class FileUploadService: fileserver_url=self.fileserver_url ) - return env + return env, env_json_str - async def upload_large_file(self, file_path: str, recipient: str) -> dict: + async def upload_large_file(self, file_path: str, recipient: str) -> tuple: file_size = os.path.getsize(file_path) if file_size > 100 * 1024 * 1024: # > 100MB @@ -613,7 +613,7 @@ class FileUploadService: return await self.upload_file(file_path, recipient) - async def stream_upload(self, file_path: str, recipient: str) -> dict: + async def stream_upload(self, file_path: str, recipient: str) -> tuple: # Implement streaming upload to file server # This would require a more sophisticated file server # For now, we'll use the standard upload @@ -1098,33 +1098,24 @@ class SensorSender: # Convert to Arrow IPC import pyarrow as arrow - import pyarrow.feather as feather + import pyarrow.ipc as ipc import io table = arrow.Table.from_pandas(df) buf = io.BytesIO() - with feather.FeatherWriter(buf, table) as writer: - pass - buf.seek(0) - arrow_data = buf.read() + sink = ipc.new_file(buf, table.schema) + ipc.write_table(table, sink) + sink.close() + arrow_data = buf.getvalue() - # Send based on size - if len(arrow_data) < 1048576: - data = [("batch", arrow_data, "table")] - await smartsend( - "/sensors/batch", - data, - broker_url=self.broker_url, - fileserver_url=self.fileserver_url - ) - else: - data = [("batch", arrow_data, "table")] - await smartsend( - "/sensors/batch", - data, - broker_url=self.broker_url, - fileserver_url=self.fileserver_url - ) + # Send based on size (auto-selected by smartsend) + data = [("batch", arrow_data, "table")] + await smartsend( + "/sensors/batch", + data, + broker_url=self.broker_url, + fileserver_url=self.fileserver_url + ) ``` --- @@ -1242,13 +1233,16 @@ end ```python # Reuse NATS connections +import asyncio +import nats + class ConnectionPool: def __init__(self): self.connections = {} - def get_connection(self, nats_url: str): + async def get_connection(self, nats_url: str): if nats_url not in self.connections: - self.connections[nats_url] = asyncio.run(nats.connect(nats_url)) + self.connections[nats_url] = await nats.connect(nats_url) return self.connections[nats_url] async def close_all(self): @@ -1286,18 +1280,20 @@ end ```python # Cache file server responses +import asyncio import threading +from natbridge import fetch_with_backoff file_cache = {} cache_lock = threading.Lock() -def fetch_with_caching(url, max_retries, base_delay, max_delay, correlation_id): +async def fetch_with_caching(url, max_retries, base_delay, max_delay, correlation_id): with cache_lock: if url in file_cache: return file_cache[url] # Fetch from file server - data = asyncio.run(fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id)) + data = await fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id) # Cache the result with cache_lock: @@ -1341,7 +1337,13 @@ async function safeSmartSend(subject, data, options = {}) { #### Python ```python -async def safe_smartsend(subject: str, data: List[tuple], **kwargs): +from typing import List, Tuple, Optional, Union + +async def safe_smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + **kwargs +) -> Optional[Tuple[dict, str]]: try: return await smartsend(subject, data, **kwargs) except Exception as error: @@ -1369,10 +1371,11 @@ end ```python import logging +from typing import List, Tuple, Any logger = logging.getLogger(__name__) -def log_send(subject: str, data: List[tuple], correlation_id: str): +def log_send(subject: str, data: List[Tuple[str, Any, str]], correlation_id: str): logger.info(f"Sending to {subject}: {len(data)} payloads, correlation_id={correlation_id}") def log_receive(correlation_id: str, num_payloads: int): diff --git a/updated_README.md b/updated_README.md deleted file mode 100644 index be22435..0000000 --- a/updated_README.md +++ /dev/null @@ -1,939 +0,0 @@ -# NATSBridge - Cross-Platform Bi-Directional Data Bridge - -A high-performance, bi-directional data bridge for **Julia, JavaScript, Python, and MicroPython** applications using NATS (Core & JetStream), implementing the Claim-Check pattern for large payloads. - -[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) -[![NATS](https://img.shields.io/badge/NATS-Enabled-green.svg)](https://nats.io) - ---- - -## Table of Contents - -- [Overview](#overview) -- [Cross-Platform Support](#cross-platform-support) -- [Features](#features) -- [Architecture](#architecture) -- [Installation](#installation) -- [Quick Start](#quick-start) -- [API Reference](#api-reference) -- [Payload Types](#payload-types) -- [Transport Strategies](#transport-strategies) -- [Cross-Platform Examples](#cross-platform-examples) -- [Testing](#testing) -- [License](#license) - ---- - -## Overview - -NATSBridge enables seamless communication across multiple platforms through NATS, with intelligent transport selection based on payload size: - -| Transport | Payload Size | Method | -|-----------|--------------|--------| -| **Direct** | < 1MB | Sent directly via NATS (Base64 encoded) | -| **Link** | >= 1MB | Uploaded to HTTP file server, URL sent via NATS | - -### Use Cases - -- **Chat Applications**: Text, images, audio, video in a single message -- **File Transfer**: Efficient transfer of large files using claim-check pattern -- **IoT/Embedded**: Sensor data, telemetry, and analytics pipelines (MicroPython) -- **Cross-Platform Communication**: Interoperability between Julia, JavaScript, Python, and MicroPython systems - ---- - -## Cross-Platform Support - -| Platform | Implementation | Features | -|----------|----------------|----------| -| **Julia** | [`src/NATSBridge.jl`](src/NATSBridge.jl) | Full feature set, Arrow IPC, multiple dispatch | -| **JavaScript** | [`src/natbridge.js`](src/natbridge.js) | Node.js & browser, async/await | -| **Python** | [`src/natbridge.py`](src/natbridge.py) | Desktop Python, asyncio, type hints | -| **MicroPython** | [`src/natbridge_mpy.py`](src/natbridge_mpy.py) | Memory-constrained, synchronous API | - -### Platform Comparison - -| Feature | Julia | JavaScript | Python | MicroPython | -|---------|-------|------------|--------|-------------| -| Multiple Dispatch | ✅ Native | ❌ | ❌ | ❌ | -| Async/Await | ❌ | ✅ Native | ✅ Native | ⚠️ (uasyncio) | -| Type Safety | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | -| Memory Management | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | -| Arrow IPC | ✅ Native | ✅ | ✅ | ❌ | -| Direct Transport | ✅ | ✅ | ✅ | ✅ | -| Link Transport | ✅ | ✅ | ✅ | ⚠️ (Limited) | -| Handler Functions | ✅ | ✅ | ✅ | ✅ | -| Cross-Platform API | ✅ | ✅ | ✅ | ✅ | - ---- - -## Features - -- ✅ **Cross-platform messaging** for Julia, JavaScript, Python, and MicroPython applications -- ✅ **Bi-directional messaging** with request-reply patterns -- ✅ **Multi-payload support** - send multiple payloads with different types in one message -- ✅ **Automatic transport selection** - direct vs link based on payload size -- ✅ **Claim-Check pattern** for payloads > 1MB -- ✅ **Apache Arrow IPC** support for tabular data (zero-copy reading) -- ✅ **Exponential backoff** for reliable file server downloads -- ✅ **Correlation ID tracking** for message tracing -- ✅ **Reply-to support** for request-response patterns -- ✅ **Handler function abstraction** - pluggable file server implementations (Plik, AWS S3, custom) - ---- - -## Architecture - -### System Components - -```mermaid -flowchart TB - subgraph Sender["Application (Sender)"] - SenderApp[App Code] - NATSBridge_Send[NATSBridge] - NATS_Client[NATS.jl] - end - - subgraph Receiver["Application (Receiver)"] - ReceiverApp[App Code] - NATSBridge_Recv[NATSBridge] - NATS_Client_Recv[NATS.jl] - end - - subgraph Infrastructure["Infrastructure"] - NATS[NATS Server
Message Broker] - FileServer[HTTP File Server
Upload/Download] - end - - SenderApp --> NATSBridge_Send - NATSBridge_Send --> NATS_Client - NATS_Client --> NATS - - NATS --> NATS_Client_Recv - NATS_Client_Recv --> NATSBridge_Recv - NATSBridge_Recv --> ReceiverApp - - NATSBridge_Send -.->|HTTP POST upload| FileServer - FileServer -.->|HTTP GET download| NATSBridge_Recv - - style SenderApp fill:#e8f5e9 - style ReceiverApp fill:#e8f5e9 - style NATS fill:#fff3e0 - style FileServer fill:#f3e5f5 -``` - -### Message Flow - -1. **Sender** creates a message envelope with payloads using `smartsend()` -2. **NATSBridge** serializes and encodes each payload based on type -3. **Transport Decision**: - - **Direct** (< 1MB): Payload encoded as Base64, published to NATS - - **Link** (≥ 1MB): Payload uploaded to HTTP file server, URL published to NATS -4. **NATS** routes message envelope to subscribers -5. **Receiver** receives message via NATS subscription callback -6. **NATSBridge** processes envelope: - - Decodes Base64 payloads from NATS message - - Fetches URLs from file server with exponential backoff -7. **Receiver** deserializes payloads based on their type - -### File Server Handler Abstraction - -The system uses handler functions to abstract file server operations: - -| Handler | Purpose | -|---------|---------| -| `plik_oneshot_upload()` / `plikOneshotUpload()` | Uploads payload bytes to file server, returns URL | -| `_fetch_with_backoff()` / `fetchWithBackoff()` | Downloads data from URL with exponential backoff retry | - -This abstraction allows support for different file server implementations (Plik, AWS S3, custom HTTP server). - -### Message Envelope Schema - -All platforms use identical JSON schemas for message envelopes: - -```json -{ - "correlation_id": "uuid-v4-string", - "msg_id": "uuid-v4-string", - "timestamp": "2024-01-15T10:30:00Z", - "send_to": "topic/subject", - "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", - "sender_name": "agent-wine-web-frontend", - "sender_id": "uuid4", - "receiver_name": "agent-backend", - "receiver_id": "uuid4", - "reply_to": "topic", - "reply_to_msg_id": "uuid4", - "broker_url": "nats://localhost:4222", - "metadata": {}, - "payloads": [ - { - "id": "uuid4", - "dataname": "login_image", - "payload_type": "image", - "transport": "direct", - "encoding": "base64", - "size": 15433, - "data": "base64-encoded-string" - }, - { - "id": "uuid4", - "dataname": "large_table", - "payload_type": "table", - "transport": "link", - "encoding": "none", - "size": 524288, - "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow" - } - ] -} -``` - ---- - -## Installation - -### Prerequisites - -- **NATS Server** (v2.10+ recommended) -- **HTTP File Server** (optional, for payloads > 1MB) - -### Platform-Specific Dependencies - -#### Julia - -```julia -using Pkg -Pkg.add("NATS") -Pkg.add("Arrow") -Pkg.add("JSON3") -Pkg.add("HTTP") -Pkg.add("UUIDs") -Pkg.add("Dates") -``` - -#### JavaScript (Node.js) - -```bash -npm install nats uuid apache-arrow node-fetch -# or -yarn add nats uuid apache-arrow node-fetch -``` - -#### JavaScript (Browser) - -```bash -npm install nats uuid apache-arrow -# or use CDN: -# https://unpkg.com/nats-js/dist/bundle/nats.min.js -# https://unpkg.com/apache-arrow/arrow.min.js -``` - -#### Python (Desktop) - -```bash -pip install nats-py aiohttp pyarrow pandas python-dateutil -``` - -#### MicroPython - -MicroPython uses built-in modules: -- `network` - NATS connection (custom implementation) -- `time` - Timestamps -- `uos` - File operations -- `base64` - Base64 encoding -- `json` - JSON parsing -- `struct` - Binary data handling - ---- - -## Quick Start - -### Step 1: Start NATS Server - -```bash -docker run -p 4222:4222 nats:latest -``` - -### Step 2: Start HTTP File Server (Optional) - -```bash -# Create a directory for file uploads -mkdir -p /tmp/fileserver - -# Start HTTP file server -python3 -m http.server 8080 --directory /tmp/fileserver -``` - ---- - -## API Reference - -### Unified API Standard - -All platforms use the same input/output format for payloads: - -**Input format for smartsend:** -``` -[(dataname1, data1, type1), (dataname2, data2, type2), ...] -``` - -**Output format for smartreceive:** -``` -{ - "correlation_id": "...", - "msg_id": "...", - "timestamp": "...", - "send_to": "...", - "msg_purpose": "...", - "sender_name": "...", - "sender_id": "...", - "receiver_name": "...", - "receiver_id": "...", - "reply_to": "...", - "reply_to_msg_id": "...", - "broker_url": "...", - "metadata": {...}, - "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -} -``` - -### smartsend - -Sends data either directly via NATS or via a fileserver URL, depending on payload size. - -#### Julia - -```julia -using NATSBridge - -env, env_json_str = NATSBridge.smartsend( - subject::String, # NATS subject - data::AbstractArray{Tuple{String, Any, String}}; # List of (dataname, data, type) - broker_url::String = "nats://localhost:4222", - fileserver_url = "http://localhost:8080", - fileserver_upload_handler::Function = plik_oneshot_upload, - size_threshold::Int = 1_000_000, - correlation_id::String = string(uuid4()), - msg_purpose::String = "chat", - sender_name::String = "NATSBridge", - receiver_name::String = "", - receiver_id::String = "", - reply_to::String = "", - reply_to_msg_id::String = "", - is_publish::Bool = true, - NATS_connection::Union{NATS.Connection, Nothing} = nothing, - msg_id::String = string(uuid4()), - sender_id::String = string(uuid4()) -) -# Returns: ::Tuple{msg_envelope_v1, String} -``` - -#### JavaScript - -```javascript -const NATSBridge = require('natbridge'); - -const [env, env_json_str] = await NATSBridge.smartsend( - subject, - data, // Array of [dataname, data, type] tuples - { - broker_url: 'nats://localhost:4222', - fileserver_url: 'http://localhost:8080', - fileserver_upload_handler: NATSBridge.plikOneshotUpload, - size_threshold: 1_000_000, - correlation_id: uuidv4(), - msg_purpose: 'chat', - sender_name: 'NATSBridge', - receiver_name: '', - receiver_id: '', - reply_to: '', - reply_to_msg_id: '', - is_publish: true, - nats_connection: null, - msg_id: uuidv4(), - sender_id: uuidv4() - } -); -// Returns: Promise<[env, env_json_str]> -``` - -#### Python - -```python -from natbridge import NATSBridge - -env, env_json_str = await NATSBridge.smartsend( - subject: str, - data: List[Tuple[str, Any, str]], - broker_url: str = "nats://localhost:4222", - fileserver_url: str = "http://localhost:8080", - fileserver_upload_handler: Callable = plik_oneshot_upload, - size_threshold: int = 1_000_000, - correlation_id: str = None, - msg_purpose: str = "chat", - sender_name: str = "NATSBridge", - receiver_name: str = "", - receiver_id: str = "", - reply_to: str = "", - reply_to_msg_id: str = "", - is_publish: bool = True, - nats_connection: Any = None, - msg_id: str = None, - sender_id: str = None -) -# Returns: Tuple[Dict, str] -``` - -#### MicroPython - -```python -from natbridge import NATSBridge - -# Limited to direct transport (< 100KB threshold) -env, env_json_str = NATSBridge.smartsend( - subject, - data, # List of (dataname, data, type) tuples - broker_url="nats://localhost:4222", - size_threshold=100000 # Lower threshold for memory constraints -) -# Returns: Tuple[Dict, str] -``` - -### smartreceive - -Receives and processes messages from NATS, handling both direct and link transport. - -#### Julia - -```julia -using NATSBridge - -env = NATSBridge.smartreceive( - msg::NATS.Msg; - fileserver_download_handler::Function = _fetch_with_backoff, - max_retries::Int = 5, - base_delay::Int = 100, - max_delay::Int = 5000 -) -# Returns: ::JSON.Object{String, Any} -``` - -#### JavaScript - -```javascript -const env = await NATSBridge.smartreceive( - msg, - { - fileserver_download_handler: NATSBridge.fetchWithBackoff, - max_retries: 5, - base_delay: 100, - max_delay: 5000 - } -); -// Returns: Promise -``` - -#### Python - -```python -env = await NATSBridge.smartreceive( - msg, - fileserver_download_handler=fetch_with_backoff, - max_retries=5, - base_delay=100, - max_delay=5000 -) -# Returns: Dict with "payloads" key -``` - -#### MicroPython - -```python -env = NATSBridge.smartreceive( - msg, - fileserver_download_handler=_sync_fileserver_download, - max_retries=3, - base_delay=100, - max_delay=1000 -) -# Returns: Dict with "payloads" key -``` - ---- - -## Payload Types - -| Type | Julia | JavaScript | Python | MicroPython | Description | -|------|-------|------------|--------|-------------|-------------| -| `text` | `String` | `string` | `str` | `str` | Plain text strings | -| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | JSON-serializable dictionaries | -| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ | Tabular data (Arrow IPC) | -| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Image data (PNG, JPG) | -| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Audio data (WAV, MP3) | -| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Video data (MP4, AVI) | -| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | Generic binary data | - ---- - -## Transport Strategies - -### Direct Transport (Payloads < 1MB) - -Small payloads are sent directly via NATS with Base64 encoding. - -#### Cross-Platform - -```julia -# Julia -data = [("message", "Hello", "text")] -smartsend("/topic", data) -``` - -```javascript -// JavaScript -const data = [["message", "Hello", "text"]]; -smartsend("/topic", data); -``` - -```python -# Python -data = [("message", "Hello", "text")] -await smartsend("/topic", data) -``` - -### Link Transport (Payloads >= 1MB) - -Large payloads are uploaded to an HTTP file server. - -#### Cross-Platform - -```julia -# Julia -data = [("file", large_data, "binary")] -smartsend("/topic", data; fileserver_url="http://localhost:8080") -``` - -```javascript -// JavaScript -const data = [["file", largeData, "binary"]]; -smartsend("/topic", data, { fileserver_url: 'http://localhost:8080' }); -``` - -```python -# Python -data = [("file", large_data, "binary")] -await smartsend("/topic", data, fileserver_url="http://localhost:8080") -``` - ---- - -## Cross-Platform Examples - -### Example 1: Chat with Mixed Content - -Send text, image, and large file in one message. - -#### Julia - -```julia -using NATSBridge - -data = [ - ("message_text", "Hello!", "text"), - ("user_avatar", image_data, "image"), - ("large_document", large_file_data, "binary") -] - -env, env_json_str = NATSBridge.smartsend("/chat/room1", data; fileserver_url="http://localhost:8080") -``` - -#### JavaScript - -```javascript -const NATSBridge = require('natbridge'); - -const data = [ - ["message_text", "Hello!", "text"], - ["user_avatar", imageData, "image"], - ["large_document", largeFileData, "binary"] -]; - -const [env, env_json_str] = await NATSBridge.smartsend( - "/chat/room1", - data, - { fileserver_url: 'http://localhost:8080' } -); -``` - -#### Python - -```python -from natbridge import NATSBridge - -data = [ - ("message_text", "Hello!", "text"), - ("user_avatar", image_data, "image"), - ("large_document", large_file_data, "binary") -] - -env, env_json_str = await NATSBridge.smartsend( - "/chat/room1", - data, - fileserver_url="http://localhost:8080" -) -``` - -### Example 2: Dictionary Exchange - -Send configuration data between platforms. - -#### Julia - -```julia -using NATSBridge - -config = Dict( - "wifi_ssid" => "MyNetwork", - "wifi_password" => "password123", - "update_interval" => 60 -) - -data = [("config", config, "dictionary")] -env, env_json_str = NATSBridge.smartsend("/device/config", data) -``` - -#### JavaScript - -```javascript -const NATSBridge = require('natbridge'); - -const config = { - wifi_ssid: "MyNetwork", - wifi_password: "password123", - update_interval: 60 -}; - -const [env, env_json_str] = await NATSBridge.smartsend( - "/device/config", - [["config", config, "dictionary"]] -); -``` - -#### Python - -```python -from natbridge import NATSBridge - -config = { - "wifi_ssid": "MyNetwork", - "wifi_password": "password123", - "update_interval": 60 -} - -data = [("config", config, "dictionary")] -env, env_json_str = await NATSBridge.smartsend("/device/config", data) -``` - -### Example 3: Table Data (Arrow IPC) - -Send tabular data using Apache Arrow IPC format. - -#### Julia - -```julia -using NATSBridge -using DataFrames - -df = DataFrame( - id = [1, 2, 3], - name = ["Alice", "Bob", "Charlie"], - score = [95, 88, 92] -) - -data = [("students", df, "table")] -env, env_json_str = NATSBridge.smartsend("/data/analysis", data) -``` - -#### JavaScript - -```javascript -const NATSBridge = require('natbridge'); - -const df = [ - { id: 1, name: "Alice", score: 95 }, - { id: 2, name: "Bob", score: 88 }, - { id: 3, name: "Charlie", score: 92 } -]; - -const [env, env_json_str] = await NATSBridge.smartsend( - "/data/analysis", - [["students", df, "table"]] -); -``` - -#### Python - -```python -from natbridge import NATSBridge -import pandas as pd - -df = pd.DataFrame({ - "id": [1, 2, 3], - "name": ["Alice", "Bob", "Charlie"], - "score": [95, 88, 92] -}) - -data = [("students", df, "table")] -env, env_json_str = await NATSBridge.smartsend("/data/analysis", data) -``` - -### Example 4: Request-Response Pattern - -Bi-directional communication with reply-to support. - -#### Julia - -```julia -using NATSBridge - -# Requester -env, env_json_str = NATSBridge.smartsend( - "/device/command", - [("command", Dict("action" => "read_sensor"), "dictionary")]; - broker_url="nats://localhost:4222", - reply_to="/device/response" -) -``` - -```julia -# Responder -using NATS, NATSBridge - -function test_responder() - conn = NATS.connect("nats://localhost:4222") - NATS.subscribe(conn, "/device/command") do msg - env = NATSBridge.smartreceive(msg, fileserver_download_handler=_fetch_with_backoff) - - reply_to = env["reply_to"] - - for (dataname, data, type) in env["payloads"] - if dataname == "command" && data["action"] == "read_sensor" - response = Dict("sensor_id" => "sensor-001", "value" => 42.5) - if !isempty(reply_to) - smartsend(reply_to, [("data", response, "dictionary")]) - end - end - end - end - - sleep(120) - NATS.drain(conn) -end -``` - -#### JavaScript - -```javascript -const NATSBridge = require('natbridge'); - -// Requester -const [env, env_json_str] = await NATSBridge.smartsend( - "/device/command", - [["command", { action: "read_sensor" }, "dictionary"]], - { broker_url: 'nats://localhost:4222', reply_to: '/device/response' } -); -``` - -```javascript -// Responder -const nats = require('nats'); -const NATSBridge = require('natbridge'); - -async function testResponder() { - const conn = await nats.connect('nats://localhost:4222'); - - const subscription = await conn.subscribe('/device/command'); - - for await (const msg of subscription) { - const env = await NATSBridge.smartreceive(msg, { - fileserver_download_handler: NATSBridge.fetchWithBackoff - }); - - const replyTo = env.reply_to; - - for (const [dataname, data, type] of env.payloads) { - if (dataname === 'command' && data.action === 'read_sensor') { - const response = { sensor_id: 'sensor-001', value: 42.5 }; - if (replyTo) { - await NATSBridge.smartsend( - replyTo, - [["data", response, "dictionary"]] - ); - } - } - } - } - - setTimeout(() => conn.close(), 120000); -} -``` - -#### Python - -```python -from natbridge import NATSBridge - -# Requester -env, env_json_str = await NATSBridge.smartsend( - "/device/command", - [("command", {"action": "read_sensor"}, "dictionary")], - broker_url="nats://localhost:4222", - reply_to="/device/response" -) -``` - -```python -# Responder -from natbridge import NATSBridge -import asyncio -import nats - -async def test_responder(): - nc = await nats.connect('nats://localhost:4222') - - async def msg_handler(msg): - env = await NATSBridge.smartreceive( - msg, - fileserver_download_handler=fetch_with_backoff - ) - - reply_to = env["reply_to"] - - for dataname, data, type_ in env["payloads"]: - if dataname == "command" and data["action"] == "read_sensor": - response = {"sensor_id": "sensor-001", "value": 42.5} - if reply_to: - await NATSBridge.smartsend( - reply_to, - [("data", response, "dictionary")] - ) - - await nc.subscribe('/device/command', cb=msg_handler) - - await asyncio.sleep(120) - await nc.drain() -``` - ---- - -## Testing - -### Test File Organization - -| Platform | Sender Tests | Receiver Tests | -|----------|--------------|----------------| -| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | -| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | -| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | - -### Run Tests - -#### Julia - -```bash -# Text message exchange -julia test/test_julia_text_sender.jl -julia test/test_julia_text_receiver.jl - -# Dictionary exchange -julia test/test_julia_dict_sender.jl -julia test/test_julia_dict_receiver.jl - -# File transfer -julia test/test_julia_file_sender.jl -julia test/test_julia_file_receiver.jl - -# Mixed payload types -julia test/test_julia_mix_payloads_sender.jl -julia test/test_julia_mix_payloads_receiver.jl - -# Table exchange -julia test/test_julia_table_sender.jl -julia test/test_julia_table_receiver.jl -``` - -#### JavaScript (Node.js) - -```bash -# Text message exchange -node test/test_js_text_sender.js -node test/test_js_text_receiver.js - -# Dictionary exchange -node test/test_js_dictionary_sender.js -node test/test_js_dictionary_receiver.js - -# Binary transfer -node test/test_js_binary_sender.js -node test/test_js_binary_receiver.js - -# Table exchange -node test/test_js_table_sender.js -node test/test_js_table_receiver.js -``` - -#### Python - -```bash -# Text message exchange -python3 test/test_py_text_sender.py -python3 test/test_py_text_receiver.py - -# Dictionary exchange -python3 test/test_py_dictionary_sender.py -python3 test/test_py_dictionary_receiver.py - -# Binary transfer -python3 test/test_py_binary_sender.py -python3 test/test_py_binary_receiver.py - -# Table exchange -python3 test/test_py_table_sender.py -python3 test/test_py_table_receiver.py -``` - ---- - -## Documentation - -For detailed architecture and implementation information, see: - -- [Architecture Documentation](docs/architecture.md) - Cross-platform architecture, API parity, platform-specific patterns -- [Implementation Guide](docs/implementation.md) - Detailed implementation for each platform, handler functions, testing - ---- - -## License - -MIT License - -Copyright (c) 2026 NATSBridge Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file -- 2.49.1 From aa7cdbd36f823191aa21569d2eda9979bfca27d6 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 08:19:15 +0700 Subject: [PATCH 18/43] update --- README.md | 32 ++++++++--------- docs/architecture.md | 6 ++-- docs/implementation.md | 18 +++++----- examples/tutorial.md | 40 ++++++++++----------- examples/walkthrough.md | 22 ++++++------ src/{natbridge.js => natsbridge.js} | 0 src/{natbridge.py => natsbridge.py} | 2 +- src/{natbridge_mpy.py => natsbridge_mpy.py} | 0 test/test_js_binary_receiver.js | 2 +- test/test_js_binary_sender.js | 2 +- test/test_js_dictionary_receiver.js | 2 +- test/test_js_dictionary_sender.js | 2 +- test/test_js_mix_payloads_sender.js | 2 +- test/test_js_table_receiver.js | 2 +- test/test_js_table_sender.js | 2 +- test/test_js_text_receiver.js | 2 +- test/test_js_text_sender.js | 2 +- test/test_mpy_binary_receiver.py | 4 +-- test/test_mpy_binary_sender.py | 4 +-- test/test_mpy_dictionary_receiver.py | 4 +-- test/test_mpy_dictionary_sender.py | 4 +-- test/test_mpy_text_receiver.py | 4 +-- test/test_mpy_text_sender.py | 4 +-- test/test_py_binary_receiver.py | 2 +- test/test_py_binary_sender.py | 2 +- test/test_py_dictionary_receiver.py | 2 +- test/test_py_dictionary_sender.py | 2 +- test/test_py_mix_payloads_sender.py | 2 +- test/test_py_table_sender.py | 2 +- test/test_py_text_receiver.py | 2 +- test/test_py_text_sender.py | 2 +- 31 files changed, 89 insertions(+), 89 deletions(-) rename src/{natbridge.js => natsbridge.js} (100%) rename src/{natbridge.py => natsbridge.py} (99%) rename src/{natbridge_mpy.py => natsbridge_mpy.py} (100%) diff --git a/README.md b/README.md index be22435..bfa2bac 100644 --- a/README.md +++ b/README.md @@ -47,9 +47,9 @@ NATSBridge enables seamless communication across multiple platforms through NATS | Platform | Implementation | Features | |----------|----------------|----------| | **Julia** | [`src/NATSBridge.jl`](src/NATSBridge.jl) | Full feature set, Arrow IPC, multiple dispatch | -| **JavaScript** | [`src/natbridge.js`](src/natbridge.js) | Node.js & browser, async/await | -| **Python** | [`src/natbridge.py`](src/natbridge.py) | Desktop Python, asyncio, type hints | -| **MicroPython** | [`src/natbridge_mpy.py`](src/natbridge_mpy.py) | Memory-constrained, synchronous API | +| **JavaScript** | [`src/natsbridge.js`](src/natsbridge.js) | Node.js & browser, async/await | +| **Python** | [`src/natsbridge.py`](src/natsbridge.py) | Desktop Python, asyncio, type hints | +| **MicroPython** | [`src/natsbridge_mpy.py`](src/natsbridge_mpy.py) | Memory-constrained, synchronous API | ### Platform Comparison @@ -332,7 +332,7 @@ env, env_json_str = NATSBridge.smartsend( #### JavaScript ```javascript -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); const [env, env_json_str] = await NATSBridge.smartsend( subject, @@ -361,7 +361,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge env, env_json_str = await NATSBridge.smartsend( subject: str, @@ -388,7 +388,7 @@ env, env_json_str = await NATSBridge.smartsend( #### MicroPython ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge # Limited to direct transport (< 100KB threshold) env, env_json_str = NATSBridge.smartsend( @@ -551,7 +551,7 @@ env, env_json_str = NATSBridge.smartsend("/chat/room1", data; fileserver_url="ht #### JavaScript ```javascript -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); const data = [ ["message_text", "Hello!", "text"], @@ -569,7 +569,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge data = [ ("message_text", "Hello!", "text"), @@ -606,7 +606,7 @@ env, env_json_str = NATSBridge.smartsend("/device/config", data) #### JavaScript ```javascript -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); const config = { wifi_ssid: "MyNetwork", @@ -623,7 +623,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge config = { "wifi_ssid": "MyNetwork", @@ -658,7 +658,7 @@ env, env_json_str = NATSBridge.smartsend("/data/analysis", data) #### JavaScript ```javascript -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); const df = [ { id: 1, name: "Alice", score: 95 }, @@ -675,7 +675,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge import pandas as pd df = pd.DataFrame({ @@ -735,7 +735,7 @@ end #### JavaScript ```javascript -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); // Requester const [env, env_json_str] = await NATSBridge.smartsend( @@ -748,7 +748,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( ```javascript // Responder const nats = require('nats'); -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); async function testResponder() { const conn = await nats.connect('nats://localhost:4222'); @@ -782,7 +782,7 @@ async function testResponder() { #### Python ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge # Requester env, env_json_str = await NATSBridge.smartsend( @@ -795,7 +795,7 @@ env, env_json_str = await NATSBridge.smartsend( ```python # Responder -from natbridge import NATSBridge +from natsbridge import NATSBridge import asyncio import nats diff --git a/docs/architecture.md b/docs/architecture.md index b04a771..500f988 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -82,7 +82,7 @@ env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) **JavaScript:** ```javascript -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); // Send const [env, env_json_str] = await NATSBridge.smartsend( @@ -104,7 +104,7 @@ const env = await NATSBridge.smartreceive(msg, { **Python:** ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge # Send env, env_json_str = NATSBridge.smartsend( @@ -124,7 +124,7 @@ env = NATSBridge.smartreceive( **MicroPython:** ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge # Send (limited to direct transport due to memory constraints) env, env_json_str = NATSBridge.smartsend( diff --git a/docs/implementation.md b/docs/implementation.md index 88d9af3..49b9c1f 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -16,9 +16,9 @@ This document describes the implementation of the high-performance, bi-direction | Language | Implementation File | Description | |----------|---------------------|-------------| | **Julia** | [`src/NATSBridge.jl`](../src/NATSBridge.jl) | Full Julia implementation with Arrow IPC support | -| **JavaScript** | `src/natbridge.js` | Node.js/browser implementation | -| **Python** | `src/natbridge.py` | Desktop Python implementation | -| **MicroPython** | `src/natbridge_mpy.py` | MicroPython implementation (limited features) | +| **JavaScript** | `src/natsbridge.js` | Node.js/browser implementation | +| **Python** | `src/natsbridge.py` | Desktop Python implementation | +| **MicroPython** | `src/natsbridge_mpy.py` | MicroPython implementation (limited features) | --- @@ -228,7 +228,7 @@ end #### JavaScript ```javascript -const NATSBridge = require('natbridge'); +const NATSBridge = require('natsbridge'); // Single payload const [env, env_json_str] = await NATSBridge.smartsend( @@ -275,7 +275,7 @@ for (const [dataname, data, type] of env.payloads) { #### Python ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge # Single payload env, env_json_str = await NATSBridge.smartsend( @@ -317,7 +317,7 @@ for dataname, data, type_ in env["payloads"]: #### MicroPython ```python -from natbridge import NATSBridge +from natsbridge import NATSBridge # Limited to text and binary (no tables due to memory constraints) env, env_json_str = NATSBridge.smartsend( @@ -929,7 +929,7 @@ end #### Module Structure ```javascript -// natbridge.js +// natsbridge.js const nats = require('nats'); const { v4: uuidv4 } = require('uuid'); const fetch = require('node-fetch'); @@ -1272,7 +1272,7 @@ async function plikOneshotUpload(file_server_url, dataname, data) { #### Module Structure ```python -# natbridge.py +# natsbridge.py import asyncio import base64 import json @@ -1690,7 +1690,7 @@ MicroPython has significant constraints compared to desktop implementations: ### MicroPython Module Structure ```python -# natbridge_mpy.py (MicroPython) +# natsbridge_mpy.py (MicroPython) import network import time import json diff --git a/examples/tutorial.md b/examples/tutorial.md index 0969849..b43715d 100644 --- a/examples/tutorial.md +++ b/examples/tutorial.md @@ -134,7 +134,7 @@ env, env_json_str = smartsend("/chat/room1", data, broker_url="nats://localhost: #### JavaScript ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); // Send a text message const data = [["message", "Hello World", "text"]]; @@ -158,7 +158,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import smartsend +from natsbridge import smartsend # Send a text message data = [("message", "Hello World", "text")] @@ -185,7 +185,7 @@ env, env_json_str = await smartsend( #### MicroPython ```python -from natbridge_mpy import NATSBridge +from natsbridge_mpy import NATSBridge bridge = NATSBridge() @@ -218,7 +218,7 @@ end #### JavaScript ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); // Receive and process message const env = await NATSBridge.smartreceive(msg, { @@ -233,7 +233,7 @@ for (const [dataname, data, type] of env.payloads) { #### Python ```python -from natbridge import smartreceive, fetch_with_backoff +from natsbridge import smartreceive, fetch_with_backoff # Receive and process message env = await smartreceive( @@ -269,7 +269,7 @@ env, env_json_str = smartsend("/device/config", data, broker_url="nats://localho #### JavaScript ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); const config = { wifi_ssid: "MyNetwork", @@ -288,7 +288,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import smartsend +from natsbridge import smartsend config = { "wifi_ssid": "MyNetwork", @@ -307,7 +307,7 @@ env, env_json_str = await smartsend( #### MicroPython ```python -from natbridge_mpy import NATSBridge +from natsbridge_mpy import NATSBridge bridge = NATSBridge() @@ -342,7 +342,7 @@ env, env_json_str = smartsend("/chat/image", data, broker_url="nats://localhost: #### JavaScript ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); const fs = require('fs'); // Read image file @@ -359,7 +359,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import smartsend +from natsbridge import smartsend # Read image file with open("image.png", "rb") as f: @@ -376,7 +376,7 @@ env, env_json_str = await smartsend( #### MicroPython ```python -from natbridge_mpy import NATSBridge +from natsbridge_mpy import NATSBridge bridge = NATSBridge() @@ -413,7 +413,7 @@ env, env_json_str = smartsend( #### JavaScript (Requester) ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); // Send command with reply-to const data = [["command", { action: "read_sensor" }, "dictionary"]]; @@ -431,7 +431,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python (Requester) ```python -from natbridge import smartsend +from natsbridge import smartsend # Send command with reply-to data = [("command", {"action": "read_sensor"}, "dictionary")] @@ -506,7 +506,7 @@ println("File uploaded to: $(env.payloads[1].data)") #### JavaScript ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); // Create large data (> 1MB) const large_data = Buffer.alloc(2_000_000); @@ -530,7 +530,7 @@ console.log("File uploaded to:", env.payloads[0].data); #### Python ```python -from natbridge import smartsend +from natsbridge import smartsend # Create large data (> 1MB) import os @@ -552,7 +552,7 @@ print(f"File uploaded to: {env['payloads'][0]['data']}") MicroPython enforces a hard limit of 50KB per payload: ```python -from natbridge_mpy import NATSBridge +from natsbridge_mpy import NATSBridge bridge = NATSBridge() @@ -590,7 +590,7 @@ env, env_json_str = smartsend("/chat/mixed", data, broker_url="nats://localhost: #### JavaScript ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); const fs = require('fs'); const image_data = fs.readFileSync('avatar.png'); @@ -610,7 +610,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import smartsend +from natsbridge import smartsend with open("avatar.png", "rb") as f: image_data = f.read() @@ -652,7 +652,7 @@ env, env_json_str = smartsend("/data/students", data, broker_url="nats://localho #### JavaScript ```javascript -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); // Create table data (array of objects) const table_data = [ @@ -672,7 +672,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( #### Python ```python -from natbridge import smartsend +from natsbridge import smartsend import pandas as pd # Create DataFrame diff --git a/examples/walkthrough.md b/examples/walkthrough.md index a8d8efc..28cb59f 100644 --- a/examples/walkthrough.md +++ b/examples/walkthrough.md @@ -177,7 +177,7 @@ end ```javascript // src/chat_ui.js -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); class ChatUI { constructor() { @@ -333,7 +333,7 @@ end ```javascript // src/chat_handler.js -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); const nats = require('nats'); class ChatHandler { @@ -393,7 +393,7 @@ module.exports = ChatHandler; # src/chat_handler.py import asyncio from typing import Optional -from natbridge import smartreceive, fetch_with_backoff +from natsbridge import smartreceive, fetch_with_backoff class ChatHandler: def __init__(self, nats_connection): @@ -526,7 +526,7 @@ end ```javascript // src/file_upload_service.js -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); const fs = require('fs'); class FileUploadService { @@ -580,7 +580,7 @@ module.exports = FileUploadService; ```python # src/file_upload_service.py -from natbridge import smartsend +from natsbridge import smartsend import os class FileUploadService: @@ -659,7 +659,7 @@ end ```javascript // src/file_download_service.js -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); const fs = require('fs'); class FileDownloadService { @@ -690,7 +690,7 @@ module.exports = FileDownloadService; ```python # src/file_download_service.py -from natbridge import smartreceive, fetch_with_backoff +from natsbridge import smartreceive, fetch_with_backoff import os class FileDownloadService: @@ -832,7 +832,7 @@ end ```javascript // src/sensor_data.js -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); class SensorReading { constructor(sensorId, value, unit, metadata = {}) { @@ -985,7 +985,7 @@ end ```javascript // src/sensor_sender.js -const NATSBridge = require('./src/natbridge.js'); +const NATSBridge = require('./src/natsbridge.js'); const { SensorReading, SensorBatch } = require('./sensor_data.js'); class SensorSender { @@ -1069,7 +1069,7 @@ module.exports = SensorSender; ```python # src/sensor_sender.py -from natbridge import smartsend +from natsbridge import smartsend from sensor_data import SensorReading, SensorBatch class SensorSender: @@ -1282,7 +1282,7 @@ end # Cache file server responses import asyncio import threading -from natbridge import fetch_with_backoff +from natsbridge import fetch_with_backoff file_cache = {} cache_lock = threading.Lock() diff --git a/src/natbridge.js b/src/natsbridge.js similarity index 100% rename from src/natbridge.js rename to src/natsbridge.js diff --git a/src/natbridge.py b/src/natsbridge.py similarity index 99% rename from src/natbridge.py rename to src/natsbridge.py index ee94bb0..f30851d 100644 --- a/src/natbridge.py +++ b/src/natsbridge.py @@ -6,7 +6,7 @@ This module provides functionality for sending and receiving data across network using NATS as the message bus, with support for both direct payload transport and URL-based transport for larger payloads. -@package natbridge +@package natsbridge """ import asyncio diff --git a/src/natbridge_mpy.py b/src/natsbridge_mpy.py similarity index 100% rename from src/natbridge_mpy.py rename to src/natsbridge_mpy.py diff --git a/test/test_js_binary_receiver.js b/test/test_js_binary_receiver.js index 1d989f6..db8f5f0 100644 --- a/test/test_js_binary_receiver.js +++ b/test/test_js_binary_receiver.js @@ -3,7 +3,7 @@ * Tests the smartreceive function with binary/image/audio/video payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; diff --git a/test/test_js_binary_sender.js b/test/test_js_binary_sender.js index 4562d53..dea75fb 100644 --- a/test/test_js_binary_sender.js +++ b/test/test_js_binary_sender.js @@ -3,7 +3,7 @@ * Tests the smartsend function with binary/image/audio/video payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_SUBJECT = '/test/binary'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; diff --git a/test/test_js_dictionary_receiver.js b/test/test_js_dictionary_receiver.js index 1011fdf..e18d57b 100644 --- a/test/test_js_dictionary_receiver.js +++ b/test/test_js_dictionary_receiver.js @@ -3,7 +3,7 @@ * Tests the smartreceive function with dictionary payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; diff --git a/test/test_js_dictionary_sender.js b/test/test_js_dictionary_sender.js index d3acca3..e0eef78 100644 --- a/test/test_js_dictionary_sender.js +++ b/test/test_js_dictionary_sender.js @@ -3,7 +3,7 @@ * Tests the smartsend function with dictionary payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_SUBJECT = '/test/dictionary'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; diff --git a/test/test_js_mix_payloads_sender.js b/test/test_js_mix_payloads_sender.js index 6a25b55..534fe5c 100644 --- a/test/test_js_mix_payloads_sender.js +++ b/test/test_js_mix_payloads_sender.js @@ -3,7 +3,7 @@ * Tests the smartsend function with mixed payload types */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_SUBJECT = '/test/mix'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; diff --git a/test/test_js_table_receiver.js b/test/test_js_table_receiver.js index d73eae1..ec99ec4 100644 --- a/test/test_js_table_receiver.js +++ b/test/test_js_table_receiver.js @@ -3,7 +3,7 @@ * Tests the smartreceive function with table (Arrow IPC) payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; diff --git a/test/test_js_table_sender.js b/test/test_js_table_sender.js index 7f8fa21..f95512c 100644 --- a/test/test_js_table_sender.js +++ b/test/test_js_table_sender.js @@ -3,7 +3,7 @@ * Tests the smartsend function with table (Arrow IPC) payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_SUBJECT = '/test/table'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; diff --git a/test/test_js_text_receiver.js b/test/test_js_text_receiver.js index 479ece5..54a6b37 100644 --- a/test/test_js_text_receiver.js +++ b/test/test_js_text_receiver.js @@ -3,7 +3,7 @@ * Tests the smartreceive function with text payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; diff --git a/test/test_js_text_sender.js b/test/test_js_text_sender.js index dda7b0c..3bcd013 100644 --- a/test/test_js_text_sender.js +++ b/test/test_js_text_sender.js @@ -3,7 +3,7 @@ * Tests the smartsend function with text payloads */ -const NATSBridge = require('../src/natbridge.js'); +const NATSBridge = require('../src/natsbridge.js'); const TEST_SUBJECT = '/test/text'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; diff --git a/test/test_mpy_binary_receiver.py b/test/test_mpy_binary_receiver.py index 09bf589..13f6da5 100644 --- a/test/test_mpy_binary_receiver.py +++ b/test/test_mpy_binary_receiver.py @@ -14,7 +14,7 @@ import base64 # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') @@ -23,7 +23,7 @@ TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') def run_test(): print('=== MicroPython Binary Receiver Test ===\n') - from natbridge_mpy import _generate_uuid + from natsbridge_mpy import _generate_uuid # Create mock NATS message with binary payloads image_data = bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) # PNG header diff --git a/test/test_mpy_binary_sender.py b/test/test_mpy_binary_sender.py index 45a6e00..bd44fb8 100644 --- a/test/test_mpy_binary_sender.py +++ b/test/test_mpy_binary_sender.py @@ -13,7 +13,7 @@ import base64 # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE +from natsbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE TEST_SUBJECT = '/test/binary' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') @@ -23,7 +23,7 @@ TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') def run_test(): print('=== MicroPython Binary Sender Test ===\n') - from natbridge_mpy import _generate_uuid + from natsbridge_mpy import _generate_uuid correlation_id = 'mpy-binary-test-' + _generate_uuid() print(f'Correlation ID: {correlation_id}') print(f'Subject: {TEST_SUBJECT}') diff --git a/test/test_mpy_dictionary_receiver.py b/test/test_mpy_dictionary_receiver.py index 5f431a0..0f3a804 100644 --- a/test/test_mpy_dictionary_receiver.py +++ b/test/test_mpy_dictionary_receiver.py @@ -13,7 +13,7 @@ import json # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') @@ -22,7 +22,7 @@ TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') def run_test(): print('=== MicroPython Dictionary Receiver Test ===\n') - from natbridge_mpy import _generate_uuid + from natsbridge_mpy import _generate_uuid # Create a mock NATS message with dictionary payloads import base64 diff --git a/test/test_mpy_dictionary_sender.py b/test/test_mpy_dictionary_sender.py index 33aa92a..54a190d 100644 --- a/test/test_mpy_dictionary_sender.py +++ b/test/test_mpy_dictionary_sender.py @@ -13,7 +13,7 @@ import json # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE +from natsbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE TEST_SUBJECT = '/test/dictionary' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') @@ -23,7 +23,7 @@ TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') def run_test(): print('=== MicroPython Dictionary Sender Test ===\n') - from natbridge_mpy import _generate_uuid + from natsbridge_mpy import _generate_uuid correlation_id = 'mpy-dict-test-' + _generate_uuid() print(f'Correlation ID: {correlation_id}') print(f'Subject: {TEST_SUBJECT}') diff --git a/test/test_mpy_text_receiver.py b/test/test_mpy_text_receiver.py index c224d05..c053a0b 100644 --- a/test/test_mpy_text_receiver.py +++ b/test/test_mpy_text_receiver.py @@ -13,7 +13,7 @@ import json # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge_mpy import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') @@ -22,7 +22,7 @@ TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') def run_test(): print('=== MicroPython Text Receiver Test ===\n') - from natbridge_mpy import _generate_uuid + from natsbridge_mpy import _generate_uuid # Create a mock NATS message with text payload test_text = 'Hello, NATSBridge! This is a test message.' diff --git a/test/test_mpy_text_sender.py b/test/test_mpy_text_sender.py index f52fd4f..dff9ec8 100644 --- a/test/test_mpy_text_sender.py +++ b/test/test_mpy_text_sender.py @@ -12,7 +12,7 @@ import os # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE +from natsbridge_mpy import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL, DEFAULT_SIZE_THRESHOLD, MAX_PAYLOAD_SIZE TEST_SUBJECT = '/test/text' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') @@ -22,7 +22,7 @@ TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') def run_test(): print('=== MicroPython Text Sender Test ===\n') - from natbridge_mpy import _generate_uuid + from natsbridge_mpy import _generate_uuid correlation_id = 'mpy-text-test-' + _generate_uuid() print(f'Correlation ID: {correlation_id}') print(f'Subject: {TEST_SUBJECT}') diff --git a/test/test_py_binary_receiver.py b/test/test_py_binary_receiver.py index d1410b0..eaeeb0c 100644 --- a/test/test_py_binary_receiver.py +++ b/test/test_py_binary_receiver.py @@ -12,7 +12,7 @@ import base64 # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') diff --git a/test/test_py_binary_sender.py b/test/test_py_binary_sender.py index 2de616d..74de656 100644 --- a/test/test_py_binary_sender.py +++ b/test/test_py_binary_sender.py @@ -11,7 +11,7 @@ import base64 # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_SUBJECT = '/test/binary' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') diff --git a/test/test_py_dictionary_receiver.py b/test/test_py_dictionary_receiver.py index f6afb16..293b3cb 100644 --- a/test/test_py_dictionary_receiver.py +++ b/test/test_py_dictionary_receiver.py @@ -11,7 +11,7 @@ import json # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') diff --git a/test/test_py_dictionary_sender.py b/test/test_py_dictionary_sender.py index 908c2e7..b8027cc 100644 --- a/test/test_py_dictionary_sender.py +++ b/test/test_py_dictionary_sender.py @@ -11,7 +11,7 @@ import json # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_SUBJECT = '/test/dictionary' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') diff --git a/test/test_py_mix_payloads_sender.py b/test/test_py_mix_payloads_sender.py index 3a95e0c..7f9d858 100644 --- a/test/test_py_mix_payloads_sender.py +++ b/test/test_py_mix_payloads_sender.py @@ -11,7 +11,7 @@ import base64 # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_SUBJECT = '/test/mix' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') diff --git a/test/test_py_table_sender.py b/test/test_py_table_sender.py index 1c04eb0..724260b 100644 --- a/test/test_py_table_sender.py +++ b/test/test_py_table_sender.py @@ -10,7 +10,7 @@ import os # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_SUBJECT = '/test/table' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') diff --git a/test/test_py_text_receiver.py b/test/test_py_text_receiver.py index 6758d8b..c22493f 100644 --- a/test/test_py_text_receiver.py +++ b/test/test_py_text_receiver.py @@ -11,7 +11,7 @@ import json # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartreceive, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') TEST_FILESERVER_URL = os.environ.get('FILESERVER_URL', 'http://localhost:8080') diff --git a/test/test_py_text_sender.py b/test/test_py_text_sender.py index d1fa716..ac86044 100644 --- a/test/test_py_text_sender.py +++ b/test/test_py_text_sender.py @@ -10,7 +10,7 @@ import os # Add parent directory to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from natbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL +from natsbridge import smartsend, DEFAULT_BROKER_URL, DEFAULT_FILESERVER_URL TEST_SUBJECT = '/test/text' TEST_BROKER_URL = os.environ.get('NATS_URL', 'nats://localhost:4222') -- 2.49.1 From 7205cc1ea3a64a9764334bc6653d3084d1204b76 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 08:36:51 +0700 Subject: [PATCH 19/43] update --- test/test_js_binary_receiver.js | 9 +- test/test_js_binary_sender.js | 3 +- test/test_js_dictionary_receiver.js | 17 +- test/test_js_dictionary_sender.js | 3 +- test/test_js_mix_payloads_receiver.js | 216 ++++++++++++++++++++++++++ test/test_js_mix_payloads_sender.js | 3 +- test/test_js_table_receiver.js | 9 +- test/test_js_table_sender.js | 3 +- test/test_js_text_receiver.js | 19 +-- test/test_js_text_sender.js | 3 +- 10 files changed, 255 insertions(+), 30 deletions(-) create mode 100644 test/test_js_mix_payloads_receiver.js diff --git a/test/test_js_binary_receiver.js b/test/test_js_binary_receiver.js index db8f5f0..0c9305e 100644 --- a/test/test_js_binary_receiver.js +++ b/test/test_js_binary_receiver.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; @@ -18,15 +19,15 @@ async function runTest() { const genericBinary = Buffer.from([0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE]); const testData = { - correlation_id: 'js-binary-receiver-' + Date.now(), - msg_id: 'msg-' + Date.now(), + correlation_id: 'js-binary-receiver-' + crypto.randomUUID(), + msg_id: 'msg-' + crypto.randomUUID(), timestamp: new Date().toISOString(), send_to: '/test/binary', msg_purpose: 'test', sender_name: 'js-binary-test', - sender_id: 'sender-' + Date.now(), + sender_id: 'sender-' + crypto.randomUUID(), receiver_name: 'js-receiver', - receiver_id: 'receiver-' + Date.now(), + receiver_id: 'receiver-' + crypto.randomUUID(), reply_to: '', reply_to_msg_id: '', broker_url: TEST_BROKER_URL, diff --git a/test/test_js_binary_sender.js b/test/test_js_binary_sender.js index dea75fb..7120bee 100644 --- a/test/test_js_binary_sender.js +++ b/test/test_js_binary_sender.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_SUBJECT = '/test/binary'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; @@ -12,7 +13,7 @@ const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080 async function runTest() { console.log('=== JavaScript Binary Sender Test ===\n'); - const correlationId = NATSBridge.uuidv4(); + const correlationId = crypto.randomUUID(); console.log(`Correlation ID: ${correlationId}`); console.log(`Subject: ${TEST_SUBJECT}`); console.log(`Broker URL: ${TEST_BROKER_URL}\n`); diff --git a/test/test_js_dictionary_receiver.js b/test/test_js_dictionary_receiver.js index e18d57b..0a8c1ee 100644 --- a/test/test_js_dictionary_receiver.js +++ b/test/test_js_dictionary_receiver.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; @@ -18,15 +19,15 @@ async function runTest() { const mixedDict = { string: 'text', number: 123, boolean: true, null_val: null }; const testData = { - correlation_id: 'test-receiver-dict-' + Date.now(), - msg_id: 'msg-' + Date.now(), + correlation_id: 'test-receiver-dict-' + crypto.randomUUID(), + msg_id: 'msg-' + crypto.randomUUID(), timestamp: new Date().toISOString(), send_to: '/test/dictionary', msg_purpose: 'test', sender_name: 'js-dict-test', - sender_id: 'sender-' + Date.now(), + sender_id: 'sender-' + crypto.randomUUID(), receiver_name: 'js-receiver', - receiver_id: 'receiver-' + Date.now(), + receiver_id: 'receiver-' + crypto.randomUUID(), reply_to: '', reply_to_msg_id: '', broker_url: TEST_BROKER_URL, @@ -161,15 +162,15 @@ async function runTest() { // Test round-trip with receive console.log('\n=== Round-trip Test ==='); const roundTripData = { - correlation_id: 'roundtrip-' + Date.now(), - msg_id: 'msg-' + Date.now(), + correlation_id: 'roundtrip-' + crypto.randomUUID(), + msg_id: 'msg-' + crypto.randomUUID(), timestamp: new Date().toISOString(), send_to: '/test/dictionary', msg_purpose: 'test', sender_name: 'js-test', - sender_id: 'sender-' + Date.now(), + sender_id: 'sender-' + crypto.randomUUID(), receiver_name: 'js-receiver', - receiver_id: 'receiver-' + Date.now(), + receiver_id: 'receiver-' + crypto.randomUUID(), reply_to: '', reply_to_msg_id: '', broker_url: TEST_BROKER_URL, diff --git a/test/test_js_dictionary_sender.js b/test/test_js_dictionary_sender.js index e0eef78..b504da3 100644 --- a/test/test_js_dictionary_sender.js +++ b/test/test_js_dictionary_sender.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_SUBJECT = '/test/dictionary'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; @@ -12,7 +13,7 @@ const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080 async function runTest() { console.log('=== JavaScript Dictionary Sender Test ===\n'); - const correlationId = NATSBridge.uuidv4(); + const correlationId = crypto.randomUUID(); console.log(`Correlation ID: ${correlationId}`); console.log(`Subject: ${TEST_SUBJECT}`); console.log(`Broker URL: ${TEST_BROKER_URL}\n`); diff --git a/test/test_js_mix_payloads_receiver.js b/test/test_js_mix_payloads_receiver.js new file mode 100644 index 0000000..55f4077 --- /dev/null +++ b/test/test_js_mix_payloads_receiver.js @@ -0,0 +1,216 @@ +/** + * JavaScript Mix Payloads Receiver Test + * Tests the smartreceive function with mixed payload types + */ + +const NATSBridge = require('../src/natsbridge.js'); +const nats = require('nats'); +const crypto = require('crypto'); + +const TEST_SUBJECT = '/test/mix'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; + +async function runTest() { + console.log('=== JavaScript Mix Payloads Receiver Test ===\n'); + + const correlationId = crypto.randomUUID(); + console.log(`Correlation ID: ${correlationId}`); + console.log(`Subject: ${TEST_SUBJECT}`); + console.log(`Broker URL: ${TEST_BROKER_URL}\n`); + + // Expected test data - same as sender + const expectedTextData = 'Hello, NATSBridge!'; + const expectedDictData = { key1: 'value1', key2: 42, nested: { a: 1, b: 2 } }; + const expectedBinaryData = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); // PNG header + const expectedTableData = [ + { id: 1, name: 'Alice', age: 30 }, + { id: 2, name: 'Bob', age: 25 }, + { id: 3, name: 'Charlie', age: 35 } + ]; + + const expectedDatanames = ['message', 'config', 'image', 'users']; + const expectedTypes = ['text', 'dictionary', 'image', 'table']; + + let testPassed = true; + let messagesReceived = 0; + const receivedPayloads = []; + + try { + // Connect to NATS + console.log('Connecting to NATS server...'); + const nc = await nats.connect({ servers: TEST_BROKER_URL }); + console.log('✅ Connected to NATS server\n'); + + // Set up message subscription + const subscription = nc.subscribe(TEST_SUBJECT); + + // Wait for messages with timeout + const messagePromise = new Promise(async (resolve, reject) => { + const timeout = setTimeout(() => { + resolve('timeout'); + }, 10000); // 10 second timeout + + (async () => { + for await (const msg of subscription) { + clearTimeout(timeout); + messagesReceived++; + console.log(`\n=== Message ${messagesReceived} Received ===`); + console.log(`Raw payload length: ${msg.payload.length} bytes`); + + try { + // Process the message using smartreceive + const envelope = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: NATSBridge.fetchWithBackoff, + max_retries: 5, + base_delay: 100, + max_delay: 5000 + }); + + console.log(`Correlation ID: ${envelope.correlation_id}`); + console.log(`Message ID: ${envelope.msg_id}`); + console.log(`Number of payloads: ${envelope.payloads.length}`); + + receivedPayloads.push(envelope); + + // Validate envelope structure + console.log('\n=== Envelope Validation ==='); + + if (envelope.payloads.length < 4) { + console.log(`❌ Expected at least 4 payloads, got ${envelope.payloads.length}`); + testPassed = false; + } else { + console.log(`✅ Correct number of payloads: ${envelope.payloads.length}`); + } + + // Validate each payload + for (let i = 0; i < envelope.payloads.length; i++) { + const [dataname, data, dataType] = envelope.payloads[i]; + + console.log(`\n--- Payload ${i + 1}: ${dataname} (type: ${dataType}) ---`); + + // Check dataname + if (i < expectedDatanames.length && dataname !== expectedDatanames[i]) { + console.log(`❌ Expected dataname '${expectedDatanames[i]}', got '${dataname}'`); + testPassed = false; + } else { + console.log(`✅ Correct dataname: ${dataname}`); + } + + // Check data type + if (i < expectedTypes.length && dataType !== expectedTypes[i]) { + console.log(`❌ Expected type '${expectedTypes[i]}', got '${dataType}'`); + testPassed = false; + } else { + console.log(`✅ Correct type: ${dataType}`); + } + + // Validate data based on type + if (dataType === 'text') { + if (typeof data === 'string' && data === expectedTextData) { + console.log(`✅ Text data verified: "${data}"`); + } else { + console.log(`❌ Text data mismatch. Expected: "${expectedTextData}", Got: "${data}"`); + testPassed = false; + } + } else if (dataType === 'dictionary') { + if (typeof data === 'object' && JSON.stringify(data) === JSON.stringify(expectedDictData)) { + console.log(`✅ Dictionary data verified`); + console.log(` Keys: ${Object.keys(data).join(', ')}`); + } else { + console.log(`❌ Dictionary data mismatch`); + console.log(` Expected: ${JSON.stringify(expectedDictData)}`); + console.log(` Got: ${JSON.stringify(data)}`); + testPassed = false; + } + } else if (dataType === 'image') { + if (data instanceof Buffer || data instanceof Uint8Array) { + const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data); + if (dataBuffer.length === expectedBinaryData.length) { + let dataMatch = true; + for (let j = 0; j < expectedBinaryData.length; j++) { + if (dataBuffer[j] !== expectedBinaryData[j]) { + dataMatch = false; + break; + } + } + if (dataMatch) { + console.log(`✅ Image data verified (${dataBuffer.length} bytes)`); + } else { + console.log(`❌ Image data mismatch`); + testPassed = false; + } + } else { + console.log(`❌ Image data length mismatch. Expected: ${expectedBinaryData.length}, Got: ${dataBuffer.length}`); + testPassed = false; + } + } else { + console.log(`❌ Image data is not a Buffer or Uint8Array`); + testPassed = false; + } + } else if (dataType === 'table') { + // For table data, check if it's an Arrow table-like object + if (data && typeof data === 'object') { + // Arrow tables have specific properties + if (data.numRows !== undefined && data.numCols !== undefined) { + console.log(`✅ Table data verified`); + console.log(` Rows: ${data.numRows}, Columns: ${data.numCols}`); + } else { + console.log(`⚠️ Table data received but not standard Arrow format`); + console.log(` Keys: ${Object.keys(data).join(', ')}`); + } + } else { + console.log(`❌ Table data is not a valid object`); + testPassed = false; + } + } + } + + // Stop after receiving at least one valid message + if (messagesReceived >= 1) { + resolve('done'); + } + } catch (error) { + console.error(`❌ Error processing message: ${error.message}`); + console.error(error.stack); + testPassed = false; + resolve('error'); + } + } + })(); + }); + + console.log('Waiting for messages...\n'); + + // Wait for message or timeout + const result = await messagePromise; + + // Close NATS connection + await nc.close(); + console.log('\n✅ NATS connection closed'); + + // Final result + console.log('\n=== Test Result ==='); + if (messagesReceived === 0) { + console.log('❌ NO MESSAGES RECEIVED'); + console.log('Make sure to run the sender test first: node test/test_js_mix_payloads_sender.js'); + process.exit(1); + } else if (result === 'error') { + console.log('❌ ERROR PROCESSING MESSAGES'); + process.exit(1); + } else if (testPassed) { + console.log('✅ ALL TESTS PASSED'); + process.exit(0); + } else { + console.log('❌ SOME TESTS FAILED'); + process.exit(1); + } + + } catch (error) { + console.error('❌ Test failed with error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +runTest(); \ No newline at end of file diff --git a/test/test_js_mix_payloads_sender.js b/test/test_js_mix_payloads_sender.js index 534fe5c..300942b 100644 --- a/test/test_js_mix_payloads_sender.js +++ b/test/test_js_mix_payloads_sender.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_SUBJECT = '/test/mix'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; @@ -12,7 +13,7 @@ const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080 async function runTest() { console.log('=== JavaScript Mix Payloads Sender Test ===\n'); - const correlationId = NATSBridge.uuidv4(); + const correlationId = crypto.randomUUID(); console.log(`Correlation ID: ${correlationId}`); console.log(`Subject: ${TEST_SUBJECT}`); console.log(`Broker URL: ${TEST_BROKER_URL}\n`); diff --git a/test/test_js_table_receiver.js b/test/test_js_table_receiver.js index ec99ec4..f15a2b7 100644 --- a/test/test_js_table_receiver.js +++ b/test/test_js_table_receiver.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; @@ -42,15 +43,15 @@ async function runTest() { const arrowBuffer = Buffer.from(combined); const testData = { - correlation_id: 'js-table-receiver-' + Date.now(), - msg_id: 'msg-' + Date.now(), + correlation_id: 'js-table-receiver-' + crypto.randomUUID(), + msg_id: 'msg-' + crypto.randomUUID(), timestamp: new Date().toISOString(), send_to: '/test/table', msg_purpose: 'test', sender_name: 'js-table-test', - sender_id: 'sender-' + Date.now(), + sender_id: 'sender-' + crypto.randomUUID(), receiver_name: 'js-receiver', - receiver_id: 'receiver-' + Date.now(), + receiver_id: 'receiver-' + crypto.randomUUID(), reply_to: '', reply_to_msg_id: '', broker_url: TEST_BROKER_URL, diff --git a/test/test_js_table_sender.js b/test/test_js_table_sender.js index f95512c..f158a4b 100644 --- a/test/test_js_table_sender.js +++ b/test/test_js_table_sender.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_SUBJECT = '/test/table'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; @@ -12,7 +13,7 @@ const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080 async function runTest() { console.log('=== JavaScript Table Sender Test ===\n'); - const correlationId = NATSBridge.uuidv4(); + const correlationId = crypto.randomUUID(); console.log(`Correlation ID: ${correlationId}`); console.log(`Subject: ${TEST_SUBJECT}`); console.log(`Broker URL: ${TEST_BROKER_URL}\n`); diff --git a/test/test_js_text_receiver.js b/test/test_js_text_receiver.js index 54a6b37..9d8d450 100644 --- a/test/test_js_text_receiver.js +++ b/test/test_js_text_receiver.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; @@ -13,22 +14,22 @@ async function runTest() { // Create a mock NATS message with text payload const testData = { - correlation_id: 'test-receiver-' + Date.now(), - msg_id: 'msg-' + Date.now(), + correlation_id: 'test-receiver-' + crypto.randomUUID(), + msg_id: 'msg-' + crypto.randomUUID(), timestamp: new Date().toISOString(), send_to: '/test/text', msg_purpose: 'test', sender_name: 'js-text-test', - sender_id: 'sender-' + Date.now(), + sender_id: 'sender-' + crypto.randomUUID(), receiver_name: 'js-receiver', - receiver_id: 'receiver-' + Date.now(), + receiver_id: 'receiver-' + crypto.randomUUID(), reply_to: '', reply_to_msg_id: '', broker_url: TEST_BROKER_URL, metadata: {}, payloads: [ { - id: 'payload-' + Date.now(), + id: 'payload-' + crypto.randomUUID(), dataname: 'message', payload_type: 'text', transport: 'direct', @@ -115,15 +116,15 @@ async function runTest() { // Test with multiple text payloads console.log('\n=== Multiple Text Payloads Test ==='); const multiTestData = { - correlation_id: 'multi-receiver-' + Date.now(), - msg_id: 'msg-' + Date.now(), + correlation_id: 'multi-receiver-' + crypto.randomUUID(), + msg_id: 'msg-' + crypto.randomUUID(), timestamp: new Date().toISOString(), send_to: '/test/text', msg_purpose: 'test', sender_name: 'js-text-test', - sender_id: 'sender-' + Date.now(), + sender_id: 'sender-' + crypto.randomUUID(), receiver_name: 'js-receiver', - receiver_id: 'receiver-' + Date.now(), + receiver_id: 'receiver-' + crypto.randomUUID(), reply_to: '', reply_to_msg_id: '', broker_url: TEST_BROKER_URL, diff --git a/test/test_js_text_sender.js b/test/test_js_text_sender.js index 3bcd013..794af1b 100644 --- a/test/test_js_text_sender.js +++ b/test/test_js_text_sender.js @@ -4,6 +4,7 @@ */ const NATSBridge = require('../src/natsbridge.js'); +const crypto = require('crypto'); const TEST_SUBJECT = '/test/text'; const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; @@ -12,7 +13,7 @@ const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080 async function runTest() { console.log('=== JavaScript Text Sender Test ===\n'); - const correlationId = NATSBridge.uuidv4(); + const correlationId = crypto.randomUUID(); console.log(`Correlation ID: ${correlationId}`); console.log(`Subject: ${TEST_SUBJECT}`); console.log(`Broker URL: ${TEST_BROKER_URL}\n`); -- 2.49.1 From cefc56a6bb4322cf4491773fd292a843ea5e2a46 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 12:23:14 +0700 Subject: [PATCH 20/43] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bfa2bac..a609308 100644 --- a/README.md +++ b/README.md @@ -468,7 +468,7 @@ env = NATSBridge.smartreceive( |------|-------|------------|--------|-------------|-------------| | `text` | `String` | `string` | `str` | `str` | Plain text strings | | `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | JSON-serializable dictionaries | -| `table` | `DataFrame`, `Arrow.Table` | `Array` | `pandas.DataFrame` | ❌ | Tabular data (Arrow IPC) | +| `table` | `DataFrame`, `Arrow.Table` | `Array` → `Arrow.Table` | `pandas.DataFrame` | ❌ | Tabular data (Arrow IPC) | | `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Image data (PNG, JPG) | | `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Audio data (WAV, MP3) | | `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | Video data (MP4, AVI) | -- 2.49.1 From 1d177f54380a633f429bdc8188e45d680528a0b7 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 14:07:33 +0700 Subject: [PATCH 21/43] update --- .gitignore | 1 + AI_prompt.txt | 18 ++++++++----- {examples => docs}/tutorial.md | 0 {examples => docs}/walkthrough.md | 0 etc.jl | 38 --------------------------- test/test_js_mix_payloads_receiver.js | 4 +-- test/test_js_mix_payloads_sender.js | 4 +-- test/test_js_text_receiver.js | 4 +-- 8 files changed, 19 insertions(+), 50 deletions(-) create mode 100644 .gitignore rename {examples => docs}/tutorial.md (100%) rename {examples => docs}/walkthrough.md (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/AI_prompt.txt b/AI_prompt.txt index 90815a5..73d40fc 100644 --- a/AI_prompt.txt +++ b/AI_prompt.txt @@ -18,12 +18,9 @@ Create a walkthrough for Julia service-A service sending a mix-content chat mess - I updated the following: - NATSBridge.jl. Essentially I add NATS_connection keyword and new publish_message function to support the keyword. - Use them and ONLY them as ground truth. - Then update the following files accordingly: - architecture.md - implementation.md @@ -39,11 +36,8 @@ All API should be semantically consistent and naming should be consistent across Task: Update NATSBridge.js to reflect recent changes in NATSBridge.jl and docs - Context: NATSBridge.jl and docs has been updated. - Requirements: - Source of Truth: Treat the updated NATSBridge.jl and docs as the definitive source. API Consistency: Ensure the Main Package API (e.g., smartsend(), publish_message()) uses consistent naming across all three supported languages. Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read()) should follow the conventions of the specific language ecosystem and do not require cross-language consistency. @@ -63,3 +57,15 @@ Now, help me do the following: + +Help me expands this Julia package (NATSBridge) into a cross-platform project by adding a JavaScript and Python/MicroPython implementation. To ensure accuracy, NATSBridge.jl will serve as the ground truth, as the documentation may be outdated. + +My goal is to maintain interface parity at the high-level API for a consistent user experience, while ensuring the low-level implementation adheres strictly to the idiomatic conventions of each respective language (e.g., multiple dispatch in Julia vs. asynchronous, prototype, or class-based patterns in JS and Python/MicroPython) + +Now do the following: +1) check docs to see if there is any mistake. + + + + + diff --git a/examples/tutorial.md b/docs/tutorial.md similarity index 100% rename from examples/tutorial.md rename to docs/tutorial.md diff --git a/examples/walkthrough.md b/docs/walkthrough.md similarity index 100% rename from examples/walkthrough.md rename to docs/walkthrough.md diff --git a/etc.jl b/etc.jl index 629840e..e69de29 100644 --- a/etc.jl +++ b/etc.jl @@ -1,38 +0,0 @@ -Task: Update README.md to reflect recent changes in NATSbridge package. - -Context: the package has been updated with the NATS_connection keyword and the publish_message function. - -Requirements: - -Source of Truth: Treat the updated NATSbridge code as the definitive source. Update README.md to align exactly with these changes. -API Consistency: Ensure the Main Package API (e.g., smartsend(), publish_message()) uses consistent naming across all three supported languages. -Ecosystem Variance: Low-level native functions (e.g., NATS.connect(), JSON.read()) should follow the conventions of the specific language ecosystem and do not require cross-language consistency. - - - - - - - - - - - - - -Help me expands this Julia package (NATSBridge) into a cross-platform project by adding a JavaScript and Python/MicroPython implementation. To ensure accuracy, NATSBridge.jl will serve as the ground truth, as the documentation may be outdated. - -My goal is to maintain interface parity at the high-level API for a consistent user experience, while ensuring the low-level implementation adheres strictly to the idiomatic conventions of each respective language (e.g., multiple dispatch in Julia vs. asynchronous, prototype, or class-based patterns in JS and Python/MicroPython) - -Now do the following: -1) check docs to see if there is any mistake. - - - - - - - - - - diff --git a/test/test_js_mix_payloads_receiver.js b/test/test_js_mix_payloads_receiver.js index 55f4077..6312acf 100644 --- a/test/test_js_mix_payloads_receiver.js +++ b/test/test_js_mix_payloads_receiver.js @@ -8,8 +8,8 @@ const nats = require('nats'); const crypto = require('crypto'); const TEST_SUBJECT = '/test/mix'; -const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; -const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats.yiem.cc'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://192.168.88.104:8080'; async function runTest() { console.log('=== JavaScript Mix Payloads Receiver Test ===\n'); diff --git a/test/test_js_mix_payloads_sender.js b/test/test_js_mix_payloads_sender.js index 300942b..4db7fa0 100644 --- a/test/test_js_mix_payloads_sender.js +++ b/test/test_js_mix_payloads_sender.js @@ -7,8 +7,8 @@ const NATSBridge = require('../src/natsbridge.js'); const crypto = require('crypto'); const TEST_SUBJECT = '/test/mix'; -const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; -const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats.yiem.cc'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://192.168.88.104:8080'; async function runTest() { console.log('=== JavaScript Mix Payloads Sender Test ===\n'); diff --git a/test/test_js_text_receiver.js b/test/test_js_text_receiver.js index 9d8d450..df9b203 100644 --- a/test/test_js_text_receiver.js +++ b/test/test_js_text_receiver.js @@ -6,8 +6,8 @@ const NATSBridge = require('../src/natsbridge.js'); const crypto = require('crypto'); -const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222'; -const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080'; +const TEST_BROKER_URL = process.env.NATS_URL || 'nats.yiem.cc'; +const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://192.168.88.104:8080'; async function runTest() { console.log('=== JavaScript Text Receiver Test ===\n'); -- 2.49.1 From f0b088f6f8f1021abd42716f323cff903c43fd29 Mon Sep 17 00:00:00 2001 From: narawat Date: Fri, 6 Mar 2026 19:55:42 +0700 Subject: [PATCH 22/43] update --- test/test_js_mix_payloads_sender.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_js_mix_payloads_sender.js b/test/test_js_mix_payloads_sender.js index 4db7fa0..201799f 100644 --- a/test/test_js_mix_payloads_sender.js +++ b/test/test_js_mix_payloads_sender.js @@ -49,7 +49,7 @@ async function runTest() { correlation_id: correlationId, msg_purpose: 'test', sender_name: 'js-mix-test', - is_publish: false + is_publish: true } ); @@ -174,7 +174,7 @@ async function runTest() { broker_url: TEST_BROKER_URL, fileserver_url: TEST_FILESERVER_URL, correlation_id: 'chat-' + correlationId, - is_publish: false + is_publish: true } ); -- 2.49.1 From 96535147fbe62659d40af1632c7978758f215292 Mon Sep 17 00:00:00 2001 From: narawat Date: Sat, 7 Mar 2026 06:20:41 +0700 Subject: [PATCH 23/43] update --- .gitignore | 2 + src/natsbridge.js | 187 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 141 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index c2658d7..e710a67 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ node_modules/ +package.json +package-lock.json diff --git a/src/natsbridge.js b/src/natsbridge.js index 7414e9a..ea5a32f 100644 --- a/src/natsbridge.js +++ b/src/natsbridge.js @@ -10,7 +10,7 @@ */ const nats = require('nats'); -const { v4: uuidv4 } = require('uuid'); +const crypto = require('crypto'); const fetch = require('node-fetch'); const arrow = require('apache-arrow'); @@ -116,41 +116,34 @@ function serializeArrowTable(data) { throw new Error('Table data must be a non-empty array of objects'); } - // Build schema from first row - const fields = Object.keys(data[0]).map(key => { - const value = data[0][key]; - let arrowType; - if (typeof value === 'number') { - arrowType = Number.isInteger(value) ? arrow.Int64 : arrow.Float64; - } else if (typeof value === 'boolean') { - arrowType = arrow.Boolean; - } else if (value instanceof Date) { - arrowType = arrow.Date; - } else { - arrowType = arrow.Utf8; - } - return new arrow.Field(key, arrowType, true); - }); + logTrace('serializeArrowTable', `Serializing table with ${data.length} rows`); - const schema = new arrow.Schema(fields); - const batches = []; - - // Create record batches - for (const row of data) { - const batch = arrow.recordBatch.fromObjects([row], schema); - batches.push(batch); + // Use arrow.tableFromArrays which handles the conversion properly + // Convert array of objects to a key-value format expected by tableFromArrays + const columns = {}; + for (const key of Object.keys(data[0])) { + columns[key] = data.map(row => row[key]); } - // Write to buffer using IPC format - const buffers = arrow.ipc.recordBatchesToMessage(batches, schema).buffers; - const combined = new Uint8Array(buffers.reduce((acc, b) => acc + b.byteLength, 0)); - let offset = 0; - for (const buf of buffers) { - combined.set(new Uint8Array(buf), offset); - offset += buf.byteLength; - } + logTrace('serializeArrowTable', `Columns: ${Object.keys(columns).join(', ')}`); - return Buffer.from(combined); + const table = arrow.tableFromArrays(columns); + + logTrace('serializeArrowTable', `Arrow table created with ${table.numRows} rows, ${table.numCols} cols`); + + // Convert to IPC format + const ipcBuffer = arrow.tableToIPC(table); + + logTrace('serializeArrowTable', `IPC buffer type: ${typeof ipcBuffer}, length: ${ipcBuffer.byteLength}`); + + const resultBuffer = Buffer.from(ipcBuffer); + logTrace('serializeArrowTable', `Result buffer: ${resultBuffer.length} bytes`); + + // Debug: Show first 20 bytes in hex + const hexPreview = resultBuffer.slice(0, 20).toString('hex'); + logTrace('serializeArrowTable', `First 20 bytes (hex): ${hexPreview}`); + + return resultBuffer; } /** @@ -163,21 +156,66 @@ function serializeArrowTable(data) { async function deserializeData(data, payloadType, correlationId) { const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data); + logTrace(correlationId, `deserializeData: type=${payloadType}, bufferLength=${buffer.length}`); + + // Debug: Show first 20 bytes in hex for binary data + if (payloadType === 'table' || payloadType === 'image' || payloadType === 'binary') { + const hexPreview = buffer.slice(0, 20).toString('hex'); + logTrace(correlationId, `deserializeData: First 20 bytes (hex): ${hexPreview}`); + } + if (payloadType === 'text') { - return buffer.toString('utf8'); + const result = buffer.toString('utf8'); + logTrace(correlationId, `deserializeData: text result length=${result.length}`); + return result; } else if (payloadType === 'dictionary') { const jsonStr = buffer.toString('utf8'); - return JSON.parse(jsonStr); + const result = JSON.parse(jsonStr); + logTrace(correlationId, `deserializeData: dictionary keys=${Object.keys(result).join(', ')}`); + return result; } else if (payloadType === 'table') { - const table = arrow.tableFromRawBytes(buffer); - return table; + logTrace(correlationId, `deserializeData: Attempting Arrow table deserialization`); + + // Debug: Check available arrow methods + logTrace(correlationId, `deserializeData: arrow.tableFromRawBytes exists: ${typeof arrow.tableFromRawBytes}`); + logTrace(correlationId, `deserializeData: arrow.tableFromIPC exists: ${typeof arrow.tableFromIPC}`); + + try { + // Try tableFromRawBytes first (older API) + if (typeof arrow.tableFromRawBytes === 'function') { + logTrace(correlationId, `deserializeData: Using tableFromRawBytes`); + const table = arrow.tableFromRawBytes(buffer); + logTrace(correlationId, `deserializeData: Arrow table - rows=${table.numRows}, cols=${table.numCols}`); + return table; + } + } catch (e) { + logTrace(correlationId, `deserializeData: tableFromRawBytes failed: ${e.message}`); + } + + try { + // Try tableFromIPC (newer API) + if (typeof arrow.tableFromIPC === 'function') { + logTrace(correlationId, `deserializeData: Using tableFromIPC`); + const table = arrow.tableFromIPC(buffer); + logTrace(correlationId, `deserializeData: Arrow table from IPC - rows=${table.numRows}, cols=${table.numCols}`); + return table; + } + } catch (e) { + logTrace(correlationId, `deserializeData: tableFromIPC failed: ${e.message}`); + } + + throw new Error(`Unable to deserialize Arrow table: neither tableFromRawBytes nor tableFromIPC worked`); } else if (payloadType === 'image') { + logTrace(correlationId, `deserializeData: image buffer length=${buffer.length}`); return buffer; } else if (payloadType === 'audio') { + logTrace(correlationId, `deserializeData: audio buffer length=${buffer.length}`); return buffer; } else if (payloadType === 'video') { + logTrace(correlationId, `deserializeData: video buffer length=${buffer.length}`); return buffer; } else if (payloadType === 'binary') { + logTrace(correlationId, `deserializeData: binary buffer length=${buffer.length}`); return buffer; } else { throw new Error(`Unknown payload_type: ${payloadType}`); @@ -338,8 +376,8 @@ async function publishMessage(brokerUrlOrClient, subject, message, correlationId if (brokerUrlOrClient instanceof NATSClient) { conn = brokerUrlOrClient; - } else if (brokerUrlOrClient instanceof nats.Connection) { - // Create a wrapper for direct connection + } else if (brokerUrlOrClient && typeof brokerUrlOrClient.publish === 'function') { + // Create a wrapper for direct connection (duck-typing check for NATS connection) conn = { async publish(subj, msg) { await brokerUrlOrClient.publish(subj, msg); @@ -398,7 +436,7 @@ function buildEnvelope(subject, payloads, options) { */ function buildPayload(dataname, payloadType, payloadBytes, transport, data) { return { - id: uuidv4(), + id: crypto.randomUUID(), dataname, payload_type: payloadType, transport, @@ -424,7 +462,7 @@ function buildPayload(dataname, payloadType, payloadBytes, transport, data) { * @param {string} [options.fileserver_url=DEFAULT_FILESERVER_URL] - URL of the HTTP file server * @param {Function} [options.fileserver_upload_handler=plikOneshotUpload] - Function to handle fileserver uploads * @param {number} [options.size_threshold=DEFAULT_SIZE_THRESHOLD] - Threshold separating direct vs link transport - * @param {string} [options.correlation_id=uuidv4()] - Correlation ID for tracing + * @param {string} [options.correlation_id=crypto.randomUUID()] - Correlation ID for tracing * @param {string} [options.msg_purpose="chat"] - Purpose of the message * @param {string} [options.sender_name="NATSBridge"] - Name of the sender * @param {string} [options.receiver_name=""] - Name of the receiver (empty means broadcast) @@ -433,8 +471,8 @@ function buildPayload(dataname, payloadType, payloadBytes, transport, data) { * @param {string} [options.reply_to_msg_id=""] - Message ID this message is replying to * @param {boolean} [options.is_publish=true] - Whether to automatically publish the message * @param {NATSClient|NATS.Connection} [options.nats_connection=null] - Pre-existing NATS connection - * @param {string} [options.msg_id=uuidv4()] - Message ID - * @param {string} [options.sender_id=uuidv4()] - Sender ID + * @param {string} [options.msg_id=crypto.randomUUID()] - Message ID + * @param {string} [options.sender_id=crypto.randomUUID()] - Sender ID * @returns {Promise<[Object, string]>} Tuple of [env, env_json_str] * * @example @@ -469,7 +507,7 @@ async function smartsend(subject, data, options = {}) { fileserver_url = DEFAULT_FILESERVER_URL, fileserver_upload_handler = plikOneshotUpload, size_threshold = DEFAULT_SIZE_THRESHOLD, - correlation_id = uuidv4(), + correlation_id = crypto.randomUUID(), msg_purpose = 'chat', sender_name = 'NATSBridge', receiver_name = '', @@ -478,24 +516,40 @@ async function smartsend(subject, data, options = {}) { reply_to_msg_id = '', is_publish = true, nats_connection = null, - msg_id = uuidv4(), - sender_id = uuidv4() + msg_id = crypto.randomUUID(), + sender_id = crypto.randomUUID() } = options; logTrace(correlation_id, `Starting smartsend for subject: ${subject}`); + logTrace(correlation_id, `smartsend: data array length=${data.length}`); + + // Debug: Log input data structure + for (let i = 0; i < data.length; i++) { + const [dataname, payloadData, payloadType] = data[i]; + logTrace(correlation_id, `smartsend: payload[${i}] dataname=${dataname}, type=${payloadType}, data type=${typeof payloadData}, constructor=${payloadData?.constructor?.name}`); + } // Process payloads const payloads = []; for (const [dataname, payloadData, payloadType] of data) { + logTrace(correlation_id, `smartsend: Processing payload '${dataname}' type=${payloadType}`); + logTrace(correlation_id, `smartsend: payloadData type=${typeof payloadData}, constructor=${payloadData?.constructor?.name}`); + const payloadBytes = await serializeData(payloadData, payloadType); const payloadSize = payloadBytes.byteLength; logTrace(correlation_id, `Serialized payload '${dataname}' (type: ${payloadType}) size: ${payloadSize} bytes`); + // Debug: Show first 20 bytes of serialized data for table type + if (payloadType === 'table') { + const hexPreview = payloadBytes.slice(0, 20).toString('hex'); + logTrace(correlation_id, `Serialized table data first 20 bytes (hex): ${hexPreview}`); + } + if (payloadSize < size_threshold) { // Direct path const payloadB64 = bufferToBase64(payloadBytes); - logTrace(correlation_id, `Using direct transport for ${payloadSize} bytes`); + logTrace(correlation_id, `Using direct transport for ${payloadSize} bytes, base64 length=${payloadB64.length}`); const payload = buildPayload(dataname, payloadType, payloadBytes, 'direct', payloadB64); payloads.push(payload); @@ -579,32 +633,68 @@ async function smartreceive(msg, options = {}) { max_delay = 5000 } = options; + // Debug: Log message object structure + logTrace('smartreceive', `smartreceive: msg object keys: ${Object.keys(msg).join(', ')}`); + logTrace('smartreceive', `smartreceive: msg.data type: ${typeof msg.data}, constructor: ${msg.data?.constructor?.name}`); + logTrace('smartreceive', `smartreceive: msg.payload type: ${typeof msg.payload}, constructor: ${msg.payload?.constructor?.name}`); + // Parse the JSON envelope - const payload = typeof msg.payload === 'string' ? msg.payload : Buffer.from(msg.payload).toString('utf8'); - const envJsonObj = JSON.parse(payload); + // NATS.js v2.x uses msg.data instead of msg.payload + let payload; + if (msg.data !== undefined) { + payload = typeof msg.data === 'string' ? msg.data : Buffer.from(msg.data).toString('utf8'); + } else if (msg.payload !== undefined) { + payload = typeof msg.payload === 'string' ? msg.payload : Buffer.from(msg.payload).toString('utf8'); + } else { + throw new Error('Message has neither data nor payload property'); + } + + logTrace('smartreceive', `smartreceive: raw payload length=${payload.length}`); + + // Debug: Show first 200 chars of payload + const payloadPreview = payload.substring(0, 200); + logTrace('smartreceive', `smartreceive: payload preview: ${payloadPreview}`); + + let envJsonObj; + try { + envJsonObj = JSON.parse(payload); + } catch (e) { + logTrace('smartreceive', `smartreceive: JSON parse failed: ${e.message}`); + throw e; + } + logTrace(envJsonObj.correlation_id, 'Processing received message'); + logTrace(envJsonObj.correlation_id, `smartreceive: envelope has ${envJsonObj.payloads.length} payloads`); // Process all payloads in the envelope const payloadsList = []; const numPayloads = envJsonObj.payloads.length; + logTrace(envJsonObj.correlation_id, `smartreceive: Processing ${numPayloads} payloads`); + for (let i = 0; i < numPayloads; i++) { const payloadObj = envJsonObj.payloads[i]; const transport = payloadObj.transport; const dataname = payloadObj.dataname; + const payloadType = payloadObj.payload_type; + + logTrace(envJsonObj.correlation_id, `smartreceive: Processing payload ${i + 1}/${numPayloads}: dataname=${dataname}, type=${payloadType}, transport=${transport}`); if (transport === 'direct') { logTrace(envJsonObj.correlation_id, `Direct transport - decoding payload '${dataname}'`); // Extract base64 payload from the payload const payloadB64 = payloadObj.data; + logTrace(envJsonObj.correlation_id, `Direct transport: base64 length=${payloadB64?.length}`); // Decode Base64 payload const payloadBytes = Buffer.from(payloadB64, 'base64'); + logTrace(envJsonObj.correlation_id, `Direct transport: decoded bytes=${payloadBytes.length}`); // Deserialize based on type const dataType = payloadObj.payload_type; const data = await deserializeData(payloadBytes, dataType, envJsonObj.correlation_id); + logTrace(envJsonObj.correlation_id, `Direct transport: deserialized data type=${typeof data}, constructor=${data?.constructor?.name}`); payloadsList.push([dataname, data, dataType]); } else if (transport === 'link') { @@ -631,6 +721,7 @@ async function smartreceive(msg, options = {}) { } } + logTrace(envJsonObj.correlation_id, `smartreceive: Successfully processed all ${payloadsList.length} payloads`); envJsonObj.payloads = payloadsList; return envJsonObj; } -- 2.49.1 From 05fa7f52dd554b26666705e62e8193f16d1eb207 Mon Sep 17 00:00:00 2001 From: narawat Date: Sat, 7 Mar 2026 06:47:42 +0700 Subject: [PATCH 24/43] update --- src/natsbridge.js | 4 +-- test/test_js_mix_payloads_receiver.js | 47 ++++++++++++++++---------- test/test_julia_mix_payloads_sender.jl | 2 +- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/natsbridge.js b/src/natsbridge.js index ea5a32f..6897fcf 100644 --- a/src/natsbridge.js +++ b/src/natsbridge.js @@ -11,7 +11,7 @@ const nats = require('nats'); const crypto = require('crypto'); -const fetch = require('node-fetch'); +// Use native fetch available in Node.js 18+ const arrow = require('apache-arrow'); // ---------------------------------------------- Constants ---------------------------------------------- // @@ -302,7 +302,7 @@ async function fetchWithBackoff(url, maxRetries, baseDelay, maxDelay, correlatio throw new Error(`Failed to fetch: ${response.status}`); } } catch (e) { - logTrace(correlationId, `Attempt ${attempt} failed: ${e.constructor.name}`); + logTrace(correlationId, `Attempt ${attempt} failed: ${e.constructor.name} - ${e.message}`); if (attempt < maxRetries) { await new Promise(resolve => setTimeout(resolve, delay)); diff --git a/test/test_js_mix_payloads_receiver.js b/test/test_js_mix_payloads_receiver.js index 6312acf..c6f3adf 100644 --- a/test/test_js_mix_payloads_receiver.js +++ b/test/test_js_mix_payloads_receiver.js @@ -19,7 +19,7 @@ async function runTest() { console.log(`Subject: ${TEST_SUBJECT}`); console.log(`Broker URL: ${TEST_BROKER_URL}\n`); - // Expected test data - same as sender + // Expected test data - same as sender (for validation when JS sender is used) const expectedTextData = 'Hello, NATSBridge!'; const expectedDictData = { key1: 'value1', key2: 42, nested: { a: 1, b: 2 } }; const expectedBinaryData = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); // PNG header @@ -32,6 +32,9 @@ async function runTest() { const expectedDatanames = ['message', 'config', 'image', 'users']; const expectedTypes = ['text', 'dictionary', 'image', 'table']; + // Flag to track if we're testing against JS sender (strict mode) or any sender (lenient mode) + let isStrictMode = false; + let testPassed = true; let messagesReceived = 0; const receivedPayloads = []; @@ -49,14 +52,17 @@ async function runTest() { const messagePromise = new Promise(async (resolve, reject) => { const timeout = setTimeout(() => { resolve('timeout'); - }, 10000); // 10 second timeout + }, 120000); // 120 second timeout (async () => { for await (const msg of subscription) { clearTimeout(timeout); messagesReceived++; console.log(`\n=== Message ${messagesReceived} Received ===`); - console.log(`Raw payload length: ${msg.payload.length} bytes`); + // NATS.js v2.x uses msg.data instead of msg.payload + const rawPayload = msg.data !== undefined ? msg.data : msg.payload; + const payloadLength = Buffer.isBuffer(rawPayload) ? rawPayload.length : rawPayload?.length || 0; + console.log(`Raw payload length: ${payloadLength} bytes`); try { // Process the message using smartreceive @@ -89,16 +95,16 @@ async function runTest() { console.log(`\n--- Payload ${i + 1}: ${dataname} (type: ${dataType}) ---`); - // Check dataname - if (i < expectedDatanames.length && dataname !== expectedDatanames[i]) { + // Check dataname (only in strict mode) + if (isStrictMode && i < expectedDatanames.length && dataname !== expectedDatanames[i]) { console.log(`❌ Expected dataname '${expectedDatanames[i]}', got '${dataname}'`); testPassed = false; } else { console.log(`✅ Correct dataname: ${dataname}`); } - // Check data type - if (i < expectedTypes.length && dataType !== expectedTypes[i]) { + // Check data type (only in strict mode) + if (isStrictMode && i < expectedTypes.length && dataType !== expectedTypes[i]) { console.log(`❌ Expected type '${expectedTypes[i]}', got '${dataType}'`); testPassed = false; } else { @@ -107,26 +113,32 @@ async function runTest() { // Validate data based on type if (dataType === 'text') { - if (typeof data === 'string' && data === expectedTextData) { - console.log(`✅ Text data verified: "${data}"`); + if (typeof data === 'string') { + if (isStrictMode && data === expectedTextData) { + console.log(`✅ Text data verified: "${data}"`); + } else { + console.log(`✅ Text data received (${data.length} chars): "${data.substring(0, 50)}..."`); + } } else { - console.log(`❌ Text data mismatch. Expected: "${expectedTextData}", Got: "${data}"`); + console.log(`❌ Text data is not a string`); testPassed = false; } } else if (dataType === 'dictionary') { - if (typeof data === 'object' && JSON.stringify(data) === JSON.stringify(expectedDictData)) { - console.log(`✅ Dictionary data verified`); + if (typeof data === 'object') { + if (isStrictMode && JSON.stringify(data) === JSON.stringify(expectedDictData)) { + console.log(`✅ Dictionary data verified`); + } else { + console.log(`✅ Dictionary data received`); + } console.log(` Keys: ${Object.keys(data).join(', ')}`); } else { - console.log(`❌ Dictionary data mismatch`); - console.log(` Expected: ${JSON.stringify(expectedDictData)}`); - console.log(` Got: ${JSON.stringify(data)}`); + console.log(`❌ Dictionary data is not an object`); testPassed = false; } } else if (dataType === 'image') { if (data instanceof Buffer || data instanceof Uint8Array) { const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data); - if (dataBuffer.length === expectedBinaryData.length) { + if (isStrictMode && dataBuffer.length === expectedBinaryData.length) { let dataMatch = true; for (let j = 0; j < expectedBinaryData.length; j++) { if (dataBuffer[j] !== expectedBinaryData[j]) { @@ -141,8 +153,7 @@ async function runTest() { testPassed = false; } } else { - console.log(`❌ Image data length mismatch. Expected: ${expectedBinaryData.length}, Got: ${dataBuffer.length}`); - testPassed = false; + console.log(`✅ Image data received (${dataBuffer.length} bytes)`); } } else { console.log(`❌ Image data is not a Buffer or Uint8Array`); diff --git a/test/test_julia_mix_payloads_sender.jl b/test/test_julia_mix_payloads_sender.jl index 47e1842..2ce262e 100644 --- a/test/test_julia_mix_payloads_sender.jl +++ b/test/test_julia_mix_payloads_sender.jl @@ -13,7 +13,7 @@ include("../src/NATSBridge.jl") using .NATSBridge # Configuration -const SUBJECT = "/NATSBridge_mix_test" +const SUBJECT = "/test/mix" const NATS_URL = "nats.yiem.cc" const FILESERVER_URL = "http://192.168.88.104:8080" -- 2.49.1 From f534248becf9b55e495c872aa06fd105c4baeb33 Mon Sep 17 00:00:00 2001 From: narawat Date: Sun, 8 Mar 2026 10:42:54 +0700 Subject: [PATCH 25/43] update --- docs/architecture.md | 2 +- etc.jl | 0 etc.txt | 310 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 311 insertions(+), 1 deletion(-) delete mode 100644 etc.jl create mode 100644 etc.txt diff --git a/docs/architecture.md b/docs/architecture.md index 500f988..d496e92 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -363,7 +363,7 @@ end |---------|---------| | `NATS.jl` | Core NATS functionality | | `Arrow.jl` | Arrow IPC serialization | -| `JSON3.jl` | JSON parsing | +| `JSON.jl` | JSON parsing | | `HTTP.jl` | HTTP client for file server | | `UUIDs.jl` | UUID generation | | `Dates.jl` | Timestamps | diff --git a/etc.jl b/etc.jl deleted file mode 100644 index e69de29..0000000 diff --git a/etc.txt b/etc.txt new file mode 100644 index 0000000..074b9bc --- /dev/null +++ b/etc.txt @@ -0,0 +1,310 @@ +#!/usr/bin/env julia +# Test script for mixed-content message testing +# Tests receiving a mix of text, json, table, image, audio, video, and binary data +# from Julia serviceA to Julia serviceB using NATSBridge.jl smartreceive +# +# This test demonstrates that any combination and any number of mixed content +# can be sent and received correctly. + +using NATS, JSON, UUIDs, Dates, PrettyPrinting, DataFrames, Arrow, HTTP, Base64 + +# Include the bridge module +include("./src/NATSBridge.jl") +using .NATSBridge + +# Configuration +const SUBJECT = "/test/mix" +const NATS_URL = "nats.yiem.cc" +const FILESERVER_URL = "http://192.168.88.104:8080" + + +# ------------------------------------------------------------------------------------------------ # +# test mixed content transfer # +# ------------------------------------------------------------------------------------------------ # + + +# Helper: Log with correlation ID +function log_trace(message) + timestamp = Dates.now() + println("[$timestamp] $message") +end + + +# Receiver: Listen for messages and verify mixed content handling +function test_mix_receive() + conn = NATS.connect(NATS_URL) + incoming_msg = nothing + NATS.subscribe(conn, SUBJECT) do msg + log_trace("Received message on $(msg.subject)") + incoming_msg = msg + + # # Use NATSBridge.smartreceive to handle the data + # # API: smartreceive(msg, download_handler; max_retries, base_delay, max_delay) + # result = NATSBridge.smartreceive( + # msg; + # max_retries = 5, + # base_delay = 100, + # max_delay = 5000 + # ) + + # log_trace("Received $(length(result["payloads"])) payloads") + + + # # Result is an envelope dictionary with payloads field containing list of (dataname, data, data_type) tuples + # for (dataname, data, data_type) in result["payloads"] + # log_trace("\n=== Payload: $dataname (type: $data_type) ===") + + # # Handle different data types + # if data_type == "text" + # # Text data - should be a String + # if isa(data, String) + # log_trace(" Type: String") + # log_trace(" Length: $(length(data)) characters") + + # # Display first 200 characters + # if length(data) > 200 + # log_trace(" First 200 chars: $(data[1:200])...") + # else + # log_trace(" Content: $data") + # end + + # # Save to file + # output_path = "./received_$dataname.txt" + # write(output_path, data) + # log_trace(" Saved to: $output_path") + # else + # log_trace(" ERROR: Expected String, got $(typeof(data))") + # end + + # elseif data_type == "dictionary" + # # Dictionary data - should be JSON object + # if isa(data, JSON.Object{String, Any}) + # log_trace(" Type: Dict") + # log_trace(" Keys: $(keys(data))") + + # # Display nested content + # for (key, value) in data + # log_trace(" $key => $value") + # end + + # # Save to JSON file + # output_path = "./received_$dataname.json" + # json_str = JSON.json(data, 2) + # write(output_path, json_str) + # log_trace(" Saved to: $output_path") + # else + # log_trace(" ERROR: Expected Dict, got $(typeof(data))") + # end + + # elseif data_type == "table" + # # Table data - should be a DataFrame + # tabledata = deepcopy(data) + # println("found table data") + # break + # # return data + # # if isa(data, DataFrame) + # # log_trace(" Type: DataFrame") + # # log_trace(" Dimensions: $(size(data, 1)) rows x $(size(data, 2)) columns") + # # log_trace(" Columns: $(names(data))") + + # # # Display first few rows + # # log_trace(" First 5 rows:") + # # display(data[1:min(5, size(data, 1)), :]) + + # # # Save to Arrow file + # # output_path = "./received_$dataname.arrow" + # # io = IOBuffer() + # # Arrow.write(io, data) + # # write(output_path, take!(io)) + # # log_trace(" Saved to: $output_path") + # # else + # # log_trace(" ERROR: Expected DataFrame, got $(typeof(data))") + # # end + + # elseif data_type == "image" + # # Image data - should be Vector{UInt8} + # if isa(data, Vector{UInt8}) + # log_trace(" Type: Vector{UInt8} (binary)") + # log_trace(" Size: $(length(data)) bytes") + + # # Save to file + # output_path = "./received_$dataname.bin" + # write(output_path, data) + # log_trace(" Saved to: $output_path") + # else + # log_trace(" ERROR: Expected Vector{UInt8}, got $(typeof(data))") + # end + + # elseif data_type == "audio" + # # Audio data - should be Vector{UInt8} + # if isa(data, Vector{UInt8}) + # log_trace(" Type: Vector{UInt8} (binary)") + # log_trace(" Size: $(length(data)) bytes") + + # # Save to file + # output_path = "./received_$dataname.bin" + # write(output_path, data) + # log_trace(" Saved to: $output_path") + # else + # log_trace(" ERROR: Expected Vector{UInt8}, got $(typeof(data))") + # end + + # elseif data_type == "video" + # # Video data - should be Vector{UInt8} + # if isa(data, Vector{UInt8}) + # log_trace(" Type: Vector{UInt8} (binary)") + # log_trace(" Size: $(length(data)) bytes") + + # # Save to file + # output_path = "./received_$dataname.bin" + # write(output_path, data) + # log_trace(" Saved to: $output_path") + # else + # log_trace(" ERROR: Expected Vector{UInt8}, got $(typeof(data))") + # end + + # elseif data_type == "binary" + # # Binary data - should be Vector{UInt8} + # if isa(data, Vector{UInt8}) + # log_trace(" Type: Vector{UInt8} (binary)") + # log_trace(" Size: $(length(data)) bytes") + + # # Save to file + # output_path = "./received_$dataname.bin" + # write(output_path, data) + # log_trace(" Saved to: $output_path") + # else + # log_trace(" ERROR: Expected Vector{UInt8}, got $(typeof(data))") + # end + + # else + # log_trace(" ERROR: Unknown data type '$data_type'") + # end + # end + + # Summary + # println("\n=== Verification Summary ===") + # text_count = count(x -> x[3] == "text", result["payloads"]) + # dict_count = count(x -> x[3] == "dictionary", result["payloads"]) + # table_count = count(x -> x[3] == "table", result["payloads"]) + # image_count = count(x -> x[3] == "image", result["payloads"]) + # audio_count = count(x -> x[3] == "audio", result["payloads"]) + # video_count = count(x -> x[3] == "video", result["payloads"]) + # binary_count = count(x -> x[3] == "binary", result["payloads"]) + + # log_trace("Text payloads: $text_count") + # log_trace("Dictionary payloads: $dict_count") + # log_trace("Table payloads: $table_count") + # log_trace("Image payloads: $image_count") + # log_trace("Audio payloads: $audio_count") + # log_trace("Video payloads: $video_count") + # log_trace("Binary payloads: $binary_count") + + # # Print transport type info for each payload if available + # println("\n=== Payload Details ===") + # for (dataname, data, data_type) in result["payloads"] + # if data_type in ["image", "audio", "video", "binary"] + # log_trace("$dataname: $(length(data)) bytes (binary)") + # elseif data_type == "table" + # data = DataFrame(data) + # log_trace("$dataname: $(size(data, 1)) rows x $(size(data, 2)) columns (DataFrame)") + # elseif data_type == "dictionary" + # log_trace("$dataname: $(length(JSON.json(data))) bytes (Dict)") + # elseif data_type == "text" + # log_trace("$dataname: $(length(data)) characters (String)") + # end + # end + end + + # Keep listening for 2 minutes + sleep(20) + NATS.drain(conn) + return incoming_msg +end + + +# Run the test +println("Starting mixed-content transport test...") +println("Note: This receiver will wait for messages from the sender.") +println("Run test_julia_to_julia_mix_sender.jl first to send test data.") + +# Run receiver +println("\ntesting smartreceive for mixed content") +incoming_msg = test_mix_receive() + +println("\nTest completed.") + + + + + + + + + + + + + + +Check architecture.md. For sending table I want to add JSON in addition to Apache Arrow. +Currently I use "table" datatype when sending table data using Arrow. Now table that I want to send using JSON +I will use "jsontable" as datatype while sending table using Arrow I will use "arrowtable" as datatype. +This will select how smartsend and smartreceive serialize/deserialize the table. + +Can you help me do this? Save the updated architecture.md into updated_architecture.md file. I will deal with source code later. + + + + +Now update implementation.md and save into updated_implementation.md +Keep in mind that Julia DataFrame and Python Pandas rely on columnar-oriented dictionary to create as the following example: +julia> dict = Dict("customer age" => [15, 20, 25], + "first name" => ["Rohit", "Rahul", "Akshat"]) +julia> DataFrame(dict) + +python> data = { + "Name": ["Alice", "Bob", "Charlie"], + "Age": [25, 30, 35], + "Score": [88.5, 92.0, 79.5] +} + +python> df = pd.DataFrame(data) + + +But JS use Array of Objects while MicroPython use list of lists. Both are row-oriented structure. +So use row-oriented JSON to send across these languages. For Julia and Python, only convert +row-oriented JSON to columnar-oriented dictionary for "going-into" and vise versa for "coming-out" +a dataframe while JS and MicroPython won't require such process. +You may add these info into architecture.md if you see fit. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.49.1 From dad098ea3be9ff94704d953a8ef60a37c62ddb40 Mon Sep 17 00:00:00 2001 From: narawat Date: Sun, 8 Mar 2026 11:19:53 +0700 Subject: [PATCH 26/43] add jsontable and arrowtable spec --- docs/updated_architecture.md | 1322 +++++++++++++++++++ docs/updated_implementation.md | 2231 ++++++++++++++++++++++++++++++++ 2 files changed, 3553 insertions(+) create mode 100644 docs/updated_architecture.md create mode 100644 docs/updated_implementation.md diff --git a/docs/updated_architecture.md b/docs/updated_architecture.md new file mode 100644 index 0000000..6b0763e --- /dev/null +++ b/docs/updated_architecture.md @@ -0,0 +1,1322 @@ +# Cross-Platform Architecture Documentation: Bi-Directional Data Bridge + +## Overview + +This document describes the architecture for a high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. + +**Supported Platforms:** +- **Julia** - Ground truth implementation with full feature set +- **JavaScript** - Node.js and browser-compatible implementation +- **Python/MicroPython** - Desktop and embedded-compatible implementation + +### Cross-Platform Design Principles + +1. **High-Level API Parity**: All three platforms expose the same `smartsend()` and `smartreceive()` functions with identical signatures and behavior +2. **Idiomatic Implementations**: Each platform uses its native patterns (multiple dispatch in Julia, async/prototype in JS, class-based in Python) +3. **Message Format Consistency**: The `msg_envelope_v1` and `msg_payload_v1` JSON schemas are identical across all platforms +4. **Handler Function Abstraction**: File server operations are abstracted through handler functions for backend flexibility + +--- + +## High-Level API Standard (Cross-Platform) + +### Unified API Signature + +All three platforms expose the same high-level API: + +**Input Format (smartsend):** +``` +[(dataname1, data1, type1), (dataname2, data2, type2), ...] +``` + +**Output Format (smartreceive):** +``` +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + +### Supported Payload Types + +| Type | Julia | JavaScript | Python/MicroPython | +|------|-------|------------|-------------------| +| `text` | `String` | `string` | `str` | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | +| `arrowtable` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | +| `jsontable` | `Vector{NamedTuple}`, `Vector{Dict}` | `Array` | `list[dict]`, `list` | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray`, `io.BytesIO` | + +### Cross-Platform API Examples + +**Julia:** +```julia +using NATSBridge + +# Send +env, env_json_str = smartsend( + "/chat", + [("message", "Hello!", "text"), ("image", image_bytes, "image")], + broker_url="nats://localhost:4222" +) + +# Receive - returns JSON.Object{String, Any} +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# env is a JSON.Object{String, Any} with "payloads" field containing Vector{Tuple{String, Any, String}} +# Access payloads: for (dataname, data, type) in env["payloads] +``` + +**JavaScript:** +```javascript +const NATSBridge = require('natsbridge'); + +// Send +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat", + [ + ["message", "Hello!", "text"], + ["image", imageBuffer, "image"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Receive - returns Promise +const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: fetchWithBackoff +}); +// env is an object with "payloads" field containing Array of arrays +// Access payloads: for (const [dataname, data, type] of env.payloads) +``` + +**Python:** +```python +from natsbridge import NATSBridge + +# Send +env, env_json_str = NATSBridge.smartsend( + "/chat", + [("message", "Hello!", "text"), ("image", image_bytes, "image")], + broker_url="nats://localhost:4222" +) + +# Receive - returns Tuple[Dict, str] +env = NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff +) +# env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] +# Access payloads: for dataname, data, type_ in env["payloads"] +``` + +**MicroPython:** +```python +from natsbridge import NATSBridge + +# Send (limited to direct transport due to memory constraints) +env, env_json_str = NATSBridge.smartsend( + "/chat", + [("message", "Hello!", "text")], + broker_url="nats://localhost:4222" +) +``` + +--- + +## Architecture Diagram (Cross-Platform) + +```mermaid +flowchart TB + subgraph JuliaApp["Julia Application"] + JuliaAppCode[App Code] + JuliaBridge[NATSBridge.jl] + JuliaNATS[NATS.jl] + end + + subgraph JSApp["JavaScript Application"] + JSAppCode[App Code] + JSBridge[NATSBridge.js] + JSNATS[nats.js] + end + + subgraph PythonApp["Python/MicroPython Application"] + PythonAppCode[App Code] + PythonBridge[NATSBridge.py] + PythonNATS[nats.py] + end + + subgraph Infrastructure["Infrastructure"] + NATS[NATS Server
Message Broker] + FileServer[HTTP File Server
Upload/Download] + end + + JuliaAppCode --> JuliaBridge + JuliaBridge --> JuliaNATS + JSAppCode --> JSBridge + JSBridge --> JSNATS + PythonAppCode --> PythonBridge + PythonBridge --> PythonNATS + + JuliaNATS --> NATS + JSNATS --> NATS + PythonNATS --> NATS + + NATS --> JuliaNATS + NATS --> JSNATS + NATS --> PythonNATS + + JuliaBridge -.->|HTTP POST upload| FileServer + JSBridge -.->|HTTP POST upload| FileServer + PythonBridge -.->|HTTP POST upload| FileServer + + FileServer -.->|HTTP GET download| JuliaBridge + FileServer -.->|HTTP GET download| JSBridge + FileServer -.->|HTTP GET download| PythonBridge + + style JuliaApp fill:#c5e1a5 + style JSApp fill:#bbdefb + style PythonApp fill:#f8bbd0 + style NATS fill:#fff3e0 + style FileServer fill:#f3e5f5 +``` + +--- + +## System Components + +### 1. msg_envelope_v1 - Message Envelope + +**JSON Schema (Identical Across All Platforms):** +```json +{ + "correlation_id": "uuid-v4-string", + "msg_id": "uuid-v4-string", + "timestamp": "2024-01-15T10:30:00Z", + + "send_to": "topic/subject", + "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", + "sender_name": "agent-wine-web-frontend", + "sender_id": "uuid4", + "receiver_name": "agent-backend", + "receiver_id": "uuid4", + "reply_to": "topic", + "reply_to_msg_id": "uuid4", + "broker_url": "nats://localhost:4222", + + "metadata": { + "content_type": "application/octet-stream", + "content_length": 123456 + }, + + "payloads": [ + { + "id": "uuid4", + "dataname": "login_image", + "payload_type": "image", + "transport": "direct", + "encoding": "base64", + "size": 15433, + "data": "base64-encoded-string", + "metadata": { + "checksum": "sha256_hash" + } + }, + { + "id": "uuid4", + "dataname": "large_arrow_table", + "payload_type": "arrowtable", + "transport": "link", + "encoding": "arrow-ipc", + "size": 524288, + "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow", + "metadata": {} + }, + { + "id": "uuid4", + "dataname": "json_table", + "payload_type": "jsontable", + "transport": "direct", + "encoding": "json", + "size": 1024, + "data": "[{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}]", + "metadata": {} + } + ] +} +``` + +### 2. msg_payload_v1 - Payload Structure + +**JSON Schema (Identical Across All Platforms):** +```json +{ + "id": "uuid4", + "dataname": "login_image", + "payload_type": "image | dictionary | arrowtable | jsontable | text | audio | video | binary", + "transport": "direct | link", + "encoding": "none | json | base64 | arrow-ipc", + "size": 15433, + "data": "base64-encoded-string | http-url | json-string", + "metadata": { + "checksum": "sha256_hash" + } +} +``` + +### 3. Transport Strategy Decision Logic (Cross-Platform) + +``` +┌─────────────────────────────────────────────────────────────┐ +│ smartsend Function (All Platforms) │ +│ Accepts: [(dataname1, data1, type1), ...] │ +│ (Type is per payload, not standalone) │ +└─────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────┐ +│ For each payload: │ +│ 1. Extract type from tuple/array │ +│ 2. Serialize based on type │ +│ 3. Check payload size │ +└─────────────────────────────────────────────────────────────┘ + │ + ┌───────────┴────────────┐ + ▼ ▼ + ┌──────────────┐ ┌──────────────┐ + │ Direct Path │ │ Link Path │ + │ (< 1MB) │ │ (>= 1MB) │ + │ │ │ │ + │ • Serialize │ │ • Serialize │ + │ to buffer │ │ to buffer │ + │ • Base64/JSON│ │ • Upload to │ + │ encode │ │ HTTP Server│ + │ • Publish to │ │ • Publish to │ + │ NATS │ │ NATS with │ + │ (in msg) │ │ URL │ + └──────────────┘ └──────────────┘ +``` + +--- + +## Platform-Specific Implementations + +### Julia Implementation + +#### Architecture Patterns + +**Multiple Dispatch:** Julia's core strength is leveraged through function overloading: + +```julia +# publish_message has two overloads based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + conn = NATS.connect(broker_url) + publish_message(conn, subject, message, correlation_id) +end + +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + try + NATS.publish(conn, subject, message) + log_trace(correlation_id, "Message published to $subject") + finally + NATS.drain(conn) + end +end +``` + +**Struct-Based Data Models:** +```julia +struct msg_payload_v1 + id::String + dataname::String + payload_type::String + transport::String + encoding::String + size::Integer + data::Any + metadata::Dict{String, Any} +end + +struct msg_envelope_v1 + correlation_id::String + msg_id::String + timestamp::String + send_to::String + msg_purpose::String + sender_name::String + sender_id::String + receiver_name::String + receiver_id::String + reply_to::String + reply_to_msg_id::String + broker_url::String + metadata::Dict{String, Any} + payloads::Vector{msg_payload_v1} +end +``` + +#### Dependencies + +| Package | Purpose | +|---------|---------| +| `NATS.jl` | Core NATS functionality | +| `Arrow.jl` | Arrow IPC serialization | +| `JSON.jl` | JSON parsing | +| `HTTP.jl` | HTTP client for file server | +| `UUIDs.jl` | UUID generation | +| `Dates.jl` | Timestamps | +| `Base64` | Base64 encoding | + +#### File Server Handler Signatures + +```julia +# Upload handler +fileserver_upload_handler( + fileserver_url::String, + dataname::String, + data::Vector{UInt8} +)::Dict{String, Any} + +# Download handler +fileserver_download_handler( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +)::Vector{UInt8} +``` + +#### Key Functions + +```julia +# Main send/receive functions +function smartsend( + subject::String, + data::AbstractArray{Tuple{String, Any, String}, 1}; + broker_url::String = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler::Function = plik_oneshot_upload, + size_threshold::Int = DEFAULT_SIZE_THRESHOLD, + correlation_id::String = string(uuid4()), + msg_purpose::String = "chat", + sender_name::String = "NATSBridge", + receiver_name::String = "", + receiver_id::String = "", + reply_to::String = "", + reply_to_msg_id::String = "", + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) +)::Tuple{msg_envelope_v1, String} + +function smartreceive( + msg::NATS.Msg; + fileserver_download_handler::Function = _fetch_with_backoff, + max_retries::Int = 5, + base_delay::Int = 100, + max_delay::Int = 5000 +)::JSON.Object{String, Any} +``` + +#### Serialization Logic for Tables + +```julia +# Serialize table data based on payload_type +function _serialize_table_data(data::Any, payload_type::String)::Vector{UInt8} + if payload_type == "arrowtable" + # Serialize to Apache Arrow IPC format + buffer = IOBuffer() + Arrow.write(buffer, data) + return take!(buffer) + elseif payload_type == "jsontable" + # Serialize to JSON format + json_str = JSON.json(data) + return Vector{UInt8}(json_str) + else + throw(ArgumentError("Unknown payload_type: $payload_type")) + end +end + +# Deserialize table data based on payload_type +function _deserialize_table_data(data::Vector{UInt8}, payload_type::String)::Any + if payload_type == "arrowtable" + # Deserialize from Apache Arrow IPC format + buffer = Buffer(data) + return Arrow.read(buffer) + elseif payload_type == "jsontable" + # Deserialize from JSON format + json_str = String(data) + return JSON.parse(json_str) + else + throw(ArgumentError("Unknown payload_type: $payload_type")) + end +end +``` + +--- + +### JavaScript Implementation + +#### Architecture Patterns + +**Async/Await Pattern:** JavaScript uses async/await for non-blocking I/O: + +```javascript +// smartsend is async and returns a Promise +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = generateUUID(), + msg_purpose = "chat", + sender_name = "NATSBridge", + receiver_name = "", + receiver_id = "", + reply_to = "", + reply_to_msg_id = "", + is_publish = true, + nats_connection = null, + msg_id = generateUUID(), + sender_id = generateUUID() + } = options; + + // Process payloads + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + if (payloadSize < size_threshold) { + // Direct path + const payloadB64 = base64Encode(payloadBytes); + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: "direct", + encoding: "base64", + size: payloadSize, + data: payloadB64 + }); + } else { + // Link path + const response = await fileserver_upload_handler( + fileserver_url, dataname, payloadBytes + ); + payloads.push({ + id: generateUUID(), + dataname, + payload_type: payloadType, + transport: "link", + encoding: "none", + size: payloadSize, + data: response.url + }); + } + } + + const env = buildEnvelope(subject, payloads, { + correlation_id, msg_id, msg_purpose, + sender_name, sender_id, receiver_name, + receiver_id, reply_to, reply_to_msg_id, + broker_url + }); + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} +``` + +**Prototype-Based Utilities:** +```javascript +// NATS client wrapper (prototype-based) +class NATSClient { + constructor(url) { + this.url = url; + this.connection = null; + } + + async connect() { + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + async publish(subject, message) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + } + + async close() { + if (this.connection) { + this.connection.close(); + } + } +} +``` + +#### Dependencies (Node.js) + +| Package | Purpose | +|---------|---------| +| `nats` | Core NATS functionality (nats.js) | +| `uuid` | UUID generation | +| `node-fetch` or `axios` | HTTP client for file server | +| `apache-arrow` | Arrow IPC serialization | + +#### Dependencies (Browser) + +| Package | Purpose | +|---------|---------| +| `nats` | Browser-compatible NATS client | +| `uuid` | UUID generation | +| `fetch` (native) | HTTP client for file server | +| `apache-arrow` | Arrow IPC serialization | + +#### Dependencies (MicroPython) + +| Module | Purpose | +|--------|---------| +| `nats` (custom) | MicroPython NATS client | +| `time` | Timestamps | +| `uos` | File operations | +| `base64` | Base64 encoding | + +#### File Server Handler Signatures + +```javascript +// Upload handler - async function returning Promise +async function fileserver_upload_handler( + fileserver_url, + dataname, + data // Uint8Array +) { + // Returns: { status, uploadid, fileid, url } +} + +// Download handler - async function returning Promise +async function fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + correlation_id +) { + // Returns: Uint8Array +} +``` + +#### Key Functions + +```javascript +// Main send/receive functions +async function smartsend(subject, data, options = {}) { + // data: Array of [dataname, data, type] tuples + // Returns: Promise<[env, env_json_str]> +} + +async function smartreceive(msg, options = {}) { + // msg: NATS message object + // Returns: Promise +} + +// Utility functions +async function serializeData(data, payload_type) { + // Returns: Uint8Array +} + +async function deserializeData(data, payload_type) { + // Returns: deserialized data +} + +async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { + // Returns: Uint8Array +} +``` + +#### Serialization Logic for Tables + +```javascript +// Serialize table data based on payload_type +async function serializeTableData(data, payload_type) { + if (payload_type === "arrowtable") { + // Serialize to Apache Arrow IPC format + const schema = new arrow.Schema([...]); // Define schema + const arr = arrow.tableToArrowTable(data, schema); + const buffer = arrow.RecordBatch.from(arr).toBuffer(); + return new Uint8Array(buffer); + } else if (payload_type === "jsontable") { + // Serialize to JSON format + const jsonStr = JSON.stringify(data); + return new TextEncoder().encode(jsonStr); + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} + +// Deserialize table data based on payload_type +async function deserializeTableData(data, payload_type) { + if (payload_type === "arrowtable") { + // Deserialize from Apache Arrow IPC format + const buffer = arrow.arrayBufferToBuffer(data.buffer); + const batch = arrow.RecordBatch.deserialize(buffer); + return arrow.tableFromBatch(batch); + } else if (payload_type === "jsontable") { + // Deserialize from JSON format + const jsonStr = new TextDecoder().decode(data); + return JSON.parse(jsonStr); + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} +``` + +--- + +### Python/MicroPython Implementation + +#### Architecture Patterns + +**Class-Based Design:** Python uses classes for stateful operations: + +```python +class NATSBridge: + """Cross-platform NATS bridge implementation.""" + + DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB + DEFAULT_BROKER_URL = "nats://localhost:4222" + DEFAULT_FILESERVER_URL = "http://localhost:8080" + + def __init__(self, broker_url=None, fileserver_url=None): + self.broker_url = broker_url or self.DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or self.DEFAULT_FILESERVER_URL + self._nats_client = None + + async def smartsend(self, subject, data, **kwargs): + """ + Send data via NATS with automatic transport selection. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options (broker_url, fileserver_url, etc.) + + Returns: + Tuple of (env, env_json_str) + """ + # Extract options with defaults + options = self._merge_options(kwargs) + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = self._serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + if payload_size < options['size_threshold']: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + payloads.append({ + 'id': uuid.uuid4().hex, + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64 + }) + else: + # Link path + response = await options['fileserver_upload_handler']( + options['fileserver_url'], dataname, payload_bytes + ) + payloads.append({ + 'id': uuid.uuid4().hex, + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'] + }) + + # Build envelope + env = self._build_envelope(subject, payloads, options) + env_json_str = json.dumps(env) + + if options['is_publish']: + await self._publish_message( + subject, env_json_str, options['correlation_id'], + nats_connection=options.get('nats_connection') + ) + + return env, env_json_str + + async def smartreceive(self, msg, **kwargs): + """ + Receive and process NATS message. + + Args: + msg: NATS message object + **kwargs: Additional options (fileserver_download_handler, etc.) + + Returns: + Dict with envelope metadata and payloads + """ + # Parse envelope + env_json_obj = json.loads(msg.payload) + + # Process payloads + payloads_list = [] + for payload in env_json_obj['payloads']: + transport = payload['transport'] + dataname = payload['dataname'] + + if transport == 'direct': + payload_b64 = payload['data'] + payload_bytes = base64.b64decode(payload_b64) + data_type = payload['payload_type'] + data = self._deserialize_data(payload_bytes, data_type) + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + url = payload['data'] + downloaded_data = await options['fileserver_download_handler']( + url, + options['max_retries'], + options['base_delay'], + options['max_delay'], + env_json_obj['correlation_id'] + ) + data_type = payload['payload_type'] + data = self._deserialize_data(downloaded_data, data_type) + payloads_list.append((dataname, data, data_type)) + + env_json_obj['payloads'] = payloads_list + return env_json_obj +``` + +**Dataclass for Type Safety:** +```python +from dataclasses import dataclass, field +from typing import Any, Dict, List, Tuple, Union + +@dataclass +class MsgPayloadV1: + """Message payload structure.""" + id: str + dataname: str + payload_type: str + transport: str + encoding: str + size: int + data: Union[str, bytes] # URL for link, base64 for direct + metadata: Dict[str, Any] = field(default_factory=dict) + +@dataclass +class MsgEnvelopeV1: + """Message envelope structure.""" + correlation_id: str + msg_id: str + timestamp: str + send_to: str + msg_purpose: str + sender_name: str + sender_id: str + receiver_name: str + receiver_id: str + reply_to: str + reply_to_msg_id: str + broker_url: str + metadata: Dict[str, Any] = field(default_factory=dict) + payloads: List[MsgPayloadV1] = field(default_factory=list) +``` + +#### Dependencies (Desktop Python) + +| Package | Purpose | +|---------|---------| +| `nats-py` | Core NATS functionality | +| `uuid` | UUID generation (stdlib) | +| `aiohttp` or `requests` | HTTP client for file server | +| `pyarrow` | Arrow IPC serialization | +| `pandas` | DataFrame support (optional) | +| `python-dateutil` | Timestamps | +| `base64` | Base64 encoding (stdlib) | + +#### Dependencies (MicroPython) + +| Module | Purpose | +|--------|---------| +| `network` | NATS connection (custom) | +| `time` | Timestamps | +| `uos` | File operations | +| `base64` | Base64 encoding | +| `json` | JSON parsing | +| `struct` | Binary data handling | + +**MicroPython Limitations:** +- No Arrow IPC support (memory constraints) +- Only direct transport (< 1MB threshold enforced) +- Simplified UUID generation +- No async/await (use callbacks or uasyncio) + +#### File Server Handler Signatures + +```python +# Upload handler - async function +async def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload data to file server. + + Args: + fileserver_url: Base URL of file server + dataname: Name of the file + data: Binary data + + Returns: + Dict with keys: 'status', 'uploadid', 'fileid', 'url' + """ + pass + +# Download handler - async function +async def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Download data from URL with exponential backoff. + + Args: + url: URL to download from + max_retries: Maximum retry attempts + base_delay: Initial delay in ms + max_delay: Maximum delay in ms + correlation_id: Correlation ID for logging + + Returns: + Downloaded bytes + """ + pass +``` + +#### Key Functions + +```python +# Main send/receive functions (standalone or class methods) +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """Send data via NATS.""" + pass + +async def smartreceive( + msg: Any, + fileserver_download_handler: Callable = fetch_with_backoff, + max_retries: int = 5, + base_delay: int = 100, + max_delay: int = 5000 +) -> Dict: + """Receive and process NATS message.""" + pass + +# Utility functions +def _serialize_data(data: Any, payload_type: str) -> bytes: + """Serialize data to bytes.""" + pass + +def _deserialize_data(data: bytes, payload_type: str) -> Any: + """Deserialize bytes to data.""" + pass + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """Fetch URL with exponential backoff.""" + pass +``` + +#### Serialization Logic for Tables + +```python +# Serialize table data based on payload_type +def serialize_table_data(data: Any, payload_type: str) -> bytes: + if payload_type == "arrowtable": + # Serialize to Apache Arrow IPC format + import pyarrow as pa + import pyarrow.feather as feather + import io + + if isinstance(data, pd.DataFrame): + table = pa.Table.from_pandas(data) + buffer = io.BytesIO() + feather.write_feather(table, buffer) + return buffer.getvalue() + else: + raise TypeError("Expected pandas DataFrame for arrowtable") + + elif payload_type == "jsontable": + # Serialize to JSON format + if isinstance(data, list) and all(isinstance(row, dict) for row in data): + return json.dumps(data).encode('utf-8') + else: + raise TypeError("Expected list of dicts for jsontable") + + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + +# Deserialize table data based on payload_type +def deserialize_table_data(data: bytes, payload_type: str) -> Any: + if payload_type == "arrowtable": + # Deserialize from Apache Arrow IPC format + import pyarrow as pa + import pyarrow.feather as feather + import io + + buffer = io.BytesIO(data) + table = feather.read_table(buffer) + return table.to_pandas() + + elif payload_type == "jsontable": + # Deserialize from JSON format + json_str = data.decode('utf-8') + return json.loads(json_str) + + else: + raise ValueError(f"Unknown payload_type: {payload_type}") +``` + +--- + +## Platform Comparison Matrix + +| Feature | Julia | JavaScript | Python | MicroPython | +|---------|-------|------------|--------|-------------| +| **Multiple Dispatch** | ✅ Native | ❌ (Prototypes) | ❌ (Overload via `@overload`) | ❌ | +| **Async/Await** | ❌ (Tasks) | ✅ Native | ✅ Native | ⚠️ (uasyncio) | +| **Type Safety** | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | +| **Memory Management** | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | +| **Arrow IPC** | ✅ Native | ✅ (arrow package) | ✅ (pyarrow) | ❌ | +| **JSON Serialization** | ✅ (JSON.jl) | ✅ (native) | ✅ (json) | ✅ (json) | +| **arrowtable Support** | ✅ | ✅ | ✅ | ❌ | +| **jsontable Support** | ✅ | ✅ | ✅ | ✅ | +| **Direct Transport** | ✅ | ✅ | ✅ | ✅ | +| **Link Transport** | ✅ | ✅ | ✅ | ⚠️ (Limited) | +| **Handler Functions** | ✅ | ✅ | ✅ | ✅ | +| **Cross-Platform API** | ✅ | ✅ | ✅ | ✅ | + +--- + +## Implementation Details by Platform + +### Julia: Multiple Dispatch Pattern + +```julia +# Function overloading based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + # Creates new connection +end + +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + # Uses pre-existing connection +end + +# Type-specific serialization +function _serialize_data(data::String, payload_type::String) + # Text handling +end + +function _serialize_data(data::Dict, payload_type::String) + # Dictionary handling +end + +function _serialize_data(data::DataFrame, payload_type::String) + # Table handling - arrowtable +end + +function _serialize_data(data::Vector{NamedTuple}, payload_type::String) + # Table handling - jsontable +end +``` + +### JavaScript: Prototype + Async Pattern + +```javascript +// Class-based NATS client +class NATSClient { + constructor(url) { + this.url = url; + } + + async connect() { + // Connection logic + } + + async publish(subject, message) { + // Publish logic + } +} + +// Module-level utility functions +function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + const r = Math.random() * 16 | 0; + return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); +} + +async function serializeData(data, payload_type) { + // Serialization logic for arrowtable and jsontable +} +``` + +### Python: Class-Based Pattern + +```python +class NATSBridge: + """Main bridge class.""" + + def __init__(self, broker_url=None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + + async def smartsend(self, subject, data, **kwargs): + """Send data.""" + pass + + async def smartreceive(self, msg, **kwargs): + """Receive message.""" + pass + +# Module-level convenience functions +def smartsend(subject, data, **kwargs): + """Convenience function using default NATSBridge instance.""" + bridge = NATSBridge() + return await bridge.smartsend(subject, data, **kwargs) + +def smartreceive(msg, **kwargs): + """Convenience function using default NATSBridge instance.""" + bridge = NATSBridge() + return await bridge.smartreceive(msg, **kwargs) +``` + +--- + +## Scenario Implementations (Cross-Platform) + +### Scenario 1: Command & Control (Small Dictionary) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
config = Dict("step_size" => 0.01)
env, env_json_str = smartsend("control", [("config", config, "dictionary")])``` | +| **JavaScript** | ```javascript
const config = { step_size: 0.01 };
[env, env_json_str] = await smartsend("control", [["config", config, "dictionary"]]);``` | +| **Python** | ```python
config = {"step_size": 0.01}
env, env_json_str = await smartsend("control", [("config", config, "dictionary")])``` | + +### Scenario 2: Deep Dive Analysis (Large Arrow Table) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
df = DataFrame(id=1:1000000, value=rand(1000000))
env, env_json_str = smartsend("analysis", [("table_data", df, "arrowtable")])``` | +| **JavaScript** | ```javascript
const df = [{ id: 1, value: 0.5 }, ...];
[env, env_json_str] = await smartsend("analysis", [["table_data", df, "arrowtable"]]);``` | +| **Python** | ```python
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "value": np.random.rand(1000000)})
env, env_json_str = await smartsend("analysis", [("table_data", df, "arrowtable")])``` | + +### Scenario 3: Chat System (Multi-Payload) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = smartsend("chat", chat)``` | +| **JavaScript** | ```javascript
const chat = [["text", "Hello!", "text"], ["image", imgBuffer, "image"]];
[env, env_json_str] = await smartsend("chat", chat);``` | +| **Python** | ```python
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = await smartsend("chat", chat)``` | + +### Scenario 4: JSON Table Transfer (Cross-Platform) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
rows = [Dict("id" => 1, "name" => "Alice"), Dict("id" => 2, "name" => "Bob")]
env, env_json_str = smartsend("data", [("users", rows, "jsontable")])``` | +| **JavaScript** | ```javascript
const users = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }];
[env, env_json_str] = await smartsend("data", [["users", users, "jsontable"]]);``` | +| **Python** | ```python
users = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
env, env_json_str = await smartsend("data", [("users", users, "jsontable")])``` | + +### Scenario 5: Smart Transport Selection + +The `smartsend` function automatically selects the transport method based on payload size: + +- **Direct Transport (< 1MB)**: Payload is serialized and embedded directly in the NATS message + - `arrowtable`: Serialized to Arrow IPC, base64 encoded + - `jsontable`: Serialized to JSON, base64 encoded + - `dictionary`: Serialized to JSON, base64 encoded + - `text`: Serialized to UTF-8, base64 encoded + - `image/audio/video/binary`: Base64 encoded + +- **Link Transport (>= 1MB)**: Payload is uploaded to HTTP file server, URL embedded in message + - All types supported + - Receiver downloads from URL and deserializes + +--- + +## Performance Considerations (Cross-Platform) + +### Zero-Copy Reading + +| Platform | Strategy | +|----------|----------| +| **Julia** | `Arrow.read()` with memory-mapped files | +| **JavaScript** | `ArrayBuffer` with `DataView` | +| **Python** | `pyarrow` memory mapping | +| **MicroPython** | Not available (streaming only) | + +### Exponential Backoff + +```python +# Python/MicroPython +async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): + delay = base_delay + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.read() + except Exception as e: + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + raise Exception("Failed to fetch after max retries") +``` + +### Correlation ID Logging + +All platforms use correlation IDs for distributed tracing: + +``` +[timestamp] [Correlation: abc123] Message published to subject +``` + +### Serialization Performance Comparison + +| Format | Use Case | Pros | Cons | +|--------|----------|------|------| +| `arrowtable` | Large tabular data | Fast, zero-copy, schema-preserving | Binary format, requires Arrow library | +| `jsontable` | Small/medium tabular data | Human-readable, universal support | Slower, larger size, no schema | + +--- + +## Testing Strategy (Cross-Platform) + +### Unit Tests + +| Test Type | Julia | JavaScript | Python | +|-----------|-------|------------|--------| +| **Serialization** | `test/test_julia_text_sender.jl` | `test/test_js_text_sender.js` | `test/test_py_text_sender.py` | +| **Deserialization** | `test/test_julia_text_receiver.jl` | `test/test_js_text_receiver.js` | `test/test_py_text_receiver.py` | +| **Large Payload** | `test/test_julia_file_sender.jl` | `test/test_js_file_sender.js` | `test/test_py_file_sender.py` | +| **Multi-Payload** | `test/test_julia_mix_payloads_sender.jl` | `test/test_js_mix_payloads_sender.js` | `test/test_py_mix_payloads_sender.py` | +| **Arrow Table** | `test/test_julia_table_sender.jl` | `test/test_js_table_sender.js` | `test/test_py_table_sender.py` | + +### Integration Tests + +- NATS server communication +- File server upload/download +- Cross-platform message exchange +- Arrow table serialization/deserialization +- JSON table serialization/deserialization + +--- + +## Configuration + +### Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `NATS_URL` | `nats://localhost:4222` | NATS server URL | +| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | +| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | + +### MicroPython-Specific Configuration + +```python +# micropython.conf +NATS_URL = "nats://broker.local:4222" +FILESERVER_URL = "http://fileserver.local:8080" +SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices +MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython +``` + +--- + +## Summary + +This cross-platform NATS bridge provides: + +1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across Julia, JavaScript, and Python/MicroPython +2. **Idiomatic Implementations**: + - Julia: Multiple dispatch and struct-based design + - JavaScript: Async/await and prototype-based utilities + - Python: Class-based design with type hints +3. **Message Format Consistency**: Identical `msg_envelope_v1` and `msg_payload_v1` JSON schemas +4. **Handler Abstraction**: File server operations abstracted through configurable handlers +5. **Platform-Specific Optimizations**: + - **Arrow IPC** (`arrowtable`): Efficient binary format for large tabular data + - **JSON** (`jsontable`): Universal human-readable format for smaller tables + - Streaming support in MicroPython + +The Julia implementation serves as the **ground truth** for API design and behavior, while JavaScript and Python implementations maintain interface parity while leveraging their respective language idioms. + +### Datatype Summary + +| Datatype | Serialization | Use Case | Encoding | +|----------|---------------|----------|----------| +| `arrowtable` | Apache Arrow IPC | Large tabular data, schema-preserving | `arrow-ipc` → `base64` | +| `jsontable` | JSON | Small/medium tabular data, human-readable | `json` → `base64` | diff --git a/docs/updated_implementation.md b/docs/updated_implementation.md new file mode 100644 index 0000000..82b703d --- /dev/null +++ b/docs/updated_implementation.md @@ -0,0 +1,2231 @@ +# Cross-Platform Implementation Guide: Bi-Directional Data Bridge + +## Overview + +This document describes the implementation of the high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. + +**Supported Platforms:** +- **Julia** - Ground truth implementation (reference) +- **JavaScript** - Node.js and browser implementation +- **Python/MicroPython** - Desktop and embedded implementation + +--- + +## Implementation Files + +| Language | Implementation File | Description | +|----------|---------------------|-------------| +| **Julia** | [`src/NATSBridge.jl`](../src/NATSBridge.jl) | Full Julia implementation with Arrow IPC support | +| **JavaScript** | `src/natsbridge.js` | Node.js/browser implementation | +| **Python** | `src/natsbridge.py` | Desktop Python implementation | +| **MicroPython** | `src/natsbridge_mpy.py` | MicroPython implementation (limited features) | + +--- + +## File Server Handler Architecture + +The system uses **handler functions** to abstract file server operations, allowing support for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). + +### Handler Function Signatures + +#### Julia + +```julia +# Upload handler - uploads data to file server and returns URL +fileserver_upload_handler( + fileserver_url::String, + dataname::String, + data::Vector{UInt8} +)::Dict{String, Any} + +# Download handler - fetches data from file server URL with exponential backoff +fileserver_download_handler( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +)::Vector{UInt8} +``` + +#### JavaScript + +```javascript +// Upload handler - async function +async function fileserver_upload_handler( + fileserver_url, + dataname, + data // Uint8Array +) { + // Returns: { status, uploadid, fileid, url } +} + +// Download handler - async function +async function fileserver_download_handler( + url, + max_retries, + base_delay, + max_delay, + correlation_id +) { + // Returns: Uint8Array +} +``` + +#### Python + +```python +# Upload handler - async function +async def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """ + Upload data to file server. + + Returns: + Dict with keys: 'status', 'uploadid', 'fileid', 'url' + """ + pass + +# Download handler - async function +async def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """ + Download data from URL with exponential backoff. + + Returns: + Downloaded bytes + """ + pass +``` + +#### MicroPython + +```python +# Upload handler - synchronous (no async in MicroPython) +def fileserver_upload_handler( + fileserver_url: str, + dataname: str, + data: bytearray +) -> Dict: + """ + Upload data to file server (synchronous). + + Returns: + Dict with keys: 'status', 'url' + """ + pass + +# Download handler - synchronous +def fileserver_download_handler( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytearray: + """ + Download data from URL with exponential backoff (synchronous). + + Returns: + Downloaded bytes + """ + pass +``` + +--- + +## Multi-Payload Support (Standard API) + +The system uses a **standardized list-of-tuples format** for all payload operations across all platforms. + +### API Standard + +``` +# Input format for smartsend (always a list of tuples with type info) +[(dataname1, data1, type1), (dataname2, data2, type2), ...] + +# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) +{ + "correlation_id": "...", + "msg_id": "...", + "timestamp": "...", + "send_to": "...", + "msg_purpose": "...", + "sender_name": "...", + "sender_id": "...", + "receiver_name": "...", + "receiver_id": "...", + "reply_to": "...", + "reply_to_msg_id": "...", + "broker_url": "...", + "metadata": {...}, + "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] +} +``` + +### Supported Types + +| Type | Julia | JavaScript | Python | MicroPython | +|------|-------|------------|--------|-------------| +| `text` | `String` | `string` | `str` | `str` | +| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | +| `arrowtable` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | ❌ (not supported) | +| `jsontable` | `Vector{NamedTuple}`, `Vector{Dict}` | `Array` | `list[dict]`, `list` | `list` | +| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | +| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | + +### Cross-Platform Examples + +#### Julia + +```julia +using NATSBridge + +# Single payload - still wrapped in a list +env, env_json_str = smartsend( + "/test", + [("dataname1", data1, "dictionary")], + broker_url="nats://localhost:4222", + fileserver_upload_handler=plik_oneshot_upload +) + +# Multiple payloads with different types +env, env_json_str = smartsend( + "/test", + [("dataname1", data1, "dictionary"), ("dataname2", data2, "arrowtable")], + broker_url="nats://localhost:4222" +) + +# Mixed content (chat with text, image, audio) +env, env_json_str = smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("user_image", image_data, "image"), + ("audio_clip", audio_data, "audio") + ], + broker_url="nats://localhost:4222" +) + +# Receive returns a JSON.Object{String, Any} envelope +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# env is a JSON.Object{String, Any} with "payloads" field containing Vector{Tuple{String, Any, String}} +# Access payloads: env["payloads"] which is a Vector of tuples +for (dataname, data, type) in env["payloads"] + println("$dataname: $data (type: $type)") +end +``` + +#### JavaScript + +```javascript +const NATSBridge = require('natsbridge'); + +// Single payload +const [env, env_json_str] = await NATSBridge.smartsend( + "/test", + [["dataname1", data1, "dictionary"]], + { + broker_url: "nats://localhost:4222", + fileserver_upload_handler: plikOneshotUpload + } +); + +// Multiple payloads +const [env, env_json_str] = await NATSBridge.smartsend( + "/test", + [ + ["dataname1", data1, "dictionary"], + ["dataname2", data2, "arrowtable"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Mixed content +const [env, env_json_str] = await NATSBridge.smartsend( + "/chat", + [ + ["message_text", "Hello!", "text"], + ["user_image", imageData, "image"], + ["audio_clip", audioData, "audio"] + ], + { broker_url: "nats://localhost:4222" } +); + +// Receive +const env = await NATSBridge.smartreceive(msg, { + fileserver_download_handler: fetchWithBackoff +}); +// env is an object with "payloads" field containing Array of arrays +// Access payloads: env.payloads which is an Array of [dataname, data, type] arrays +for (const [dataname, data, type] of env.payloads) { + console.log(`${dataname}: ${data} (type: ${type})`); +} +``` + +#### Python + +```python +from natsbridge import NATSBridge + +# Single payload +env, env_json_str = await NATSBridge.smartsend( + "/test", + [("dataname1", data1, "dictionary")], + broker_url="nats://localhost:4222", + fileserver_upload_handler=plik_oneshot_upload +) + +# Multiple payloads +env, env_json_str = await NATSBridge.smartsend( + "/test", + [("dataname1", data1, "dictionary"), ("dataname2", data2, "arrowtable")], + broker_url="nats://localhost:4222" +) + +# Mixed content +env, env_json_str = await NATSBridge.smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("user_image", image_data, "image"), + ("audio_clip", audio_data, "audio") + ], + broker_url="nats://localhost:4222" +) + +# Receive +env = await NATSBridge.smartreceive( + msg, + fileserver_download_handler=fetch_with_backoff +) +# env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] +# Access payloads: env["payloads"] which is a list of tuples +for dataname, data, type_ in env["payloads"]: + print(f"{dataname}: {data} (type: {type_})") +``` + +#### MicroPython + +```python +from natsbridge import NATSBridge + +# Limited to text and binary (no tables due to memory constraints) +env, env_json_str = NATSBridge.smartsend( + "/chat", + [ + ("message_text", "Hello!", "text"), + ("binary_data", data_bytes, "binary") + ], + broker_url="nats://localhost:4222", + size_threshold=100000 # Lower threshold for memory constraints +) +# Note: MicroPython uses synchronous handlers +``` + +--- + +## Row-Oriented vs Column-Oriented Data Structures + +Different platforms use different internal representations for tabular data. Understanding these differences is crucial for proper serialization/deserialization when using `jsontable` and `arrowtable` datatypes. + +### Data Structure Comparison + +| Platform | Table Structure | Orientation | +|----------|-----------------|-------------| +| **Julia (DataFrame)** | `Dict{String, Vector}` | Column-oriented | +| **Python (pandas)** | `dict[str, list]` | Column-oriented | +| **JavaScript** | `Array` | Row-oriented | +| **MicroPython** | `list[list]` | Row-oriented | + +### Column-Oriented (Julia DataFrame, Python pandas) + +In column-oriented structures, each column is stored as a separate array/vector: + +**Julia Example:** +```julia +# Create dictionary with column vectors +dict = Dict("customer age" => [15, 20, 25], + "first name" => ["Rohit", "Rahul", "Akshat"]) + +# Convert to DataFrame +df = DataFrame(dict) +println(df) +# Output: +# 3×2 DataFrame +# Row ┆ customer age ┆ first name +# ┆ Int64 ┆ String +# ─────┼──────────────┼──────────── +# 1 ┆ 15 ┆ "Rohit" +# 2 ┆ 20 ┆ "Rahul" +# 3 ┆ 25 ┆ "Akshat" +``` + +**Python Example:** +```python +# Create dictionary with column lists +data = { + "Name": ["Alice", "Bob", "Charlie"], + "Age": [25, 30, 35], + "Score": [88.5, 92.0, 79.5] +} + +# Convert to DataFrame +df = pd.DataFrame(data) +print(df) +# Output: +# Name Age Score +# 0 Alice 25 88.5 +# 1 Bob 30 92.0 +# 2 Charlie 35 79.5 +``` + +### Row-Oriented (JavaScript, MicroPython) + +In row-oriented structures, each row is stored as a separate object/array: + +**JavaScript Example:** +```javascript +// Array of objects (row-oriented) +const users = [ + { Name: "Alice", Age: 25, Score: 88.5 }, + { Name: "Bob", Age: 30, Score: 92.0 }, + { Name: "Charlie", Age: 35, Score: 79.5 } +]; +``` + +**MicroPython Example:** +```python +# List of lists (row-oriented) +users = [ + ["Alice", 25, 88.5], + ["Bob", 30, 92.0], + ["Charlie", 35, 79.5] +] +``` + +### Cross-Platform Conversion for jsontable + +When sending `jsontable` across platforms, the system performs automatic conversion between row-oriented and column-oriented formats: + +**Sending from Julia/Python (column-oriented) to JS/MicroPython (row-oriented):** +1. Convert column-oriented dict to row-oriented array of objects +2. Serialize to JSON +3. Send with `payload_type = "jsontable"` + +**Receiving from JS/MicroPython (row-oriented) to Julia/Python (column-oriented):** +1. Deserialize JSON to row-oriented array of objects +2. Convert to column-oriented dict +3. Create DataFrame from column-oriented dict + +**Example: Julia to JavaScript** +```julia +# Julia side - column-oriented DataFrame +df = DataFrame( + "Name" => ["Alice", "Bob", "Charlie"], + "Age" => [25, 30, 35], + "Score" => [88.5, 92.0, 79.5] +) + +# smartsend automatically converts to row-oriented JSON +env, env_json_str = smartsend( + "/data", + [("users", df, "jsontable")] +) +# JSON sent: [{"Name":"Alice","Age":25,"Score":88.5}, ...] +``` + +```javascript +// JavaScript side - receives row-oriented array +const [env, env_json_str] = await NATSBridge.smartsend( + "/data", + [["users", users, "jsontable"]] +); +// users is already row-oriented: [{Name: "Alice", Age: 25, ...}, ...] +``` + +**Example: JavaScript to Julia** +```javascript +// JavaScript side - row-oriented array +const users = [ + { Name: "Alice", Age: 25, Score: 88.5 }, + { Name: "Bob", Age: 30, Score: 92.0 } +]; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/data", + [["users", users, "jsontable"]] +); +``` + +```julia +# Julia side - receives and converts to column-oriented DataFrame +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# The jsontable is automatically converted to DataFrame +for (dataname, data, type) in env["payloads"] + if type == "jsontable" + # data is now a DataFrame with column-oriented structure + println(data) + # Output: + # 2×3 DataFrame + # Row ┆ Name ┆ Age ┆ Score + # ┆ String ┆ Int64 ┆ Float64 + # ─────┼────────┼──────┼─────── + # 1 ┆ Alice ┆ 25 ┆ 88.5 + # 2 ┆ Bob ┆ 30 ┆ 92.0 + end +end +``` + +--- + +## Architecture + +### Cross-Platform Claim-Check Pattern + +```mermaid +flowchart TD + A[SmartSend Function] --> B{Is payload size < 1MB?} + B -->|Yes | C[Direct Path
< 1MB] + B -->|No | D[Link Path
>= 1MB] + + C --> C1[Serialize to Buffer] + C1 --> C2[Base64/JSON encode] + C2 --> C3[Publish to NATS] + + D --> D1[Serialize to Buffer] + D1 --> D2[Upload to HTTP Server] + D2 --> D3[Publish to NATS with URL] + + style A fill:#e1f5ff,stroke:#0066cc,stroke-width:2px + style B fill:#fff4e1,stroke:#cc6600,stroke-width:2px + style C fill:#e8f5e9,stroke:#008000,stroke-width:2px + style D fill:#e8f5e9,stroke:#008000,stroke-width:2px + style C1 fill:#f5f5f5,stroke:#666,stroke-width:1px + style C2 fill:#f5f5f5,stroke:#666,stroke-width:1px + style C3 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D1 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D2 fill:#f5f5f5,stroke:#666,stroke-width:1px + style D3 fill:#f5f5f5,stroke:#666,stroke-width:1px +``` + +**Claim-Check Pattern Overview:** +- **Direct Path** (< 1MB): Payload is serialized, Base64-encoded, and published directly to NATS +- **Link Path** (≥ 1MB): Payload is serialized, uploaded to an HTTP file server, and only the URL is published to NATS (claim-check pattern) + +### smartsend Return Value + +All platforms return a tuple/array containing both the envelope and JSON string: + +#### Julia + +```julia +env, env_json_str = smartsend(...) +# Returns: ::Tuple{msg_envelope_v1, String} +# env::msg_envelope_v1 - The envelope object with all metadata and payloads +# env_json_str::String - JSON string for publishing to NATS +``` + +#### JavaScript + +```javascript +const [env, env_json_str] = await smartsend(...); +// Returns: Promise<[env, env_json_str]> +// env: Object with all metadata and payloads +// env_json_str: String for publishing to NATS +``` + +#### Python + +```python +env, env_json_str = await smartsend(...) +# Returns: Tuple[Dict, str] +# env: Dict with all metadata and payloads +# env_json_str: String for publishing to NATS +``` + +#### MicroPython + +```python +env, env_json_str = NATSBridge.smartsend(...) +# Returns: Tuple[Dict, str] +# Note: MicroPython returns plain dicts (no structured envelope object) +``` + +--- + +## Installation + +### Julia Dependencies + +```julia +using Pkg +Pkg.add("NATS") +Pkg.add("Arrow") +Pkg.add("JSON3") +Pkg.add("HTTP") +Pkg.add("UUIDs") +Pkg.add("Dates") +``` + +### JavaScript Dependencies (Node.js) + +```bash +npm install nats uuid apache-arrow node-fetch +# or +yarn add nats uuid apache-arrow node-fetch +``` + +### JavaScript Dependencies (Browser) + +```bash +npm install nats uuid apache-arrow +# or use CDN: +# https://unpkg.com/nats-js/dist/bundle/nats.min.js +# https://unpkg.com/apache-arrow/arrow.min.js +``` + +### Python Dependencies (Desktop) + +```bash +pip install nats-py aiohttp pyarrow pandas python-dateutil +``` + +### MicroPython Dependencies + +MicroPython uses built-in modules: +- `network` - NATS connection (custom implementation) +- `time` - Timestamps +- `uos` - File operations +- `base64` - Base64 encoding +- `json` - JSON parsing +- `struct` - Binary data handling + +--- + +## Usage Tutorial + +### Step 1: Start NATS Server + +```bash +docker run -p 4222:4222 nats:latest +``` + +### Step 2: Start HTTP File Server (optional) + +```bash +# Create a directory for file uploads +mkdir -p /tmp/fileserver + +# Use any HTTP server that supports POST for file uploads +# Example: Python's built-in server +python3 -m http.server 8080 --directory /tmp/fileserver +``` + +### Step 3: Run Test Scenarios + +```bash +# Julia tests +julia test/test_julia_to_julia_text_sender.jl +julia test/test_julia_to_julia_text_receiver.jl + +# JavaScript tests (Node.js) +node test/test_js_text_sender.js +node test/test_js_text_receiver.js + +# Python tests +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py +``` + +--- + +## Platform-Specific Implementations + +### Julia Implementation + +#### Module Structure + +```julia +module NATSBridge + using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64 + + # Constants + const DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB + const DEFAULT_BROKER_URL = "nats://localhost:4222" + const DEFAULT_FILESERVER_URL = "http://localhost:8080" + + # Structs + struct msg_payload_v1 + id::String + dataname::String + payload_type::String + transport::String + encoding::String + size::Integer + data::Any + metadata::Dict{String, Any} + end + + struct msg_envelope_v1 + correlation_id::String + msg_id::String + timestamp::String + send_to::String + msg_purpose::String + sender_name::String + sender_id::String + receiver_name::String + receiver_id::String + reply_to::String + reply_to_msg_id::String + broker_url::String + metadata::Dict{String, Any} + payloads::Vector{msg_payload_v1} + end + + # Main functions + function smartsend(...) end + function smartreceive(...) end + + # Utility functions + function _serialize_data(...) end + function _deserialize_data(...) end + function envelope_to_json(...) end + function log_trace(...) end + + # File server handlers + function plik_oneshot_upload(...) end + function _fetch_with_backoff(...) end + function publish_message(...) end + + # Internal helpers + function _get_payload_bytes(...) end +end +``` + +#### Multiple Dispatch Pattern + +Julia leverages multiple dispatch for type-specific implementations: + +```julia +# publish_message has two overloads based on argument types +function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) + conn = NATS.connect(broker_url) + publish_message(conn, subject, message, correlation_id) +end + +function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) + try + NATS.publish(conn, subject, message) + log_trace(correlation_id, "Message published to $subject") + finally + NATS.drain(conn) + end +end + +# Type-specific serialization +function _serialize_data(data::String, payload_type::String) + # Text handling + return Vector{UInt8}(data) +end + +function _serialize_data(data::Dict, payload_type::String) + # Dictionary handling + json_str = JSON.json(data) + return Vector{UInt8}(json_str) +end + +function _serialize_data(data::DataFrame, payload_type::String) + # Table handling - arrowtable + io = IOBuffer() + Arrow.write(io, data) + return take!(io) +end +``` + +#### smartsend Implementation + +```julia +function smartsend( + subject::String, + data::AbstractArray{Tuple{String, T1, String}, 1}; + broker_url::String = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler::Function = plik_oneshot_upload, + size_threshold::Int = DEFAULT_SIZE_THRESHOLD, + correlation_id::String = string(uuid4()), + msg_purpose::String = "chat", + sender_name::String = "NATSBridge", + receiver_name::String = "", + receiver_id::String = "", + reply_to::String = "", + reply_to_msg_id::String = "", + is_publish::Bool = true, + NATS_connection::Union{NATS.Connection, Nothing} = nothing, + msg_id::String = string(uuid4()), + sender_id::String = string(uuid4()) +)::Tuple{msg_envelope_v1, String} where {T1<:Any} + + log_trace(correlation_id, "Starting smartsend for subject: $subject") + + # Process each payload in the list + payloads = msg_payload_v1[] + for (dataname, payload_data, payload_type) in data + # Serialize data based on type + payload_bytes = _serialize_data(payload_data, payload_type) + + payload_size = length(payload_bytes) + log_trace(correlation_id, "Serialized payload '$dataname' size: $payload_size bytes") + + # Decision: Direct vs Link + if payload_size < size_threshold + # Direct path - Base64 encode and send via NATS + payload_b64 = Base64.base64encode(payload_bytes) + log_trace(correlation_id, "Using direct transport for $payload_size bytes") + + payload = msg_payload_v1( + payload_b64, + payload_type; + id = string(uuid4()), + dataname = dataname, + transport = "direct", + encoding = "base64", + size = payload_size, + metadata = Dict{String, Any}("payload_bytes" => payload_size) + ) + push!(payloads, payload) + else + # Link path - Upload to HTTP server, send URL via NATS + log_trace(correlation_id, "Using link transport, uploading to fileserver") + + response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response["status"] != 200 + error("Failed to upload data to fileserver: $(response["status"])") + end + + url = response["url"] + log_trace(correlation_id, "Uploaded to URL: $url") + + payload = msg_payload_v1( + url, + payload_type; + id = string(uuid4()), + dataname = dataname, + transport = "link", + encoding = "none", + size = payload_size, + metadata = Dict{String, Any}() + ) + push!(payloads, payload) + end + end + + # Create msg_envelope_v1 with all payloads + # Note: First positional argument is "send_to" (the NATS subject), not "subject" + env = msg_envelope_v1( + subject, # send_to: NATS subject to publish to + payloads; + correlation_id = correlation_id, + msg_id = msg_id, + msg_purpose = msg_purpose, + sender_name = sender_name, + sender_id = sender_id, + receiver_name = receiver_name, + receiver_id = receiver_id, + reply_to = reply_to, + reply_to_msg_id = reply_to_msg_id, + broker_url = broker_url, + metadata = Dict{String, Any}(), + ) + + env_json_str = envelope_to_json(env) + + if is_publish == false + # skip publish + elseif is_publish == true && NATS_connection === nothing + publish_message(broker_url, subject, env_json_str, correlation_id) + elseif is_publish == true && NATS_connection !== nothing + publish_message(NATS_connection, subject, env_json_str, correlation_id) + end + + return (env, env_json_str) +end +``` + +#### smartreceive Implementation + +```julia +function smartreceive( + msg::NATS.Msg; + fileserver_download_handler::Function = _fetch_with_backoff, + max_retries::Int = 5, + base_delay::Int = 100, + max_delay::Int = 5000 +)::JSON.Object{String, Any} + # Parse the JSON envelope + env_json_obj = JSON.parse(String(msg.payload)) + log_trace(env_json_obj["correlation_id"], "Processing received message") + + # Process all payloads in the envelope + payloads_list = Tuple{String, Any, String}[] + + num_payloads = length(env_json_obj["payloads"]) + + for i in 1:num_payloads + payload = env_json_obj["payloads"][i] + transport = String(payload["transport"]) + dataname = String(payload["dataname"]) + + if transport == "direct" + log_trace(env_json_obj["correlation_id"], "Direct transport - decoding payload '$dataname'") + + # Extract base64 payload from the payload + payload_b64 = String(payload["data"]) + + # Decode Base64 payload + payload_bytes = Base64.base64decode(payload_b64) + + # Deserialize based on type + data_type = String(payload["payload_type"]) + data = _deserialize_data(payload_bytes, data_type, env_json_obj["correlation_id"]) + + push!(payloads_list, (dataname, data, data_type)) + elseif transport == "link" + # Extract download URL from the payload + url = String(payload["data"]) + log_trace(env_json_obj["correlation_id"], "Link transport - fetching '$dataname' from URL: $url") + + # Fetch with exponential backoff using the download handler + downloaded_data = fileserver_download_handler(url, max_retries, base_delay, max_delay, env_json_obj["correlation_id"]) + + # Deserialize based on type + data_type = String(payload["payload_type"]) + data = _deserialize_data(downloaded_data, data_type, env_json_obj["correlation_id"]) + + push!(payloads_list, (dataname, data, data_type)) + else + error("Unknown transport type for payload '$dataname': $(transport)") + end + end + env_json_obj["payloads"] = payloads_list + return env_json_obj +end +``` + +#### _serialize_data Implementation + +```julia +function _serialize_data(data::Any, payload_type::String) + if payload_type == "text" + if isa(data, String) + data_bytes = Vector{UInt8}(data) + return data_bytes + else + error("Text data must be a String") + end + elseif payload_type == "dictionary" + json_str = JSON.json(data) + json_str_bytes = Vector{UInt8}(json_str) + return json_str_bytes + elseif payload_type == "arrowtable" + # Serialize DataFrame to Arrow IPC format + io = IOBuffer() + Arrow.write(io, data) + return take!(io) + elseif payload_type == "jsontable" + # Convert column-oriented to row-oriented JSON + # data is Vector{NamedTuple} or Vector{Dict} + json_str = JSON.json(data) + return Vector{UInt8}(json_str) + elseif payload_type == "image" + if isa(data, Vector{UInt8}) + return data + else + error("Image data must be Vector{UInt8}") + end + elseif payload_type == "audio" + if isa(data, Vector{UInt8}) + return data + else + error("Audio data must be Vector{UInt8}") + end + elseif payload_type == "video" + if isa(data, Vector{UInt8}) + return data + else + error("Video data must be Vector{UInt8}") + end + elseif payload_type == "binary" + if isa(data, IOBuffer) + return take!(data) + elseif isa(data, Vector{UInt8}) + return data + else + error("Binary data must be binary (Vector{UInt8} or IOBuffer)") + end + else + error("Unknown payload_type: $payload_type") + end +end +``` + +#### _deserialize_data Implementation + +```julia +function _deserialize_data( + data::Vector{UInt8}, + payload_type::String, + correlation_id::String +) + if payload_type == "text" + return String(data) + elseif payload_type == "dictionary" + json_str = String(data) + return JSON.parse(json_str) + elseif payload_type == "arrowtable" + # Deserialize from Arrow IPC format + io = IOBuffer(data) + arrow_table = Arrow.Table(io) + return arrow_table + elseif payload_type == "jsontable" + # Deserialize from JSON format + # Returns Vector{NamedTuple} (column-oriented compatible) + json_str = String(data) + parsed = JSON.parse(json_str) + return parsed + elseif payload_type == "image" + return data + elseif payload_type == "audio" + return data + elseif payload_type == "video" + return data + elseif payload_type == "binary" + return data + else + error("Unknown payload_type: $payload_type") + end +end +``` + +#### _fetch_with_backoff Implementation + +```julia +function _fetch_with_backoff( + url::String, + max_retries::Int, + base_delay::Int, + max_delay::Int, + correlation_id::String +) + delay = base_delay + for attempt in 1:max_retries + try + response = HTTP.request("GET", url) + if response.status == 200 + log_trace(correlation_id, "Successfully fetched data from $url on attempt $attempt") + return response.body + else + error("Failed to fetch: $(response.status)") + end + catch e + log_trace(correlation_id, "Attempt $attempt failed: $(typeof(e))") + + if attempt < max_retries + sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + end + end + end + + error("Failed to fetch data after $max_retries attempts") +end +``` + +#### plik_oneshot_upload Implementation + +```julia +function plik_oneshot_upload(file_server_url::String, dataname::String, data::Vector{UInt8}) + # Get upload id + url_getUploadID = "$file_server_url/upload" + headers = ["Content-Type" => "application/json"] + body = """{ "OneShot" : true }""" + http_response = HTTP.request("POST", url_getUploadID, headers, body; body_is_form=false) + response_json = JSON.parse(http_response.body) + uploadid = response_json["id"] + uploadtoken = response_json["uploadToken"] + + # Upload file + file_multipart = HTTP.Multipart(dataname, IOBuffer(data), "application/octet-stream") + url_upload = "$file_server_url/file/$uploadid" + headers = ["X-UploadToken" => uploadtoken] + + form = HTTP.Form(Dict( + "file" => file_multipart + )) + + http_response = nothing + try + http_response = HTTP.post(url_upload, headers, form) + catch e + @error "Request failed" exception=e + end + response_json = JSON.parse(http_response.body) + fileid = response_json["id"] + + url = "$file_server_url/file/$uploadid/$fileid/$dataname" + + return Dict("status" => http_response.status, "uploadid" => uploadid, "fileid" => fileid, "url" => url) +end +``` + +--- + +### JavaScript Implementation + +#### Module Structure + +```javascript +// natsbridge.js +const nats = require('nats'); +const { v4: uuidv4 } = require('uuid'); +const fetch = require('node-fetch'); + +const DEFAULT_SIZE_THRESHOLD = 1_000_000; +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; + +class NATSClient { + constructor(url) { + this.url = url; + this.connection = null; + } + + async connect() { + this.connection = await nats.connect({ servers: this.url }); + return this.connection; + } + + async publish(subject, message) { + if (!this.connection) { + await this.connect(); + } + await this.connection.publish(subject, message); + } + + async close() { + if (this.connection) { + this.connection.close(); + } + } +} + +async function smartsend(subject, data, options = {}) { + // Implementation +} + +async function smartreceive(msg, options = {}) { + // Implementation +} + +module.exports = { + NATSClient, + smartsend, + smartreceive, + plikOneshotUpload, + fetchWithBackoff +}; +``` + +#### smartsend Implementation + +```javascript +const nats = require('nats'); +const { v4: uuidv4 } = require('uuid'); +const fetch = require('node-fetch'); +const arrow = require('apache-arrow'); + +const DEFAULT_SIZE_THRESHOLD = 1_000_000; +const DEFAULT_BROKER_URL = 'nats://localhost:4222'; +const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; + +async function smartsend(subject, data, options = {}) { + const { + broker_url = DEFAULT_BROKER_URL, + fileserver_url = DEFAULT_FILESERVER_URL, + fileserver_upload_handler = plikOneshotUpload, + size_threshold = DEFAULT_SIZE_THRESHOLD, + correlation_id = uuidv4(), + msg_purpose = 'chat', + sender_name = 'NATSBridge', + receiver_name = '', + receiver_id = '', + reply_to = '', + reply_to_msg_id = '', + is_publish = true, + nats_connection = null, + msg_id = uuidv4(), + sender_id = uuidv4() + } = options; + + console.log(`[Correlation: ${correlation_id}] Starting smartsend for subject: ${subject}`); + + // Process payloads + const payloads = []; + for (const [dataname, payloadData, payloadType] of data) { + const payloadBytes = await serializeData(payloadData, payloadType); + const payloadSize = payloadBytes.byteLength; + + console.log(`[Correlation: ${correlation_id}] Serialized payload '${dataname}' (type: ${payloadType}) size: ${payloadSize} bytes`); + + if (payloadSize < size_threshold) { + // Direct path + const payloadB64 = bufferToBase64(payloadBytes); + console.log(`[Correlation: ${correlation_id}] Using direct transport for ${payloadSize} bytes`); + + payloads.push({ + id: uuidv4(), + dataname, + payload_type: payloadType, + transport: 'direct', + encoding: 'base64', + size: payloadSize, + data: payloadB64, + metadata: { payload_bytes: payloadSize } + }); + } else { + // Link path + console.log(`[Correlation: ${correlation_id}] Using link transport, uploading to fileserver`); + + const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); + + if (response.status !== 200) { + throw new Error(`Failed to upload data to fileserver: ${response.status}`); + } + + console.log(`[Correlation: ${correlation_id}] Uploaded to URL: ${response.url}`); + + payloads.push({ + id: uuidv4(), + dataname, + payload_type: payloadType, + transport: 'link', + encoding: 'none', + size: payloadSize, + data: response.url, + metadata: {} + }); + } + } + + // Build envelope + const env = { + correlation_id, + msg_id, + timestamp: new Date().toISOString(), + send_to: subject, + msg_purpose, + sender_name, + sender_id, + receiver_name, + receiver_id, + reply_to, + reply_to_msg_id, + broker_url, + metadata: {}, + payloads + }; + + const env_json_str = JSON.stringify(env); + + if (is_publish) { + if (nats_connection) { + await publishMessage(nats_connection, subject, env_json_str, correlation_id); + } else { + await publishMessage(broker_url, subject, env_json_str, correlation_id); + } + } + + return [env, env_json_str]; +} +``` + +#### serializeData Implementation + +```javascript +const arrow = require('apache-arrow'); + +async function serializeData(data, payload_type) { + if (payload_type === 'text') { + if (typeof data === 'string') { + return Buffer.from(data, 'utf8'); + } else { + throw new Error('Text data must be a string'); + } + } else if (payload_type === 'dictionary') { + const jsonStr = JSON.stringify(data); + return Buffer.from(jsonStr, 'utf8'); + } else if (payload_type === 'arrowtable') { + // Convert Array to Arrow IPC + // data is row-oriented: [{id: 1, name: "Alice"}, ...] + if (!Array.isArray(data) || data.length === 0) { + throw new Error('arrowtable data must be a non-empty array of objects'); + } + + // Create schema from first row + const schemaFields = Object.keys(data[0]).map(key => + new arrow.Field(key, arrow.any()) + ); + const schema = new arrow.Schema(schemaFields); + + // Create writer + const writer = new arrow.RecordBatchWriter([schema]); + + // Write rows + for (const row of data) { + const recordBatch = arrow.recordBatch.fromObjects([row], schema); + writer.write(recordBatch); + } + await writer.close(); + + // Read buffer + return writer.toBuffer(); + } else if (payload_type === 'jsontable') { + // data is already row-oriented Array + // Serialize directly to JSON + const jsonStr = JSON.stringify(data); + return Buffer.from(jsonStr, 'utf8'); + } else if (payload_type === 'image') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Image data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'audio') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Audio data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'video') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Video data must be Uint8Array or Buffer'); + } + } else if (payload_type === 'binary') { + if (data instanceof Uint8Array || Buffer.isBuffer(data)) { + return Buffer.from(data); + } else { + throw new Error('Binary data must be Uint8Array or Buffer'); + } + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} + +function bufferToBase64(buffer) { + return buffer.toString('base64'); +} +``` + +#### deserializeData Implementation + +```javascript +const arrow = require('apache-arrow'); + +async function deserializeData(data, payload_type, correlation_id) { + if (payload_type === 'text') { + return Buffer.from(data).toString('utf8'); + } else if (payload_type === 'dictionary') { + const jsonStr = Buffer.from(data).toString('utf8'); + return JSON.parse(jsonStr); + } else if (payload_type === 'arrowtable') { + // Deserialize from Arrow IPC + const buffer = Buffer.from(data); + const table = arrow.tableFromRawBytes(buffer); + return table; + } else if (payload_type === 'jsontable') { + // Deserialize from JSON - returns Array (row-oriented) + const jsonStr = Buffer.from(data).toString('utf8'); + return JSON.parse(jsonStr); + } else if (payload_type === 'image') { + return Buffer.from(data); + } else if (payload_type === 'audio') { + return Buffer.from(data); + } else if (payload_type === 'video') { + return Buffer.from(data); + } else if (payload_type === 'binary') { + return Buffer.from(data); + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} +``` + +#### fetchWithBackoff Implementation + +```javascript +async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { + let delay = base_delay; + + for (let attempt = 1; attempt <= max_retries; attempt++) { + try { + const response = await fetch(url); + + if (response.status === 200) { + console.log(`[Correlation: ${correlation_id}] Successfully fetched data from ${url} on attempt ${attempt}`); + return await response.arrayBuffer(); + } else { + throw new Error(`Failed to fetch: ${response.status}`); + } + } catch (e) { + console.log(`[Correlation: ${correlation_id}] Attempt ${attempt} failed: ${e.constructor.name}`); + + if (attempt < max_retries) { + await new Promise(resolve => setTimeout(resolve, delay)); + delay = Math.min(delay * 2, max_delay); + } + } + } + + throw new Error(`Failed to fetch data after ${max_retries} attempts`); +} +``` + +#### plikOneshotUpload Implementation + +```javascript +async function plikOneshotUpload(file_server_url, dataname, data) { + // Get upload id + const url_getUploadID = `${file_server_url}/upload`; + const headers = { 'Content-Type': 'application/json' }; + const body = JSON.stringify({ OneShot: true }); + + const http_response = await fetch(url_getUploadID, { + method: 'POST', + headers, + body + }); + + const response_json = await http_response.json(); + const uploadid = response_json.id; + const uploadtoken = response_json.uploadToken; + + // Upload file + const url_upload = `${file_server_url}/file/${uploadid}`; + const form = new FormData(); + const blob = new Blob([data]); + form.append('file', blob, dataname); + + const upload_headers = { + 'X-UploadToken': uploadtoken + }; + + const upload_response = await fetch(url_upload, { + method: 'POST', + headers: upload_headers, + body: form + }); + + const upload_json = await upload_response.json(); + const fileid = upload_json.id; + + const url = `${file_server_url}/file/${uploadid}/${fileid}/${dataname}`; + + return { + status: upload_response.status, + uploadid, + fileid, + url + }; +} +``` + +--- + +### Python Implementation + +#### Module Structure + +```python +# natsbridge.py +import asyncio +import base64 +import json +import uuid +import time +from typing import Any, Dict, List, Tuple, Union, Callable +from dataclasses import dataclass, field +from datetime import datetime + +try: + import pyarrow as arrow + import pyarrow.parquet as pq + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + +try: + import aiohttp + import nats + from nats.aio.client import Client as NATSClient + NATS_AVAILABLE = True +except ImportError: + NATS_AVAILABLE = False + + +DEFAULT_SIZE_THRESHOLD = 1_000_000 +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + + +@dataclass +class MsgPayloadV1: + """Message payload structure.""" + id: str + dataname: str + payload_type: str + transport: str + encoding: str + size: int + data: Union[str, bytes] + metadata: Dict[str, Any] = field(default_factory=dict) + + +@dataclass +class MsgEnvelopeV1: + """Message envelope structure.""" + correlation_id: str + msg_id: str + timestamp: str + send_to: str + msg_purpose: str + sender_name: str + sender_id: str + receiver_name: str + receiver_id: str + reply_to: str + reply_to_msg_id: str + broker_url: str + metadata: Dict[str, Any] = field(default_factory=dict) + payloads: List[MsgPayloadV1] = field(default_factory=list) + + +class NATSBridge: + """Cross-platform NATS bridge implementation.""" + + def __init__(self, broker_url: str = None, fileserver_url: str = None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_client: NATSClient = None + + async def smartsend(self, subject: str, data: List[Tuple[str, Any, str]], **kwargs) -> Tuple[Dict, str]: + """Send data via NATS.""" + pass + + async def smartreceive(self, msg: Any, **kwargs) -> Dict: + """Receive and process NATS message.""" + pass +``` + +#### smartsend Implementation + +```python +import asyncio +import base64 +import json +import uuid +from typing import Any, Dict, List, Tuple, Union, Callable +from datetime import datetime + +DEFAULT_SIZE_THRESHOLD = 1_000_000 +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" + + +async def smartsend( + subject: str, + data: List[Tuple[str, Any, str]], + broker_url: str = DEFAULT_BROKER_URL, + fileserver_url: str = DEFAULT_FILESERVER_URL, + fileserver_upload_handler: Callable = plik_oneshot_upload, + size_threshold: int = DEFAULT_SIZE_THRESHOLD, + correlation_id: str = None, + msg_purpose: str = "chat", + sender_name: str = "NATSBridge", + receiver_name: str = "", + receiver_id: str = "", + reply_to: str = "", + reply_to_msg_id: str = "", + is_publish: bool = True, + nats_connection: Any = None, + msg_id: str = None, + sender_id: str = None +) -> Tuple[Dict, str]: + """ + Send data via NATS with automatic transport selection. + + Args: + subject: NATS subject to publish to + data: List of (dataname, data, type) tuples + **kwargs: Additional options + + Returns: + Tuple of (env, env_json_str) + """ + if correlation_id is None: + correlation_id = str(uuid.uuid4()) + if msg_id is None: + msg_id = str(uuid.uuid4()) + if sender_id is None: + sender_id = str(uuid.uuid4()) + + print(f"[Correlation: {correlation_id}] Starting smartsend for subject: {subject}") + + # Process payloads + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = _serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + print(f"[Correlation: {correlation_id}] Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") + + if payload_size < size_threshold: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') + print(f"[Correlation: {correlation_id}] Using direct transport for {payload_size} bytes") + + payloads.append({ + 'id': str(uuid.uuid4()), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64, + 'metadata': {'payload_bytes': payload_size} + }) + else: + # Link path + print(f"[Correlation: {correlation_id}] Using link transport, uploading to fileserver") + + response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) + + if response['status'] != 200: + raise Exception(f"Failed to upload data to fileserver: {response['status']}") + + print(f"[Correlation: {correlation_id}] Uploaded to URL: {response['url']}") + + payloads.append({ + 'id': str(uuid.uuid4()), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'], + 'metadata': {} + }) + + # Build envelope + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': datetime.utcnow().isoformat() + 'Z', + 'send_to': subject, + 'msg_purpose': msg_purpose, + 'sender_name': sender_name, + 'sender_id': sender_id, + 'receiver_name': receiver_name, + 'receiver_id': receiver_id, + 'reply_to': reply_to, + 'reply_to_msg_id': reply_to_msg_id, + 'broker_url': broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + if is_publish: + if nats_connection: + await publish_message(nats_connection, subject, env_json_str, correlation_id) + else: + await publish_message(broker_url, subject, env_json_str, correlation_id) + + return env, env_json_str +``` + +#### serializeData Implementation + +```python +import base64 +import json +from typing import Any + +try: + import pyarrow as arrow + import pyarrow.feather as feather + import pyarrow.ipc as ipc + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + + +def _serialize_data(data: Any, payload_type: str) -> bytes: + """Serialize data to bytes based on type.""" + if payload_type == 'text': + if isinstance(data, str): + return data.encode('utf-8') + else: + raise Error('Text data must be a string') + elif payload_type == 'dictionary': + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type == 'arrowtable': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table serialization') + + import io + buf = io.BytesIO() + import pandas as pd + if isinstance(data, pd.DataFrame): + # Column-oriented DataFrame to Arrow + table = arrow.Table.from_pandas(data) + sink = arrow.ipc.new_file(buf) + arrow.ipc.write_table(table, sink) + sink.close() + return buf.getvalue() + else: + raise Error('arrowtable data must be a pandas DataFrame') + elif payload_type == 'jsontable': + # data is list[dict] or list (row-oriented) + # Serialize directly to JSON + json_str = json.dumps(data) + return json_str.encode('utf-8') + elif payload_type == 'image': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Image data must be bytes') + elif payload_type == 'audio': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Audio data must be bytes') + elif payload_type == 'video': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Video data must be bytes') + elif payload_type == 'binary': + if isinstance(data, (bytes, bytearray)): + return bytes(data) + else: + raise Error('Binary data must be bytes') + else: + raise Error(f'Unknown payload_type: {payload_type}') +``` + +#### deserializeData Implementation + +```python +import base64 +import json +from typing import Any + +try: + import pyarrow as arrow + import pyarrow.feather as feather + import pyarrow.ipc as ipc + ARROW_AVAILABLE = True +except ImportError: + ARROW_AVAILABLE = False + + +def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: + """Deserialize bytes to data based on type.""" + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type == 'arrowtable': + if not ARROW_AVAILABLE: + raise Error('pyarrow not available for table deserialization') + + import io + buf = io.BytesIO(data) + reader = arrow.ipc.open_file(buf) + return reader.read_all().to_pandas() + elif payload_type == 'jsontable': + # Deserialize from JSON - returns list[dict] (row-oriented) + json_str = data.decode('utf-8') + return json.loads(json_str) + elif payload_type == 'image': + return data + elif payload_type == 'audio': + return data + elif payload_type == 'video': + return data + elif payload_type == 'binary': + return data + else: + raise Error(f'Unknown payload_type: {payload_type}') +``` + +#### fetchWithBackoff Implementation + +```python +import asyncio +import aiohttp +from typing import Callable + + +async def fetch_with_backoff( + url: str, + max_retries: int, + base_delay: int, + max_delay: int, + correlation_id: str +) -> bytes: + """Fetch URL with exponential backoff.""" + delay = base_delay + + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + print(f"[Correlation: {correlation_id}] Successfully fetched data from {url} on attempt {attempt}") + return await response.read() + else: + raise Exception(f"Failed to fetch: {response.status}") + except Exception as e: + print(f"[Correlation: {correlation_id}] Attempt {attempt} failed: {type(e).__name__}") + + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + + raise Exception(f"Failed to fetch data after {max_retries} attempts") +``` + +#### plikOneshotUpload Implementation + +```python +import aiohttp +import json +from typing import Dict, Any + + +async def plik_oneshot_upload( + file_server_url: str, + dataname: str, + data: bytes +) -> Dict[str, Any]: + """Upload data to plik server in one-shot mode.""" + + # Get upload id + async with aiohttp.ClientSession() as session: + url_getUploadID = f"{file_server_url}/upload" + headers = {'Content-Type': 'application/json'} + body = json.dumps({"OneShot": True}) + + async with session.post(url_getUploadID, headers=headers, data=body) as response: + response_json = await response.json() + uploadid = response_json['id'] + uploadtoken = response_json['uploadToken'] + + # Upload file + url_upload = f"{file_server_url}/file/{uploadid}" + headers = {'X-UploadToken': uploadtoken} + + form = aiohttp.FormData() + form.add_field('file', data, filename=dataname, content_type='application/octet-stream') + + async with session.post(url_upload, headers=headers, data=form) as upload_response: + upload_json = await upload_response.json() + fileid = upload_json['id'] + + url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" + + return { + 'status': upload_response.status, + 'uploadid': uploadid, + 'fileid': fileid, + 'url': url + } +``` + +--- + +## MicroPython Implementation + +### Limitations + +MicroPython has significant constraints compared to desktop implementations: + +| Feature | Desktop | MicroPython | +|---------|---------|-------------| +| Memory | Unlimited | ~256KB - 1MB | +| Arrow IPC | ✅ | ❌ (not supported) | +| Async/Await | ✅ | ⚠️ (uasyncio only) | +| Large payloads (>1MB) | ✅ | ❌ (enforced limit) | +| arrowtable | ✅ | ❌ | +| jsontable | ⚠️ (limited) | ⚠️ (limited) | +| Multiple payloads | ✅ | ⚠️ (limited) | + +### MicroPython Module Structure + +```python +# natsbridge_mpy.py (MicroPython) +import network +import time +import json +import base64 +import uos +import struct + +# Constants +DEFAULT_SIZE_THRESHOLD = 100000 # 100KB for MicroPython +DEFAULT_BROKER_URL = "nats://localhost:4222" +DEFAULT_FILESERVER_URL = "http://localhost:8080" +MAX_PAYLOAD_SIZE = 50000 # Hard limit + +# Note: MicroPython uses list[list] for jsontable (row-oriented) +# No DataFrame support - data is always row-oriented + + +class NATSBridge: + """MicroPython NATS bridge implementation.""" + + def __init__(self, broker_url=None, fileserver_url=None): + self.broker_url = broker_url or DEFAULT_BROKER_URL + self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL + self._nats_conn = None + + def smartsend(self, subject, data, **kwargs): + """Send data (synchronous).""" + correlation_id = self._generate_uuid() + msg_id = self._generate_uuid() + sender_id = self._generate_uuid() + + print(f"[Correlation: {correlation_id}] Starting smartsend") + + payloads = [] + for dataname, payload_data, payload_type in data: + payload_bytes = self._serialize_data(payload_data, payload_type) + payload_size = len(payload_bytes) + + if payload_size > MAX_PAYLOAD_SIZE: + raise MemoryError(f"Payload {dataname} exceeds max size {MAX_PAYLOAD_SIZE}") + + if payload_size < DEFAULT_SIZE_THRESHOLD: + # Direct path + payload_b64 = base64.b64encode(payload_bytes).decode('ascii') + payloads.append({ + 'id': self._generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'direct', + 'encoding': 'base64', + 'size': payload_size, + 'data': payload_b64 + }) + else: + # Link path (limited support) + response = self._sync_fileserver_upload(self.fileserver_url, dataname, payload_bytes) + payloads.append({ + 'id': self._generate_uuid(), + 'dataname': dataname, + 'payload_type': payload_type, + 'transport': 'link', + 'encoding': 'none', + 'size': payload_size, + 'data': response['url'] + }) + + env = { + 'correlation_id': correlation_id, + 'msg_id': msg_id, + 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), + 'send_to': subject, + 'msg_purpose': kwargs.get('msg_purpose', 'chat'), + 'sender_name': kwargs.get('sender_name', 'NATSBridge'), + 'sender_id': sender_id, + 'receiver_name': kwargs.get('receiver_name', ''), + 'receiver_id': kwargs.get('receiver_id', ''), + 'reply_to': kwargs.get('reply_to', ''), + 'reply_to_msg_id': kwargs.get('reply_to_msg_id', ''), + 'broker_url': self.broker_url, + 'metadata': {}, + 'payloads': payloads + } + + env_json_str = json.dumps(env) + + # Publish + self._publish(subject, env_json_str, correlation_id) + + return env, env_json_str + + def smartreceive(self, msg, **kwargs): + """Receive and process message (synchronous).""" + env_json_obj = json.loads(msg.payload) + correlation_id = env_json_obj['correlation_id'] + + payloads_list = [] + for payload in env_json_obj['payloads']: + transport = payload['transport'] + dataname = payload['dataname'] + + if transport == 'direct': + payload_b64 = payload['data'] + payload_bytes = base64.b64decode(payload_b64) + data_type = payload['payload_type'] + data = self._deserialize_data(payload_bytes, data_type) + payloads_list.append((dataname, data, data_type)) + elif transport == 'link': + url = payload['data'] + downloaded_data = self._sync_fileserver_download( + url, + kwargs.get('max_retries', 3), + kwargs.get('base_delay', 100), + kwargs.get('max_delay', 1000), + correlation_id + ) + data_type = payload['payload_type'] + data = self._deserialize_data(downloaded_data, data_type) + payloads_list.append((dataname, data, data_type)) + + env_json_obj['payloads'] = payloads_list + return env_json_obj + + def _serialize_data(self, data, payload_type): + """Serialize data (MicroPython version - no arrowtable support).""" + if payload_type == 'text': + return data.encode('utf-8') + elif payload_type == 'dictionary': + return json.dumps(data).encode('utf-8') + elif payload_type == 'jsontable': + # data is list[list] (row-oriented) + return json.dumps(data).encode('utf-8') + elif payload_type in ('image', 'audio', 'video', 'binary'): + return bytes(data) + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + + def _deserialize_data(self, data, payload_type): + """Deserialize data (MicroPython version).""" + if payload_type == 'text': + return data.decode('utf-8') + elif payload_type == 'dictionary': + return json.loads(data.decode('utf-8')) + elif payload_type == 'jsontable': + # Returns list[list] (row-oriented) + return json.loads(data.decode('utf-8')) + elif payload_type in ('image', 'audio', 'video', 'binary'): + return data + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + + def _generate_uuid(self): + """Generate simple UUID (MicroPython compatible).""" + return 'mp-%04x%04x-%04x-%04x-%04x-%04x%04x%04x' % ( + time.time_ns() // (10**6) % 0xFFFFFFFF, + time.time_ns() % 0xFFFFFFFF, + time.time_ns() >> 32 & 0xFFFF, + time.time_ns() >> 48 & 0xFFFF, + time.time_ns() >> 64 & 0xFFFF, + time.time_ns() >> 80 & 0xFFFF, + time.time_ns() >> 96 & 0xFFFF, + time.time_ns() >> 112 & 0xFFFF + ) + + def _sync_fileserver_upload(self, url, dataname, data): + """Synchronous file upload (limited).""" + # Simplified implementation for MicroPython + # In practice, would use network.HTTP or similar + raise NotImplementedError("File upload not implemented in MicroPython") + + def _sync_fileserver_download(self, url, max_retries, base_delay, max_delay, correlation_id): + """Synchronous file download with backoff.""" + # Simplified implementation for MicroPython + raise NotImplementedError("File download not implemented in MicroPython") + + def _publish(self, subject, message, correlation_id): + """Publish message to NATS.""" + # Simplified implementation for MicroPython + raise NotImplementedError("NATS publishing not implemented in MicroPython") +``` + +--- + +## Configuration + +### Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `NATS_URL` | `nats://localhost:4222` | NATS server URL | +| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | +| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | + +### MicroPython Configuration + +```python +# micropython.conf +NATS_URL = "nats://broker.local:4222" +FILESERVER_URL = "http://fileserver.local:8080" +SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices +MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython +``` + +--- + +## Performance Considerations + +### Zero-Copy Reading + +| Platform | Strategy | +|----------|----------| +| **Julia** | `Arrow.read()` with memory-mapped files | +| **JavaScript** | `ArrayBuffer` with `DataView` | +| **Python** | `pyarrow` memory mapping | +| **MicroPython** | Not available (streaming only) | + +### Exponential Backoff + +All platforms implement exponential backoff for HTTP downloads: + +```python +# Python +async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): + delay = base_delay + for attempt in range(1, max_retries + 1): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.read() + except Exception as e: + if attempt < max_retries: + await asyncio.sleep(delay / 1000.0) + delay = min(delay * 2, max_delay) + raise Exception("Failed to fetch after max retries") +``` + +### Correlation ID Logging + +All platforms use correlation IDs for distributed tracing: + +``` +[timestamp] [Correlation: abc123] Message published to subject +``` + +### Serialization Performance + +| Format | Use Case | Pros | Cons | +|--------|----------|------|------| +| `arrowtable` | Large tabular data | Fast, zero-copy, schema-preserving | Binary format, requires Arrow library, not supported in MicroPython | +| `jsontable` | Small/medium tabular data | Human-readable, universal support, works in MicroPython | Slower, larger size, no schema enforcement | + +--- + +## Testing + +### Test File Organization + +| Platform | Sender Tests | Receiver Tests | +|----------|--------------|----------------| +| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | +| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | +| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | + +### Run Tests + +```bash +# Julia +julia test/test_julia_text_sender.jl +julia test/test_julia_text_receiver.jl + +# JavaScript (Node.js) +node test/test_js_text_sender.js +node test/test_js_text_receiver.js + +# Python +python3 test/test_py_text_sender.py +python3 test/test_py_text_receiver.py +``` + +--- + +## Troubleshooting + +### Common Issues + +1. **NATS Connection Failed** + - Ensure NATS server is running + - Check `broker_url` configuration + +2. **HTTP Upload Failed** + - Ensure file server is running + - Check `fileserver_url` configuration + - Verify upload permissions + +3. **Arrow IPC Deserialization Error** + - Ensure data is properly serialized to Arrow format + - Check Arrow version compatibility + - MicroPython doesn't support Arrow IPC + +4. **Memory Constraints (MicroPython)** + - Reduce `size_threshold` + - Use direct transport only (< 100KB) + - Avoid large payloads + - Use `jsontable` instead of `arrowtable` (arrowtable not supported) + +5. **Row-Oriented vs Column-Oriented Conversion Issues** + - Julia/Python: DataFrames are column-oriented; when sending `jsontable`, they are converted to row-oriented JSON + - JavaScript/MicroPython: Data is natively row-oriented + - When receiving `jsontable` in Julia/Python, JSON is automatically converted back to column-oriented DataFrame + +--- + +## Summary + +This cross-platform NATS bridge provides: + +1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across all platforms +2. **Idiomatic Implementations**: + - **Julia**: Multiple dispatch, struct-based design, native Arrow IPC + - **JavaScript**: Async/await, prototype-based utilities, class-based NATS client + - **Python**: Class-based design with dataclasses, type hints, async/await + - **MicroPython**: Synchronous API, memory-constrained optimizations +3. **Message Format Consistency**: Identical JSON schemas across all platforms +4. **Handler Abstraction**: File server operations abstracted through configurable handlers +5. **Platform-Specific Optimizations**: + - **Arrow IPC** (`arrowtable`): Efficient binary format for large tabular data (not supported in MicroPython) + - **JSON** (`jsontable`): Universal human-readable format for smaller tables (works in all platforms) +6. **Row-Oriented ↔ Column-Oriented Conversion**: Automatic conversion between row-oriented (JS, MicroPython) and column-oriented (Julia DataFrame, Python pandas) formats when using `jsontable` + +The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. + +### Datatype Summary + +| Datatype | Serialization | Use Case | Encoding | Supported Platforms | +|----------|---------------|----------|----------|---------------------| +| `arrowtable` | Apache Arrow IPC | Large tabular data, schema-preserving | `arrow-ipc` → `base64` | Julia, JavaScript, Python | +| `jsontable` | JSON | Small/medium tabular data, human-readable | `json` → `base64` | Julia, JavaScript, Python, MicroPython | -- 2.49.1 From 0ef8dd61a802f9812f46f9c41b00e590896d7926 Mon Sep 17 00:00:00 2001 From: narawat Date: Sun, 8 Mar 2026 11:34:10 +0700 Subject: [PATCH 27/43] use crypto for JS --- docs/updated_architecture.md | 4 ++-- docs/updated_implementation.md | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/updated_architecture.md b/docs/updated_architecture.md index 6b0763e..8b57af8 100644 --- a/docs/updated_architecture.md +++ b/docs/updated_architecture.md @@ -587,7 +587,7 @@ class NATSClient { | Package | Purpose | |---------|---------| | `nats` | Core NATS functionality (nats.js) | -| `uuid` | UUID generation | +| `crypto` (built-in) | UUID generation (Node.js) | | `node-fetch` or `axios` | HTTP client for file server | | `apache-arrow` | Arrow IPC serialization | @@ -596,7 +596,7 @@ class NATSClient { | Package | Purpose | |---------|---------| | `nats` | Browser-compatible NATS client | -| `uuid` | UUID generation | +| `crypto` (built-in) | UUID generation (browser) | | `fetch` (native) | HTTP client for file server | | `apache-arrow` | Arrow IPC serialization | diff --git a/docs/updated_implementation.md b/docs/updated_implementation.md index 82b703d..ed21567 100644 --- a/docs/updated_implementation.md +++ b/docs/updated_implementation.md @@ -581,20 +581,24 @@ Pkg.add("Dates") ### JavaScript Dependencies (Node.js) ```bash -npm install nats uuid apache-arrow node-fetch +npm install nats apache-arrow node-fetch # or -yarn add nats uuid apache-arrow node-fetch +yarn add nats apache-arrow node-fetch ``` +**Note:** Node.js has a built-in `crypto` module for UUID generation, so no external `uuid` package is needed. + ### JavaScript Dependencies (Browser) ```bash -npm install nats uuid apache-arrow +npm install nats apache-arrow # or use CDN: # https://unpkg.com/nats-js/dist/bundle/nats.min.js # https://unpkg.com/apache-arrow/arrow.min.js ``` +**Note:** For browser UUID generation, use the built-in `crypto.randomUUID()` API (available in modern browsers) or a lightweight alternative like `uuidv4` package. + ### Python Dependencies (Desktop) ```bash @@ -1099,9 +1103,12 @@ end ```javascript // natsbridge.js const nats = require('nats'); -const { v4: uuidv4 } = require('uuid'); +const crypto = require('crypto'); const fetch = require('node-fetch'); +// UUID generation using built-in crypto module +const uuidv4 = () => crypto.randomUUID(); + const DEFAULT_SIZE_THRESHOLD = 1_000_000; const DEFAULT_BROKER_URL = 'nats://localhost:4222'; const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; @@ -1152,10 +1159,13 @@ module.exports = { ```javascript const nats = require('nats'); -const { v4: uuidv4 } = require('uuid'); +const crypto = require('crypto'); const fetch = require('node-fetch'); const arrow = require('apache-arrow'); +// UUID generation using built-in crypto module +const uuidv4 = () => crypto.randomUUID(); + const DEFAULT_SIZE_THRESHOLD = 1_000_000; const DEFAULT_BROKER_URL = 'nats://localhost:4222'; const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; -- 2.49.1 From 89a72cf8a98bbd21f45ab88ffb529ae2d31b848d Mon Sep 17 00:00:00 2001 From: narawat Date: Sun, 8 Mar 2026 13:11:53 +0700 Subject: [PATCH 28/43] adding jsontable --- docs/architecture.md | 243 +++- docs/implementation.md | 311 ++++- docs/updated_architecture.md | 1322 ------------------- docs/updated_implementation.md | 2241 -------------------------------- src/NATSBridge.jl | 172 ++- 5 files changed, 604 insertions(+), 3685 deletions(-) delete mode 100644 docs/updated_architecture.md delete mode 100644 docs/updated_implementation.md diff --git a/docs/architecture.md b/docs/architecture.md index d496e92..8b57af8 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -55,7 +55,8 @@ All three platforms expose the same high-level API: |------|-------|------------|-------------------| | `text` | `String` | `string` | `str` | | `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | -| `table` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | +| `arrowtable` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | +| `jsontable` | `Vector{NamedTuple}`, `Vector{Dict}` | `Array` | `list[dict]`, `list` | | `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | | `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | | `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | @@ -236,13 +237,23 @@ flowchart TB }, { "id": "uuid4", - "dataname": "large_table", - "payload_type": "table", + "dataname": "large_arrow_table", + "payload_type": "arrowtable", "transport": "link", - "encoding": "none", + "encoding": "arrow-ipc", "size": 524288, "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow", "metadata": {} + }, + { + "id": "uuid4", + "dataname": "json_table", + "payload_type": "jsontable", + "transport": "direct", + "encoding": "json", + "size": 1024, + "data": "[{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}]", + "metadata": {} } ] } @@ -255,11 +266,11 @@ flowchart TB { "id": "uuid4", "dataname": "login_image", - "payload_type": "image | dictionary | table | text | audio | video | binary", + "payload_type": "image | dictionary | arrowtable | jsontable | text | audio | video | binary", "transport": "direct | link", "encoding": "none | json | base64 | arrow-ipc", "size": 15433, - "data": "base64-encoded-string | http-url", + "data": "base64-encoded-string | http-url | json-string", "metadata": { "checksum": "sha256_hash" } @@ -278,25 +289,25 @@ flowchart TB ▼ ┌─────────────────────────────────────────────────────────────┐ │ For each payload: │ -│ 1. Extract type from tuple/array │ +│ 1. Extract type from tuple/array │ │ 2. Serialize based on type │ │ 3. Check payload size │ └─────────────────────────────────────────────────────────────┘ │ - ┌───────────┴────────────┐ - ▼ ▼ - ┌──────────────┐ ┌──────────────┐ - │ Direct Path │ │ Link Path │ - │ (< 1MB) │ │ (>= 1MB) │ - │ │ │ │ - │ • Serialize │ │ • Serialize │ - │ to buffer │ │ to buffer │ - │ • Base64 │ │ • Upload to │ - │ encode │ │ HTTP Server│ - │ • Publish to │ │ • Publish to │ - │ NATS │ │ NATS with │ - │ (in msg) │ │ URL │ - └──────────────┘ └──────────────┘ + ┌───────────┴────────────┐ + ▼ ▼ + ┌──────────────┐ ┌──────────────┐ + │ Direct Path │ │ Link Path │ + │ (< 1MB) │ │ (>= 1MB) │ + │ │ │ │ + │ • Serialize │ │ • Serialize │ + │ to buffer │ │ to buffer │ + │ • Base64/JSON│ │ • Upload to │ + │ encode │ │ HTTP Server│ + │ • Publish to │ │ • Publish to │ + │ NATS │ │ NATS with │ + │ (in msg) │ │ URL │ + └──────────────┘ └──────────────┘ ``` --- @@ -422,6 +433,41 @@ function smartreceive( )::JSON.Object{String, Any} ``` +#### Serialization Logic for Tables + +```julia +# Serialize table data based on payload_type +function _serialize_table_data(data::Any, payload_type::String)::Vector{UInt8} + if payload_type == "arrowtable" + # Serialize to Apache Arrow IPC format + buffer = IOBuffer() + Arrow.write(buffer, data) + return take!(buffer) + elseif payload_type == "jsontable" + # Serialize to JSON format + json_str = JSON.json(data) + return Vector{UInt8}(json_str) + else + throw(ArgumentError("Unknown payload_type: $payload_type")) + end +end + +# Deserialize table data based on payload_type +function _deserialize_table_data(data::Vector{UInt8}, payload_type::String)::Any + if payload_type == "arrowtable" + # Deserialize from Apache Arrow IPC format + buffer = Buffer(data) + return Arrow.read(buffer) + elseif payload_type == "jsontable" + # Deserialize from JSON format + json_str = String(data) + return JSON.parse(json_str) + else + throw(ArgumentError("Unknown payload_type: $payload_type")) + end +end +``` + --- ### JavaScript Implementation @@ -541,7 +587,7 @@ class NATSClient { | Package | Purpose | |---------|---------| | `nats` | Core NATS functionality (nats.js) | -| `uuid` | UUID generation | +| `crypto` (built-in) | UUID generation (Node.js) | | `node-fetch` or `axios` | HTTP client for file server | | `apache-arrow` | Arrow IPC serialization | @@ -550,7 +596,7 @@ class NATSClient { | Package | Purpose | |---------|---------| | `nats` | Browser-compatible NATS client | -| `uuid` | UUID generation | +| `crypto` (built-in) | UUID generation (browser) | | `fetch` (native) | HTTP client for file server | | `apache-arrow` | Arrow IPC serialization | @@ -615,6 +661,43 @@ async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correla } ``` +#### Serialization Logic for Tables + +```javascript +// Serialize table data based on payload_type +async function serializeTableData(data, payload_type) { + if (payload_type === "arrowtable") { + // Serialize to Apache Arrow IPC format + const schema = new arrow.Schema([...]); // Define schema + const arr = arrow.tableToArrowTable(data, schema); + const buffer = arrow.RecordBatch.from(arr).toBuffer(); + return new Uint8Array(buffer); + } else if (payload_type === "jsontable") { + // Serialize to JSON format + const jsonStr = JSON.stringify(data); + return new TextEncoder().encode(jsonStr); + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} + +// Deserialize table data based on payload_type +async function deserializeTableData(data, payload_type) { + if (payload_type === "arrowtable") { + // Deserialize from Apache Arrow IPC format + const buffer = arrow.arrayBufferToBuffer(data.buffer); + const batch = arrow.RecordBatch.deserialize(buffer); + return arrow.tableFromBatch(batch); + } else if (payload_type === "jsontable") { + // Deserialize from JSON format + const jsonStr = new TextDecoder().decode(data); + return JSON.parse(jsonStr); + } else { + throw new Error(`Unknown payload_type: ${payload_type}`); + } +} +``` + --- ### Python/MicroPython Implementation @@ -906,6 +989,56 @@ async def fetch_with_backoff( pass ``` +#### Serialization Logic for Tables + +```python +# Serialize table data based on payload_type +def serialize_table_data(data: Any, payload_type: str) -> bytes: + if payload_type == "arrowtable": + # Serialize to Apache Arrow IPC format + import pyarrow as pa + import pyarrow.feather as feather + import io + + if isinstance(data, pd.DataFrame): + table = pa.Table.from_pandas(data) + buffer = io.BytesIO() + feather.write_feather(table, buffer) + return buffer.getvalue() + else: + raise TypeError("Expected pandas DataFrame for arrowtable") + + elif payload_type == "jsontable": + # Serialize to JSON format + if isinstance(data, list) and all(isinstance(row, dict) for row in data): + return json.dumps(data).encode('utf-8') + else: + raise TypeError("Expected list of dicts for jsontable") + + else: + raise ValueError(f"Unknown payload_type: {payload_type}") + +# Deserialize table data based on payload_type +def deserialize_table_data(data: bytes, payload_type: str) -> Any: + if payload_type == "arrowtable": + # Deserialize from Apache Arrow IPC format + import pyarrow as pa + import pyarrow.feather as feather + import io + + buffer = io.BytesIO(data) + table = feather.read_table(buffer) + return table.to_pandas() + + elif payload_type == "jsontable": + # Deserialize from JSON format + json_str = data.decode('utf-8') + return json.loads(json_str) + + else: + raise ValueError(f"Unknown payload_type: {payload_type}") +``` + --- ## Platform Comparison Matrix @@ -917,6 +1050,9 @@ async def fetch_with_backoff( | **Type Safety** | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | | **Memory Management** | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | | **Arrow IPC** | ✅ Native | ✅ (arrow package) | ✅ (pyarrow) | ❌ | +| **JSON Serialization** | ✅ (JSON.jl) | ✅ (native) | ✅ (json) | ✅ (json) | +| **arrowtable Support** | ✅ | ✅ | ✅ | ❌ | +| **jsontable Support** | ✅ | ✅ | ✅ | ✅ | | **Direct Transport** | ✅ | ✅ | ✅ | ✅ | | **Link Transport** | ✅ | ✅ | ✅ | ⚠️ (Limited) | | **Handler Functions** | ✅ | ✅ | ✅ | ✅ | @@ -948,7 +1084,11 @@ function _serialize_data(data::Dict, payload_type::String) end function _serialize_data(data::DataFrame, payload_type::String) - # Table handling + # Table handling - arrowtable +end + +function _serialize_data(data::Vector{NamedTuple}, payload_type::String) + # Table handling - jsontable end ``` @@ -979,7 +1119,7 @@ function generateUUID() { } async function serializeData(data, payload_type) { - // Serialization logic + // Serialization logic for arrowtable and jsontable } ``` @@ -1028,9 +1168,9 @@ def smartreceive(msg, **kwargs): | Platform | Code | |----------|------| -| **Julia** | ```julia
df = DataFrame(id=1:1000000, value=rand(1000000))
env, env_json_str = smartsend("analysis", [("table", df, "table")])``` | -| **JavaScript** | ```javascript
const df = [{ id: 1, value: 0.5 }, ...];
[env, env_json_str] = await smartsend("analysis", [["table", df, "table"]]);``` | -| **Python** | ```python
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "value": np.random.rand(1000000)})
env, env_json_str = await smartsend("analysis", [("table", df, "table")])``` | +| **Julia** | ```julia
df = DataFrame(id=1:1000000, value=rand(1000000))
env, env_json_str = smartsend("analysis", [("table_data", df, "arrowtable")])``` | +| **JavaScript** | ```javascript
const df = [{ id: 1, value: 0.5 }, ...];
[env, env_json_str] = await smartsend("analysis", [["table_data", df, "arrowtable"]]);``` | +| **Python** | ```python
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "value": np.random.rand(1000000)})
env, env_json_str = await smartsend("analysis", [("table_data", df, "arrowtable")])``` | ### Scenario 3: Chat System (Multi-Payload) @@ -1040,6 +1180,29 @@ def smartreceive(msg, **kwargs): | **JavaScript** | ```javascript
const chat = [["text", "Hello!", "text"], ["image", imgBuffer, "image"]];
[env, env_json_str] = await smartsend("chat", chat);``` | | **Python** | ```python
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = await smartsend("chat", chat)``` | +### Scenario 4: JSON Table Transfer (Cross-Platform) + +| Platform | Code | +|----------|------| +| **Julia** | ```julia
rows = [Dict("id" => 1, "name" => "Alice"), Dict("id" => 2, "name" => "Bob")]
env, env_json_str = smartsend("data", [("users", rows, "jsontable")])``` | +| **JavaScript** | ```javascript
const users = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }];
[env, env_json_str] = await smartsend("data", [["users", users, "jsontable"]]);``` | +| **Python** | ```python
users = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
env, env_json_str = await smartsend("data", [("users", users, "jsontable")])``` | + +### Scenario 5: Smart Transport Selection + +The `smartsend` function automatically selects the transport method based on payload size: + +- **Direct Transport (< 1MB)**: Payload is serialized and embedded directly in the NATS message + - `arrowtable`: Serialized to Arrow IPC, base64 encoded + - `jsontable`: Serialized to JSON, base64 encoded + - `dictionary`: Serialized to JSON, base64 encoded + - `text`: Serialized to UTF-8, base64 encoded + - `image/audio/video/binary`: Base64 encoded + +- **Link Transport (>= 1MB)**: Payload is uploaded to HTTP file server, URL embedded in message + - All types supported + - Receiver downloads from URL and deserializes + --- ## Performance Considerations (Cross-Platform) @@ -1080,6 +1243,13 @@ All platforms use correlation IDs for distributed tracing: [timestamp] [Correlation: abc123] Message published to subject ``` +### Serialization Performance Comparison + +| Format | Use Case | Pros | Cons | +|--------|----------|------|------| +| `arrowtable` | Large tabular data | Fast, zero-copy, schema-preserving | Binary format, requires Arrow library | +| `jsontable` | Small/medium tabular data | Human-readable, universal support | Slower, larger size, no schema | + --- ## Testing Strategy (Cross-Platform) @@ -1092,12 +1262,15 @@ All platforms use correlation IDs for distributed tracing: | **Deserialization** | `test/test_julia_text_receiver.jl` | `test/test_js_text_receiver.js` | `test/test_py_text_receiver.py` | | **Large Payload** | `test/test_julia_file_sender.jl` | `test/test_js_file_sender.js` | `test/test_py_file_sender.py` | | **Multi-Payload** | `test/test_julia_mix_payloads_sender.jl` | `test/test_js_mix_payloads_sender.js` | `test/test_py_mix_payloads_sender.py` | +| **Arrow Table** | `test/test_julia_table_sender.jl` | `test/test_js_table_sender.js` | `test/test_py_table_sender.py` | ### Integration Tests - NATS server communication - File server upload/download - Cross-platform message exchange +- Arrow table serialization/deserialization +- JSON table serialization/deserialization --- @@ -1134,6 +1307,16 @@ This cross-platform NATS bridge provides: - Python: Class-based design with type hints 3. **Message Format Consistency**: Identical `msg_envelope_v1` and `msg_payload_v1` JSON schemas 4. **Handler Abstraction**: File server operations abstracted through configurable handlers -5. **Platform-Specific Optimizations**: Arrow IPC support in desktop platforms, streaming support in MicroPython +5. **Platform-Specific Optimizations**: + - **Arrow IPC** (`arrowtable`): Efficient binary format for large tabular data + - **JSON** (`jsontable`): Universal human-readable format for smaller tables + - Streaming support in MicroPython -The Julia implementation serves as the **ground truth** for API design and behavior, while JavaScript and Python implementations maintain interface parity while leveraging their respective language idioms. \ No newline at end of file +The Julia implementation serves as the **ground truth** for API design and behavior, while JavaScript and Python implementations maintain interface parity while leveraging their respective language idioms. + +### Datatype Summary + +| Datatype | Serialization | Use Case | Encoding | +|----------|---------------|----------|----------| +| `arrowtable` | Apache Arrow IPC | Large tabular data, schema-preserving | `arrow-ipc` → `base64` | +| `jsontable` | JSON | Small/medium tabular data, human-readable | `json` → `base64` | diff --git a/docs/implementation.md b/docs/implementation.md index 49b9c1f..ed21567 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -177,7 +177,8 @@ The system uses a **standardized list-of-tuples format** for all payload operati |------|-------|------------|--------|-------------| | `text` | `String` | `string` | `str` | `str` | | `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | -| `table` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | ❌ (not supported) | +| `arrowtable` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | ❌ (not supported) | +| `jsontable` | `Vector{NamedTuple}`, `Vector{Dict}` | `Array` | `list[dict]`, `list` | `list` | | `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | | `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | | `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | @@ -201,7 +202,7 @@ env, env_json_str = smartsend( # Multiple payloads with different types env, env_json_str = smartsend( "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], + [("dataname1", data1, "dictionary"), ("dataname2", data2, "arrowtable")], broker_url="nats://localhost:4222" ) @@ -245,7 +246,7 @@ const [env, env_json_str] = await NATSBridge.smartsend( "/test", [ ["dataname1", data1, "dictionary"], - ["dataname2", data2, "table"] + ["dataname2", data2, "arrowtable"] ], { broker_url: "nats://localhost:4222" } ); @@ -288,7 +289,7 @@ env, env_json_str = await NATSBridge.smartsend( # Multiple payloads env, env_json_str = await NATSBridge.smartsend( "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")], + [("dataname1", data1, "dictionary"), ("dataname2", data2, "arrowtable")], broker_url="nats://localhost:4222" ) @@ -334,6 +335,160 @@ env, env_json_str = NATSBridge.smartsend( --- +## Row-Oriented vs Column-Oriented Data Structures + +Different platforms use different internal representations for tabular data. Understanding these differences is crucial for proper serialization/deserialization when using `jsontable` and `arrowtable` datatypes. + +### Data Structure Comparison + +| Platform | Table Structure | Orientation | +|----------|-----------------|-------------| +| **Julia (DataFrame)** | `Dict{String, Vector}` | Column-oriented | +| **Python (pandas)** | `dict[str, list]` | Column-oriented | +| **JavaScript** | `Array` | Row-oriented | +| **MicroPython** | `list[list]` | Row-oriented | + +### Column-Oriented (Julia DataFrame, Python pandas) + +In column-oriented structures, each column is stored as a separate array/vector: + +**Julia Example:** +```julia +# Create dictionary with column vectors +dict = Dict("customer age" => [15, 20, 25], + "first name" => ["Rohit", "Rahul", "Akshat"]) + +# Convert to DataFrame +df = DataFrame(dict) +println(df) +# Output: +# 3×2 DataFrame +# Row ┆ customer age ┆ first name +# ┆ Int64 ┆ String +# ─────┼──────────────┼──────────── +# 1 ┆ 15 ┆ "Rohit" +# 2 ┆ 20 ┆ "Rahul" +# 3 ┆ 25 ┆ "Akshat" +``` + +**Python Example:** +```python +# Create dictionary with column lists +data = { + "Name": ["Alice", "Bob", "Charlie"], + "Age": [25, 30, 35], + "Score": [88.5, 92.0, 79.5] +} + +# Convert to DataFrame +df = pd.DataFrame(data) +print(df) +# Output: +# Name Age Score +# 0 Alice 25 88.5 +# 1 Bob 30 92.0 +# 2 Charlie 35 79.5 +``` + +### Row-Oriented (JavaScript, MicroPython) + +In row-oriented structures, each row is stored as a separate object/array: + +**JavaScript Example:** +```javascript +// Array of objects (row-oriented) +const users = [ + { Name: "Alice", Age: 25, Score: 88.5 }, + { Name: "Bob", Age: 30, Score: 92.0 }, + { Name: "Charlie", Age: 35, Score: 79.5 } +]; +``` + +**MicroPython Example:** +```python +# List of lists (row-oriented) +users = [ + ["Alice", 25, 88.5], + ["Bob", 30, 92.0], + ["Charlie", 35, 79.5] +] +``` + +### Cross-Platform Conversion for jsontable + +When sending `jsontable` across platforms, the system performs automatic conversion between row-oriented and column-oriented formats: + +**Sending from Julia/Python (column-oriented) to JS/MicroPython (row-oriented):** +1. Convert column-oriented dict to row-oriented array of objects +2. Serialize to JSON +3. Send with `payload_type = "jsontable"` + +**Receiving from JS/MicroPython (row-oriented) to Julia/Python (column-oriented):** +1. Deserialize JSON to row-oriented array of objects +2. Convert to column-oriented dict +3. Create DataFrame from column-oriented dict + +**Example: Julia to JavaScript** +```julia +# Julia side - column-oriented DataFrame +df = DataFrame( + "Name" => ["Alice", "Bob", "Charlie"], + "Age" => [25, 30, 35], + "Score" => [88.5, 92.0, 79.5] +) + +# smartsend automatically converts to row-oriented JSON +env, env_json_str = smartsend( + "/data", + [("users", df, "jsontable")] +) +# JSON sent: [{"Name":"Alice","Age":25,"Score":88.5}, ...] +``` + +```javascript +// JavaScript side - receives row-oriented array +const [env, env_json_str] = await NATSBridge.smartsend( + "/data", + [["users", users, "jsontable"]] +); +// users is already row-oriented: [{Name: "Alice", Age: 25, ...}, ...] +``` + +**Example: JavaScript to Julia** +```javascript +// JavaScript side - row-oriented array +const users = [ + { Name: "Alice", Age: 25, Score: 88.5 }, + { Name: "Bob", Age: 30, Score: 92.0 } +]; + +const [env, env_json_str] = await NATSBridge.smartsend( + "/data", + [["users", users, "jsontable"]] +); +``` + +```julia +# Julia side - receives and converts to column-oriented DataFrame +env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) +# The jsontable is automatically converted to DataFrame +for (dataname, data, type) in env["payloads"] + if type == "jsontable" + # data is now a DataFrame with column-oriented structure + println(data) + # Output: + # 2×3 DataFrame + # Row ┆ Name ┆ Age ┆ Score + # ┆ String ┆ Int64 ┆ Float64 + # ─────┼────────┼──────┼─────── + # 1 ┆ Alice ┆ 25 ┆ 88.5 + # 2 ┆ Bob ┆ 30 ┆ 92.0 + end +end +``` + +--- + ## Architecture ### Cross-Platform Claim-Check Pattern @@ -345,7 +500,7 @@ flowchart TD B -->|No | D[Link Path
>= 1MB] C --> C1[Serialize to Buffer] - C1 --> C2[Base64 encode] + C1 --> C2[Base64/JSON encode] C2 --> C3[Publish to NATS] D --> D1[Serialize to Buffer] @@ -426,20 +581,24 @@ Pkg.add("Dates") ### JavaScript Dependencies (Node.js) ```bash -npm install nats uuid apache-arrow node-fetch +npm install nats apache-arrow node-fetch # or -yarn add nats uuid apache-arrow node-fetch +yarn add nats apache-arrow node-fetch ``` +**Note:** Node.js has a built-in `crypto` module for UUID generation, so no external `uuid` package is needed. + ### JavaScript Dependencies (Browser) ```bash -npm install nats uuid apache-arrow +npm install nats apache-arrow # or use CDN: # https://unpkg.com/nats-js/dist/bundle/nats.min.js # https://unpkg.com/apache-arrow/arrow.min.js ``` +**Note:** For browser UUID generation, use the built-in `crypto.randomUUID()` API (available in modern browsers) or a lightweight alternative like `uuidv4` package. + ### Python Dependencies (Desktop) ```bash @@ -592,7 +751,7 @@ function _serialize_data(data::Dict, payload_type::String) end function _serialize_data(data::DataFrame, payload_type::String) - # Table handling + # Table handling - arrowtable io = IOBuffer() Arrow.write(io, data) return take!(io) @@ -784,10 +943,16 @@ function _serialize_data(data::Any, payload_type::String) json_str = JSON.json(data) json_str_bytes = Vector{UInt8}(json_str) return json_str_bytes - elseif payload_type == "table" + elseif payload_type == "arrowtable" + # Serialize DataFrame to Arrow IPC format io = IOBuffer() Arrow.write(io, data) return take!(io) + elseif payload_type == "jsontable" + # Convert column-oriented to row-oriented JSON + # data is Vector{NamedTuple} or Vector{Dict} + json_str = JSON.json(data) + return Vector{UInt8}(json_str) elseif payload_type == "image" if isa(data, Vector{UInt8}) return data @@ -833,10 +998,17 @@ function _deserialize_data( elseif payload_type == "dictionary" json_str = String(data) return JSON.parse(json_str) - elseif payload_type == "table" + elseif payload_type == "arrowtable" + # Deserialize from Arrow IPC format io = IOBuffer(data) - df = Arrow.Table(io) - return df + arrow_table = Arrow.Table(io) + return arrow_table + elseif payload_type == "jsontable" + # Deserialize from JSON format + # Returns Vector{NamedTuple} (column-oriented compatible) + json_str = String(data) + parsed = JSON.parse(json_str) + return parsed elseif payload_type == "image" return data elseif payload_type == "audio" @@ -931,9 +1103,12 @@ end ```javascript // natsbridge.js const nats = require('nats'); -const { v4: uuidv4 } = require('uuid'); +const crypto = require('crypto'); const fetch = require('node-fetch'); +// UUID generation using built-in crypto module +const uuidv4 = () => crypto.randomUUID(); + const DEFAULT_SIZE_THRESHOLD = 1_000_000; const DEFAULT_BROKER_URL = 'nats://localhost:4222'; const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; @@ -984,10 +1159,13 @@ module.exports = { ```javascript const nats = require('nats'); -const { v4: uuidv4 } = require('uuid'); +const crypto = require('crypto'); const fetch = require('node-fetch'); const arrow = require('apache-arrow'); +// UUID generation using built-in crypto module +const uuidv4 = () => crypto.randomUUID(); + const DEFAULT_SIZE_THRESHOLD = 1_000_000; const DEFAULT_BROKER_URL = 'nats://localhost:4222'; const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; @@ -1108,21 +1286,36 @@ async function serializeData(data, payload_type) { } else if (payload_type === 'dictionary') { const jsonStr = JSON.stringify(data); return Buffer.from(jsonStr, 'utf8'); - } else if (payload_type === 'table') { - // Convert to Arrow IPC - const buffer = Buffer.alloc(1024 * 1024); // Pre-allocate buffer - const writer = new arrow.RecordBatchWriter([ - new arrow.Schema(Object.keys(data[0]).map(key => new arrow.Field(key, arrow.any()))) - ]); + } else if (payload_type === 'arrowtable') { + // Convert Array to Arrow IPC + // data is row-oriented: [{id: 1, name: "Alice"}, ...] + if (!Array.isArray(data) || data.length === 0) { + throw new Error('arrowtable data must be a non-empty array of objects'); + } + // Create schema from first row + const schemaFields = Object.keys(data[0]).map(key => + new arrow.Field(key, arrow.any()) + ); + const schema = new arrow.Schema(schemaFields); + + // Create writer + const writer = new arrow.RecordBatchWriter([schema]); + + // Write rows for (const row of data) { - const recordBatch = arrow.recordBatch.fromObjects([row], writer.schema); + const recordBatch = arrow.recordBatch.fromObjects([row], schema); writer.write(recordBatch); } await writer.close(); - // Read from the underlying buffer - return buffer; + // Read buffer + return writer.toBuffer(); + } else if (payload_type === 'jsontable') { + // data is already row-oriented Array + // Serialize directly to JSON + const jsonStr = JSON.stringify(data); + return Buffer.from(jsonStr, 'utf8'); } else if (payload_type === 'image') { if (data instanceof Uint8Array || Buffer.isBuffer(data)) { return Buffer.from(data); @@ -1168,10 +1361,15 @@ async function deserializeData(data, payload_type, correlation_id) { } else if (payload_type === 'dictionary') { const jsonStr = Buffer.from(data).toString('utf8'); return JSON.parse(jsonStr); - } else if (payload_type === 'table') { + } else if (payload_type === 'arrowtable') { + // Deserialize from Arrow IPC const buffer = Buffer.from(data); const table = arrow.tableFromRawBytes(buffer); return table; + } else if (payload_type === 'jsontable') { + // Deserialize from JSON - returns Array (row-oriented) + const jsonStr = Buffer.from(data).toString('utf8'); + return JSON.parse(jsonStr); } else if (payload_type === 'image') { return Buffer.from(data); } else if (payload_type === 'audio') { @@ -1489,7 +1687,8 @@ from typing import Any try: import pyarrow as arrow - import pyarrow.parquet as pq + import pyarrow.feather as feather + import pyarrow.ipc as ipc ARROW_AVAILABLE = True except ImportError: ARROW_AVAILABLE = False @@ -1505,22 +1704,27 @@ def _serialize_data(data: Any, payload_type: str) -> bytes: elif payload_type == 'dictionary': json_str = json.dumps(data) return json_str.encode('utf-8') - elif payload_type == 'table': + elif payload_type == 'arrowtable': if not ARROW_AVAILABLE: raise Error('pyarrow not available for table serialization') - # Convert DataFrame to Arrow import io buf = io.BytesIO() import pandas as pd if isinstance(data, pd.DataFrame): + # Column-oriented DataFrame to Arrow table = arrow.Table.from_pandas(data) sink = arrow.ipc.new_file(buf) arrow.ipc.write_table(table, sink) sink.close() return buf.getvalue() else: - raise Error('Table data must be a pandas DataFrame') + raise Error('arrowtable data must be a pandas DataFrame') + elif payload_type == 'jsontable': + # data is list[dict] or list (row-oriented) + # Serialize directly to JSON + json_str = json.dumps(data) + return json_str.encode('utf-8') elif payload_type == 'image': if isinstance(data, (bytes, bytearray)): return bytes(data) @@ -1554,6 +1758,8 @@ from typing import Any try: import pyarrow as arrow + import pyarrow.feather as feather + import pyarrow.ipc as ipc ARROW_AVAILABLE = True except ImportError: ARROW_AVAILABLE = False @@ -1566,7 +1772,7 @@ def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> An elif payload_type == 'dictionary': json_str = data.decode('utf-8') return json.loads(json_str) - elif payload_type == 'table': + elif payload_type == 'arrowtable': if not ARROW_AVAILABLE: raise Error('pyarrow not available for table deserialization') @@ -1574,6 +1780,10 @@ def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> An buf = io.BytesIO(data) reader = arrow.ipc.open_file(buf) return reader.read_all().to_pandas() + elif payload_type == 'jsontable': + # Deserialize from JSON - returns list[dict] (row-oriented) + json_str = data.decode('utf-8') + return json.loads(json_str) elif payload_type == 'image': return data elif payload_type == 'audio': @@ -1684,7 +1894,8 @@ MicroPython has significant constraints compared to desktop implementations: | Arrow IPC | ✅ | ❌ (not supported) | | Async/Await | ✅ | ⚠️ (uasyncio only) | | Large payloads (>1MB) | ✅ | ❌ (enforced limit) | -| Table type | ✅ | ❌ | +| arrowtable | ✅ | ❌ | +| jsontable | ⚠️ (limited) | ⚠️ (limited) | | Multiple payloads | ✅ | ⚠️ (limited) | ### MicroPython Module Structure @@ -1704,6 +1915,9 @@ DEFAULT_BROKER_URL = "nats://localhost:4222" DEFAULT_FILESERVER_URL = "http://localhost:8080" MAX_PAYLOAD_SIZE = 50000 # Hard limit +# Note: MicroPython uses list[list] for jsontable (row-oriented) +# No DataFrame support - data is always row-oriented + class NATSBridge: """MicroPython NATS bridge implementation.""" @@ -1811,11 +2025,14 @@ class NATSBridge: return env_json_obj def _serialize_data(self, data, payload_type): - """Serialize data (MicroPython version - no table support).""" + """Serialize data (MicroPython version - no arrowtable support).""" if payload_type == 'text': return data.encode('utf-8') elif payload_type == 'dictionary': return json.dumps(data).encode('utf-8') + elif payload_type == 'jsontable': + # data is list[list] (row-oriented) + return json.dumps(data).encode('utf-8') elif payload_type in ('image', 'audio', 'video', 'binary'): return bytes(data) else: @@ -1827,6 +2044,9 @@ class NATSBridge: return data.decode('utf-8') elif payload_type == 'dictionary': return json.loads(data.decode('utf-8')) + elif payload_type == 'jsontable': + # Returns list[list] (row-oriented) + return json.loads(data.decode('utf-8')) elif payload_type in ('image', 'audio', 'video', 'binary'): return data else: @@ -1926,6 +2146,13 @@ All platforms use correlation IDs for distributed tracing: [timestamp] [Correlation: abc123] Message published to subject ``` +### Serialization Performance + +| Format | Use Case | Pros | Cons | +|--------|----------|------|------| +| `arrowtable` | Large tabular data | Fast, zero-copy, schema-preserving | Binary format, requires Arrow library, not supported in MicroPython | +| `jsontable` | Small/medium tabular data | Human-readable, universal support, works in MicroPython | Slower, larger size, no schema enforcement | + --- ## Testing @@ -1978,6 +2205,12 @@ python3 test/test_py_text_receiver.py - Reduce `size_threshold` - Use direct transport only (< 100KB) - Avoid large payloads + - Use `jsontable` instead of `arrowtable` (arrowtable not supported) + +5. **Row-Oriented vs Column-Oriented Conversion Issues** + - Julia/Python: DataFrames are column-oriented; when sending `jsontable`, they are converted to row-oriented JSON + - JavaScript/MicroPython: Data is natively row-oriented + - When receiving `jsontable` in Julia/Python, JSON is automatically converted back to column-oriented DataFrame --- @@ -1993,6 +2226,16 @@ This cross-platform NATS bridge provides: - **MicroPython**: Synchronous API, memory-constrained optimizations 3. **Message Format Consistency**: Identical JSON schemas across all platforms 4. **Handler Abstraction**: File server operations abstracted through configurable handlers -5. **Platform-Specific Optimizations**: Arrow IPC in desktop platforms, streaming support in MicroPython +5. **Platform-Specific Optimizations**: + - **Arrow IPC** (`arrowtable`): Efficient binary format for large tabular data (not supported in MicroPython) + - **JSON** (`jsontable`): Universal human-readable format for smaller tables (works in all platforms) +6. **Row-Oriented ↔ Column-Oriented Conversion**: Automatic conversion between row-oriented (JS, MicroPython) and column-oriented (Julia DataFrame, Python pandas) formats when using `jsontable` -The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. \ No newline at end of file +The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. + +### Datatype Summary + +| Datatype | Serialization | Use Case | Encoding | Supported Platforms | +|----------|---------------|----------|----------|---------------------| +| `arrowtable` | Apache Arrow IPC | Large tabular data, schema-preserving | `arrow-ipc` → `base64` | Julia, JavaScript, Python | +| `jsontable` | JSON | Small/medium tabular data, human-readable | `json` → `base64` | Julia, JavaScript, Python, MicroPython | diff --git a/docs/updated_architecture.md b/docs/updated_architecture.md deleted file mode 100644 index 8b57af8..0000000 --- a/docs/updated_architecture.md +++ /dev/null @@ -1,1322 +0,0 @@ -# Cross-Platform Architecture Documentation: Bi-Directional Data Bridge - -## Overview - -This document describes the architecture for a high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. - -**Supported Platforms:** -- **Julia** - Ground truth implementation with full feature set -- **JavaScript** - Node.js and browser-compatible implementation -- **Python/MicroPython** - Desktop and embedded-compatible implementation - -### Cross-Platform Design Principles - -1. **High-Level API Parity**: All three platforms expose the same `smartsend()` and `smartreceive()` functions with identical signatures and behavior -2. **Idiomatic Implementations**: Each platform uses its native patterns (multiple dispatch in Julia, async/prototype in JS, class-based in Python) -3. **Message Format Consistency**: The `msg_envelope_v1` and `msg_payload_v1` JSON schemas are identical across all platforms -4. **Handler Function Abstraction**: File server operations are abstracted through handler functions for backend flexibility - ---- - -## High-Level API Standard (Cross-Platform) - -### Unified API Signature - -All three platforms expose the same high-level API: - -**Input Format (smartsend):** -``` -[(dataname1, data1, type1), (dataname2, data2, type2), ...] -``` - -**Output Format (smartreceive):** -``` -{ - "correlation_id": "...", - "msg_id": "...", - "timestamp": "...", - "send_to": "...", - "msg_purpose": "...", - "sender_name": "...", - "sender_id": "...", - "receiver_name": "...", - "receiver_id": "...", - "reply_to": "...", - "reply_to_msg_id": "...", - "broker_url": "...", - "metadata": {...}, - "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -} -``` - -### Supported Payload Types - -| Type | Julia | JavaScript | Python/MicroPython | -|------|-------|------------|-------------------| -| `text` | `String` | `string` | `str` | -| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | -| `arrowtable` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | -| `jsontable` | `Vector{NamedTuple}`, `Vector{Dict}` | `Array` | `list[dict]`, `list` | -| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | -| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | -| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | -| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray`, `io.BytesIO` | - -### Cross-Platform API Examples - -**Julia:** -```julia -using NATSBridge - -# Send -env, env_json_str = smartsend( - "/chat", - [("message", "Hello!", "text"), ("image", image_bytes, "image")], - broker_url="nats://localhost:4222" -) - -# Receive - returns JSON.Object{String, Any} -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) -# env is a JSON.Object{String, Any} with "payloads" field containing Vector{Tuple{String, Any, String}} -# Access payloads: for (dataname, data, type) in env["payloads] -``` - -**JavaScript:** -```javascript -const NATSBridge = require('natsbridge'); - -// Send -const [env, env_json_str] = await NATSBridge.smartsend( - "/chat", - [ - ["message", "Hello!", "text"], - ["image", imageBuffer, "image"] - ], - { broker_url: "nats://localhost:4222" } -); - -// Receive - returns Promise -const env = await NATSBridge.smartreceive(msg, { - fileserver_download_handler: fetchWithBackoff -}); -// env is an object with "payloads" field containing Array of arrays -// Access payloads: for (const [dataname, data, type] of env.payloads) -``` - -**Python:** -```python -from natsbridge import NATSBridge - -# Send -env, env_json_str = NATSBridge.smartsend( - "/chat", - [("message", "Hello!", "text"), ("image", image_bytes, "image")], - broker_url="nats://localhost:4222" -) - -# Receive - returns Tuple[Dict, str] -env = NATSBridge.smartreceive( - msg, - fileserver_download_handler=fetch_with_backoff -) -# env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] -# Access payloads: for dataname, data, type_ in env["payloads"] -``` - -**MicroPython:** -```python -from natsbridge import NATSBridge - -# Send (limited to direct transport due to memory constraints) -env, env_json_str = NATSBridge.smartsend( - "/chat", - [("message", "Hello!", "text")], - broker_url="nats://localhost:4222" -) -``` - ---- - -## Architecture Diagram (Cross-Platform) - -```mermaid -flowchart TB - subgraph JuliaApp["Julia Application"] - JuliaAppCode[App Code] - JuliaBridge[NATSBridge.jl] - JuliaNATS[NATS.jl] - end - - subgraph JSApp["JavaScript Application"] - JSAppCode[App Code] - JSBridge[NATSBridge.js] - JSNATS[nats.js] - end - - subgraph PythonApp["Python/MicroPython Application"] - PythonAppCode[App Code] - PythonBridge[NATSBridge.py] - PythonNATS[nats.py] - end - - subgraph Infrastructure["Infrastructure"] - NATS[NATS Server
Message Broker] - FileServer[HTTP File Server
Upload/Download] - end - - JuliaAppCode --> JuliaBridge - JuliaBridge --> JuliaNATS - JSAppCode --> JSBridge - JSBridge --> JSNATS - PythonAppCode --> PythonBridge - PythonBridge --> PythonNATS - - JuliaNATS --> NATS - JSNATS --> NATS - PythonNATS --> NATS - - NATS --> JuliaNATS - NATS --> JSNATS - NATS --> PythonNATS - - JuliaBridge -.->|HTTP POST upload| FileServer - JSBridge -.->|HTTP POST upload| FileServer - PythonBridge -.->|HTTP POST upload| FileServer - - FileServer -.->|HTTP GET download| JuliaBridge - FileServer -.->|HTTP GET download| JSBridge - FileServer -.->|HTTP GET download| PythonBridge - - style JuliaApp fill:#c5e1a5 - style JSApp fill:#bbdefb - style PythonApp fill:#f8bbd0 - style NATS fill:#fff3e0 - style FileServer fill:#f3e5f5 -``` - ---- - -## System Components - -### 1. msg_envelope_v1 - Message Envelope - -**JSON Schema (Identical Across All Platforms):** -```json -{ - "correlation_id": "uuid-v4-string", - "msg_id": "uuid-v4-string", - "timestamp": "2024-01-15T10:30:00Z", - - "send_to": "topic/subject", - "msg_purpose": "ACK | NACK | updateStatus | shutdown | chat", - "sender_name": "agent-wine-web-frontend", - "sender_id": "uuid4", - "receiver_name": "agent-backend", - "receiver_id": "uuid4", - "reply_to": "topic", - "reply_to_msg_id": "uuid4", - "broker_url": "nats://localhost:4222", - - "metadata": { - "content_type": "application/octet-stream", - "content_length": 123456 - }, - - "payloads": [ - { - "id": "uuid4", - "dataname": "login_image", - "payload_type": "image", - "transport": "direct", - "encoding": "base64", - "size": 15433, - "data": "base64-encoded-string", - "metadata": { - "checksum": "sha256_hash" - } - }, - { - "id": "uuid4", - "dataname": "large_arrow_table", - "payload_type": "arrowtable", - "transport": "link", - "encoding": "arrow-ipc", - "size": 524288, - "data": "http://localhost:8080/file/UPLOAD_ID/FILE_ID/data.arrow", - "metadata": {} - }, - { - "id": "uuid4", - "dataname": "json_table", - "payload_type": "jsontable", - "transport": "direct", - "encoding": "json", - "size": 1024, - "data": "[{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}]", - "metadata": {} - } - ] -} -``` - -### 2. msg_payload_v1 - Payload Structure - -**JSON Schema (Identical Across All Platforms):** -```json -{ - "id": "uuid4", - "dataname": "login_image", - "payload_type": "image | dictionary | arrowtable | jsontable | text | audio | video | binary", - "transport": "direct | link", - "encoding": "none | json | base64 | arrow-ipc", - "size": 15433, - "data": "base64-encoded-string | http-url | json-string", - "metadata": { - "checksum": "sha256_hash" - } -} -``` - -### 3. Transport Strategy Decision Logic (Cross-Platform) - -``` -┌─────────────────────────────────────────────────────────────┐ -│ smartsend Function (All Platforms) │ -│ Accepts: [(dataname1, data1, type1), ...] │ -│ (Type is per payload, not standalone) │ -└─────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ For each payload: │ -│ 1. Extract type from tuple/array │ -│ 2. Serialize based on type │ -│ 3. Check payload size │ -└─────────────────────────────────────────────────────────────┘ - │ - ┌───────────┴────────────┐ - ▼ ▼ - ┌──────────────┐ ┌──────────────┐ - │ Direct Path │ │ Link Path │ - │ (< 1MB) │ │ (>= 1MB) │ - │ │ │ │ - │ • Serialize │ │ • Serialize │ - │ to buffer │ │ to buffer │ - │ • Base64/JSON│ │ • Upload to │ - │ encode │ │ HTTP Server│ - │ • Publish to │ │ • Publish to │ - │ NATS │ │ NATS with │ - │ (in msg) │ │ URL │ - └──────────────┘ └──────────────┘ -``` - ---- - -## Platform-Specific Implementations - -### Julia Implementation - -#### Architecture Patterns - -**Multiple Dispatch:** Julia's core strength is leveraged through function overloading: - -```julia -# publish_message has two overloads based on argument types -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - conn = NATS.connect(broker_url) - publish_message(conn, subject, message, correlation_id) -end - -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - try - NATS.publish(conn, subject, message) - log_trace(correlation_id, "Message published to $subject") - finally - NATS.drain(conn) - end -end -``` - -**Struct-Based Data Models:** -```julia -struct msg_payload_v1 - id::String - dataname::String - payload_type::String - transport::String - encoding::String - size::Integer - data::Any - metadata::Dict{String, Any} -end - -struct msg_envelope_v1 - correlation_id::String - msg_id::String - timestamp::String - send_to::String - msg_purpose::String - sender_name::String - sender_id::String - receiver_name::String - receiver_id::String - reply_to::String - reply_to_msg_id::String - broker_url::String - metadata::Dict{String, Any} - payloads::Vector{msg_payload_v1} -end -``` - -#### Dependencies - -| Package | Purpose | -|---------|---------| -| `NATS.jl` | Core NATS functionality | -| `Arrow.jl` | Arrow IPC serialization | -| `JSON.jl` | JSON parsing | -| `HTTP.jl` | HTTP client for file server | -| `UUIDs.jl` | UUID generation | -| `Dates.jl` | Timestamps | -| `Base64` | Base64 encoding | - -#### File Server Handler Signatures - -```julia -# Upload handler -fileserver_upload_handler( - fileserver_url::String, - dataname::String, - data::Vector{UInt8} -)::Dict{String, Any} - -# Download handler -fileserver_download_handler( - url::String, - max_retries::Int, - base_delay::Int, - max_delay::Int, - correlation_id::String -)::Vector{UInt8} -``` - -#### Key Functions - -```julia -# Main send/receive functions -function smartsend( - subject::String, - data::AbstractArray{Tuple{String, Any, String}, 1}; - broker_url::String = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler::Function = plik_oneshot_upload, - size_threshold::Int = DEFAULT_SIZE_THRESHOLD, - correlation_id::String = string(uuid4()), - msg_purpose::String = "chat", - sender_name::String = "NATSBridge", - receiver_name::String = "", - receiver_id::String = "", - reply_to::String = "", - reply_to_msg_id::String = "", - is_publish::Bool = true, - NATS_connection::Union{NATS.Connection, Nothing} = nothing, - msg_id::String = string(uuid4()), - sender_id::String = string(uuid4()) -)::Tuple{msg_envelope_v1, String} - -function smartreceive( - msg::NATS.Msg; - fileserver_download_handler::Function = _fetch_with_backoff, - max_retries::Int = 5, - base_delay::Int = 100, - max_delay::Int = 5000 -)::JSON.Object{String, Any} -``` - -#### Serialization Logic for Tables - -```julia -# Serialize table data based on payload_type -function _serialize_table_data(data::Any, payload_type::String)::Vector{UInt8} - if payload_type == "arrowtable" - # Serialize to Apache Arrow IPC format - buffer = IOBuffer() - Arrow.write(buffer, data) - return take!(buffer) - elseif payload_type == "jsontable" - # Serialize to JSON format - json_str = JSON.json(data) - return Vector{UInt8}(json_str) - else - throw(ArgumentError("Unknown payload_type: $payload_type")) - end -end - -# Deserialize table data based on payload_type -function _deserialize_table_data(data::Vector{UInt8}, payload_type::String)::Any - if payload_type == "arrowtable" - # Deserialize from Apache Arrow IPC format - buffer = Buffer(data) - return Arrow.read(buffer) - elseif payload_type == "jsontable" - # Deserialize from JSON format - json_str = String(data) - return JSON.parse(json_str) - else - throw(ArgumentError("Unknown payload_type: $payload_type")) - end -end -``` - ---- - -### JavaScript Implementation - -#### Architecture Patterns - -**Async/Await Pattern:** JavaScript uses async/await for non-blocking I/O: - -```javascript -// smartsend is async and returns a Promise -async function smartsend(subject, data, options = {}) { - const { - broker_url = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler = plikOneshotUpload, - size_threshold = DEFAULT_SIZE_THRESHOLD, - correlation_id = generateUUID(), - msg_purpose = "chat", - sender_name = "NATSBridge", - receiver_name = "", - receiver_id = "", - reply_to = "", - reply_to_msg_id = "", - is_publish = true, - nats_connection = null, - msg_id = generateUUID(), - sender_id = generateUUID() - } = options; - - // Process payloads - const payloads = []; - for (const [dataname, payloadData, payloadType] of data) { - const payloadBytes = await serializeData(payloadData, payloadType); - const payloadSize = payloadBytes.byteLength; - - if (payloadSize < size_threshold) { - // Direct path - const payloadB64 = base64Encode(payloadBytes); - payloads.push({ - id: generateUUID(), - dataname, - payload_type: payloadType, - transport: "direct", - encoding: "base64", - size: payloadSize, - data: payloadB64 - }); - } else { - // Link path - const response = await fileserver_upload_handler( - fileserver_url, dataname, payloadBytes - ); - payloads.push({ - id: generateUUID(), - dataname, - payload_type: payloadType, - transport: "link", - encoding: "none", - size: payloadSize, - data: response.url - }); - } - } - - const env = buildEnvelope(subject, payloads, { - correlation_id, msg_id, msg_purpose, - sender_name, sender_id, receiver_name, - receiver_id, reply_to, reply_to_msg_id, - broker_url - }); - - const env_json_str = JSON.stringify(env); - - if (is_publish) { - if (nats_connection) { - await publishMessage(nats_connection, subject, env_json_str, correlation_id); - } else { - await publishMessage(broker_url, subject, env_json_str, correlation_id); - } - } - - return [env, env_json_str]; -} -``` - -**Prototype-Based Utilities:** -```javascript -// NATS client wrapper (prototype-based) -class NATSClient { - constructor(url) { - this.url = url; - this.connection = null; - } - - async connect() { - this.connection = await nats.connect({ servers: this.url }); - return this.connection; - } - - async publish(subject, message) { - if (!this.connection) { - await this.connect(); - } - await this.connection.publish(subject, message); - } - - async close() { - if (this.connection) { - this.connection.close(); - } - } -} -``` - -#### Dependencies (Node.js) - -| Package | Purpose | -|---------|---------| -| `nats` | Core NATS functionality (nats.js) | -| `crypto` (built-in) | UUID generation (Node.js) | -| `node-fetch` or `axios` | HTTP client for file server | -| `apache-arrow` | Arrow IPC serialization | - -#### Dependencies (Browser) - -| Package | Purpose | -|---------|---------| -| `nats` | Browser-compatible NATS client | -| `crypto` (built-in) | UUID generation (browser) | -| `fetch` (native) | HTTP client for file server | -| `apache-arrow` | Arrow IPC serialization | - -#### Dependencies (MicroPython) - -| Module | Purpose | -|--------|---------| -| `nats` (custom) | MicroPython NATS client | -| `time` | Timestamps | -| `uos` | File operations | -| `base64` | Base64 encoding | - -#### File Server Handler Signatures - -```javascript -// Upload handler - async function returning Promise -async function fileserver_upload_handler( - fileserver_url, - dataname, - data // Uint8Array -) { - // Returns: { status, uploadid, fileid, url } -} - -// Download handler - async function returning Promise -async function fileserver_download_handler( - url, - max_retries, - base_delay, - max_delay, - correlation_id -) { - // Returns: Uint8Array -} -``` - -#### Key Functions - -```javascript -// Main send/receive functions -async function smartsend(subject, data, options = {}) { - // data: Array of [dataname, data, type] tuples - // Returns: Promise<[env, env_json_str]> -} - -async function smartreceive(msg, options = {}) { - // msg: NATS message object - // Returns: Promise -} - -// Utility functions -async function serializeData(data, payload_type) { - // Returns: Uint8Array -} - -async function deserializeData(data, payload_type) { - // Returns: deserialized data -} - -async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { - // Returns: Uint8Array -} -``` - -#### Serialization Logic for Tables - -```javascript -// Serialize table data based on payload_type -async function serializeTableData(data, payload_type) { - if (payload_type === "arrowtable") { - // Serialize to Apache Arrow IPC format - const schema = new arrow.Schema([...]); // Define schema - const arr = arrow.tableToArrowTable(data, schema); - const buffer = arrow.RecordBatch.from(arr).toBuffer(); - return new Uint8Array(buffer); - } else if (payload_type === "jsontable") { - // Serialize to JSON format - const jsonStr = JSON.stringify(data); - return new TextEncoder().encode(jsonStr); - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} - -// Deserialize table data based on payload_type -async function deserializeTableData(data, payload_type) { - if (payload_type === "arrowtable") { - // Deserialize from Apache Arrow IPC format - const buffer = arrow.arrayBufferToBuffer(data.buffer); - const batch = arrow.RecordBatch.deserialize(buffer); - return arrow.tableFromBatch(batch); - } else if (payload_type === "jsontable") { - // Deserialize from JSON format - const jsonStr = new TextDecoder().decode(data); - return JSON.parse(jsonStr); - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} -``` - ---- - -### Python/MicroPython Implementation - -#### Architecture Patterns - -**Class-Based Design:** Python uses classes for stateful operations: - -```python -class NATSBridge: - """Cross-platform NATS bridge implementation.""" - - DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB - DEFAULT_BROKER_URL = "nats://localhost:4222" - DEFAULT_FILESERVER_URL = "http://localhost:8080" - - def __init__(self, broker_url=None, fileserver_url=None): - self.broker_url = broker_url or self.DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or self.DEFAULT_FILESERVER_URL - self._nats_client = None - - async def smartsend(self, subject, data, **kwargs): - """ - Send data via NATS with automatic transport selection. - - Args: - subject: NATS subject to publish to - data: List of (dataname, data, type) tuples - **kwargs: Additional options (broker_url, fileserver_url, etc.) - - Returns: - Tuple of (env, env_json_str) - """ - # Extract options with defaults - options = self._merge_options(kwargs) - - # Process payloads - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = self._serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - if payload_size < options['size_threshold']: - # Direct path - payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') - payloads.append({ - 'id': uuid.uuid4().hex, - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64 - }) - else: - # Link path - response = await options['fileserver_upload_handler']( - options['fileserver_url'], dataname, payload_bytes - ) - payloads.append({ - 'id': uuid.uuid4().hex, - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response['url'] - }) - - # Build envelope - env = self._build_envelope(subject, payloads, options) - env_json_str = json.dumps(env) - - if options['is_publish']: - await self._publish_message( - subject, env_json_str, options['correlation_id'], - nats_connection=options.get('nats_connection') - ) - - return env, env_json_str - - async def smartreceive(self, msg, **kwargs): - """ - Receive and process NATS message. - - Args: - msg: NATS message object - **kwargs: Additional options (fileserver_download_handler, etc.) - - Returns: - Dict with envelope metadata and payloads - """ - # Parse envelope - env_json_obj = json.loads(msg.payload) - - # Process payloads - payloads_list = [] - for payload in env_json_obj['payloads']: - transport = payload['transport'] - dataname = payload['dataname'] - - if transport == 'direct': - payload_b64 = payload['data'] - payload_bytes = base64.b64decode(payload_b64) - data_type = payload['payload_type'] - data = self._deserialize_data(payload_bytes, data_type) - payloads_list.append((dataname, data, data_type)) - elif transport == 'link': - url = payload['data'] - downloaded_data = await options['fileserver_download_handler']( - url, - options['max_retries'], - options['base_delay'], - options['max_delay'], - env_json_obj['correlation_id'] - ) - data_type = payload['payload_type'] - data = self._deserialize_data(downloaded_data, data_type) - payloads_list.append((dataname, data, data_type)) - - env_json_obj['payloads'] = payloads_list - return env_json_obj -``` - -**Dataclass for Type Safety:** -```python -from dataclasses import dataclass, field -from typing import Any, Dict, List, Tuple, Union - -@dataclass -class MsgPayloadV1: - """Message payload structure.""" - id: str - dataname: str - payload_type: str - transport: str - encoding: str - size: int - data: Union[str, bytes] # URL for link, base64 for direct - metadata: Dict[str, Any] = field(default_factory=dict) - -@dataclass -class MsgEnvelopeV1: - """Message envelope structure.""" - correlation_id: str - msg_id: str - timestamp: str - send_to: str - msg_purpose: str - sender_name: str - sender_id: str - receiver_name: str - receiver_id: str - reply_to: str - reply_to_msg_id: str - broker_url: str - metadata: Dict[str, Any] = field(default_factory=dict) - payloads: List[MsgPayloadV1] = field(default_factory=list) -``` - -#### Dependencies (Desktop Python) - -| Package | Purpose | -|---------|---------| -| `nats-py` | Core NATS functionality | -| `uuid` | UUID generation (stdlib) | -| `aiohttp` or `requests` | HTTP client for file server | -| `pyarrow` | Arrow IPC serialization | -| `pandas` | DataFrame support (optional) | -| `python-dateutil` | Timestamps | -| `base64` | Base64 encoding (stdlib) | - -#### Dependencies (MicroPython) - -| Module | Purpose | -|--------|---------| -| `network` | NATS connection (custom) | -| `time` | Timestamps | -| `uos` | File operations | -| `base64` | Base64 encoding | -| `json` | JSON parsing | -| `struct` | Binary data handling | - -**MicroPython Limitations:** -- No Arrow IPC support (memory constraints) -- Only direct transport (< 1MB threshold enforced) -- Simplified UUID generation -- No async/await (use callbacks or uasyncio) - -#### File Server Handler Signatures - -```python -# Upload handler - async function -async def fileserver_upload_handler( - fileserver_url: str, - dataname: str, - data: bytes -) -> Dict[str, Any]: - """ - Upload data to file server. - - Args: - fileserver_url: Base URL of file server - dataname: Name of the file - data: Binary data - - Returns: - Dict with keys: 'status', 'uploadid', 'fileid', 'url' - """ - pass - -# Download handler - async function -async def fileserver_download_handler( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """ - Download data from URL with exponential backoff. - - Args: - url: URL to download from - max_retries: Maximum retry attempts - base_delay: Initial delay in ms - max_delay: Maximum delay in ms - correlation_id: Correlation ID for logging - - Returns: - Downloaded bytes - """ - pass -``` - -#### Key Functions - -```python -# Main send/receive functions (standalone or class methods) -async def smartsend( - subject: str, - data: List[Tuple[str, Any, str]], - broker_url: str = DEFAULT_BROKER_URL, - fileserver_url: str = DEFAULT_FILESERVER_URL, - fileserver_upload_handler: Callable = plik_oneshot_upload, - size_threshold: int = DEFAULT_SIZE_THRESHOLD, - correlation_id: str = None, - msg_purpose: str = "chat", - sender_name: str = "NATSBridge", - receiver_name: str = "", - receiver_id: str = "", - reply_to: str = "", - reply_to_msg_id: str = "", - is_publish: bool = True, - nats_connection: Any = None, - msg_id: str = None, - sender_id: str = None -) -> Tuple[Dict, str]: - """Send data via NATS.""" - pass - -async def smartreceive( - msg: Any, - fileserver_download_handler: Callable = fetch_with_backoff, - max_retries: int = 5, - base_delay: int = 100, - max_delay: int = 5000 -) -> Dict: - """Receive and process NATS message.""" - pass - -# Utility functions -def _serialize_data(data: Any, payload_type: str) -> bytes: - """Serialize data to bytes.""" - pass - -def _deserialize_data(data: bytes, payload_type: str) -> Any: - """Deserialize bytes to data.""" - pass - -async def fetch_with_backoff( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """Fetch URL with exponential backoff.""" - pass -``` - -#### Serialization Logic for Tables - -```python -# Serialize table data based on payload_type -def serialize_table_data(data: Any, payload_type: str) -> bytes: - if payload_type == "arrowtable": - # Serialize to Apache Arrow IPC format - import pyarrow as pa - import pyarrow.feather as feather - import io - - if isinstance(data, pd.DataFrame): - table = pa.Table.from_pandas(data) - buffer = io.BytesIO() - feather.write_feather(table, buffer) - return buffer.getvalue() - else: - raise TypeError("Expected pandas DataFrame for arrowtable") - - elif payload_type == "jsontable": - # Serialize to JSON format - if isinstance(data, list) and all(isinstance(row, dict) for row in data): - return json.dumps(data).encode('utf-8') - else: - raise TypeError("Expected list of dicts for jsontable") - - else: - raise ValueError(f"Unknown payload_type: {payload_type}") - -# Deserialize table data based on payload_type -def deserialize_table_data(data: bytes, payload_type: str) -> Any: - if payload_type == "arrowtable": - # Deserialize from Apache Arrow IPC format - import pyarrow as pa - import pyarrow.feather as feather - import io - - buffer = io.BytesIO(data) - table = feather.read_table(buffer) - return table.to_pandas() - - elif payload_type == "jsontable": - # Deserialize from JSON format - json_str = data.decode('utf-8') - return json.loads(json_str) - - else: - raise ValueError(f"Unknown payload_type: {payload_type}") -``` - ---- - -## Platform Comparison Matrix - -| Feature | Julia | JavaScript | Python | MicroPython | -|---------|-------|------------|--------|-------------| -| **Multiple Dispatch** | ✅ Native | ❌ (Prototypes) | ❌ (Overload via `@overload`) | ❌ | -| **Async/Await** | ❌ (Tasks) | ✅ Native | ✅ Native | ⚠️ (uasyncio) | -| **Type Safety** | ✅ Strong | ⚠️ (TypeScript) | ✅ (Type hints) | ❌ | -| **Memory Management** | ✅ GC | ✅ GC | ✅ GC | ⚠️ (Manual) | -| **Arrow IPC** | ✅ Native | ✅ (arrow package) | ✅ (pyarrow) | ❌ | -| **JSON Serialization** | ✅ (JSON.jl) | ✅ (native) | ✅ (json) | ✅ (json) | -| **arrowtable Support** | ✅ | ✅ | ✅ | ❌ | -| **jsontable Support** | ✅ | ✅ | ✅ | ✅ | -| **Direct Transport** | ✅ | ✅ | ✅ | ✅ | -| **Link Transport** | ✅ | ✅ | ✅ | ⚠️ (Limited) | -| **Handler Functions** | ✅ | ✅ | ✅ | ✅ | -| **Cross-Platform API** | ✅ | ✅ | ✅ | ✅ | - ---- - -## Implementation Details by Platform - -### Julia: Multiple Dispatch Pattern - -```julia -# Function overloading based on argument types -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - # Creates new connection -end - -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - # Uses pre-existing connection -end - -# Type-specific serialization -function _serialize_data(data::String, payload_type::String) - # Text handling -end - -function _serialize_data(data::Dict, payload_type::String) - # Dictionary handling -end - -function _serialize_data(data::DataFrame, payload_type::String) - # Table handling - arrowtable -end - -function _serialize_data(data::Vector{NamedTuple}, payload_type::String) - # Table handling - jsontable -end -``` - -### JavaScript: Prototype + Async Pattern - -```javascript -// Class-based NATS client -class NATSClient { - constructor(url) { - this.url = url; - } - - async connect() { - // Connection logic - } - - async publish(subject, message) { - // Publish logic - } -} - -// Module-level utility functions -function generateUUID() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { - const r = Math.random() * 16 | 0; - return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); - }); -} - -async function serializeData(data, payload_type) { - // Serialization logic for arrowtable and jsontable -} -``` - -### Python: Class-Based Pattern - -```python -class NATSBridge: - """Main bridge class.""" - - def __init__(self, broker_url=None): - self.broker_url = broker_url or DEFAULT_BROKER_URL - - async def smartsend(self, subject, data, **kwargs): - """Send data.""" - pass - - async def smartreceive(self, msg, **kwargs): - """Receive message.""" - pass - -# Module-level convenience functions -def smartsend(subject, data, **kwargs): - """Convenience function using default NATSBridge instance.""" - bridge = NATSBridge() - return await bridge.smartsend(subject, data, **kwargs) - -def smartreceive(msg, **kwargs): - """Convenience function using default NATSBridge instance.""" - bridge = NATSBridge() - return await bridge.smartreceive(msg, **kwargs) -``` - ---- - -## Scenario Implementations (Cross-Platform) - -### Scenario 1: Command & Control (Small Dictionary) - -| Platform | Code | -|----------|------| -| **Julia** | ```julia
config = Dict("step_size" => 0.01)
env, env_json_str = smartsend("control", [("config", config, "dictionary")])``` | -| **JavaScript** | ```javascript
const config = { step_size: 0.01 };
[env, env_json_str] = await smartsend("control", [["config", config, "dictionary"]]);``` | -| **Python** | ```python
config = {"step_size": 0.01}
env, env_json_str = await smartsend("control", [("config", config, "dictionary")])``` | - -### Scenario 2: Deep Dive Analysis (Large Arrow Table) - -| Platform | Code | -|----------|------| -| **Julia** | ```julia
df = DataFrame(id=1:1000000, value=rand(1000000))
env, env_json_str = smartsend("analysis", [("table_data", df, "arrowtable")])``` | -| **JavaScript** | ```javascript
const df = [{ id: 1, value: 0.5 }, ...];
[env, env_json_str] = await smartsend("analysis", [["table_data", df, "arrowtable"]]);``` | -| **Python** | ```python
import pandas as pd
df = pd.DataFrame({"id": range(1000000), "value": np.random.rand(1000000)})
env, env_json_str = await smartsend("analysis", [("table_data", df, "arrowtable")])``` | - -### Scenario 3: Chat System (Multi-Payload) - -| Platform | Code | -|----------|------| -| **Julia** | ```julia
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = smartsend("chat", chat)``` | -| **JavaScript** | ```javascript
const chat = [["text", "Hello!", "text"], ["image", imgBuffer, "image"]];
[env, env_json_str] = await smartsend("chat", chat);``` | -| **Python** | ```python
chat = [("text", "Hello!", "text"), ("image", img_bytes, "image")]
env, env_json_str = await smartsend("chat", chat)``` | - -### Scenario 4: JSON Table Transfer (Cross-Platform) - -| Platform | Code | -|----------|------| -| **Julia** | ```julia
rows = [Dict("id" => 1, "name" => "Alice"), Dict("id" => 2, "name" => "Bob")]
env, env_json_str = smartsend("data", [("users", rows, "jsontable")])``` | -| **JavaScript** | ```javascript
const users = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }];
[env, env_json_str] = await smartsend("data", [["users", users, "jsontable"]]);``` | -| **Python** | ```python
users = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
env, env_json_str = await smartsend("data", [("users", users, "jsontable")])``` | - -### Scenario 5: Smart Transport Selection - -The `smartsend` function automatically selects the transport method based on payload size: - -- **Direct Transport (< 1MB)**: Payload is serialized and embedded directly in the NATS message - - `arrowtable`: Serialized to Arrow IPC, base64 encoded - - `jsontable`: Serialized to JSON, base64 encoded - - `dictionary`: Serialized to JSON, base64 encoded - - `text`: Serialized to UTF-8, base64 encoded - - `image/audio/video/binary`: Base64 encoded - -- **Link Transport (>= 1MB)**: Payload is uploaded to HTTP file server, URL embedded in message - - All types supported - - Receiver downloads from URL and deserializes - ---- - -## Performance Considerations (Cross-Platform) - -### Zero-Copy Reading - -| Platform | Strategy | -|----------|----------| -| **Julia** | `Arrow.read()` with memory-mapped files | -| **JavaScript** | `ArrayBuffer` with `DataView` | -| **Python** | `pyarrow` memory mapping | -| **MicroPython** | Not available (streaming only) | - -### Exponential Backoff - -```python -# Python/MicroPython -async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): - delay = base_delay - for attempt in range(1, max_retries + 1): - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - return await response.read() - except Exception as e: - if attempt < max_retries: - await asyncio.sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - raise Exception("Failed to fetch after max retries") -``` - -### Correlation ID Logging - -All platforms use correlation IDs for distributed tracing: - -``` -[timestamp] [Correlation: abc123] Message published to subject -``` - -### Serialization Performance Comparison - -| Format | Use Case | Pros | Cons | -|--------|----------|------|------| -| `arrowtable` | Large tabular data | Fast, zero-copy, schema-preserving | Binary format, requires Arrow library | -| `jsontable` | Small/medium tabular data | Human-readable, universal support | Slower, larger size, no schema | - ---- - -## Testing Strategy (Cross-Platform) - -### Unit Tests - -| Test Type | Julia | JavaScript | Python | -|-----------|-------|------------|--------| -| **Serialization** | `test/test_julia_text_sender.jl` | `test/test_js_text_sender.js` | `test/test_py_text_sender.py` | -| **Deserialization** | `test/test_julia_text_receiver.jl` | `test/test_js_text_receiver.js` | `test/test_py_text_receiver.py` | -| **Large Payload** | `test/test_julia_file_sender.jl` | `test/test_js_file_sender.js` | `test/test_py_file_sender.py` | -| **Multi-Payload** | `test/test_julia_mix_payloads_sender.jl` | `test/test_js_mix_payloads_sender.js` | `test/test_py_mix_payloads_sender.py` | -| **Arrow Table** | `test/test_julia_table_sender.jl` | `test/test_js_table_sender.js` | `test/test_py_table_sender.py` | - -### Integration Tests - -- NATS server communication -- File server upload/download -- Cross-platform message exchange -- Arrow table serialization/deserialization -- JSON table serialization/deserialization - ---- - -## Configuration - -### Environment Variables - -| Variable | Default | Description | -|----------|---------|-------------| -| `NATS_URL` | `nats://localhost:4222` | NATS server URL | -| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | -| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | - -### MicroPython-Specific Configuration - -```python -# micropython.conf -NATS_URL = "nats://broker.local:4222" -FILESERVER_URL = "http://fileserver.local:8080" -SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices -MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython -``` - ---- - -## Summary - -This cross-platform NATS bridge provides: - -1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across Julia, JavaScript, and Python/MicroPython -2. **Idiomatic Implementations**: - - Julia: Multiple dispatch and struct-based design - - JavaScript: Async/await and prototype-based utilities - - Python: Class-based design with type hints -3. **Message Format Consistency**: Identical `msg_envelope_v1` and `msg_payload_v1` JSON schemas -4. **Handler Abstraction**: File server operations abstracted through configurable handlers -5. **Platform-Specific Optimizations**: - - **Arrow IPC** (`arrowtable`): Efficient binary format for large tabular data - - **JSON** (`jsontable`): Universal human-readable format for smaller tables - - Streaming support in MicroPython - -The Julia implementation serves as the **ground truth** for API design and behavior, while JavaScript and Python implementations maintain interface parity while leveraging their respective language idioms. - -### Datatype Summary - -| Datatype | Serialization | Use Case | Encoding | -|----------|---------------|----------|----------| -| `arrowtable` | Apache Arrow IPC | Large tabular data, schema-preserving | `arrow-ipc` → `base64` | -| `jsontable` | JSON | Small/medium tabular data, human-readable | `json` → `base64` | diff --git a/docs/updated_implementation.md b/docs/updated_implementation.md deleted file mode 100644 index ed21567..0000000 --- a/docs/updated_implementation.md +++ /dev/null @@ -1,2241 +0,0 @@ -# Cross-Platform Implementation Guide: Bi-Directional Data Bridge - -## Overview - -This document describes the implementation of the high-performance, bi-directional data bridge using **NATS (Core & JetStream)**, implementing the Claim-Check pattern for large payloads. The system is implemented across three platforms with **high-level API parity** while maintaining **idiomatic implementations** for each language. - -**Supported Platforms:** -- **Julia** - Ground truth implementation (reference) -- **JavaScript** - Node.js and browser implementation -- **Python/MicroPython** - Desktop and embedded implementation - ---- - -## Implementation Files - -| Language | Implementation File | Description | -|----------|---------------------|-------------| -| **Julia** | [`src/NATSBridge.jl`](../src/NATSBridge.jl) | Full Julia implementation with Arrow IPC support | -| **JavaScript** | `src/natsbridge.js` | Node.js/browser implementation | -| **Python** | `src/natsbridge.py` | Desktop Python implementation | -| **MicroPython** | `src/natsbridge_mpy.py` | MicroPython implementation (limited features) | - ---- - -## File Server Handler Architecture - -The system uses **handler functions** to abstract file server operations, allowing support for different file server implementations (e.g., Plik, AWS S3, custom HTTP server). - -### Handler Function Signatures - -#### Julia - -```julia -# Upload handler - uploads data to file server and returns URL -fileserver_upload_handler( - fileserver_url::String, - dataname::String, - data::Vector{UInt8} -)::Dict{String, Any} - -# Download handler - fetches data from file server URL with exponential backoff -fileserver_download_handler( - url::String, - max_retries::Int, - base_delay::Int, - max_delay::Int, - correlation_id::String -)::Vector{UInt8} -``` - -#### JavaScript - -```javascript -// Upload handler - async function -async function fileserver_upload_handler( - fileserver_url, - dataname, - data // Uint8Array -) { - // Returns: { status, uploadid, fileid, url } -} - -// Download handler - async function -async function fileserver_download_handler( - url, - max_retries, - base_delay, - max_delay, - correlation_id -) { - // Returns: Uint8Array -} -``` - -#### Python - -```python -# Upload handler - async function -async def fileserver_upload_handler( - fileserver_url: str, - dataname: str, - data: bytes -) -> Dict[str, Any]: - """ - Upload data to file server. - - Returns: - Dict with keys: 'status', 'uploadid', 'fileid', 'url' - """ - pass - -# Download handler - async function -async def fileserver_download_handler( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """ - Download data from URL with exponential backoff. - - Returns: - Downloaded bytes - """ - pass -``` - -#### MicroPython - -```python -# Upload handler - synchronous (no async in MicroPython) -def fileserver_upload_handler( - fileserver_url: str, - dataname: str, - data: bytearray -) -> Dict: - """ - Upload data to file server (synchronous). - - Returns: - Dict with keys: 'status', 'url' - """ - pass - -# Download handler - synchronous -def fileserver_download_handler( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytearray: - """ - Download data from URL with exponential backoff (synchronous). - - Returns: - Downloaded bytes - """ - pass -``` - ---- - -## Multi-Payload Support (Standard API) - -The system uses a **standardized list-of-tuples format** for all payload operations across all platforms. - -### API Standard - -``` -# Input format for smartsend (always a list of tuples with type info) -[(dataname1, data1, type1), (dataname2, data2, type2), ...] - -# Output format for smartreceive (returns a dictionary with payloads field containing list of tuples) -{ - "correlation_id": "...", - "msg_id": "...", - "timestamp": "...", - "send_to": "...", - "msg_purpose": "...", - "sender_name": "...", - "sender_id": "...", - "receiver_name": "...", - "receiver_id": "...", - "reply_to": "...", - "reply_to_msg_id": "...", - "broker_url": "...", - "metadata": {...}, - "payloads": [(dataname1, data1, type1), (dataname2, data2, type2), ...] -} -``` - -### Supported Types - -| Type | Julia | JavaScript | Python | MicroPython | -|------|-------|------------|--------|-------------| -| `text` | `String` | `string` | `str` | `str` | -| `dictionary` | `Dict`, `NamedTuple` | `Object`, `Array` | `dict`, `list` | `dict` | -| `arrowtable` | `DataFrame`, `Arrow.Table` | `Array` (input) → `Buffer` (Arrow IPC) | `pandas.DataFrame`, `bytes` (Arrow IPC) | ❌ (not supported) | -| `jsontable` | `Vector{NamedTuple}`, `Vector{Dict}` | `Array` | `list[dict]`, `list` | `list` | -| `image` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | -| `audio` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | -| `video` | `Vector{UInt8}` | `Uint8Array`, `Buffer` | `bytes` | `bytearray` | -| `binary` | `Vector{UInt8}`, `IOBuffer` | `Uint8Array`, `Buffer` | `bytes`, `bytearray` | `bytearray` | - -### Cross-Platform Examples - -#### Julia - -```julia -using NATSBridge - -# Single payload - still wrapped in a list -env, env_json_str = smartsend( - "/test", - [("dataname1", data1, "dictionary")], - broker_url="nats://localhost:4222", - fileserver_upload_handler=plik_oneshot_upload -) - -# Multiple payloads with different types -env, env_json_str = smartsend( - "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "arrowtable")], - broker_url="nats://localhost:4222" -) - -# Mixed content (chat with text, image, audio) -env, env_json_str = smartsend( - "/chat", - [ - ("message_text", "Hello!", "text"), - ("user_image", image_data, "image"), - ("audio_clip", audio_data, "audio") - ], - broker_url="nats://localhost:4222" -) - -# Receive returns a JSON.Object{String, Any} envelope -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) -# env is a JSON.Object{String, Any} with "payloads" field containing Vector{Tuple{String, Any, String}} -# Access payloads: env["payloads"] which is a Vector of tuples -for (dataname, data, type) in env["payloads"] - println("$dataname: $data (type: $type)") -end -``` - -#### JavaScript - -```javascript -const NATSBridge = require('natsbridge'); - -// Single payload -const [env, env_json_str] = await NATSBridge.smartsend( - "/test", - [["dataname1", data1, "dictionary"]], - { - broker_url: "nats://localhost:4222", - fileserver_upload_handler: plikOneshotUpload - } -); - -// Multiple payloads -const [env, env_json_str] = await NATSBridge.smartsend( - "/test", - [ - ["dataname1", data1, "dictionary"], - ["dataname2", data2, "arrowtable"] - ], - { broker_url: "nats://localhost:4222" } -); - -// Mixed content -const [env, env_json_str] = await NATSBridge.smartsend( - "/chat", - [ - ["message_text", "Hello!", "text"], - ["user_image", imageData, "image"], - ["audio_clip", audioData, "audio"] - ], - { broker_url: "nats://localhost:4222" } -); - -// Receive -const env = await NATSBridge.smartreceive(msg, { - fileserver_download_handler: fetchWithBackoff -}); -// env is an object with "payloads" field containing Array of arrays -// Access payloads: env.payloads which is an Array of [dataname, data, type] arrays -for (const [dataname, data, type] of env.payloads) { - console.log(`${dataname}: ${data} (type: ${type})`); -} -``` - -#### Python - -```python -from natsbridge import NATSBridge - -# Single payload -env, env_json_str = await NATSBridge.smartsend( - "/test", - [("dataname1", data1, "dictionary")], - broker_url="nats://localhost:4222", - fileserver_upload_handler=plik_oneshot_upload -) - -# Multiple payloads -env, env_json_str = await NATSBridge.smartsend( - "/test", - [("dataname1", data1, "dictionary"), ("dataname2", data2, "arrowtable")], - broker_url="nats://localhost:4222" -) - -# Mixed content -env, env_json_str = await NATSBridge.smartsend( - "/chat", - [ - ("message_text", "Hello!", "text"), - ("user_image", image_data, "image"), - ("audio_clip", audio_data, "audio") - ], - broker_url="nats://localhost:4222" -) - -# Receive -env = await NATSBridge.smartreceive( - msg, - fileserver_download_handler=fetch_with_backoff -) -# env is a Dict with "payloads" key containing List[Tuple[str, Any, str]] -# Access payloads: env["payloads"] which is a list of tuples -for dataname, data, type_ in env["payloads"]: - print(f"{dataname}: {data} (type: {type_})") -``` - -#### MicroPython - -```python -from natsbridge import NATSBridge - -# Limited to text and binary (no tables due to memory constraints) -env, env_json_str = NATSBridge.smartsend( - "/chat", - [ - ("message_text", "Hello!", "text"), - ("binary_data", data_bytes, "binary") - ], - broker_url="nats://localhost:4222", - size_threshold=100000 # Lower threshold for memory constraints -) -# Note: MicroPython uses synchronous handlers -``` - ---- - -## Row-Oriented vs Column-Oriented Data Structures - -Different platforms use different internal representations for tabular data. Understanding these differences is crucial for proper serialization/deserialization when using `jsontable` and `arrowtable` datatypes. - -### Data Structure Comparison - -| Platform | Table Structure | Orientation | -|----------|-----------------|-------------| -| **Julia (DataFrame)** | `Dict{String, Vector}` | Column-oriented | -| **Python (pandas)** | `dict[str, list]` | Column-oriented | -| **JavaScript** | `Array` | Row-oriented | -| **MicroPython** | `list[list]` | Row-oriented | - -### Column-Oriented (Julia DataFrame, Python pandas) - -In column-oriented structures, each column is stored as a separate array/vector: - -**Julia Example:** -```julia -# Create dictionary with column vectors -dict = Dict("customer age" => [15, 20, 25], - "first name" => ["Rohit", "Rahul", "Akshat"]) - -# Convert to DataFrame -df = DataFrame(dict) -println(df) -# Output: -# 3×2 DataFrame -# Row ┆ customer age ┆ first name -# ┆ Int64 ┆ String -# ─────┼──────────────┼──────────── -# 1 ┆ 15 ┆ "Rohit" -# 2 ┆ 20 ┆ "Rahul" -# 3 ┆ 25 ┆ "Akshat" -``` - -**Python Example:** -```python -# Create dictionary with column lists -data = { - "Name": ["Alice", "Bob", "Charlie"], - "Age": [25, 30, 35], - "Score": [88.5, 92.0, 79.5] -} - -# Convert to DataFrame -df = pd.DataFrame(data) -print(df) -# Output: -# Name Age Score -# 0 Alice 25 88.5 -# 1 Bob 30 92.0 -# 2 Charlie 35 79.5 -``` - -### Row-Oriented (JavaScript, MicroPython) - -In row-oriented structures, each row is stored as a separate object/array: - -**JavaScript Example:** -```javascript -// Array of objects (row-oriented) -const users = [ - { Name: "Alice", Age: 25, Score: 88.5 }, - { Name: "Bob", Age: 30, Score: 92.0 }, - { Name: "Charlie", Age: 35, Score: 79.5 } -]; -``` - -**MicroPython Example:** -```python -# List of lists (row-oriented) -users = [ - ["Alice", 25, 88.5], - ["Bob", 30, 92.0], - ["Charlie", 35, 79.5] -] -``` - -### Cross-Platform Conversion for jsontable - -When sending `jsontable` across platforms, the system performs automatic conversion between row-oriented and column-oriented formats: - -**Sending from Julia/Python (column-oriented) to JS/MicroPython (row-oriented):** -1. Convert column-oriented dict to row-oriented array of objects -2. Serialize to JSON -3. Send with `payload_type = "jsontable"` - -**Receiving from JS/MicroPython (row-oriented) to Julia/Python (column-oriented):** -1. Deserialize JSON to row-oriented array of objects -2. Convert to column-oriented dict -3. Create DataFrame from column-oriented dict - -**Example: Julia to JavaScript** -```julia -# Julia side - column-oriented DataFrame -df = DataFrame( - "Name" => ["Alice", "Bob", "Charlie"], - "Age" => [25, 30, 35], - "Score" => [88.5, 92.0, 79.5] -) - -# smartsend automatically converts to row-oriented JSON -env, env_json_str = smartsend( - "/data", - [("users", df, "jsontable")] -) -# JSON sent: [{"Name":"Alice","Age":25,"Score":88.5}, ...] -``` - -```javascript -// JavaScript side - receives row-oriented array -const [env, env_json_str] = await NATSBridge.smartsend( - "/data", - [["users", users, "jsontable"]] -); -// users is already row-oriented: [{Name: "Alice", Age: 25, ...}, ...] -``` - -**Example: JavaScript to Julia** -```javascript -// JavaScript side - row-oriented array -const users = [ - { Name: "Alice", Age: 25, Score: 88.5 }, - { Name: "Bob", Age: 30, Score: 92.0 } -]; - -const [env, env_json_str] = await NATSBridge.smartsend( - "/data", - [["users", users, "jsontable"]] -); -``` - -```julia -# Julia side - receives and converts to column-oriented DataFrame -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) -# The jsontable is automatically converted to DataFrame -for (dataname, data, type) in env["payloads"] - if type == "jsontable" - # data is now a DataFrame with column-oriented structure - println(data) - # Output: - # 2×3 DataFrame - # Row ┆ Name ┆ Age ┆ Score - # ┆ String ┆ Int64 ┆ Float64 - # ─────┼────────┼──────┼─────── - # 1 ┆ Alice ┆ 25 ┆ 88.5 - # 2 ┆ Bob ┆ 30 ┆ 92.0 - end -end -``` - ---- - -## Architecture - -### Cross-Platform Claim-Check Pattern - -```mermaid -flowchart TD - A[SmartSend Function] --> B{Is payload size < 1MB?} - B -->|Yes | C[Direct Path
< 1MB] - B -->|No | D[Link Path
>= 1MB] - - C --> C1[Serialize to Buffer] - C1 --> C2[Base64/JSON encode] - C2 --> C3[Publish to NATS] - - D --> D1[Serialize to Buffer] - D1 --> D2[Upload to HTTP Server] - D2 --> D3[Publish to NATS with URL] - - style A fill:#e1f5ff,stroke:#0066cc,stroke-width:2px - style B fill:#fff4e1,stroke:#cc6600,stroke-width:2px - style C fill:#e8f5e9,stroke:#008000,stroke-width:2px - style D fill:#e8f5e9,stroke:#008000,stroke-width:2px - style C1 fill:#f5f5f5,stroke:#666,stroke-width:1px - style C2 fill:#f5f5f5,stroke:#666,stroke-width:1px - style C3 fill:#f5f5f5,stroke:#666,stroke-width:1px - style D1 fill:#f5f5f5,stroke:#666,stroke-width:1px - style D2 fill:#f5f5f5,stroke:#666,stroke-width:1px - style D3 fill:#f5f5f5,stroke:#666,stroke-width:1px -``` - -**Claim-Check Pattern Overview:** -- **Direct Path** (< 1MB): Payload is serialized, Base64-encoded, and published directly to NATS -- **Link Path** (≥ 1MB): Payload is serialized, uploaded to an HTTP file server, and only the URL is published to NATS (claim-check pattern) - -### smartsend Return Value - -All platforms return a tuple/array containing both the envelope and JSON string: - -#### Julia - -```julia -env, env_json_str = smartsend(...) -# Returns: ::Tuple{msg_envelope_v1, String} -# env::msg_envelope_v1 - The envelope object with all metadata and payloads -# env_json_str::String - JSON string for publishing to NATS -``` - -#### JavaScript - -```javascript -const [env, env_json_str] = await smartsend(...); -// Returns: Promise<[env, env_json_str]> -// env: Object with all metadata and payloads -// env_json_str: String for publishing to NATS -``` - -#### Python - -```python -env, env_json_str = await smartsend(...) -# Returns: Tuple[Dict, str] -# env: Dict with all metadata and payloads -# env_json_str: String for publishing to NATS -``` - -#### MicroPython - -```python -env, env_json_str = NATSBridge.smartsend(...) -# Returns: Tuple[Dict, str] -# Note: MicroPython returns plain dicts (no structured envelope object) -``` - ---- - -## Installation - -### Julia Dependencies - -```julia -using Pkg -Pkg.add("NATS") -Pkg.add("Arrow") -Pkg.add("JSON3") -Pkg.add("HTTP") -Pkg.add("UUIDs") -Pkg.add("Dates") -``` - -### JavaScript Dependencies (Node.js) - -```bash -npm install nats apache-arrow node-fetch -# or -yarn add nats apache-arrow node-fetch -``` - -**Note:** Node.js has a built-in `crypto` module for UUID generation, so no external `uuid` package is needed. - -### JavaScript Dependencies (Browser) - -```bash -npm install nats apache-arrow -# or use CDN: -# https://unpkg.com/nats-js/dist/bundle/nats.min.js -# https://unpkg.com/apache-arrow/arrow.min.js -``` - -**Note:** For browser UUID generation, use the built-in `crypto.randomUUID()` API (available in modern browsers) or a lightweight alternative like `uuidv4` package. - -### Python Dependencies (Desktop) - -```bash -pip install nats-py aiohttp pyarrow pandas python-dateutil -``` - -### MicroPython Dependencies - -MicroPython uses built-in modules: -- `network` - NATS connection (custom implementation) -- `time` - Timestamps -- `uos` - File operations -- `base64` - Base64 encoding -- `json` - JSON parsing -- `struct` - Binary data handling - ---- - -## Usage Tutorial - -### Step 1: Start NATS Server - -```bash -docker run -p 4222:4222 nats:latest -``` - -### Step 2: Start HTTP File Server (optional) - -```bash -# Create a directory for file uploads -mkdir -p /tmp/fileserver - -# Use any HTTP server that supports POST for file uploads -# Example: Python's built-in server -python3 -m http.server 8080 --directory /tmp/fileserver -``` - -### Step 3: Run Test Scenarios - -```bash -# Julia tests -julia test/test_julia_to_julia_text_sender.jl -julia test/test_julia_to_julia_text_receiver.jl - -# JavaScript tests (Node.js) -node test/test_js_text_sender.js -node test/test_js_text_receiver.js - -# Python tests -python3 test/test_py_text_sender.py -python3 test/test_py_text_receiver.py -``` - ---- - -## Platform-Specific Implementations - -### Julia Implementation - -#### Module Structure - -```julia -module NATSBridge - using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64 - - # Constants - const DEFAULT_SIZE_THRESHOLD = 1_000_000 # 1MB - const DEFAULT_BROKER_URL = "nats://localhost:4222" - const DEFAULT_FILESERVER_URL = "http://localhost:8080" - - # Structs - struct msg_payload_v1 - id::String - dataname::String - payload_type::String - transport::String - encoding::String - size::Integer - data::Any - metadata::Dict{String, Any} - end - - struct msg_envelope_v1 - correlation_id::String - msg_id::String - timestamp::String - send_to::String - msg_purpose::String - sender_name::String - sender_id::String - receiver_name::String - receiver_id::String - reply_to::String - reply_to_msg_id::String - broker_url::String - metadata::Dict{String, Any} - payloads::Vector{msg_payload_v1} - end - - # Main functions - function smartsend(...) end - function smartreceive(...) end - - # Utility functions - function _serialize_data(...) end - function _deserialize_data(...) end - function envelope_to_json(...) end - function log_trace(...) end - - # File server handlers - function plik_oneshot_upload(...) end - function _fetch_with_backoff(...) end - function publish_message(...) end - - # Internal helpers - function _get_payload_bytes(...) end -end -``` - -#### Multiple Dispatch Pattern - -Julia leverages multiple dispatch for type-specific implementations: - -```julia -# publish_message has two overloads based on argument types -function publish_message(broker_url::String, subject::String, message::String, correlation_id::String) - conn = NATS.connect(broker_url) - publish_message(conn, subject, message, correlation_id) -end - -function publish_message(conn::NATS.Connection, subject::String, message::String, correlation_id::String) - try - NATS.publish(conn, subject, message) - log_trace(correlation_id, "Message published to $subject") - finally - NATS.drain(conn) - end -end - -# Type-specific serialization -function _serialize_data(data::String, payload_type::String) - # Text handling - return Vector{UInt8}(data) -end - -function _serialize_data(data::Dict, payload_type::String) - # Dictionary handling - json_str = JSON.json(data) - return Vector{UInt8}(json_str) -end - -function _serialize_data(data::DataFrame, payload_type::String) - # Table handling - arrowtable - io = IOBuffer() - Arrow.write(io, data) - return take!(io) -end -``` - -#### smartsend Implementation - -```julia -function smartsend( - subject::String, - data::AbstractArray{Tuple{String, T1, String}, 1}; - broker_url::String = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler::Function = plik_oneshot_upload, - size_threshold::Int = DEFAULT_SIZE_THRESHOLD, - correlation_id::String = string(uuid4()), - msg_purpose::String = "chat", - sender_name::String = "NATSBridge", - receiver_name::String = "", - receiver_id::String = "", - reply_to::String = "", - reply_to_msg_id::String = "", - is_publish::Bool = true, - NATS_connection::Union{NATS.Connection, Nothing} = nothing, - msg_id::String = string(uuid4()), - sender_id::String = string(uuid4()) -)::Tuple{msg_envelope_v1, String} where {T1<:Any} - - log_trace(correlation_id, "Starting smartsend for subject: $subject") - - # Process each payload in the list - payloads = msg_payload_v1[] - for (dataname, payload_data, payload_type) in data - # Serialize data based on type - payload_bytes = _serialize_data(payload_data, payload_type) - - payload_size = length(payload_bytes) - log_trace(correlation_id, "Serialized payload '$dataname' size: $payload_size bytes") - - # Decision: Direct vs Link - if payload_size < size_threshold - # Direct path - Base64 encode and send via NATS - payload_b64 = Base64.base64encode(payload_bytes) - log_trace(correlation_id, "Using direct transport for $payload_size bytes") - - payload = msg_payload_v1( - payload_b64, - payload_type; - id = string(uuid4()), - dataname = dataname, - transport = "direct", - encoding = "base64", - size = payload_size, - metadata = Dict{String, Any}("payload_bytes" => payload_size) - ) - push!(payloads, payload) - else - # Link path - Upload to HTTP server, send URL via NATS - log_trace(correlation_id, "Using link transport, uploading to fileserver") - - response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) - - if response["status"] != 200 - error("Failed to upload data to fileserver: $(response["status"])") - end - - url = response["url"] - log_trace(correlation_id, "Uploaded to URL: $url") - - payload = msg_payload_v1( - url, - payload_type; - id = string(uuid4()), - dataname = dataname, - transport = "link", - encoding = "none", - size = payload_size, - metadata = Dict{String, Any}() - ) - push!(payloads, payload) - end - end - - # Create msg_envelope_v1 with all payloads - # Note: First positional argument is "send_to" (the NATS subject), not "subject" - env = msg_envelope_v1( - subject, # send_to: NATS subject to publish to - payloads; - correlation_id = correlation_id, - msg_id = msg_id, - msg_purpose = msg_purpose, - sender_name = sender_name, - sender_id = sender_id, - receiver_name = receiver_name, - receiver_id = receiver_id, - reply_to = reply_to, - reply_to_msg_id = reply_to_msg_id, - broker_url = broker_url, - metadata = Dict{String, Any}(), - ) - - env_json_str = envelope_to_json(env) - - if is_publish == false - # skip publish - elseif is_publish == true && NATS_connection === nothing - publish_message(broker_url, subject, env_json_str, correlation_id) - elseif is_publish == true && NATS_connection !== nothing - publish_message(NATS_connection, subject, env_json_str, correlation_id) - end - - return (env, env_json_str) -end -``` - -#### smartreceive Implementation - -```julia -function smartreceive( - msg::NATS.Msg; - fileserver_download_handler::Function = _fetch_with_backoff, - max_retries::Int = 5, - base_delay::Int = 100, - max_delay::Int = 5000 -)::JSON.Object{String, Any} - # Parse the JSON envelope - env_json_obj = JSON.parse(String(msg.payload)) - log_trace(env_json_obj["correlation_id"], "Processing received message") - - # Process all payloads in the envelope - payloads_list = Tuple{String, Any, String}[] - - num_payloads = length(env_json_obj["payloads"]) - - for i in 1:num_payloads - payload = env_json_obj["payloads"][i] - transport = String(payload["transport"]) - dataname = String(payload["dataname"]) - - if transport == "direct" - log_trace(env_json_obj["correlation_id"], "Direct transport - decoding payload '$dataname'") - - # Extract base64 payload from the payload - payload_b64 = String(payload["data"]) - - # Decode Base64 payload - payload_bytes = Base64.base64decode(payload_b64) - - # Deserialize based on type - data_type = String(payload["payload_type"]) - data = _deserialize_data(payload_bytes, data_type, env_json_obj["correlation_id"]) - - push!(payloads_list, (dataname, data, data_type)) - elseif transport == "link" - # Extract download URL from the payload - url = String(payload["data"]) - log_trace(env_json_obj["correlation_id"], "Link transport - fetching '$dataname' from URL: $url") - - # Fetch with exponential backoff using the download handler - downloaded_data = fileserver_download_handler(url, max_retries, base_delay, max_delay, env_json_obj["correlation_id"]) - - # Deserialize based on type - data_type = String(payload["payload_type"]) - data = _deserialize_data(downloaded_data, data_type, env_json_obj["correlation_id"]) - - push!(payloads_list, (dataname, data, data_type)) - else - error("Unknown transport type for payload '$dataname': $(transport)") - end - end - env_json_obj["payloads"] = payloads_list - return env_json_obj -end -``` - -#### _serialize_data Implementation - -```julia -function _serialize_data(data::Any, payload_type::String) - if payload_type == "text" - if isa(data, String) - data_bytes = Vector{UInt8}(data) - return data_bytes - else - error("Text data must be a String") - end - elseif payload_type == "dictionary" - json_str = JSON.json(data) - json_str_bytes = Vector{UInt8}(json_str) - return json_str_bytes - elseif payload_type == "arrowtable" - # Serialize DataFrame to Arrow IPC format - io = IOBuffer() - Arrow.write(io, data) - return take!(io) - elseif payload_type == "jsontable" - # Convert column-oriented to row-oriented JSON - # data is Vector{NamedTuple} or Vector{Dict} - json_str = JSON.json(data) - return Vector{UInt8}(json_str) - elseif payload_type == "image" - if isa(data, Vector{UInt8}) - return data - else - error("Image data must be Vector{UInt8}") - end - elseif payload_type == "audio" - if isa(data, Vector{UInt8}) - return data - else - error("Audio data must be Vector{UInt8}") - end - elseif payload_type == "video" - if isa(data, Vector{UInt8}) - return data - else - error("Video data must be Vector{UInt8}") - end - elseif payload_type == "binary" - if isa(data, IOBuffer) - return take!(data) - elseif isa(data, Vector{UInt8}) - return data - else - error("Binary data must be binary (Vector{UInt8} or IOBuffer)") - end - else - error("Unknown payload_type: $payload_type") - end -end -``` - -#### _deserialize_data Implementation - -```julia -function _deserialize_data( - data::Vector{UInt8}, - payload_type::String, - correlation_id::String -) - if payload_type == "text" - return String(data) - elseif payload_type == "dictionary" - json_str = String(data) - return JSON.parse(json_str) - elseif payload_type == "arrowtable" - # Deserialize from Arrow IPC format - io = IOBuffer(data) - arrow_table = Arrow.Table(io) - return arrow_table - elseif payload_type == "jsontable" - # Deserialize from JSON format - # Returns Vector{NamedTuple} (column-oriented compatible) - json_str = String(data) - parsed = JSON.parse(json_str) - return parsed - elseif payload_type == "image" - return data - elseif payload_type == "audio" - return data - elseif payload_type == "video" - return data - elseif payload_type == "binary" - return data - else - error("Unknown payload_type: $payload_type") - end -end -``` - -#### _fetch_with_backoff Implementation - -```julia -function _fetch_with_backoff( - url::String, - max_retries::Int, - base_delay::Int, - max_delay::Int, - correlation_id::String -) - delay = base_delay - for attempt in 1:max_retries - try - response = HTTP.request("GET", url) - if response.status == 200 - log_trace(correlation_id, "Successfully fetched data from $url on attempt $attempt") - return response.body - else - error("Failed to fetch: $(response.status)") - end - catch e - log_trace(correlation_id, "Attempt $attempt failed: $(typeof(e))") - - if attempt < max_retries - sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - end - end - end - - error("Failed to fetch data after $max_retries attempts") -end -``` - -#### plik_oneshot_upload Implementation - -```julia -function plik_oneshot_upload(file_server_url::String, dataname::String, data::Vector{UInt8}) - # Get upload id - url_getUploadID = "$file_server_url/upload" - headers = ["Content-Type" => "application/json"] - body = """{ "OneShot" : true }""" - http_response = HTTP.request("POST", url_getUploadID, headers, body; body_is_form=false) - response_json = JSON.parse(http_response.body) - uploadid = response_json["id"] - uploadtoken = response_json["uploadToken"] - - # Upload file - file_multipart = HTTP.Multipart(dataname, IOBuffer(data), "application/octet-stream") - url_upload = "$file_server_url/file/$uploadid" - headers = ["X-UploadToken" => uploadtoken] - - form = HTTP.Form(Dict( - "file" => file_multipart - )) - - http_response = nothing - try - http_response = HTTP.post(url_upload, headers, form) - catch e - @error "Request failed" exception=e - end - response_json = JSON.parse(http_response.body) - fileid = response_json["id"] - - url = "$file_server_url/file/$uploadid/$fileid/$dataname" - - return Dict("status" => http_response.status, "uploadid" => uploadid, "fileid" => fileid, "url" => url) -end -``` - ---- - -### JavaScript Implementation - -#### Module Structure - -```javascript -// natsbridge.js -const nats = require('nats'); -const crypto = require('crypto'); -const fetch = require('node-fetch'); - -// UUID generation using built-in crypto module -const uuidv4 = () => crypto.randomUUID(); - -const DEFAULT_SIZE_THRESHOLD = 1_000_000; -const DEFAULT_BROKER_URL = 'nats://localhost:4222'; -const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; - -class NATSClient { - constructor(url) { - this.url = url; - this.connection = null; - } - - async connect() { - this.connection = await nats.connect({ servers: this.url }); - return this.connection; - } - - async publish(subject, message) { - if (!this.connection) { - await this.connect(); - } - await this.connection.publish(subject, message); - } - - async close() { - if (this.connection) { - this.connection.close(); - } - } -} - -async function smartsend(subject, data, options = {}) { - // Implementation -} - -async function smartreceive(msg, options = {}) { - // Implementation -} - -module.exports = { - NATSClient, - smartsend, - smartreceive, - plikOneshotUpload, - fetchWithBackoff -}; -``` - -#### smartsend Implementation - -```javascript -const nats = require('nats'); -const crypto = require('crypto'); -const fetch = require('node-fetch'); -const arrow = require('apache-arrow'); - -// UUID generation using built-in crypto module -const uuidv4 = () => crypto.randomUUID(); - -const DEFAULT_SIZE_THRESHOLD = 1_000_000; -const DEFAULT_BROKER_URL = 'nats://localhost:4222'; -const DEFAULT_FILESERVER_URL = 'http://localhost:8080'; - -async function smartsend(subject, data, options = {}) { - const { - broker_url = DEFAULT_BROKER_URL, - fileserver_url = DEFAULT_FILESERVER_URL, - fileserver_upload_handler = plikOneshotUpload, - size_threshold = DEFAULT_SIZE_THRESHOLD, - correlation_id = uuidv4(), - msg_purpose = 'chat', - sender_name = 'NATSBridge', - receiver_name = '', - receiver_id = '', - reply_to = '', - reply_to_msg_id = '', - is_publish = true, - nats_connection = null, - msg_id = uuidv4(), - sender_id = uuidv4() - } = options; - - console.log(`[Correlation: ${correlation_id}] Starting smartsend for subject: ${subject}`); - - // Process payloads - const payloads = []; - for (const [dataname, payloadData, payloadType] of data) { - const payloadBytes = await serializeData(payloadData, payloadType); - const payloadSize = payloadBytes.byteLength; - - console.log(`[Correlation: ${correlation_id}] Serialized payload '${dataname}' (type: ${payloadType}) size: ${payloadSize} bytes`); - - if (payloadSize < size_threshold) { - // Direct path - const payloadB64 = bufferToBase64(payloadBytes); - console.log(`[Correlation: ${correlation_id}] Using direct transport for ${payloadSize} bytes`); - - payloads.push({ - id: uuidv4(), - dataname, - payload_type: payloadType, - transport: 'direct', - encoding: 'base64', - size: payloadSize, - data: payloadB64, - metadata: { payload_bytes: payloadSize } - }); - } else { - // Link path - console.log(`[Correlation: ${correlation_id}] Using link transport, uploading to fileserver`); - - const response = await fileserver_upload_handler(fileserver_url, dataname, payloadBytes); - - if (response.status !== 200) { - throw new Error(`Failed to upload data to fileserver: ${response.status}`); - } - - console.log(`[Correlation: ${correlation_id}] Uploaded to URL: ${response.url}`); - - payloads.push({ - id: uuidv4(), - dataname, - payload_type: payloadType, - transport: 'link', - encoding: 'none', - size: payloadSize, - data: response.url, - metadata: {} - }); - } - } - - // Build envelope - const env = { - correlation_id, - msg_id, - timestamp: new Date().toISOString(), - send_to: subject, - msg_purpose, - sender_name, - sender_id, - receiver_name, - receiver_id, - reply_to, - reply_to_msg_id, - broker_url, - metadata: {}, - payloads - }; - - const env_json_str = JSON.stringify(env); - - if (is_publish) { - if (nats_connection) { - await publishMessage(nats_connection, subject, env_json_str, correlation_id); - } else { - await publishMessage(broker_url, subject, env_json_str, correlation_id); - } - } - - return [env, env_json_str]; -} -``` - -#### serializeData Implementation - -```javascript -const arrow = require('apache-arrow'); - -async function serializeData(data, payload_type) { - if (payload_type === 'text') { - if (typeof data === 'string') { - return Buffer.from(data, 'utf8'); - } else { - throw new Error('Text data must be a string'); - } - } else if (payload_type === 'dictionary') { - const jsonStr = JSON.stringify(data); - return Buffer.from(jsonStr, 'utf8'); - } else if (payload_type === 'arrowtable') { - // Convert Array to Arrow IPC - // data is row-oriented: [{id: 1, name: "Alice"}, ...] - if (!Array.isArray(data) || data.length === 0) { - throw new Error('arrowtable data must be a non-empty array of objects'); - } - - // Create schema from first row - const schemaFields = Object.keys(data[0]).map(key => - new arrow.Field(key, arrow.any()) - ); - const schema = new arrow.Schema(schemaFields); - - // Create writer - const writer = new arrow.RecordBatchWriter([schema]); - - // Write rows - for (const row of data) { - const recordBatch = arrow.recordBatch.fromObjects([row], schema); - writer.write(recordBatch); - } - await writer.close(); - - // Read buffer - return writer.toBuffer(); - } else if (payload_type === 'jsontable') { - // data is already row-oriented Array - // Serialize directly to JSON - const jsonStr = JSON.stringify(data); - return Buffer.from(jsonStr, 'utf8'); - } else if (payload_type === 'image') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Image data must be Uint8Array or Buffer'); - } - } else if (payload_type === 'audio') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Audio data must be Uint8Array or Buffer'); - } - } else if (payload_type === 'video') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Video data must be Uint8Array or Buffer'); - } - } else if (payload_type === 'binary') { - if (data instanceof Uint8Array || Buffer.isBuffer(data)) { - return Buffer.from(data); - } else { - throw new Error('Binary data must be Uint8Array or Buffer'); - } - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} - -function bufferToBase64(buffer) { - return buffer.toString('base64'); -} -``` - -#### deserializeData Implementation - -```javascript -const arrow = require('apache-arrow'); - -async function deserializeData(data, payload_type, correlation_id) { - if (payload_type === 'text') { - return Buffer.from(data).toString('utf8'); - } else if (payload_type === 'dictionary') { - const jsonStr = Buffer.from(data).toString('utf8'); - return JSON.parse(jsonStr); - } else if (payload_type === 'arrowtable') { - // Deserialize from Arrow IPC - const buffer = Buffer.from(data); - const table = arrow.tableFromRawBytes(buffer); - return table; - } else if (payload_type === 'jsontable') { - // Deserialize from JSON - returns Array (row-oriented) - const jsonStr = Buffer.from(data).toString('utf8'); - return JSON.parse(jsonStr); - } else if (payload_type === 'image') { - return Buffer.from(data); - } else if (payload_type === 'audio') { - return Buffer.from(data); - } else if (payload_type === 'video') { - return Buffer.from(data); - } else if (payload_type === 'binary') { - return Buffer.from(data); - } else { - throw new Error(`Unknown payload_type: ${payload_type}`); - } -} -``` - -#### fetchWithBackoff Implementation - -```javascript -async function fetchWithBackoff(url, max_retries, base_delay, max_delay, correlation_id) { - let delay = base_delay; - - for (let attempt = 1; attempt <= max_retries; attempt++) { - try { - const response = await fetch(url); - - if (response.status === 200) { - console.log(`[Correlation: ${correlation_id}] Successfully fetched data from ${url} on attempt ${attempt}`); - return await response.arrayBuffer(); - } else { - throw new Error(`Failed to fetch: ${response.status}`); - } - } catch (e) { - console.log(`[Correlation: ${correlation_id}] Attempt ${attempt} failed: ${e.constructor.name}`); - - if (attempt < max_retries) { - await new Promise(resolve => setTimeout(resolve, delay)); - delay = Math.min(delay * 2, max_delay); - } - } - } - - throw new Error(`Failed to fetch data after ${max_retries} attempts`); -} -``` - -#### plikOneshotUpload Implementation - -```javascript -async function plikOneshotUpload(file_server_url, dataname, data) { - // Get upload id - const url_getUploadID = `${file_server_url}/upload`; - const headers = { 'Content-Type': 'application/json' }; - const body = JSON.stringify({ OneShot: true }); - - const http_response = await fetch(url_getUploadID, { - method: 'POST', - headers, - body - }); - - const response_json = await http_response.json(); - const uploadid = response_json.id; - const uploadtoken = response_json.uploadToken; - - // Upload file - const url_upload = `${file_server_url}/file/${uploadid}`; - const form = new FormData(); - const blob = new Blob([data]); - form.append('file', blob, dataname); - - const upload_headers = { - 'X-UploadToken': uploadtoken - }; - - const upload_response = await fetch(url_upload, { - method: 'POST', - headers: upload_headers, - body: form - }); - - const upload_json = await upload_response.json(); - const fileid = upload_json.id; - - const url = `${file_server_url}/file/${uploadid}/${fileid}/${dataname}`; - - return { - status: upload_response.status, - uploadid, - fileid, - url - }; -} -``` - ---- - -### Python Implementation - -#### Module Structure - -```python -# natsbridge.py -import asyncio -import base64 -import json -import uuid -import time -from typing import Any, Dict, List, Tuple, Union, Callable -from dataclasses import dataclass, field -from datetime import datetime - -try: - import pyarrow as arrow - import pyarrow.parquet as pq - ARROW_AVAILABLE = True -except ImportError: - ARROW_AVAILABLE = False - -try: - import aiohttp - import nats - from nats.aio.client import Client as NATSClient - NATS_AVAILABLE = True -except ImportError: - NATS_AVAILABLE = False - - -DEFAULT_SIZE_THRESHOLD = 1_000_000 -DEFAULT_BROKER_URL = "nats://localhost:4222" -DEFAULT_FILESERVER_URL = "http://localhost:8080" - - -@dataclass -class MsgPayloadV1: - """Message payload structure.""" - id: str - dataname: str - payload_type: str - transport: str - encoding: str - size: int - data: Union[str, bytes] - metadata: Dict[str, Any] = field(default_factory=dict) - - -@dataclass -class MsgEnvelopeV1: - """Message envelope structure.""" - correlation_id: str - msg_id: str - timestamp: str - send_to: str - msg_purpose: str - sender_name: str - sender_id: str - receiver_name: str - receiver_id: str - reply_to: str - reply_to_msg_id: str - broker_url: str - metadata: Dict[str, Any] = field(default_factory=dict) - payloads: List[MsgPayloadV1] = field(default_factory=list) - - -class NATSBridge: - """Cross-platform NATS bridge implementation.""" - - def __init__(self, broker_url: str = None, fileserver_url: str = None): - self.broker_url = broker_url or DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL - self._nats_client: NATSClient = None - - async def smartsend(self, subject: str, data: List[Tuple[str, Any, str]], **kwargs) -> Tuple[Dict, str]: - """Send data via NATS.""" - pass - - async def smartreceive(self, msg: Any, **kwargs) -> Dict: - """Receive and process NATS message.""" - pass -``` - -#### smartsend Implementation - -```python -import asyncio -import base64 -import json -import uuid -from typing import Any, Dict, List, Tuple, Union, Callable -from datetime import datetime - -DEFAULT_SIZE_THRESHOLD = 1_000_000 -DEFAULT_BROKER_URL = "nats://localhost:4222" -DEFAULT_FILESERVER_URL = "http://localhost:8080" - - -async def smartsend( - subject: str, - data: List[Tuple[str, Any, str]], - broker_url: str = DEFAULT_BROKER_URL, - fileserver_url: str = DEFAULT_FILESERVER_URL, - fileserver_upload_handler: Callable = plik_oneshot_upload, - size_threshold: int = DEFAULT_SIZE_THRESHOLD, - correlation_id: str = None, - msg_purpose: str = "chat", - sender_name: str = "NATSBridge", - receiver_name: str = "", - receiver_id: str = "", - reply_to: str = "", - reply_to_msg_id: str = "", - is_publish: bool = True, - nats_connection: Any = None, - msg_id: str = None, - sender_id: str = None -) -> Tuple[Dict, str]: - """ - Send data via NATS with automatic transport selection. - - Args: - subject: NATS subject to publish to - data: List of (dataname, data, type) tuples - **kwargs: Additional options - - Returns: - Tuple of (env, env_json_str) - """ - if correlation_id is None: - correlation_id = str(uuid.uuid4()) - if msg_id is None: - msg_id = str(uuid.uuid4()) - if sender_id is None: - sender_id = str(uuid.uuid4()) - - print(f"[Correlation: {correlation_id}] Starting smartsend for subject: {subject}") - - # Process payloads - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = _serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - print(f"[Correlation: {correlation_id}] Serialized payload '{dataname}' (type: {payload_type}) size: {payload_size} bytes") - - if payload_size < size_threshold: - # Direct path - payload_b64 = base64.b64encode(payload_bytes).decode('utf-8') - print(f"[Correlation: {correlation_id}] Using direct transport for {payload_size} bytes") - - payloads.append({ - 'id': str(uuid.uuid4()), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64, - 'metadata': {'payload_bytes': payload_size} - }) - else: - # Link path - print(f"[Correlation: {correlation_id}] Using link transport, uploading to fileserver") - - response = await fileserver_upload_handler(fileserver_url, dataname, payload_bytes) - - if response['status'] != 200: - raise Exception(f"Failed to upload data to fileserver: {response['status']}") - - print(f"[Correlation: {correlation_id}] Uploaded to URL: {response['url']}") - - payloads.append({ - 'id': str(uuid.uuid4()), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response['url'], - 'metadata': {} - }) - - # Build envelope - env = { - 'correlation_id': correlation_id, - 'msg_id': msg_id, - 'timestamp': datetime.utcnow().isoformat() + 'Z', - 'send_to': subject, - 'msg_purpose': msg_purpose, - 'sender_name': sender_name, - 'sender_id': sender_id, - 'receiver_name': receiver_name, - 'receiver_id': receiver_id, - 'reply_to': reply_to, - 'reply_to_msg_id': reply_to_msg_id, - 'broker_url': broker_url, - 'metadata': {}, - 'payloads': payloads - } - - env_json_str = json.dumps(env) - - if is_publish: - if nats_connection: - await publish_message(nats_connection, subject, env_json_str, correlation_id) - else: - await publish_message(broker_url, subject, env_json_str, correlation_id) - - return env, env_json_str -``` - -#### serializeData Implementation - -```python -import base64 -import json -from typing import Any - -try: - import pyarrow as arrow - import pyarrow.feather as feather - import pyarrow.ipc as ipc - ARROW_AVAILABLE = True -except ImportError: - ARROW_AVAILABLE = False - - -def _serialize_data(data: Any, payload_type: str) -> bytes: - """Serialize data to bytes based on type.""" - if payload_type == 'text': - if isinstance(data, str): - return data.encode('utf-8') - else: - raise Error('Text data must be a string') - elif payload_type == 'dictionary': - json_str = json.dumps(data) - return json_str.encode('utf-8') - elif payload_type == 'arrowtable': - if not ARROW_AVAILABLE: - raise Error('pyarrow not available for table serialization') - - import io - buf = io.BytesIO() - import pandas as pd - if isinstance(data, pd.DataFrame): - # Column-oriented DataFrame to Arrow - table = arrow.Table.from_pandas(data) - sink = arrow.ipc.new_file(buf) - arrow.ipc.write_table(table, sink) - sink.close() - return buf.getvalue() - else: - raise Error('arrowtable data must be a pandas DataFrame') - elif payload_type == 'jsontable': - # data is list[dict] or list (row-oriented) - # Serialize directly to JSON - json_str = json.dumps(data) - return json_str.encode('utf-8') - elif payload_type == 'image': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Image data must be bytes') - elif payload_type == 'audio': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Audio data must be bytes') - elif payload_type == 'video': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Video data must be bytes') - elif payload_type == 'binary': - if isinstance(data, (bytes, bytearray)): - return bytes(data) - else: - raise Error('Binary data must be bytes') - else: - raise Error(f'Unknown payload_type: {payload_type}') -``` - -#### deserializeData Implementation - -```python -import base64 -import json -from typing import Any - -try: - import pyarrow as arrow - import pyarrow.feather as feather - import pyarrow.ipc as ipc - ARROW_AVAILABLE = True -except ImportError: - ARROW_AVAILABLE = False - - -def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> Any: - """Deserialize bytes to data based on type.""" - if payload_type == 'text': - return data.decode('utf-8') - elif payload_type == 'dictionary': - json_str = data.decode('utf-8') - return json.loads(json_str) - elif payload_type == 'arrowtable': - if not ARROW_AVAILABLE: - raise Error('pyarrow not available for table deserialization') - - import io - buf = io.BytesIO(data) - reader = arrow.ipc.open_file(buf) - return reader.read_all().to_pandas() - elif payload_type == 'jsontable': - # Deserialize from JSON - returns list[dict] (row-oriented) - json_str = data.decode('utf-8') - return json.loads(json_str) - elif payload_type == 'image': - return data - elif payload_type == 'audio': - return data - elif payload_type == 'video': - return data - elif payload_type == 'binary': - return data - else: - raise Error(f'Unknown payload_type: {payload_type}') -``` - -#### fetchWithBackoff Implementation - -```python -import asyncio -import aiohttp -from typing import Callable - - -async def fetch_with_backoff( - url: str, - max_retries: int, - base_delay: int, - max_delay: int, - correlation_id: str -) -> bytes: - """Fetch URL with exponential backoff.""" - delay = base_delay - - for attempt in range(1, max_retries + 1): - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - print(f"[Correlation: {correlation_id}] Successfully fetched data from {url} on attempt {attempt}") - return await response.read() - else: - raise Exception(f"Failed to fetch: {response.status}") - except Exception as e: - print(f"[Correlation: {correlation_id}] Attempt {attempt} failed: {type(e).__name__}") - - if attempt < max_retries: - await asyncio.sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - - raise Exception(f"Failed to fetch data after {max_retries} attempts") -``` - -#### plikOneshotUpload Implementation - -```python -import aiohttp -import json -from typing import Dict, Any - - -async def plik_oneshot_upload( - file_server_url: str, - dataname: str, - data: bytes -) -> Dict[str, Any]: - """Upload data to plik server in one-shot mode.""" - - # Get upload id - async with aiohttp.ClientSession() as session: - url_getUploadID = f"{file_server_url}/upload" - headers = {'Content-Type': 'application/json'} - body = json.dumps({"OneShot": True}) - - async with session.post(url_getUploadID, headers=headers, data=body) as response: - response_json = await response.json() - uploadid = response_json['id'] - uploadtoken = response_json['uploadToken'] - - # Upload file - url_upload = f"{file_server_url}/file/{uploadid}" - headers = {'X-UploadToken': uploadtoken} - - form = aiohttp.FormData() - form.add_field('file', data, filename=dataname, content_type='application/octet-stream') - - async with session.post(url_upload, headers=headers, data=form) as upload_response: - upload_json = await upload_response.json() - fileid = upload_json['id'] - - url = f"{file_server_url}/file/{uploadid}/{fileid}/{dataname}" - - return { - 'status': upload_response.status, - 'uploadid': uploadid, - 'fileid': fileid, - 'url': url - } -``` - ---- - -## MicroPython Implementation - -### Limitations - -MicroPython has significant constraints compared to desktop implementations: - -| Feature | Desktop | MicroPython | -|---------|---------|-------------| -| Memory | Unlimited | ~256KB - 1MB | -| Arrow IPC | ✅ | ❌ (not supported) | -| Async/Await | ✅ | ⚠️ (uasyncio only) | -| Large payloads (>1MB) | ✅ | ❌ (enforced limit) | -| arrowtable | ✅ | ❌ | -| jsontable | ⚠️ (limited) | ⚠️ (limited) | -| Multiple payloads | ✅ | ⚠️ (limited) | - -### MicroPython Module Structure - -```python -# natsbridge_mpy.py (MicroPython) -import network -import time -import json -import base64 -import uos -import struct - -# Constants -DEFAULT_SIZE_THRESHOLD = 100000 # 100KB for MicroPython -DEFAULT_BROKER_URL = "nats://localhost:4222" -DEFAULT_FILESERVER_URL = "http://localhost:8080" -MAX_PAYLOAD_SIZE = 50000 # Hard limit - -# Note: MicroPython uses list[list] for jsontable (row-oriented) -# No DataFrame support - data is always row-oriented - - -class NATSBridge: - """MicroPython NATS bridge implementation.""" - - def __init__(self, broker_url=None, fileserver_url=None): - self.broker_url = broker_url or DEFAULT_BROKER_URL - self.fileserver_url = fileserver_url or DEFAULT_FILESERVER_URL - self._nats_conn = None - - def smartsend(self, subject, data, **kwargs): - """Send data (synchronous).""" - correlation_id = self._generate_uuid() - msg_id = self._generate_uuid() - sender_id = self._generate_uuid() - - print(f"[Correlation: {correlation_id}] Starting smartsend") - - payloads = [] - for dataname, payload_data, payload_type in data: - payload_bytes = self._serialize_data(payload_data, payload_type) - payload_size = len(payload_bytes) - - if payload_size > MAX_PAYLOAD_SIZE: - raise MemoryError(f"Payload {dataname} exceeds max size {MAX_PAYLOAD_SIZE}") - - if payload_size < DEFAULT_SIZE_THRESHOLD: - # Direct path - payload_b64 = base64.b64encode(payload_bytes).decode('ascii') - payloads.append({ - 'id': self._generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'direct', - 'encoding': 'base64', - 'size': payload_size, - 'data': payload_b64 - }) - else: - # Link path (limited support) - response = self._sync_fileserver_upload(self.fileserver_url, dataname, payload_bytes) - payloads.append({ - 'id': self._generate_uuid(), - 'dataname': dataname, - 'payload_type': payload_type, - 'transport': 'link', - 'encoding': 'none', - 'size': payload_size, - 'data': response['url'] - }) - - env = { - 'correlation_id': correlation_id, - 'msg_id': msg_id, - 'timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime()), - 'send_to': subject, - 'msg_purpose': kwargs.get('msg_purpose', 'chat'), - 'sender_name': kwargs.get('sender_name', 'NATSBridge'), - 'sender_id': sender_id, - 'receiver_name': kwargs.get('receiver_name', ''), - 'receiver_id': kwargs.get('receiver_id', ''), - 'reply_to': kwargs.get('reply_to', ''), - 'reply_to_msg_id': kwargs.get('reply_to_msg_id', ''), - 'broker_url': self.broker_url, - 'metadata': {}, - 'payloads': payloads - } - - env_json_str = json.dumps(env) - - # Publish - self._publish(subject, env_json_str, correlation_id) - - return env, env_json_str - - def smartreceive(self, msg, **kwargs): - """Receive and process message (synchronous).""" - env_json_obj = json.loads(msg.payload) - correlation_id = env_json_obj['correlation_id'] - - payloads_list = [] - for payload in env_json_obj['payloads']: - transport = payload['transport'] - dataname = payload['dataname'] - - if transport == 'direct': - payload_b64 = payload['data'] - payload_bytes = base64.b64decode(payload_b64) - data_type = payload['payload_type'] - data = self._deserialize_data(payload_bytes, data_type) - payloads_list.append((dataname, data, data_type)) - elif transport == 'link': - url = payload['data'] - downloaded_data = self._sync_fileserver_download( - url, - kwargs.get('max_retries', 3), - kwargs.get('base_delay', 100), - kwargs.get('max_delay', 1000), - correlation_id - ) - data_type = payload['payload_type'] - data = self._deserialize_data(downloaded_data, data_type) - payloads_list.append((dataname, data, data_type)) - - env_json_obj['payloads'] = payloads_list - return env_json_obj - - def _serialize_data(self, data, payload_type): - """Serialize data (MicroPython version - no arrowtable support).""" - if payload_type == 'text': - return data.encode('utf-8') - elif payload_type == 'dictionary': - return json.dumps(data).encode('utf-8') - elif payload_type == 'jsontable': - # data is list[list] (row-oriented) - return json.dumps(data).encode('utf-8') - elif payload_type in ('image', 'audio', 'video', 'binary'): - return bytes(data) - else: - raise ValueError(f"Unknown payload_type: {payload_type}") - - def _deserialize_data(self, data, payload_type): - """Deserialize data (MicroPython version).""" - if payload_type == 'text': - return data.decode('utf-8') - elif payload_type == 'dictionary': - return json.loads(data.decode('utf-8')) - elif payload_type == 'jsontable': - # Returns list[list] (row-oriented) - return json.loads(data.decode('utf-8')) - elif payload_type in ('image', 'audio', 'video', 'binary'): - return data - else: - raise ValueError(f"Unknown payload_type: {payload_type}") - - def _generate_uuid(self): - """Generate simple UUID (MicroPython compatible).""" - return 'mp-%04x%04x-%04x-%04x-%04x-%04x%04x%04x' % ( - time.time_ns() // (10**6) % 0xFFFFFFFF, - time.time_ns() % 0xFFFFFFFF, - time.time_ns() >> 32 & 0xFFFF, - time.time_ns() >> 48 & 0xFFFF, - time.time_ns() >> 64 & 0xFFFF, - time.time_ns() >> 80 & 0xFFFF, - time.time_ns() >> 96 & 0xFFFF, - time.time_ns() >> 112 & 0xFFFF - ) - - def _sync_fileserver_upload(self, url, dataname, data): - """Synchronous file upload (limited).""" - # Simplified implementation for MicroPython - # In practice, would use network.HTTP or similar - raise NotImplementedError("File upload not implemented in MicroPython") - - def _sync_fileserver_download(self, url, max_retries, base_delay, max_delay, correlation_id): - """Synchronous file download with backoff.""" - # Simplified implementation for MicroPython - raise NotImplementedError("File download not implemented in MicroPython") - - def _publish(self, subject, message, correlation_id): - """Publish message to NATS.""" - # Simplified implementation for MicroPython - raise NotImplementedError("NATS publishing not implemented in MicroPython") -``` - ---- - -## Configuration - -### Environment Variables - -| Variable | Default | Description | -|----------|---------|-------------| -| `NATS_URL` | `nats://localhost:4222` | NATS server URL | -| `FILESERVER_URL` | `http://localhost:8080` | HTTP file server URL | -| `SIZE_THRESHOLD` | `1000000` | Size threshold in bytes (1MB) | - -### MicroPython Configuration - -```python -# micropython.conf -NATS_URL = "nats://broker.local:4222" -FILESERVER_URL = "http://fileserver.local:8080" -SIZE_THRESHOLD = 100000 # Lower threshold for memory-constrained devices -MAX_PAYLOAD_SIZE = 50000 # Hard limit for MicroPython -``` - ---- - -## Performance Considerations - -### Zero-Copy Reading - -| Platform | Strategy | -|----------|----------| -| **Julia** | `Arrow.read()` with memory-mapped files | -| **JavaScript** | `ArrayBuffer` with `DataView` | -| **Python** | `pyarrow` memory mapping | -| **MicroPython** | Not available (streaming only) | - -### Exponential Backoff - -All platforms implement exponential backoff for HTTP downloads: - -```python -# Python -async def fetch_with_backoff(url, max_retries, base_delay, max_delay, correlation_id): - delay = base_delay - for attempt in range(1, max_retries + 1): - try: - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - return await response.read() - except Exception as e: - if attempt < max_retries: - await asyncio.sleep(delay / 1000.0) - delay = min(delay * 2, max_delay) - raise Exception("Failed to fetch after max retries") -``` - -### Correlation ID Logging - -All platforms use correlation IDs for distributed tracing: - -``` -[timestamp] [Correlation: abc123] Message published to subject -``` - -### Serialization Performance - -| Format | Use Case | Pros | Cons | -|--------|----------|------|------| -| `arrowtable` | Large tabular data | Fast, zero-copy, schema-preserving | Binary format, requires Arrow library, not supported in MicroPython | -| `jsontable` | Small/medium tabular data | Human-readable, universal support, works in MicroPython | Slower, larger size, no schema enforcement | - ---- - -## Testing - -### Test File Organization - -| Platform | Sender Tests | Receiver Tests | -|----------|--------------|----------------| -| **Julia** | `test/test_julia_*_sender.jl` | `test/test_julia_*_receiver.jl` | -| **JavaScript** | `test/test_js_*_sender.js` | `test/test_js_*_receiver.js` | -| **Python** | `test/test_py_*_sender.py` | `test/test_py_*_receiver.py` | - -### Run Tests - -```bash -# Julia -julia test/test_julia_text_sender.jl -julia test/test_julia_text_receiver.jl - -# JavaScript (Node.js) -node test/test_js_text_sender.js -node test/test_js_text_receiver.js - -# Python -python3 test/test_py_text_sender.py -python3 test/test_py_text_receiver.py -``` - ---- - -## Troubleshooting - -### Common Issues - -1. **NATS Connection Failed** - - Ensure NATS server is running - - Check `broker_url` configuration - -2. **HTTP Upload Failed** - - Ensure file server is running - - Check `fileserver_url` configuration - - Verify upload permissions - -3. **Arrow IPC Deserialization Error** - - Ensure data is properly serialized to Arrow format - - Check Arrow version compatibility - - MicroPython doesn't support Arrow IPC - -4. **Memory Constraints (MicroPython)** - - Reduce `size_threshold` - - Use direct transport only (< 100KB) - - Avoid large payloads - - Use `jsontable` instead of `arrowtable` (arrowtable not supported) - -5. **Row-Oriented vs Column-Oriented Conversion Issues** - - Julia/Python: DataFrames are column-oriented; when sending `jsontable`, they are converted to row-oriented JSON - - JavaScript/MicroPython: Data is natively row-oriented - - When receiving `jsontable` in Julia/Python, JSON is automatically converted back to column-oriented DataFrame - ---- - -## Summary - -This cross-platform NATS bridge provides: - -1. **High-Level API Parity**: Identical `smartsend()` and `smartreceive()` signatures across all platforms -2. **Idiomatic Implementations**: - - **Julia**: Multiple dispatch, struct-based design, native Arrow IPC - - **JavaScript**: Async/await, prototype-based utilities, class-based NATS client - - **Python**: Class-based design with dataclasses, type hints, async/await - - **MicroPython**: Synchronous API, memory-constrained optimizations -3. **Message Format Consistency**: Identical JSON schemas across all platforms -4. **Handler Abstraction**: File server operations abstracted through configurable handlers -5. **Platform-Specific Optimizations**: - - **Arrow IPC** (`arrowtable`): Efficient binary format for large tabular data (not supported in MicroPython) - - **JSON** (`jsontable`): Universal human-readable format for smaller tables (works in all platforms) -6. **Row-Oriented ↔ Column-Oriented Conversion**: Automatic conversion between row-oriented (JS, MicroPython) and column-oriented (Julia DataFrame, Python pandas) formats when using `jsontable` - -The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. - -### Datatype Summary - -| Datatype | Serialization | Use Case | Encoding | Supported Platforms | -|----------|---------------|----------|----------|---------------------| -| `arrowtable` | Apache Arrow IPC | Large tabular data, schema-preserving | `arrow-ipc` → `base64` | Julia, JavaScript, Python | -| `jsontable` | JSON | Small/medium tabular data, human-readable | `json` → `base64` | Julia, JavaScript, Python, MicroPython | diff --git a/src/NATSBridge.jl b/src/NATSBridge.jl index e9912e6..d8a9050 100644 --- a/src/NATSBridge.jl +++ b/src/NATSBridge.jl @@ -31,7 +31,15 @@ # [(dataname1, data1, type1), (dataname2, data2, type2), ...] # ``` # -# Supported types: "text", "dictionary", "table", "image", "audio", "video", "binary" +# Supported types: "text", "dictionary", "arrowtable", "jsontable", "image", "audio", "video", "binary" +# +# Table Datatypes: +# - `arrowtable`: Apache Arrow IPC format for efficient binary serialization +# - Input: DataFrame, Arrow.Table +# - Encoding: arrow-ipc +# - `jsontable`: JSON format for human-readable tabular data +# - Input: Vector{NamedTuple}, Vector{Dict} (column-oriented compatible) +# - Encoding: json module NATSBridge @@ -51,7 +59,7 @@ It supports both direct transport (base64-encoded data) and link transport (URL- # Arguments: - `id::String` - Unique identifier for this payload (e.g., "uuid4") - `dataname::String` - Name of the payload (e.g., "login_image") - - `payload_type::String` - Payload type: "text", "dictionary", "table", "image", "audio", "video", "binary" + - `payload_type::String` - Payload type: "text", "dictionary", "arrowtable", "jsontable", "image", "audio", "video", "binary" - `transport::String` - Transport method: "direct" or "link" - `encoding::String` - Encoding method: "none", "json", "base64", "arrow-ipc" - `size::Integer` - Size of the payload in bytes (e.g., 15433) @@ -100,7 +108,7 @@ payload = msg_payload_v1( struct msg_payload_v1 id::String # id of this payload e.g. "uuid4" dataname::String # name of this payload e.g. "login_image" - payload_type::String # this payload type. Can be "text", "dictionary", "table", "image", "audio", "video", "binary" + payload_type::String # this payload type. Can be "text", "dictionary", "arrowtable", "jsontable", "image", "audio", "video", "binary" transport::String # transport method: "direct" or "link" encoding::String # encoding method: "none", "json", "base64", "arrow-ipc" size::Integer # data size in bytes e.g. 15433 @@ -363,7 +371,7 @@ Each payload can have a different type, enabling mixed-content messages (e.g., c - `data::AbstractArray{Tuple{String, Any, String}}` - List of (dataname, data, type) tuples to send - `dataname::String` - Name of the payload - `data::Any` - The actual data to send - - `payload_type::String` - Payload type: "text", "dictionary", "table", "image", "audio", "video", "binary" + - `payload_type::String` - Payload type: "text", "dictionary", "arrowtable", "jsontable", "image", "audio", "video", "binary" - No standalone `type` parameter - type is specified per payload # Keyword Arguments: @@ -399,11 +407,15 @@ env, msg_json = smartsend("my.subject", [("dataname1", data, "dictionary")]) # Send multiple payloads in one message with different types data1 = Dict("key1" => "value1") data2 = rand(10_000) # Small array -env, msg_json = smartsend("my.subject", [("dataname1", data1, "dictionary"), ("dataname2", data2, "table")]) +env, msg_json = smartsend("my.subject", [("dataname1", data1, "dictionary"), ("dataname2", data2, "arrowtable")]) # Send a large array using fileserver upload data = rand(10_000_000) # ~80 MB -env, msg_json = smartsend("large.data", [("large_table", data, "table")]) +env, msg_json = smartsend("large.data", [("large_arrow_table", data, "arrowtable")]) + +# Send jsontable (JSON format) +rows = [Dict("id" => 1, "name" => "Alice"), Dict("id" => 2, "name" => "Bob")] +env, msg_json = smartsend("json.data", [("users", rows, "jsontable")]) # Mixed content (e.g., chat with text and image) env, msg_json = smartsend("chat.subject", [ @@ -424,13 +436,12 @@ function smartsend( fileserver_upload_handler::Function = plik_oneshot_upload, # a function to handle uploading data to specific HTTP fileserver size_threshold::Int = DEFAULT_SIZE_THRESHOLD, - #= - Generate a globally unique identifier (UUID) at the start of the request. - This ID must remain constant and immutable as it propagates through every - stage of the execution pipeline. It serves as the end-to-end ID for - distributed tracing, enabling the correlation of all logs, metrics, and - errors across the system back to this specific request instance. - =# + # Generate a globally unique identifier (UUID) at the start of the request. + # This ID must remain constant and immutable as it propagates through every + # stage of the execution pipeline. It serves as the end-to-end ID for + # distributed tracing, enabling the correlation of all logs, metrics, and + # errors across the system back to this specific request instance. + correlation_id::String = string(uuid4()), msg_purpose::String = "chat", @@ -463,6 +474,14 @@ function smartsend( payload_b64 = Base64.base64encode(payload_bytes) # Encode bytes as base64 string log_trace(correlation_id, "Using direct transport for $payload_size bytes") # Log transport choice + # Determine encoding based on payload_type + encoding = "base64" + if payload_type == "jsontable" + encoding = "json" + elseif payload_type == "arrowtable" + encoding = "arrow-ipc" + end + # Create msg_payload_v1 for direct transport payload = msg_payload_v1( payload_b64, @@ -470,7 +489,7 @@ function smartsend( id = string(uuid4()), dataname = dataname, transport = "direct", - encoding = "base64", + encoding = encoding, size = payload_size, metadata = Dict{String, Any}("payload_bytes" => payload_size) ) @@ -481,7 +500,7 @@ function smartsend( # Upload to HTTP server response = fileserver_upload_handler(fileserver_url, dataname, payload_bytes) - + if response["status"] != 200 # Check if upload was successful error("Failed to upload data to fileserver: $(response["status"])") # Throw error if upload failed end @@ -489,6 +508,14 @@ function smartsend( url = response["url"] # URL for the uploaded data log_trace(correlation_id, "Uploaded to URL: $url") # Log successful upload + # Determine encoding based on payload_type + encoding = "none" + if payload_type == "jsontable" + encoding = "json" + elseif payload_type == "arrowtable" + encoding = "arrow-ipc" + end + # Create msg_payload_v1 for link transport payload = msg_payload_v1( url, @@ -496,7 +523,7 @@ function smartsend( id = string(uuid4()), dataname = dataname, transport = "link", - encoding = "none", + encoding = encoding, size = payload_size, metadata = Dict{String, Any}() ) @@ -543,12 +570,13 @@ It supports multiple serialization formats for different data types. 2. Converts data to binary representation according to format rules 3. For text: converts string to UTF-8 bytes 4. For dictionary: serializes as JSON then converts to bytes -5. For table: uses Arrow.jl to write as IPC stream -6. For image/audio/video/binary: returns binary data directly +5. For arrowtable: uses Arrow.jl to write as IPC stream +6. For jsontable: converts to JSON then to bytes +7. For image/audio/video/binary: returns binary data directly # Arguments: - - `data::Any` - Data to serialize (string for `"text"`, JSON-serializable for `"dictionary"`, table-like for `"table"`, binary for `"image"`, `"audio"`, `"video"`, `"binary"`) - - `payload_type::String` - Target format: "text", "dictionary", "table", "image", "audio", "video", "binary" + - `data::Any` - Data to serialize (string for `"text"`, JSON-serializable for `"dictionary"`, table-like for `"arrowtable"`, Vector{NamedTuple}/Vector{Dict} for `"jsontable"`, binary for `"image"`, `"audio"`, `"video"`, `"binary"`) + - `payload_type::String` - Target format: "text", "dictionary", "arrowtable", "jsontable", "image", "audio", "video", "binary" # Return: - `Vector{UInt8}` - Binary representation of the serialized data @@ -569,9 +597,13 @@ text_bytes = _serialize_data(text_data, "text") json_data = Dict("name" => "Alice", "age" => 30) json_bytes = _serialize_data(json_data, "dictionary") -# Table serialization with a DataFrame (recommended for tabular data) +# Arrow table serialization with a DataFrame (recommended for tabular data) df = DataFrame(id = 1:3, name = ["Alice", "Bob", "Charlie"], score = [95, 88, 92]) -table_bytes = _serialize_data(df, "table") +arrow_bytes = _serialize_data(df, "arrowtable") + +# JSON table serialization - Vector{NamedTuple} or Vector{Dict} +rows = [Dict("id" => 1, "name" => "Alice"), Dict("id" => 2, "name" => "Bob")] +json_bytes = _serialize_data(rows, "jsontable") # Image data (Vector{UInt8}) image_bytes = UInt8[1, 2, 3] # Image bytes @@ -622,10 +654,30 @@ function _serialize_data(data::Any, payload_type::String) json_str = JSON.json(data) # Convert Julia data to JSON string json_str_bytes = Vector{UInt8}(json_str) # Convert JSON string to bytes return json_str_bytes - elseif payload_type == "table" # Table data - convert to Arrow IPC stream + elseif payload_type == "arrowtable" # Arrow table data - convert to Arrow IPC stream io = IOBuffer() # Create in-memory buffer Arrow.write(io, data) # Write data as Arrow IPC stream to buffer return take!(io) # Return the buffer contents as bytes + elseif payload_type == "jsontable" # JSON table data - convert to JSON + # data can be Vector{NamedTuple}, Vector{Dict}, or DataFrame + # If DataFrame, convert to Vector{Dict} first + if isa(data, DataFrame) + # Convert DataFrame to Vector{Dict} (row-oriented) + rows = [] + for i in 1:nrow(data) + row_dict = Dict() + for col in names(data) + row_dict[String(col)] = data[i, col] + end + push!(rows, row_dict) + end + json_str = JSON.json(rows) + return Vector{UInt8}(json_str) + else + # Already Vector{NamedTuple} or Vector{Dict} + json_str = JSON.json(data) + return Vector{UInt8}(json_str) + end elseif payload_type == "image" # Image data - treat as binary if isa(data, Vector{UInt8}) return data # Return binary data directly @@ -881,24 +933,25 @@ end """ _deserialize_data - Deserialize bytes to data based on type This internal function converts serialized bytes back to Julia data based on type. -It handles "text" (string), "dictionary" (JSON deserialization), "table" (Arrow IPC deserialization), -"image" (binary data), "audio" (binary data), "video" (binary data), and "binary" (binary data). +It handles "text" (string), "dictionary" (JSON deserialization), "arrowtable" (Arrow IPC deserialization), +"jsontable" (JSON deserialization), "image" (binary data), "audio" (binary data), "video" (binary data), and "binary" (binary data). # Function Workflow: 1. Validates the data type against supported formats 2. Converts bytes to appropriate Julia data type based on format 3. For text: converts bytes to string 4. For dictionary: converts bytes to JSON string then parses to Julia object -5. For table: reads Arrow IPC format and returns DataFrame -6. For image/audio/video/binary: returns bytes directly +5. For arrowtable: reads Arrow IPC format and returns Arrow.Table +6. For jsontable: converts bytes to JSON string then parses to Vector{Dict} +7. For image/audio/video/binary: returns bytes directly # Arguments: - `data::Vector{UInt8}` - Serialized data as bytes - - `payload_type::String` - Data type ("text", "dictionary", "table", "image", "audio", "video", "binary") + - `payload_type::String` - Data type ("text", "dictionary", "arrowtable", "jsontable", "image", "audio", "video", "binary") - `correlation_id::String` - Correlation ID for logging # Return: - - Deserialized data (String for "text", DataFrame for "table", JSON data for "dictionary", bytes for "image", "audio", "video", "binary") + - Deserialized data (String for "text", Arrow.Table for "arrowtable", Vector{Dict} for "jsontable", JSON data for "dictionary", bytes for "image", "audio", "video", "binary") # Throws: - `Error` if `payload_type` is not one of the supported types @@ -913,9 +966,13 @@ text_data = _deserialize_data(text_bytes, "text", "correlation123") json_bytes = UInt8[123, 34, 110, 97, 109, 101, 34, 58, 34, 65, 108, 105, 99, 101, 125] # {"name":"Alice"} json_data = _deserialize_data(json_bytes, "dictionary", "correlation123") -# Arrow IPC data (table) +# Arrow IPC data (arrowtable) arrow_bytes = Vector{UInt8}([1, 2, 3]) # Arrow IPC bytes -table_data = _deserialize_data(arrow_bytes, "table", "correlation123") +arrow_table = _deserialize_data(arrow_bytes, "arrowtable", "correlation123") + +# JSON table data (jsontable) +json_table_bytes = UInt8[91, 123, 34, 105, 100, 34, 58, 49, 44, 34, 110, 97, 109, 101, 34, 58, 34, 65, 108, 105, 99, 101, 34, 125] # [{"id":1,"name":"Alice"}] +json_table = _deserialize_data(json_table_bytes, "jsontable", "correlation123") ``` """ function _deserialize_data( @@ -928,10 +985,13 @@ function _deserialize_data( elseif payload_type == "dictionary" # JSON data - deserialize json_str = String(data) # Convert bytes to string return JSON.parse(json_str) # Parse JSON string to JSON object - elseif payload_type == "table" # Table data - deserialize Arrow IPC stream + elseif payload_type == "arrowtable" # Arrow table data - deserialize Arrow IPC stream io = IOBuffer(data) # Create buffer from bytes - df = Arrow.Table(io) # Read Arrow IPC format from buffer - return df # Return DataFrame + table = Arrow.Table(io) # Read Arrow IPC format from buffer + return table # Return Arrow.Table + elseif payload_type == "jsontable" # JSON table data - deserialize JSON + json_str = String(data) # Convert bytes to string + return JSON.parse(json_str) # Parse JSON string to Vector{Dict} elseif payload_type == "image" # Image data - return binary return data # Return bytes directly elseif payload_type == "audio" # Audio data - return binary @@ -945,6 +1005,16 @@ function _deserialize_data( end end +function rows_to_columns_dict(rows::Vector{Dict{Symbol,Any}}) + # Ensure rows is not empty + isempty(rows) && return Dict{Symbol,Vector{Any}}() + + # Build column-oriented dictionary + return Dict( + key => [get(row, key, missing) for row in rows] + for key in keys(rows[1]) + ) +end """ plik_oneshot_upload - Upload a single file to a plik server using one-shot mode This function uploads a raw byte array to a plik server in one-shot mode (no upload session). @@ -970,19 +1040,19 @@ retrieves an upload ID and token, then uploads the file data as multipart form d - `"url"` - Full URL to download the uploaded file # Example - ```jldoctest - using HTTP, JSON + ```jldoctest + using HTTP, JSON - fileserver_url = "http://localhost:8080" - dataname = "test.txt" - data = Vector{UInt8}("hello world") + fileserver_url = "http://localhost:8080" + dataname = "test.txt" + data = Vector{UInt8}("hello world") - # Upload to local plik server - result = plik_oneshot_upload(file_server_url, dataname, data) + # Upload to local plik server + result = plik_oneshot_upload(file_server_url, dataname, data) - # Access the result as a Dict - # result["status"], result["uploadid"], result["fileid"], result["url"] - ``` + # Access the result as a Dict + # result["status"], result["uploadid"], result["fileid"], result["url"] + ``` """ function plik_oneshot_upload(file_server_url::String, dataname::String, data::Vector{UInt8}) @@ -1106,18 +1176,4 @@ end - - - - - - - - - - - - - - end # module -- 2.49.1 From 3970b8e0a8ed65cf9daa5f17e536a56c5e6f41a4 Mon Sep 17 00:00:00 2001 From: narawat Date: Sun, 8 Mar 2026 13:13:41 +0700 Subject: [PATCH 29/43] remove row to col function --- src/NATSBridge.jl | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/NATSBridge.jl b/src/NATSBridge.jl index d8a9050..a698e32 100644 --- a/src/NATSBridge.jl +++ b/src/NATSBridge.jl @@ -1005,16 +1005,6 @@ function _deserialize_data( end end -function rows_to_columns_dict(rows::Vector{Dict{Symbol,Any}}) - # Ensure rows is not empty - isempty(rows) && return Dict{Symbol,Vector{Any}}() - - # Build column-oriented dictionary - return Dict( - key => [get(row, key, missing) for row in rows] - for key in keys(rows[1]) - ) -end """ plik_oneshot_upload - Upload a single file to a plik server using one-shot mode This function uploads a raw byte array to a plik server in one-shot mode (no upload session). -- 2.49.1 From 6e2fccd04ef0989af597ce0fc7e9982c8b998a66 Mon Sep 17 00:00:00 2001 From: narawat Date: Sun, 8 Mar 2026 13:43:26 +0700 Subject: [PATCH 30/43] remove column oriented json --- docs/implementation.md | 183 +++-------------------------------------- src/NATSBridge.jl | 2 +- 2 files changed, 11 insertions(+), 174 deletions(-) diff --git a/docs/implementation.md b/docs/implementation.md index ed21567..b8d3ceb 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -335,160 +335,6 @@ env, env_json_str = NATSBridge.smartsend( --- -## Row-Oriented vs Column-Oriented Data Structures - -Different platforms use different internal representations for tabular data. Understanding these differences is crucial for proper serialization/deserialization when using `jsontable` and `arrowtable` datatypes. - -### Data Structure Comparison - -| Platform | Table Structure | Orientation | -|----------|-----------------|-------------| -| **Julia (DataFrame)** | `Dict{String, Vector}` | Column-oriented | -| **Python (pandas)** | `dict[str, list]` | Column-oriented | -| **JavaScript** | `Array` | Row-oriented | -| **MicroPython** | `list[list]` | Row-oriented | - -### Column-Oriented (Julia DataFrame, Python pandas) - -In column-oriented structures, each column is stored as a separate array/vector: - -**Julia Example:** -```julia -# Create dictionary with column vectors -dict = Dict("customer age" => [15, 20, 25], - "first name" => ["Rohit", "Rahul", "Akshat"]) - -# Convert to DataFrame -df = DataFrame(dict) -println(df) -# Output: -# 3×2 DataFrame -# Row ┆ customer age ┆ first name -# ┆ Int64 ┆ String -# ─────┼──────────────┼──────────── -# 1 ┆ 15 ┆ "Rohit" -# 2 ┆ 20 ┆ "Rahul" -# 3 ┆ 25 ┆ "Akshat" -``` - -**Python Example:** -```python -# Create dictionary with column lists -data = { - "Name": ["Alice", "Bob", "Charlie"], - "Age": [25, 30, 35], - "Score": [88.5, 92.0, 79.5] -} - -# Convert to DataFrame -df = pd.DataFrame(data) -print(df) -# Output: -# Name Age Score -# 0 Alice 25 88.5 -# 1 Bob 30 92.0 -# 2 Charlie 35 79.5 -``` - -### Row-Oriented (JavaScript, MicroPython) - -In row-oriented structures, each row is stored as a separate object/array: - -**JavaScript Example:** -```javascript -// Array of objects (row-oriented) -const users = [ - { Name: "Alice", Age: 25, Score: 88.5 }, - { Name: "Bob", Age: 30, Score: 92.0 }, - { Name: "Charlie", Age: 35, Score: 79.5 } -]; -``` - -**MicroPython Example:** -```python -# List of lists (row-oriented) -users = [ - ["Alice", 25, 88.5], - ["Bob", 30, 92.0], - ["Charlie", 35, 79.5] -] -``` - -### Cross-Platform Conversion for jsontable - -When sending `jsontable` across platforms, the system performs automatic conversion between row-oriented and column-oriented formats: - -**Sending from Julia/Python (column-oriented) to JS/MicroPython (row-oriented):** -1. Convert column-oriented dict to row-oriented array of objects -2. Serialize to JSON -3. Send with `payload_type = "jsontable"` - -**Receiving from JS/MicroPython (row-oriented) to Julia/Python (column-oriented):** -1. Deserialize JSON to row-oriented array of objects -2. Convert to column-oriented dict -3. Create DataFrame from column-oriented dict - -**Example: Julia to JavaScript** -```julia -# Julia side - column-oriented DataFrame -df = DataFrame( - "Name" => ["Alice", "Bob", "Charlie"], - "Age" => [25, 30, 35], - "Score" => [88.5, 92.0, 79.5] -) - -# smartsend automatically converts to row-oriented JSON -env, env_json_str = smartsend( - "/data", - [("users", df, "jsontable")] -) -# JSON sent: [{"Name":"Alice","Age":25,"Score":88.5}, ...] -``` - -```javascript -// JavaScript side - receives row-oriented array -const [env, env_json_str] = await NATSBridge.smartsend( - "/data", - [["users", users, "jsontable"]] -); -// users is already row-oriented: [{Name: "Alice", Age: 25, ...}, ...] -``` - -**Example: JavaScript to Julia** -```javascript -// JavaScript side - row-oriented array -const users = [ - { Name: "Alice", Age: 25, Score: 88.5 }, - { Name: "Bob", Age: 30, Score: 92.0 } -]; - -const [env, env_json_str] = await NATSBridge.smartsend( - "/data", - [["users", users, "jsontable"]] -); -``` - -```julia -# Julia side - receives and converts to column-oriented DataFrame -env = smartreceive(msg; fileserver_download_handler=_fetch_with_backoff) -# The jsontable is automatically converted to DataFrame -for (dataname, data, type) in env["payloads"] - if type == "jsontable" - # data is now a DataFrame with column-oriented structure - println(data) - # Output: - # 2×3 DataFrame - # Row ┆ Name ┆ Age ┆ Score - # ┆ String ┆ Int64 ┆ Float64 - # ─────┼────────┼──────┼─────── - # 1 ┆ Alice ┆ 25 ┆ 88.5 - # 2 ┆ Bob ┆ 30 ┆ 92.0 - end -end -``` - ---- - ## Architecture ### Cross-Platform Claim-Check Pattern @@ -949,7 +795,7 @@ function _serialize_data(data::Any, payload_type::String) Arrow.write(io, data) return take!(io) elseif payload_type == "jsontable" - # Convert column-oriented to row-oriented JSON + # Serialize to JSON # data is Vector{NamedTuple} or Vector{Dict} json_str = JSON.json(data) return Vector{UInt8}(json_str) @@ -1005,7 +851,7 @@ function _deserialize_data( return arrow_table elseif payload_type == "jsontable" # Deserialize from JSON format - # Returns Vector{NamedTuple} (column-oriented compatible) + # Returns Vector{NamedTuple} or Vector{Dict} json_str = String(data) parsed = JSON.parse(json_str) return parsed @@ -1288,7 +1134,6 @@ async function serializeData(data, payload_type) { return Buffer.from(jsonStr, 'utf8'); } else if (payload_type === 'arrowtable') { // Convert Array to Arrow IPC - // data is row-oriented: [{id: 1, name: "Alice"}, ...] if (!Array.isArray(data) || data.length === 0) { throw new Error('arrowtable data must be a non-empty array of objects'); } @@ -1312,7 +1157,6 @@ async function serializeData(data, payload_type) { // Read buffer return writer.toBuffer(); } else if (payload_type === 'jsontable') { - // data is already row-oriented Array // Serialize directly to JSON const jsonStr = JSON.stringify(data); return Buffer.from(jsonStr, 'utf8'); @@ -1367,7 +1211,7 @@ async function deserializeData(data, payload_type, correlation_id) { const table = arrow.tableFromRawBytes(buffer); return table; } else if (payload_type === 'jsontable') { - // Deserialize from JSON - returns Array (row-oriented) + // Deserialize from JSON - returns Array const jsonStr = Buffer.from(data).toString('utf8'); return JSON.parse(jsonStr); } else if (payload_type === 'image') { @@ -1712,7 +1556,7 @@ def _serialize_data(data: Any, payload_type: str) -> bytes: buf = io.BytesIO() import pandas as pd if isinstance(data, pd.DataFrame): - # Column-oriented DataFrame to Arrow + # Serialize DataFrame to Arrow table = arrow.Table.from_pandas(data) sink = arrow.ipc.new_file(buf) arrow.ipc.write_table(table, sink) @@ -1721,7 +1565,6 @@ def _serialize_data(data: Any, payload_type: str) -> bytes: else: raise Error('arrowtable data must be a pandas DataFrame') elif payload_type == 'jsontable': - # data is list[dict] or list (row-oriented) # Serialize directly to JSON json_str = json.dumps(data) return json_str.encode('utf-8') @@ -1781,7 +1624,7 @@ def _deserialize_data(data: bytes, payload_type: str, correlation_id: str) -> An reader = arrow.ipc.open_file(buf) return reader.read_all().to_pandas() elif payload_type == 'jsontable': - # Deserialize from JSON - returns list[dict] (row-oriented) + # Deserialize from JSON - returns list[dict] json_str = data.decode('utf-8') return json.loads(json_str) elif payload_type == 'image': @@ -1915,8 +1758,8 @@ DEFAULT_BROKER_URL = "nats://localhost:4222" DEFAULT_FILESERVER_URL = "http://localhost:8080" MAX_PAYLOAD_SIZE = 50000 # Hard limit -# Note: MicroPython uses list[list] for jsontable (row-oriented) -# No DataFrame support - data is always row-oriented +# Note: MicroPython uses list[list] for jsontable +# No DataFrame support class NATSBridge: @@ -2031,7 +1874,7 @@ class NATSBridge: elif payload_type == 'dictionary': return json.dumps(data).encode('utf-8') elif payload_type == 'jsontable': - # data is list[list] (row-oriented) + # Serialize list of lists to JSON return json.dumps(data).encode('utf-8') elif payload_type in ('image', 'audio', 'video', 'binary'): return bytes(data) @@ -2045,7 +1888,7 @@ class NATSBridge: elif payload_type == 'dictionary': return json.loads(data.decode('utf-8')) elif payload_type == 'jsontable': - # Returns list[list] (row-oriented) + # Returns list of lists return json.loads(data.decode('utf-8')) elif payload_type in ('image', 'audio', 'video', 'binary'): return data @@ -2207,11 +2050,6 @@ python3 test/test_py_text_receiver.py - Avoid large payloads - Use `jsontable` instead of `arrowtable` (arrowtable not supported) -5. **Row-Oriented vs Column-Oriented Conversion Issues** - - Julia/Python: DataFrames are column-oriented; when sending `jsontable`, they are converted to row-oriented JSON - - JavaScript/MicroPython: Data is natively row-oriented - - When receiving `jsontable` in Julia/Python, JSON is automatically converted back to column-oriented DataFrame - --- ## Summary @@ -2226,10 +2064,9 @@ This cross-platform NATS bridge provides: - **MicroPython**: Synchronous API, memory-constrained optimizations 3. **Message Format Consistency**: Identical JSON schemas across all platforms 4. **Handler Abstraction**: File server operations abstracted through configurable handlers -5. **Platform-Specific Optimizations**: +5. **Platform-Specific Optimizations**: - **Arrow IPC** (`arrowtable`): Efficient binary format for large tabular data (not supported in MicroPython) - **JSON** (`jsontable`): Universal human-readable format for smaller tables (works in all platforms) -6. **Row-Oriented ↔ Column-Oriented Conversion**: Automatic conversion between row-oriented (JS, MicroPython) and column-oriented (Julia DataFrame, Python pandas) formats when using `jsontable` The Julia implementation in [`src/NATSBridge.jl`](src/NATSBridge.jl:1) serves as the ground truth for API design and behavior. diff --git a/src/NATSBridge.jl b/src/NATSBridge.jl index a698e32..9a0976d 100644 --- a/src/NATSBridge.jl +++ b/src/NATSBridge.jl @@ -38,7 +38,7 @@ # - Input: DataFrame, Arrow.Table # - Encoding: arrow-ipc # - `jsontable`: JSON format for human-readable tabular data -# - Input: Vector{NamedTuple}, Vector{Dict} (column-oriented compatible) +# - Input: Vector{NamedTuple}, Vector{Dict} # - Encoding: json module NATSBridge -- 2.49.1 From 19773fddc9ebce4a8492a014469dec77a0b0ef54 Mon Sep 17 00:00:00 2001 From: narawat Date: Sun, 8 Mar 2026 17:49:13 +0700 Subject: [PATCH 31/43] add test images --- src/NATSBridge.jl | 6 +- test/large_image.png | Bin 0 -> 1232619 bytes test/small_image.jpg | Bin 0 -> 77474 bytes test/test_julia_dict_receiver.jl | 82 -------------- test/test_julia_dict_sender.jl | 137 ----------------------- test/test_julia_mix_payloads_receiver.jl | 70 +++++++++++- test/test_julia_mix_payloads_sender.jl | 122 +++++++++++--------- test/test_julia_table_receiver.jl | 84 -------------- test/test_julia_table_sender.jl | 135 ---------------------- test/test_julia_text_receiver.jl | 83 -------------- test/test_julia_text_sender.jl | 120 -------------------- 11 files changed, 140 insertions(+), 699 deletions(-) create mode 100644 test/large_image.png create mode 100644 test/small_image.jpg delete mode 100644 test/test_julia_dict_receiver.jl delete mode 100644 test/test_julia_dict_sender.jl delete mode 100644 test/test_julia_table_receiver.jl delete mode 100644 test/test_julia_table_sender.jl delete mode 100644 test/test_julia_text_receiver.jl delete mode 100644 test/test_julia_text_sender.jl diff --git a/src/NATSBridge.jl b/src/NATSBridge.jl index 9a0976d..95f9db5 100644 --- a/src/NATSBridge.jl +++ b/src/NATSBridge.jl @@ -43,7 +43,7 @@ module NATSBridge -using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64, PrettyPrinting +using NATS, JSON, Arrow, HTTP, UUIDs, Dates, Base64, PrettyPrinting, DataFrames # ---------------------------------------------- 100 --------------------------------------------- # # Constants @@ -302,7 +302,7 @@ function envelope_to_json(env::msg_envelope_v1) ) # Include data based on transport type if payload.transport == "direct" && payload.data !== nothing - if payload.encoding == "base64" || payload.encoding == "json" + if payload.encoding == "base64" || payload.encoding == "json" || payload.encoding == "arrow-ipc" payload_obj["data"] = payload.data else # For other encodings, use base64 @@ -462,6 +462,8 @@ function smartsend( # Process each payload in the list payloads = msg_payload_v1[] for (dataname, payload_data, payload_type) in data + @show dataname typeof(payload_data) + # Serialize data based on type payload_bytes = _serialize_data(payload_data, payload_type) diff --git a/test/large_image.png b/test/large_image.png new file mode 100644 index 0000000000000000000000000000000000000000..2a89fd8e1d36d1d6abf90cad15142ea9b83dcf13 GIT binary patch literal 1232619 zcmV(`K-0g8P)T<%s@A*DH~bSxQQqC>JNxXP_h+qIRrORoRjb*52_Ap=%U^!)@`ZQ5*sZ_cd;4O$ z^e=49pZm{dz1w?c?LBMVT5Iuhyl1^xJfCyM-~KqB#=~E?c(3Jm;{A@#$Maz}j;H(a z&waliKR3JIKecf@-;d{hu=Tt9yxZ-zA3rx6ztj1gn(HYZL@yhWUt}VxsfBOU9YjNDUbsu!w`jxkKTyL|}^{m&Z-+Dfe4|l ^FT5Kd$k% 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≪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%0Ai$<@hFxM; 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

bs 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

gyFG65MO}qnsJ(NCdhZ+DrvP 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�hs6?^JcyZb&|H&^z79$8{) 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%0AU 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 z

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

cpk|~KyaNTZ@A8i(bkdEeR0J; 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 z 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