@multiplatform.one/frappe 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (792) hide show
  1. package/README.md +38 -12
  2. package/dist/cjs/auth.cjs +1 -1
  3. package/dist/cjs/auth.native.js.map +1 -1
  4. package/dist/cjs/call.cjs +1 -1
  5. package/dist/cjs/call.native.js.map +1 -1
  6. package/dist/cjs/collection.cjs +18 -4
  7. package/dist/cjs/collection.native.js +18 -4
  8. package/dist/cjs/collection.native.js.map +1 -1
  9. package/dist/cjs/core/http.cjs +92 -9
  10. package/dist/cjs/core/http.native.js +96 -7
  11. package/dist/cjs/core/http.native.js.map +1 -1
  12. package/dist/cjs/db.cjs +7 -7
  13. package/dist/cjs/db.native.js +4 -4
  14. package/dist/cjs/db.native.js.map +1 -1
  15. package/dist/cjs/doctype.cjs +97 -39
  16. package/dist/cjs/doctype.native.js +116 -46
  17. package/dist/cjs/doctype.native.js.map +1 -1
  18. package/dist/cjs/file.cjs +1 -1
  19. package/dist/cjs/file.native.js.map +1 -1
  20. package/dist/cjs/fixtureDb.cjs +3 -2
  21. package/dist/cjs/fixtureDb.native.js +2 -1
  22. package/dist/cjs/fixtureDb.native.js.map +1 -1
  23. package/dist/cjs/frappeApp.cjs +15 -14
  24. package/dist/cjs/frappeApp.native.js +16 -14
  25. package/dist/cjs/frappeApp.native.js.map +1 -1
  26. package/dist/cjs/frappeReact.cjs +198 -18
  27. package/dist/cjs/frappeReact.native.js +241 -18
  28. package/dist/cjs/frappeReact.native.js.map +1 -1
  29. package/dist/cjs/index.cjs +9 -4
  30. package/dist/cjs/index.native.js +9 -4
  31. package/dist/cjs/index.native.js.map +1 -1
  32. package/dist/cjs/pacer.cjs +2 -2
  33. package/dist/cjs/pacer.native.js +2 -2
  34. package/dist/cjs/pacer.native.js.map +1 -1
  35. package/dist/cjs/realtime.cjs +186 -46
  36. package/dist/cjs/realtime.native.js +268 -48
  37. package/dist/cjs/realtime.native.js.map +1 -1
  38. package/dist/cjs/sync/backfill.cjs +32 -27
  39. package/dist/cjs/sync/backfill.native.js +49 -43
  40. package/dist/cjs/sync/backfill.native.js.map +1 -1
  41. package/dist/cjs/sync/index.cjs +90 -24
  42. package/dist/cjs/sync/index.native.js +112 -10
  43. package/dist/cjs/sync/index.native.js.map +1 -1
  44. package/dist/cjs/sync/merge.cjs +0 -3
  45. package/dist/cjs/sync/merge.native.js +0 -3
  46. package/dist/cjs/sync/merge.native.js.map +1 -1
  47. package/dist/cjs/sync/mutationEngine.cjs +25 -19
  48. package/dist/cjs/sync/mutationEngine.native.js +16 -13
  49. package/dist/cjs/sync/mutationEngine.native.js.map +1 -1
  50. package/dist/cjs/sync/mutationJournal.cjs +9 -4
  51. package/dist/cjs/sync/mutationJournal.native.js +7 -4
  52. package/dist/cjs/sync/mutationJournal.native.js.map +1 -1
  53. package/dist/cjs/sync/normalizedCache.cjs +7 -3
  54. package/dist/cjs/sync/normalizedCache.native.js +7 -2
  55. package/dist/cjs/sync/normalizedCache.native.js.map +1 -1
  56. package/dist/cjs/sync/persistence.cjs +63 -31
  57. package/dist/cjs/sync/persistence.native.js +120 -63
  58. package/dist/cjs/sync/persistence.native.js.map +1 -1
  59. package/dist/cjs/sync/realtime.cjs +124 -13
  60. package/dist/cjs/sync/realtime.native.js +163 -20
  61. package/dist/cjs/sync/realtime.native.js.map +1 -1
  62. package/dist/cjs/sync/rehydration.cjs +16 -10
  63. package/dist/cjs/sync/rehydration.native.js +16 -14
  64. package/dist/cjs/sync/rehydration.native.js.map +1 -1
  65. package/dist/cjs/sync/storage.cjs +3 -3
  66. package/dist/cjs/sync/storage.native.js +1 -1
  67. package/dist/cjs/sync/storage.native.js.map +1 -1
  68. package/dist/cjs/sync/subscriptionManager.cjs +255 -65
  69. package/dist/cjs/sync/subscriptionManager.native.js +330 -93
  70. package/dist/cjs/sync/subscriptionManager.native.js.map +1 -1
  71. package/dist/cjs/sync/types.cjs +2 -0
  72. package/dist/cjs/sync/types.native.js +2 -0
  73. package/dist/cjs/sync/types.native.js.map +1 -1
  74. package/dist/cjs/sync/virtualPageManager.cjs +9 -9
  75. package/dist/cjs/sync/virtualPageManager.native.js +5 -9
  76. package/dist/cjs/sync/virtualPageManager.native.js.map +1 -1
  77. package/dist/cjs/useLiveQuery.cjs +52 -0
  78. package/dist/cjs/useLiveQuery.native.js +59 -0
  79. package/dist/cjs/useLiveQuery.native.js.map +1 -0
  80. package/dist/cjs/util.cjs +11 -2
  81. package/dist/cjs/util.native.js +16 -2
  82. package/dist/cjs/util.native.js.map +1 -1
  83. package/dist/esm/auth.mjs +1 -1
  84. package/dist/esm/auth.mjs.map +1 -1
  85. package/dist/esm/auth.native.js.map +1 -1
  86. package/dist/esm/call.mjs +1 -1
  87. package/dist/esm/call.mjs.map +1 -1
  88. package/dist/esm/call.native.js.map +1 -1
  89. package/dist/esm/collection.mjs +18 -4
  90. package/dist/esm/collection.mjs.map +1 -1
  91. package/dist/esm/collection.native.js +18 -4
  92. package/dist/esm/collection.native.js.map +1 -1
  93. package/dist/esm/core/http.mjs +93 -10
  94. package/dist/esm/core/http.mjs.map +1 -1
  95. package/dist/esm/core/http.native.js +97 -8
  96. package/dist/esm/core/http.native.js.map +1 -1
  97. package/dist/esm/db.mjs +7 -7
  98. package/dist/esm/db.mjs.map +1 -1
  99. package/dist/esm/db.native.js +4 -4
  100. package/dist/esm/db.native.js.map +1 -1
  101. package/dist/esm/doctype.mjs +96 -39
  102. package/dist/esm/doctype.mjs.map +1 -1
  103. package/dist/esm/doctype.native.js +115 -46
  104. package/dist/esm/doctype.native.js.map +1 -1
  105. package/dist/esm/file.mjs +1 -1
  106. package/dist/esm/file.mjs.map +1 -1
  107. package/dist/esm/file.native.js.map +1 -1
  108. package/dist/esm/fixtureDb.mjs +3 -2
  109. package/dist/esm/fixtureDb.mjs.map +1 -1
  110. package/dist/esm/fixtureDb.native.js +2 -1
  111. package/dist/esm/fixtureDb.native.js.map +1 -1
  112. package/dist/esm/frappeApp.mjs +15 -14
  113. package/dist/esm/frappeApp.mjs.map +1 -1
  114. package/dist/esm/frappeApp.native.js +16 -14
  115. package/dist/esm/frappeApp.native.js.map +1 -1
  116. package/dist/esm/frappeReact.mjs +197 -19
  117. package/dist/esm/frappeReact.mjs.map +1 -1
  118. package/dist/esm/frappeReact.native.js +240 -19
  119. package/dist/esm/frappeReact.native.js.map +1 -1
  120. package/dist/esm/index.mjs +5 -4
  121. package/dist/esm/index.mjs.map +1 -1
  122. package/dist/esm/index.native.js +5 -4
  123. package/dist/esm/index.native.js.map +1 -1
  124. package/dist/esm/pacer.mjs +1 -1
  125. package/dist/esm/pacer.native.js +1 -1
  126. package/dist/esm/realtime.mjs +187 -47
  127. package/dist/esm/realtime.mjs.map +1 -1
  128. package/dist/esm/realtime.native.js +269 -49
  129. package/dist/esm/realtime.native.js.map +1 -1
  130. package/dist/esm/sync/backfill.mjs +32 -27
  131. package/dist/esm/sync/backfill.mjs.map +1 -1
  132. package/dist/esm/sync/backfill.native.js +49 -43
  133. package/dist/esm/sync/backfill.native.js.map +1 -1
  134. package/dist/esm/sync/index.mjs +90 -24
  135. package/dist/esm/sync/index.mjs.map +1 -1
  136. package/dist/esm/sync/index.native.js +112 -10
  137. package/dist/esm/sync/index.native.js.map +1 -1
  138. package/dist/esm/sync/merge.mjs +1 -1
  139. package/dist/esm/sync/merge.mjs.map +1 -1
  140. package/dist/esm/sync/merge.native.js +1 -1
  141. package/dist/esm/sync/merge.native.js.map +1 -1
  142. package/dist/esm/sync/mutationEngine.mjs +25 -19
  143. package/dist/esm/sync/mutationEngine.mjs.map +1 -1
  144. package/dist/esm/sync/mutationEngine.native.js +16 -13
  145. package/dist/esm/sync/mutationEngine.native.js.map +1 -1
  146. package/dist/esm/sync/mutationJournal.mjs +9 -4
  147. package/dist/esm/sync/mutationJournal.mjs.map +1 -1
  148. package/dist/esm/sync/mutationJournal.native.js +7 -4
  149. package/dist/esm/sync/mutationJournal.native.js.map +1 -1
  150. package/dist/esm/sync/normalizedCache.mjs +7 -3
  151. package/dist/esm/sync/normalizedCache.mjs.map +1 -1
  152. package/dist/esm/sync/normalizedCache.native.js +7 -2
  153. package/dist/esm/sync/normalizedCache.native.js.map +1 -1
  154. package/dist/esm/sync/persistence.mjs +64 -32
  155. package/dist/esm/sync/persistence.mjs.map +1 -1
  156. package/dist/esm/sync/persistence.native.js +121 -64
  157. package/dist/esm/sync/persistence.native.js.map +1 -1
  158. package/dist/esm/sync/realtime.mjs +124 -13
  159. package/dist/esm/sync/realtime.mjs.map +1 -1
  160. package/dist/esm/sync/realtime.native.js +163 -20
  161. package/dist/esm/sync/realtime.native.js.map +1 -1
  162. package/dist/esm/sync/rehydration.mjs +16 -10
  163. package/dist/esm/sync/rehydration.mjs.map +1 -1
  164. package/dist/esm/sync/rehydration.native.js +16 -14
  165. package/dist/esm/sync/rehydration.native.js.map +1 -1
  166. package/dist/esm/sync/storage.mjs +3 -3
  167. package/dist/esm/sync/storage.mjs.map +1 -1
  168. package/dist/esm/sync/storage.native.js +1 -1
  169. package/dist/esm/sync/storage.native.js.map +1 -1
  170. package/dist/esm/sync/subscriptionManager.mjs +255 -65
  171. package/dist/esm/sync/subscriptionManager.mjs.map +1 -1
  172. package/dist/esm/sync/subscriptionManager.native.js +330 -93
  173. package/dist/esm/sync/subscriptionManager.native.js.map +1 -1
  174. package/dist/esm/sync/types.mjs +2 -0
  175. package/dist/esm/sync/types.mjs.map +1 -1
  176. package/dist/esm/sync/types.native.js +2 -0
  177. package/dist/esm/sync/types.native.js.map +1 -1
  178. package/dist/esm/sync/virtualPageManager.mjs +9 -9
  179. package/dist/esm/sync/virtualPageManager.mjs.map +1 -1
  180. package/dist/esm/sync/virtualPageManager.native.js +5 -9
  181. package/dist/esm/sync/virtualPageManager.native.js.map +1 -1
  182. package/dist/esm/useLiveQuery.mjs +26 -0
  183. package/dist/esm/useLiveQuery.mjs.map +1 -0
  184. package/dist/esm/useLiveQuery.native.js +30 -0
  185. package/dist/esm/useLiveQuery.native.js.map +1 -0
  186. package/dist/esm/util.mjs +10 -2
  187. package/dist/esm/util.mjs.map +1 -1
  188. package/dist/esm/util.native.js +15 -2
  189. package/dist/esm/util.native.js.map +1 -1
  190. package/dist/jsx/auth.mjs +1 -1
  191. package/dist/jsx/auth.mjs.map +1 -1
  192. package/dist/jsx/auth.native.js.map +1 -1
  193. package/dist/jsx/call.mjs +1 -1
  194. package/dist/jsx/call.mjs.map +1 -1
  195. package/dist/jsx/call.native.js.map +1 -1
  196. package/dist/jsx/collection.mjs +18 -4
  197. package/dist/jsx/collection.mjs.map +1 -1
  198. package/dist/jsx/collection.native.js +18 -4
  199. package/dist/jsx/collection.native.js.map +1 -1
  200. package/dist/jsx/core/http.mjs +93 -10
  201. package/dist/jsx/core/http.mjs.map +1 -1
  202. package/dist/jsx/core/http.native.js +96 -7
  203. package/dist/jsx/core/http.native.js.map +1 -1
  204. package/dist/jsx/db.mjs +7 -7
  205. package/dist/jsx/db.mjs.map +1 -1
  206. package/dist/jsx/db.native.js +4 -4
  207. package/dist/jsx/db.native.js.map +1 -1
  208. package/dist/jsx/doctype.mjs +96 -39
  209. package/dist/jsx/doctype.mjs.map +1 -1
  210. package/dist/jsx/doctype.native.js +116 -46
  211. package/dist/jsx/doctype.native.js.map +1 -1
  212. package/dist/jsx/file.mjs +1 -1
  213. package/dist/jsx/file.mjs.map +1 -1
  214. package/dist/jsx/file.native.js.map +1 -1
  215. package/dist/jsx/fixtureDb.mjs +3 -2
  216. package/dist/jsx/fixtureDb.mjs.map +1 -1
  217. package/dist/jsx/fixtureDb.native.js +2 -1
  218. package/dist/jsx/fixtureDb.native.js.map +1 -1
  219. package/dist/jsx/frappeApp.mjs +15 -14
  220. package/dist/jsx/frappeApp.mjs.map +1 -1
  221. package/dist/jsx/frappeApp.native.js +16 -14
  222. package/dist/jsx/frappeApp.native.js.map +1 -1
  223. package/dist/jsx/frappeReact.mjs +197 -19
  224. package/dist/jsx/frappeReact.mjs.map +1 -1
  225. package/dist/jsx/frappeReact.native.js +241 -18
  226. package/dist/jsx/frappeReact.native.js.map +1 -1
  227. package/dist/jsx/index.js +5 -4
  228. package/dist/jsx/index.js.map +1 -1
  229. package/dist/jsx/index.mjs +5 -4
  230. package/dist/jsx/index.mjs.map +1 -1
  231. package/dist/jsx/index.native.js +9 -4
  232. package/dist/jsx/index.native.js.map +1 -1
  233. package/dist/jsx/pacer.mjs +1 -1
  234. package/dist/jsx/pacer.native.js +2 -2
  235. package/dist/jsx/pacer.native.js.map +1 -1
  236. package/dist/jsx/realtime.mjs +187 -47
  237. package/dist/jsx/realtime.mjs.map +1 -1
  238. package/dist/jsx/realtime.native.js +268 -48
  239. package/dist/jsx/realtime.native.js.map +1 -1
  240. package/dist/jsx/sync/backfill.mjs +32 -27
  241. package/dist/jsx/sync/backfill.mjs.map +1 -1
  242. package/dist/jsx/sync/backfill.native.js +49 -43
  243. package/dist/jsx/sync/backfill.native.js.map +1 -1
  244. package/dist/jsx/sync/index.mjs +90 -24
  245. package/dist/jsx/sync/index.mjs.map +1 -1
  246. package/dist/jsx/sync/index.native.js +112 -10
  247. package/dist/jsx/sync/index.native.js.map +1 -1
  248. package/dist/jsx/sync/merge.mjs +1 -1
  249. package/dist/jsx/sync/merge.mjs.map +1 -1
  250. package/dist/jsx/sync/merge.native.js +0 -3
  251. package/dist/jsx/sync/merge.native.js.map +1 -1
  252. package/dist/jsx/sync/mutationEngine.mjs +25 -19
  253. package/dist/jsx/sync/mutationEngine.mjs.map +1 -1
  254. package/dist/jsx/sync/mutationEngine.native.js +16 -13
  255. package/dist/jsx/sync/mutationEngine.native.js.map +1 -1
  256. package/dist/jsx/sync/mutationJournal.mjs +9 -4
  257. package/dist/jsx/sync/mutationJournal.mjs.map +1 -1
  258. package/dist/jsx/sync/mutationJournal.native.js +7 -4
  259. package/dist/jsx/sync/mutationJournal.native.js.map +1 -1
  260. package/dist/jsx/sync/normalizedCache.mjs +7 -3
  261. package/dist/jsx/sync/normalizedCache.mjs.map +1 -1
  262. package/dist/jsx/sync/normalizedCache.native.js +7 -2
  263. package/dist/jsx/sync/normalizedCache.native.js.map +1 -1
  264. package/dist/jsx/sync/persistence.mjs +64 -32
  265. package/dist/jsx/sync/persistence.mjs.map +1 -1
  266. package/dist/jsx/sync/persistence.native.js +120 -63
  267. package/dist/jsx/sync/persistence.native.js.map +1 -1
  268. package/dist/jsx/sync/realtime.mjs +124 -13
  269. package/dist/jsx/sync/realtime.mjs.map +1 -1
  270. package/dist/jsx/sync/realtime.native.js +163 -20
  271. package/dist/jsx/sync/realtime.native.js.map +1 -1
  272. package/dist/jsx/sync/rehydration.mjs +16 -10
  273. package/dist/jsx/sync/rehydration.mjs.map +1 -1
  274. package/dist/jsx/sync/rehydration.native.js +16 -14
  275. package/dist/jsx/sync/rehydration.native.js.map +1 -1
  276. package/dist/jsx/sync/storage.mjs +3 -3
  277. package/dist/jsx/sync/storage.mjs.map +1 -1
  278. package/dist/jsx/sync/storage.native.js +1 -1
  279. package/dist/jsx/sync/storage.native.js.map +1 -1
  280. package/dist/jsx/sync/subscriptionManager.mjs +255 -65
  281. package/dist/jsx/sync/subscriptionManager.mjs.map +1 -1
  282. package/dist/jsx/sync/subscriptionManager.native.js +330 -93
  283. package/dist/jsx/sync/subscriptionManager.native.js.map +1 -1
  284. package/dist/jsx/sync/types.mjs +2 -0
  285. package/dist/jsx/sync/types.mjs.map +1 -1
  286. package/dist/jsx/sync/types.native.js +2 -0
  287. package/dist/jsx/sync/types.native.js.map +1 -1
  288. package/dist/jsx/sync/virtualPageManager.mjs +9 -9
  289. package/dist/jsx/sync/virtualPageManager.mjs.map +1 -1
  290. package/dist/jsx/sync/virtualPageManager.native.js +5 -9
  291. package/dist/jsx/sync/virtualPageManager.native.js.map +1 -1
  292. package/dist/jsx/useLiveQuery.mjs +26 -0
  293. package/dist/jsx/useLiveQuery.mjs.map +1 -0
  294. package/dist/jsx/useLiveQuery.native.js +59 -0
  295. package/dist/jsx/useLiveQuery.native.js.map +1 -0
  296. package/dist/jsx/util.mjs +10 -2
  297. package/dist/jsx/util.mjs.map +1 -1
  298. package/dist/jsx/util.native.js +16 -2
  299. package/dist/jsx/util.native.js.map +1 -1
  300. package/package.json +20 -17
  301. package/src/auth.ts +5 -1
  302. package/src/call.ts +5 -1
  303. package/src/collection.spec.ts +55 -0
  304. package/src/collection.ts +33 -4
  305. package/src/core/http.spec.ts +66 -0
  306. package/src/core/http.ts +115 -9
  307. package/src/core/httpNative.spec.ts +234 -0
  308. package/src/core/types.ts +2 -0
  309. package/src/db.spec.ts +91 -51
  310. package/src/db.ts +27 -8
  311. package/src/doctype.spec.ts +247 -39
  312. package/src/doctype.ts +203 -53
  313. package/src/file.ts +5 -1
  314. package/src/fixtureDb.ts +13 -2
  315. package/src/frappeApp.ts +18 -19
  316. package/src/frappeReact.spec.ts +565 -1
  317. package/src/frappeReact.ts +445 -37
  318. package/src/frappeReactLiveQueryGc.spec.ts +320 -0
  319. package/src/frappeReactNative.spec.ts +65 -0
  320. package/src/index.ts +10 -9
  321. package/src/pacer.ts +1 -1
  322. package/src/realtime.spec.ts +464 -20
  323. package/src/realtime.ts +284 -46
  324. package/src/sync/backfill.spec.ts +43 -0
  325. package/src/sync/backfill.ts +59 -39
  326. package/src/sync/debug.spec.ts +36 -0
  327. package/src/sync/filterValidation.spec.ts +197 -0
  328. package/src/sync/index.ts +98 -7
  329. package/src/sync/merge.ts +3 -3
  330. package/src/sync/mutationEngine.spec.ts +36 -4
  331. package/src/sync/mutationEngine.ts +30 -11
  332. package/src/sync/mutationJournal.ts +18 -4
  333. package/src/sync/normalizedCache.spec.ts +102 -0
  334. package/src/sync/normalizedCache.ts +19 -3
  335. package/src/sync/offlineRestore.spec.ts +423 -0
  336. package/src/sync/persistence.spec.ts +39 -7
  337. package/src/sync/persistence.ts +90 -18
  338. package/src/sync/persistenceGjs.spec.ts +143 -0
  339. package/src/sync/persistenceNative.spec.ts +139 -0
  340. package/src/sync/realtime.spec.ts +18 -1
  341. package/src/sync/realtime.ts +161 -13
  342. package/src/sync/rehydration.ts +23 -5
  343. package/src/sync/storage.ts +5 -4
  344. package/src/sync/subscriptionManager.spec.ts +94 -0
  345. package/src/sync/subscriptionManager.ts +304 -82
  346. package/src/sync/syncModule.spec.ts +137 -0
  347. package/src/sync/types.ts +39 -0
  348. package/src/sync/virtualPageManager.ts +8 -4
  349. package/src/useLiveQuery.ts +58 -0
  350. package/src/util.spec.ts +35 -4
  351. package/src/util.ts +34 -7
  352. package/types/auth.d.ts +13 -0
  353. package/types/auth.d.ts.map +1 -0
  354. package/types/call.d.ts +10 -0
  355. package/types/call.d.ts.map +1 -0
  356. package/types/collection.d.ts +127 -0
  357. package/types/collection.d.ts.map +1 -0
  358. package/types/common/types.d.ts +35 -0
  359. package/types/common/types.d.ts.map +1 -0
  360. package/types/core/http.d.ts +86 -0
  361. package/types/core/http.d.ts.map +1 -0
  362. package/types/core/types.d.ts +74 -0
  363. package/types/core/types.d.ts.map +1 -0
  364. package/types/core/wire.d.ts +405 -0
  365. package/types/core/wire.d.ts.map +1 -0
  366. package/types/db.d.ts +244 -0
  367. package/types/db.d.ts.map +1 -0
  368. package/types/devtools/FrappeDevtoolsPanel.d.ts +7 -0
  369. package/types/devtools/FrappeDevtoolsPanel.d.ts.map +1 -0
  370. package/types/devtools/index.d.ts +4 -0
  371. package/types/devtools/index.d.ts.map +1 -0
  372. package/types/devtools/plugin.d.ts +9 -0
  373. package/types/devtools/plugin.d.ts.map +1 -0
  374. package/types/devtools/theme.d.ts +15 -0
  375. package/types/devtools/theme.d.ts.map +1 -0
  376. package/types/doctype.d.ts +256 -0
  377. package/types/doctype.d.ts.map +1 -0
  378. package/types/file.d.ts +15 -0
  379. package/types/file.d.ts.map +1 -0
  380. package/types/fixtureDb.d.ts +76 -0
  381. package/types/fixtureDb.d.ts.map +1 -0
  382. package/types/fixtures.d.ts +55 -0
  383. package/types/fixtures.d.ts.map +1 -0
  384. package/types/frappeApp.d.ts +45 -0
  385. package/types/frappeApp.d.ts.map +1 -0
  386. package/types/frappeReact.d.ts +270 -0
  387. package/types/frappeReact.d.ts.map +1 -0
  388. package/types/index.d.ts +44 -0
  389. package/types/index.d.ts.map +1 -0
  390. package/types/optimistic.d.ts +38 -0
  391. package/types/optimistic.d.ts.map +1 -0
  392. package/types/pacer.d.ts +193 -0
  393. package/types/pacer.d.ts.map +1 -0
  394. package/types/plugin/index.d.ts +11 -0
  395. package/types/plugin/index.d.ts.map +1 -0
  396. package/types/realtime.d.ts +121 -0
  397. package/types/realtime.d.ts.map +1 -0
  398. package/types/sync/backfill.d.ts +60 -0
  399. package/types/sync/backfill.d.ts.map +1 -0
  400. package/types/sync/filters.d.ts +101 -0
  401. package/types/sync/filters.d.ts.map +1 -0
  402. package/types/sync/index.d.ts +181 -0
  403. package/types/sync/index.d.ts.map +1 -0
  404. package/types/sync/merge.d.ts +59 -0
  405. package/types/sync/merge.d.ts.map +1 -0
  406. package/types/sync/mutationEngine.d.ts +117 -0
  407. package/types/sync/mutationEngine.d.ts.map +1 -0
  408. package/types/sync/mutationJournal.d.ts +60 -0
  409. package/types/sync/mutationJournal.d.ts.map +1 -0
  410. package/types/sync/normalizedCache.d.ts +59 -0
  411. package/types/sync/normalizedCache.d.ts.map +1 -0
  412. package/types/sync/persistence.d.ts +185 -0
  413. package/types/sync/persistence.d.ts.map +1 -0
  414. package/types/sync/realtime.d.ts +121 -0
  415. package/types/sync/realtime.d.ts.map +1 -0
  416. package/types/sync/rehydration.d.ts +109 -0
  417. package/types/sync/rehydration.d.ts.map +1 -0
  418. package/types/sync/storage.d.ts +65 -0
  419. package/types/sync/storage.d.ts.map +1 -0
  420. package/types/sync/subscriptionManager.d.ts +161 -0
  421. package/types/sync/subscriptionManager.d.ts.map +1 -0
  422. package/types/sync/types.d.ts +435 -0
  423. package/types/sync/types.d.ts.map +1 -0
  424. package/types/sync/virtualPageManager.d.ts +190 -0
  425. package/types/sync/virtualPageManager.d.ts.map +1 -0
  426. package/types/useLiveQuery.d.ts +16 -0
  427. package/types/useLiveQuery.d.ts.map +1 -0
  428. package/types/util.d.ts +24 -0
  429. package/types/util.d.ts.map +1 -0
  430. package/dist/cjs/auth.spec.cjs +0 -322
  431. package/dist/cjs/auth.spec.native.js +0 -329
  432. package/dist/cjs/auth.spec.native.js.map +0 -1
  433. package/dist/cjs/call.spec.cjs +0 -427
  434. package/dist/cjs/call.spec.native.js +0 -430
  435. package/dist/cjs/call.spec.native.js.map +0 -1
  436. package/dist/cjs/collection.spec.cjs +0 -186
  437. package/dist/cjs/collection.spec.native.js +0 -216
  438. package/dist/cjs/collection.spec.native.js.map +0 -1
  439. package/dist/cjs/common/types.spec.cjs +0 -266
  440. package/dist/cjs/common/types.spec.native.js +0 -271
  441. package/dist/cjs/common/types.spec.native.js.map +0 -1
  442. package/dist/cjs/core/http.spec.cjs +0 -1259
  443. package/dist/cjs/core/http.spec.native.js +0 -1401
  444. package/dist/cjs/core/http.spec.native.js.map +0 -1
  445. package/dist/cjs/core/wire.spec.cjs +0 -478
  446. package/dist/cjs/core/wire.spec.native.js +0 -482
  447. package/dist/cjs/core/wire.spec.native.js.map +0 -1
  448. package/dist/cjs/db.spec.cjs +0 -862
  449. package/dist/cjs/db.spec.native.js +0 -865
  450. package/dist/cjs/db.spec.native.js.map +0 -1
  451. package/dist/cjs/doctype.spec.cjs +0 -460
  452. package/dist/cjs/doctype.spec.native.js +0 -538
  453. package/dist/cjs/doctype.spec.native.js.map +0 -1
  454. package/dist/cjs/file.spec.cjs +0 -315
  455. package/dist/cjs/file.spec.native.js +0 -342
  456. package/dist/cjs/file.spec.native.js.map +0 -1
  457. package/dist/cjs/frappeApp.spec.cjs +0 -306
  458. package/dist/cjs/frappeApp.spec.native.js +0 -308
  459. package/dist/cjs/frappeApp.spec.native.js.map +0 -1
  460. package/dist/cjs/frappeReact.spec.cjs +0 -531
  461. package/dist/cjs/frappeReact.spec.native.js +0 -670
  462. package/dist/cjs/frappeReact.spec.native.js.map +0 -1
  463. package/dist/cjs/optimistic.spec.cjs +0 -11
  464. package/dist/cjs/optimistic.spec.native.js +0 -19
  465. package/dist/cjs/optimistic.spec.native.js.map +0 -1
  466. package/dist/cjs/pacer.spec.cjs +0 -470
  467. package/dist/cjs/pacer.spec.native.js +0 -537
  468. package/dist/cjs/pacer.spec.native.js.map +0 -1
  469. package/dist/cjs/realtime.spec.cjs +0 -326
  470. package/dist/cjs/realtime.spec.native.js +0 -392
  471. package/dist/cjs/realtime.spec.native.js.map +0 -1
  472. package/dist/cjs/sync/backfill.spec.cjs +0 -586
  473. package/dist/cjs/sync/backfill.spec.native.js +0 -712
  474. package/dist/cjs/sync/backfill.spec.native.js.map +0 -1
  475. package/dist/cjs/sync/debug.spec.cjs +0 -125
  476. package/dist/cjs/sync/debug.spec.native.js +0 -133
  477. package/dist/cjs/sync/debug.spec.native.js.map +0 -1
  478. package/dist/cjs/sync/filters.spec.cjs +0 -168
  479. package/dist/cjs/sync/filters.spec.native.js +0 -173
  480. package/dist/cjs/sync/filters.spec.native.js.map +0 -1
  481. package/dist/cjs/sync/merge.spec.cjs +0 -908
  482. package/dist/cjs/sync/merge.spec.native.js +0 -937
  483. package/dist/cjs/sync/merge.spec.native.js.map +0 -1
  484. package/dist/cjs/sync/multiOrderBy.spec.cjs +0 -165
  485. package/dist/cjs/sync/multiOrderBy.spec.native.js +0 -229
  486. package/dist/cjs/sync/multiOrderBy.spec.native.js.map +0 -1
  487. package/dist/cjs/sync/mutationEngine.spec.cjs +0 -1158
  488. package/dist/cjs/sync/mutationEngine.spec.native.js +0 -1173
  489. package/dist/cjs/sync/mutationEngine.spec.native.js.map +0 -1
  490. package/dist/cjs/sync/mutationJournal.spec.cjs +0 -330
  491. package/dist/cjs/sync/mutationJournal.spec.native.js +0 -333
  492. package/dist/cjs/sync/mutationJournal.spec.native.js.map +0 -1
  493. package/dist/cjs/sync/mutations.spec.cjs +0 -327
  494. package/dist/cjs/sync/mutations.spec.native.js +0 -330
  495. package/dist/cjs/sync/mutations.spec.native.js.map +0 -1
  496. package/dist/cjs/sync/normalizedCache.spec.cjs +0 -302
  497. package/dist/cjs/sync/normalizedCache.spec.native.js +0 -311
  498. package/dist/cjs/sync/normalizedCache.spec.native.js.map +0 -1
  499. package/dist/cjs/sync/persistence.spec.cjs +0 -562
  500. package/dist/cjs/sync/persistence.spec.native.js +0 -572
  501. package/dist/cjs/sync/persistence.spec.native.js.map +0 -1
  502. package/dist/cjs/sync/realtime.spec.cjs +0 -499
  503. package/dist/cjs/sync/realtime.spec.native.js +0 -512
  504. package/dist/cjs/sync/realtime.spec.native.js.map +0 -1
  505. package/dist/cjs/sync/rehydration.spec.cjs +0 -731
  506. package/dist/cjs/sync/rehydration.spec.native.js +0 -736
  507. package/dist/cjs/sync/rehydration.spec.native.js.map +0 -1
  508. package/dist/cjs/sync/storage.spec.cjs +0 -446
  509. package/dist/cjs/sync/storage.spec.native.js +0 -470
  510. package/dist/cjs/sync/storage.spec.native.js.map +0 -1
  511. package/dist/cjs/sync/subscriptionManager.spec.cjs +0 -1102
  512. package/dist/cjs/sync/subscriptionManager.spec.native.js +0 -1136
  513. package/dist/cjs/sync/subscriptionManager.spec.native.js.map +0 -1
  514. package/dist/cjs/sync/subscriptions.spec.cjs +0 -937
  515. package/dist/cjs/sync/subscriptions.spec.native.js +0 -969
  516. package/dist/cjs/sync/subscriptions.spec.native.js.map +0 -1
  517. package/dist/cjs/sync/syncModule.spec.cjs +0 -206
  518. package/dist/cjs/sync/syncModule.spec.native.js +0 -222
  519. package/dist/cjs/sync/syncModule.spec.native.js.map +0 -1
  520. package/dist/cjs/sync/types.spec.cjs +0 -246
  521. package/dist/cjs/sync/types.spec.native.js +0 -256
  522. package/dist/cjs/sync/types.spec.native.js.map +0 -1
  523. package/dist/cjs/sync/virtualPageManager.spec.cjs +0 -801
  524. package/dist/cjs/sync/virtualPageManager.spec.native.js +0 -873
  525. package/dist/cjs/sync/virtualPageManager.spec.native.js.map +0 -1
  526. package/dist/cjs/util.spec.cjs +0 -43
  527. package/dist/cjs/util.spec.native.js +0 -48
  528. package/dist/cjs/util.spec.native.js.map +0 -1
  529. package/dist/esm/auth.spec.mjs +0 -323
  530. package/dist/esm/auth.spec.mjs.map +0 -1
  531. package/dist/esm/auth.spec.native.js +0 -327
  532. package/dist/esm/auth.spec.native.js.map +0 -1
  533. package/dist/esm/call.spec.mjs +0 -428
  534. package/dist/esm/call.spec.mjs.map +0 -1
  535. package/dist/esm/call.spec.native.js +0 -428
  536. package/dist/esm/call.spec.native.js.map +0 -1
  537. package/dist/esm/collection.spec.mjs +0 -187
  538. package/dist/esm/collection.spec.mjs.map +0 -1
  539. package/dist/esm/collection.spec.native.js +0 -214
  540. package/dist/esm/collection.spec.native.js.map +0 -1
  541. package/dist/esm/common/types.spec.mjs +0 -267
  542. package/dist/esm/common/types.spec.mjs.map +0 -1
  543. package/dist/esm/common/types.spec.native.js +0 -269
  544. package/dist/esm/common/types.spec.native.js.map +0 -1
  545. package/dist/esm/core/http.spec.mjs +0 -1260
  546. package/dist/esm/core/http.spec.mjs.map +0 -1
  547. package/dist/esm/core/http.spec.native.js +0 -1399
  548. package/dist/esm/core/http.spec.native.js.map +0 -1
  549. package/dist/esm/core/wire.spec.mjs +0 -479
  550. package/dist/esm/core/wire.spec.mjs.map +0 -1
  551. package/dist/esm/core/wire.spec.native.js +0 -480
  552. package/dist/esm/core/wire.spec.native.js.map +0 -1
  553. package/dist/esm/db.spec.mjs +0 -863
  554. package/dist/esm/db.spec.mjs.map +0 -1
  555. package/dist/esm/db.spec.native.js +0 -863
  556. package/dist/esm/db.spec.native.js.map +0 -1
  557. package/dist/esm/doctype.spec.mjs +0 -461
  558. package/dist/esm/doctype.spec.mjs.map +0 -1
  559. package/dist/esm/doctype.spec.native.js +0 -536
  560. package/dist/esm/doctype.spec.native.js.map +0 -1
  561. package/dist/esm/file.spec.mjs +0 -316
  562. package/dist/esm/file.spec.mjs.map +0 -1
  563. package/dist/esm/file.spec.native.js +0 -340
  564. package/dist/esm/file.spec.native.js.map +0 -1
  565. package/dist/esm/frappeApp.spec.mjs +0 -307
  566. package/dist/esm/frappeApp.spec.mjs.map +0 -1
  567. package/dist/esm/frappeApp.spec.native.js +0 -306
  568. package/dist/esm/frappeApp.spec.native.js.map +0 -1
  569. package/dist/esm/frappeReact.spec.mjs +0 -532
  570. package/dist/esm/frappeReact.spec.mjs.map +0 -1
  571. package/dist/esm/frappeReact.spec.native.js +0 -668
  572. package/dist/esm/frappeReact.spec.native.js.map +0 -1
  573. package/dist/esm/optimistic.spec.mjs +0 -12
  574. package/dist/esm/optimistic.spec.mjs.map +0 -1
  575. package/dist/esm/optimistic.spec.native.js +0 -17
  576. package/dist/esm/optimistic.spec.native.js.map +0 -1
  577. package/dist/esm/pacer.spec.mjs +0 -447
  578. package/dist/esm/pacer.spec.mjs.map +0 -1
  579. package/dist/esm/pacer.spec.native.js +0 -511
  580. package/dist/esm/pacer.spec.native.js.map +0 -1
  581. package/dist/esm/realtime.spec.mjs +0 -327
  582. package/dist/esm/realtime.spec.mjs.map +0 -1
  583. package/dist/esm/realtime.spec.native.js +0 -390
  584. package/dist/esm/realtime.spec.native.js.map +0 -1
  585. package/dist/esm/sync/backfill.spec.mjs +0 -563
  586. package/dist/esm/sync/backfill.spec.mjs.map +0 -1
  587. package/dist/esm/sync/backfill.spec.native.js +0 -686
  588. package/dist/esm/sync/backfill.spec.native.js.map +0 -1
  589. package/dist/esm/sync/debug.spec.mjs +0 -102
  590. package/dist/esm/sync/debug.spec.mjs.map +0 -1
  591. package/dist/esm/sync/debug.spec.native.js +0 -107
  592. package/dist/esm/sync/debug.spec.native.js.map +0 -1
  593. package/dist/esm/sync/filters.spec.mjs +0 -169
  594. package/dist/esm/sync/filters.spec.mjs.map +0 -1
  595. package/dist/esm/sync/filters.spec.native.js +0 -171
  596. package/dist/esm/sync/filters.spec.native.js.map +0 -1
  597. package/dist/esm/sync/merge.spec.mjs +0 -909
  598. package/dist/esm/sync/merge.spec.mjs.map +0 -1
  599. package/dist/esm/sync/merge.spec.native.js +0 -935
  600. package/dist/esm/sync/merge.spec.native.js.map +0 -1
  601. package/dist/esm/sync/multiOrderBy.spec.mjs +0 -166
  602. package/dist/esm/sync/multiOrderBy.spec.mjs.map +0 -1
  603. package/dist/esm/sync/multiOrderBy.spec.native.js +0 -227
  604. package/dist/esm/sync/multiOrderBy.spec.native.js.map +0 -1
  605. package/dist/esm/sync/mutationEngine.spec.mjs +0 -1159
  606. package/dist/esm/sync/mutationEngine.spec.mjs.map +0 -1
  607. package/dist/esm/sync/mutationEngine.spec.native.js +0 -1171
  608. package/dist/esm/sync/mutationEngine.spec.native.js.map +0 -1
  609. package/dist/esm/sync/mutationJournal.spec.mjs +0 -331
  610. package/dist/esm/sync/mutationJournal.spec.mjs.map +0 -1
  611. package/dist/esm/sync/mutationJournal.spec.native.js +0 -331
  612. package/dist/esm/sync/mutationJournal.spec.native.js.map +0 -1
  613. package/dist/esm/sync/mutations.spec.mjs +0 -328
  614. package/dist/esm/sync/mutations.spec.mjs.map +0 -1
  615. package/dist/esm/sync/mutations.spec.native.js +0 -328
  616. package/dist/esm/sync/mutations.spec.native.js.map +0 -1
  617. package/dist/esm/sync/normalizedCache.spec.mjs +0 -303
  618. package/dist/esm/sync/normalizedCache.spec.mjs.map +0 -1
  619. package/dist/esm/sync/normalizedCache.spec.native.js +0 -309
  620. package/dist/esm/sync/normalizedCache.spec.native.js.map +0 -1
  621. package/dist/esm/sync/persistence.spec.mjs +0 -563
  622. package/dist/esm/sync/persistence.spec.mjs.map +0 -1
  623. package/dist/esm/sync/persistence.spec.native.js +0 -570
  624. package/dist/esm/sync/persistence.spec.native.js.map +0 -1
  625. package/dist/esm/sync/realtime.spec.mjs +0 -500
  626. package/dist/esm/sync/realtime.spec.mjs.map +0 -1
  627. package/dist/esm/sync/realtime.spec.native.js +0 -510
  628. package/dist/esm/sync/realtime.spec.native.js.map +0 -1
  629. package/dist/esm/sync/rehydration.spec.mjs +0 -732
  630. package/dist/esm/sync/rehydration.spec.mjs.map +0 -1
  631. package/dist/esm/sync/rehydration.spec.native.js +0 -734
  632. package/dist/esm/sync/rehydration.spec.native.js.map +0 -1
  633. package/dist/esm/sync/storage.spec.mjs +0 -423
  634. package/dist/esm/sync/storage.spec.mjs.map +0 -1
  635. package/dist/esm/sync/storage.spec.native.js +0 -444
  636. package/dist/esm/sync/storage.spec.native.js.map +0 -1
  637. package/dist/esm/sync/subscriptionManager.spec.mjs +0 -1079
  638. package/dist/esm/sync/subscriptionManager.spec.mjs.map +0 -1
  639. package/dist/esm/sync/subscriptionManager.spec.native.js +0 -1110
  640. package/dist/esm/sync/subscriptionManager.spec.native.js.map +0 -1
  641. package/dist/esm/sync/subscriptions.spec.mjs +0 -914
  642. package/dist/esm/sync/subscriptions.spec.mjs.map +0 -1
  643. package/dist/esm/sync/subscriptions.spec.native.js +0 -943
  644. package/dist/esm/sync/subscriptions.spec.native.js.map +0 -1
  645. package/dist/esm/sync/syncModule.spec.mjs +0 -207
  646. package/dist/esm/sync/syncModule.spec.mjs.map +0 -1
  647. package/dist/esm/sync/syncModule.spec.native.js +0 -220
  648. package/dist/esm/sync/syncModule.spec.native.js.map +0 -1
  649. package/dist/esm/sync/types.spec.mjs +0 -247
  650. package/dist/esm/sync/types.spec.mjs.map +0 -1
  651. package/dist/esm/sync/types.spec.native.js +0 -254
  652. package/dist/esm/sync/types.spec.native.js.map +0 -1
  653. package/dist/esm/sync/virtualPageManager.spec.mjs +0 -802
  654. package/dist/esm/sync/virtualPageManager.spec.mjs.map +0 -1
  655. package/dist/esm/sync/virtualPageManager.spec.native.js +0 -871
  656. package/dist/esm/sync/virtualPageManager.spec.native.js.map +0 -1
  657. package/dist/esm/util.spec.mjs +0 -20
  658. package/dist/esm/util.spec.mjs.map +0 -1
  659. package/dist/esm/util.spec.native.js +0 -22
  660. package/dist/esm/util.spec.native.js.map +0 -1
  661. package/dist/jsx/auth.spec.mjs +0 -323
  662. package/dist/jsx/auth.spec.mjs.map +0 -1
  663. package/dist/jsx/auth.spec.native.js +0 -329
  664. package/dist/jsx/auth.spec.native.js.map +0 -1
  665. package/dist/jsx/call.spec.mjs +0 -428
  666. package/dist/jsx/call.spec.mjs.map +0 -1
  667. package/dist/jsx/call.spec.native.js +0 -430
  668. package/dist/jsx/call.spec.native.js.map +0 -1
  669. package/dist/jsx/collection.spec.mjs +0 -187
  670. package/dist/jsx/collection.spec.mjs.map +0 -1
  671. package/dist/jsx/collection.spec.native.js +0 -216
  672. package/dist/jsx/collection.spec.native.js.map +0 -1
  673. package/dist/jsx/common/types.spec.mjs +0 -267
  674. package/dist/jsx/common/types.spec.mjs.map +0 -1
  675. package/dist/jsx/common/types.spec.native.js +0 -271
  676. package/dist/jsx/common/types.spec.native.js.map +0 -1
  677. package/dist/jsx/core/http.spec.mjs +0 -1260
  678. package/dist/jsx/core/http.spec.mjs.map +0 -1
  679. package/dist/jsx/core/http.spec.native.js +0 -1401
  680. package/dist/jsx/core/http.spec.native.js.map +0 -1
  681. package/dist/jsx/core/wire.spec.mjs +0 -479
  682. package/dist/jsx/core/wire.spec.mjs.map +0 -1
  683. package/dist/jsx/core/wire.spec.native.js +0 -482
  684. package/dist/jsx/core/wire.spec.native.js.map +0 -1
  685. package/dist/jsx/db.spec.mjs +0 -863
  686. package/dist/jsx/db.spec.mjs.map +0 -1
  687. package/dist/jsx/db.spec.native.js +0 -865
  688. package/dist/jsx/db.spec.native.js.map +0 -1
  689. package/dist/jsx/doctype.spec.mjs +0 -461
  690. package/dist/jsx/doctype.spec.mjs.map +0 -1
  691. package/dist/jsx/doctype.spec.native.js +0 -538
  692. package/dist/jsx/doctype.spec.native.js.map +0 -1
  693. package/dist/jsx/file.spec.mjs +0 -316
  694. package/dist/jsx/file.spec.mjs.map +0 -1
  695. package/dist/jsx/file.spec.native.js +0 -342
  696. package/dist/jsx/file.spec.native.js.map +0 -1
  697. package/dist/jsx/frappeApp.spec.mjs +0 -307
  698. package/dist/jsx/frappeApp.spec.mjs.map +0 -1
  699. package/dist/jsx/frappeApp.spec.native.js +0 -308
  700. package/dist/jsx/frappeApp.spec.native.js.map +0 -1
  701. package/dist/jsx/frappeReact.spec.mjs +0 -532
  702. package/dist/jsx/frappeReact.spec.mjs.map +0 -1
  703. package/dist/jsx/frappeReact.spec.native.js +0 -670
  704. package/dist/jsx/frappeReact.spec.native.js.map +0 -1
  705. package/dist/jsx/optimistic.spec.mjs +0 -12
  706. package/dist/jsx/optimistic.spec.mjs.map +0 -1
  707. package/dist/jsx/optimistic.spec.native.js +0 -19
  708. package/dist/jsx/optimistic.spec.native.js.map +0 -1
  709. package/dist/jsx/pacer.spec.mjs +0 -447
  710. package/dist/jsx/pacer.spec.mjs.map +0 -1
  711. package/dist/jsx/pacer.spec.native.js +0 -537
  712. package/dist/jsx/pacer.spec.native.js.map +0 -1
  713. package/dist/jsx/realtime.spec.mjs +0 -327
  714. package/dist/jsx/realtime.spec.mjs.map +0 -1
  715. package/dist/jsx/realtime.spec.native.js +0 -392
  716. package/dist/jsx/realtime.spec.native.js.map +0 -1
  717. package/dist/jsx/sync/backfill.spec.mjs +0 -563
  718. package/dist/jsx/sync/backfill.spec.mjs.map +0 -1
  719. package/dist/jsx/sync/backfill.spec.native.js +0 -712
  720. package/dist/jsx/sync/backfill.spec.native.js.map +0 -1
  721. package/dist/jsx/sync/debug.spec.mjs +0 -102
  722. package/dist/jsx/sync/debug.spec.mjs.map +0 -1
  723. package/dist/jsx/sync/debug.spec.native.js +0 -133
  724. package/dist/jsx/sync/debug.spec.native.js.map +0 -1
  725. package/dist/jsx/sync/filters.spec.mjs +0 -169
  726. package/dist/jsx/sync/filters.spec.mjs.map +0 -1
  727. package/dist/jsx/sync/filters.spec.native.js +0 -173
  728. package/dist/jsx/sync/filters.spec.native.js.map +0 -1
  729. package/dist/jsx/sync/merge.spec.mjs +0 -909
  730. package/dist/jsx/sync/merge.spec.mjs.map +0 -1
  731. package/dist/jsx/sync/merge.spec.native.js +0 -937
  732. package/dist/jsx/sync/merge.spec.native.js.map +0 -1
  733. package/dist/jsx/sync/multiOrderBy.spec.mjs +0 -166
  734. package/dist/jsx/sync/multiOrderBy.spec.mjs.map +0 -1
  735. package/dist/jsx/sync/multiOrderBy.spec.native.js +0 -229
  736. package/dist/jsx/sync/multiOrderBy.spec.native.js.map +0 -1
  737. package/dist/jsx/sync/mutationEngine.spec.mjs +0 -1159
  738. package/dist/jsx/sync/mutationEngine.spec.mjs.map +0 -1
  739. package/dist/jsx/sync/mutationEngine.spec.native.js +0 -1173
  740. package/dist/jsx/sync/mutationEngine.spec.native.js.map +0 -1
  741. package/dist/jsx/sync/mutationJournal.spec.mjs +0 -331
  742. package/dist/jsx/sync/mutationJournal.spec.mjs.map +0 -1
  743. package/dist/jsx/sync/mutationJournal.spec.native.js +0 -333
  744. package/dist/jsx/sync/mutationJournal.spec.native.js.map +0 -1
  745. package/dist/jsx/sync/mutations.spec.mjs +0 -328
  746. package/dist/jsx/sync/mutations.spec.mjs.map +0 -1
  747. package/dist/jsx/sync/mutations.spec.native.js +0 -330
  748. package/dist/jsx/sync/mutations.spec.native.js.map +0 -1
  749. package/dist/jsx/sync/normalizedCache.spec.mjs +0 -303
  750. package/dist/jsx/sync/normalizedCache.spec.mjs.map +0 -1
  751. package/dist/jsx/sync/normalizedCache.spec.native.js +0 -311
  752. package/dist/jsx/sync/normalizedCache.spec.native.js.map +0 -1
  753. package/dist/jsx/sync/persistence.spec.mjs +0 -563
  754. package/dist/jsx/sync/persistence.spec.mjs.map +0 -1
  755. package/dist/jsx/sync/persistence.spec.native.js +0 -572
  756. package/dist/jsx/sync/persistence.spec.native.js.map +0 -1
  757. package/dist/jsx/sync/realtime.spec.mjs +0 -500
  758. package/dist/jsx/sync/realtime.spec.mjs.map +0 -1
  759. package/dist/jsx/sync/realtime.spec.native.js +0 -512
  760. package/dist/jsx/sync/realtime.spec.native.js.map +0 -1
  761. package/dist/jsx/sync/rehydration.spec.mjs +0 -732
  762. package/dist/jsx/sync/rehydration.spec.mjs.map +0 -1
  763. package/dist/jsx/sync/rehydration.spec.native.js +0 -736
  764. package/dist/jsx/sync/rehydration.spec.native.js.map +0 -1
  765. package/dist/jsx/sync/storage.spec.mjs +0 -423
  766. package/dist/jsx/sync/storage.spec.mjs.map +0 -1
  767. package/dist/jsx/sync/storage.spec.native.js +0 -470
  768. package/dist/jsx/sync/storage.spec.native.js.map +0 -1
  769. package/dist/jsx/sync/subscriptionManager.spec.mjs +0 -1079
  770. package/dist/jsx/sync/subscriptionManager.spec.mjs.map +0 -1
  771. package/dist/jsx/sync/subscriptionManager.spec.native.js +0 -1136
  772. package/dist/jsx/sync/subscriptionManager.spec.native.js.map +0 -1
  773. package/dist/jsx/sync/subscriptions.spec.mjs +0 -914
  774. package/dist/jsx/sync/subscriptions.spec.mjs.map +0 -1
  775. package/dist/jsx/sync/subscriptions.spec.native.js +0 -969
  776. package/dist/jsx/sync/subscriptions.spec.native.js.map +0 -1
  777. package/dist/jsx/sync/syncModule.spec.mjs +0 -207
  778. package/dist/jsx/sync/syncModule.spec.mjs.map +0 -1
  779. package/dist/jsx/sync/syncModule.spec.native.js +0 -222
  780. package/dist/jsx/sync/syncModule.spec.native.js.map +0 -1
  781. package/dist/jsx/sync/types.spec.mjs +0 -247
  782. package/dist/jsx/sync/types.spec.mjs.map +0 -1
  783. package/dist/jsx/sync/types.spec.native.js +0 -256
  784. package/dist/jsx/sync/types.spec.native.js.map +0 -1
  785. package/dist/jsx/sync/virtualPageManager.spec.mjs +0 -802
  786. package/dist/jsx/sync/virtualPageManager.spec.mjs.map +0 -1
  787. package/dist/jsx/sync/virtualPageManager.spec.native.js +0 -873
  788. package/dist/jsx/sync/virtualPageManager.spec.native.js.map +0 -1
  789. package/dist/jsx/util.spec.mjs +0 -20
  790. package/dist/jsx/util.spec.mjs.map +0 -1
  791. package/dist/jsx/util.spec.native.js +0 -48
  792. package/dist/jsx/util.spec.native.js.map +0 -1
@@ -1,5 +1,7 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- import { RealtimeModule } from "./realtime";
2
+ import { io } from "socket.io-client";
3
+ import { AuthType } from "./core/types";
4
+ import { RealtimeModule, RealtimePlatform } from "./realtime";
3
5
 
4
6
  // Mock socket.io-client
5
7
  const mockSocket = {
@@ -9,7 +11,11 @@ const mockSocket = {
9
11
  emit: vi.fn(),
10
12
  connect: vi.fn(),
11
13
  disconnect: vi.fn(),
14
+ removeAllListeners: vi.fn(),
12
15
  id: "mock-socket-id",
16
+ // Manager handle: RealtimeModule mutates manager.opts on credential
17
+ // refresh and registers a reconnect_attempt safety net.
18
+ io: { opts: {} as Record<string, unknown>, on: vi.fn() },
13
19
  };
14
20
 
15
21
  vi.mock("socket.io-client", () => ({
@@ -67,6 +73,7 @@ describe("RealtimeModule", () => {
67
73
  baseURL: "http://localhost:3000",
68
74
  });
69
75
  expect(rnInstance).toBeDefined();
76
+ expect((rnInstance as any).config.platform).toBe(RealtimePlatform.ReactNative);
70
77
 
71
78
  // Restore
72
79
  if (originalUA) {
@@ -76,6 +83,105 @@ describe("RealtimeModule", () => {
76
83
  });
77
84
  }
78
85
  });
86
+
87
+ it("detects React Native via navigator.product (RN sets no userAgent)", () => {
88
+ // Real RN runtimes define navigator.product === "ReactNative" and NO
89
+ // userAgent — the old UA-only sniff misdetected RN as Web, skipping
90
+ // the extraHeaders auth path (cookie-auth sockets connected as guest).
91
+ const originalNavigator = (global as any).navigator;
92
+ Object.defineProperty(global, "navigator", {
93
+ value: { product: "ReactNative" },
94
+ writable: true,
95
+ });
96
+ const rnInstance = new RealtimeModule({ baseURL: "http://localhost:3000" });
97
+ expect((rnInstance as any).config.platform).toBe(RealtimePlatform.ReactNative);
98
+ Object.defineProperty(global, "navigator", {
99
+ value: originalNavigator,
100
+ writable: true,
101
+ });
102
+ });
103
+
104
+ it("keeps detecting Web in a browser-like environment", () => {
105
+ const webInstance = new RealtimeModule({ baseURL: "http://localhost:3000" });
106
+ expect((webInstance as any).config.platform).toBe(RealtimePlatform.Web);
107
+ });
108
+
109
+ it("classifies GJS (imports.gi global) as Node — before the Web branch", () => {
110
+ // GJS has window/document layout stubs in the GNOME bundles, so the
111
+ // Web classification would otherwise win — but GJS has no XHR for a
112
+ // polling-first handshake and its libsoup WebSocket polyfill accepts
113
+ // custom headers, so it must take the non-Web (extraHeaders) path.
114
+ (globalThis as any).imports = { gi: {} };
115
+ try {
116
+ const gjsInstance = new RealtimeModule({ baseURL: "http://localhost:3000" });
117
+ expect((gjsInstance as any).config.platform).toBe(RealtimePlatform.Node);
118
+ } finally {
119
+ delete (globalThis as any).imports;
120
+ }
121
+ });
122
+ });
123
+
124
+ describe("GJS handshake", () => {
125
+ function ioOptions(): Record<string, any> {
126
+ const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
127
+ return calls[calls.length - 1]?.[1] ?? {};
128
+ }
129
+
130
+ it("connects websocket-first with token auth in extraHeaders", async () => {
131
+ (globalThis as any).imports = { gi: {} };
132
+ try {
133
+ const rt = new RealtimeModule({
134
+ baseURL: "http://localhost:3000",
135
+ auth: { useToken: true, token: "key:secret", type: AuthType.Token },
136
+ });
137
+ await (rt as any).connect();
138
+
139
+ const options = ioOptions();
140
+ expect(options.transports).toEqual(["websocket", "polling"]);
141
+ expect(options.extraHeaders.Authorization).toBe("token key:secret");
142
+ expect(options.extraHeaders.Origin).toBe("http://localhost:3000");
143
+ expect(options.transportOptions.websocket.extraHeaders.Authorization).toBe(
144
+ "token key:secret",
145
+ );
146
+ rt.disconnect();
147
+ } finally {
148
+ delete (globalThis as any).imports;
149
+ }
150
+ });
151
+ });
152
+
153
+ describe("React Native handshake", () => {
154
+ function ioOptions(): Record<string, any> {
155
+ const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
156
+ return calls[calls.length - 1]?.[1] ?? {};
157
+ }
158
+
159
+ it("routes the sid session cookie into extraHeaders on RN (cookie auth)", async () => {
160
+ const originalNavigator = (global as any).navigator;
161
+ Object.defineProperty(global, "navigator", {
162
+ value: { product: "ReactNative" },
163
+ writable: true,
164
+ });
165
+ const rt = new RealtimeModule({
166
+ baseURL: "http://localhost:3000",
167
+ auth: { sessionId: async () => "sid-abc" },
168
+ });
169
+ await (rt as any).connect();
170
+
171
+ const options = ioOptions();
172
+ // Native is websocket-first and must carry sid + Origin itself —
173
+ // there is no shared browser cookie jar on the socket handshake.
174
+ expect(options.transports).toEqual(["websocket", "polling"]);
175
+ expect(options.extraHeaders.Cookie).toBe("sid=sid-abc");
176
+ expect(options.extraHeaders.Origin).toBe("http://localhost:3000");
177
+ expect(options.transportOptions.websocket.extraHeaders.Cookie).toBe("sid=sid-abc");
178
+
179
+ rt.disconnect();
180
+ Object.defineProperty(global, "navigator", {
181
+ value: originalNavigator,
182
+ writable: true,
183
+ });
184
+ });
79
185
  });
80
186
 
81
187
  describe("connect", () => {
@@ -106,6 +212,7 @@ describe("RealtimeModule", () => {
106
212
  describe("on", () => {
107
213
  it("should register event handler and create socket listener dynamically", async () => {
108
214
  const handler = vi.fn();
215
+ await (realtime as any).connect();
109
216
  await realtime.on("custom_event", handler);
110
217
 
111
218
  // Should create socket listener for new event
@@ -165,6 +272,7 @@ describe("RealtimeModule", () => {
165
272
  const handler1 = vi.fn();
166
273
  const handler2 = vi.fn();
167
274
 
275
+ await (realtime as any).connect();
168
276
  await realtime.on("test_event", handler1);
169
277
  await realtime.on("test_event", handler2);
170
278
 
@@ -182,11 +290,26 @@ describe("RealtimeModule", () => {
182
290
  expect(handler2).toHaveBeenCalledWith(payload);
183
291
  });
184
292
 
185
- it("should connect automatically when adding first handler", async () => {
293
+ it("does NOT connect when adding a handler — socket lifecycle is room-driven", async () => {
294
+ // The sync engine registers its handlers at construction; if that
295
+ // booted a socket, merely constructing a client for an unreachable
296
+ // host would start an unclosable infinite reconnect loop (the
297
+ // fixture/mock-story leak). Handlers wait for the first room join.
186
298
  const handler = vi.fn();
187
299
  await realtime.on("test_event", handler);
188
300
 
189
- expect(mockSocket.on).toHaveBeenCalledWith("connect", expect.any(Function));
301
+ expect(io).not.toHaveBeenCalled();
302
+ expect((realtime as any).socket).toBeUndefined();
303
+ });
304
+
305
+ it("attaches handlers registered before the first room join once it connects", async () => {
306
+ const handler = vi.fn();
307
+ await realtime.on("pre_join_event", handler);
308
+ expect(io).not.toHaveBeenCalled();
309
+
310
+ await realtime.subscribeList("Task");
311
+
312
+ expect(mockSocket.on).toHaveBeenCalledWith("pre_join_event", expect.any(Function));
190
313
  });
191
314
  });
192
315
 
@@ -195,6 +318,7 @@ describe("RealtimeModule", () => {
195
318
  const handler1 = vi.fn();
196
319
  const handler2 = vi.fn();
197
320
 
321
+ await (realtime as any).connect();
198
322
  await realtime.on("test_event", handler1);
199
323
  await realtime.on("test_event", handler2);
200
324
 
@@ -217,6 +341,7 @@ describe("RealtimeModule", () => {
217
341
  it("should remove socket listener when last handler is removed", async () => {
218
342
  const handler = vi.fn();
219
343
 
344
+ await (realtime as any).connect();
220
345
  await realtime.on("test_event", handler);
221
346
  realtime.off("test_event", handler);
222
347
 
@@ -228,6 +353,7 @@ describe("RealtimeModule", () => {
228
353
  const handler1 = vi.fn();
229
354
  const handler2 = vi.fn();
230
355
 
356
+ await (realtime as any).connect();
231
357
  await realtime.on("test_event", handler1);
232
358
  await realtime.on("test_event", handler2);
233
359
 
@@ -249,10 +375,8 @@ describe("RealtimeModule", () => {
249
375
  (realtime as any).socketHealthy = true;
250
376
 
251
377
  await realtime.subscribeDoc("Task", "TASK-001");
252
- expect(mockSocket.emit).toHaveBeenCalledWith("doc_subscribe", {
253
- doctype: "Task",
254
- name: "TASK-001",
255
- });
378
+ // Positional args — frappe's socketio handler signature is (doctype, docname)
379
+ expect(mockSocket.emit).toHaveBeenCalledWith("doc_subscribe", "Task", "TASK-001");
256
380
  });
257
381
 
258
382
  it("should emit doc_unsubscribe event", async () => {
@@ -261,10 +385,7 @@ describe("RealtimeModule", () => {
261
385
  (realtime as any).socket = mockSocket;
262
386
 
263
387
  realtime.unsubscribeDoc("Task", "TASK-001");
264
- expect(mockSocket.emit).toHaveBeenCalledWith("doc_unsubscribe", {
265
- doctype: "Task",
266
- name: "TASK-001",
267
- });
388
+ expect(mockSocket.emit).toHaveBeenCalledWith("doc_unsubscribe", "Task", "TASK-001");
268
389
  });
269
390
 
270
391
  it("should connect before subscribing if not connected", async () => {
@@ -274,26 +395,22 @@ describe("RealtimeModule", () => {
274
395
  });
275
396
 
276
397
  describe("subscribeList / unsubscribeList", () => {
277
- it("should emit list_subscribe event", async () => {
398
+ it("should emit doctype_subscribe event", async () => {
278
399
  mockSocket.connected = true;
279
400
  (realtime as any).socketHealthy = true;
280
401
 
281
402
  await realtime.subscribeList("Task", { status: "Open" });
282
- expect(mockSocket.emit).toHaveBeenCalledWith("list_subscribe", {
283
- doctype: "Task",
284
- filters: { status: "Open" },
285
- });
403
+ // frappe has one realtime room per doctype; filters stay client-side
404
+ expect(mockSocket.emit).toHaveBeenCalledWith("doctype_subscribe", "Task");
286
405
  });
287
406
 
288
- it("should emit list_unsubscribe event", async () => {
407
+ it("should emit doctype_unsubscribe event", async () => {
289
408
  mockSocket.connected = true;
290
409
  (realtime as any).socketHealthy = true;
291
410
  (realtime as any).socket = mockSocket;
292
411
 
293
412
  realtime.unsubscribeList("Task");
294
- expect(mockSocket.emit).toHaveBeenCalledWith("list_unsubscribe", {
295
- doctype: "Task",
296
- });
413
+ expect(mockSocket.emit).toHaveBeenCalledWith("doctype_unsubscribe", "Task");
297
414
  });
298
415
  });
299
416
 
@@ -347,6 +464,7 @@ describe("RealtimeModule", () => {
347
464
  const handler1 = vi.fn();
348
465
  const handler2 = vi.fn();
349
466
 
467
+ await (realtime as any).connect();
350
468
  await realtime.on("event1", handler1);
351
469
  await realtime.on("event2", handler2);
352
470
 
@@ -449,5 +567,331 @@ describe("RealtimeModule", () => {
449
567
  expect(event1Calls.length).toBe(0);
450
568
  expect(event2Calls.length).toBe(0);
451
569
  });
570
+
571
+ it("should re-emit doc and list subscriptions on reconnect", async () => {
572
+ await realtime.subscribeDoc("Task", "TASK-001");
573
+ await realtime.subscribeList("Task", { status: "Open" });
574
+
575
+ // Drain the initial subscribe emits from the first connect
576
+ await new Promise((r) => setTimeout(r, 10));
577
+ mockSocket.emit.mockClear();
578
+
579
+ // Simulate transport recovery: soft path keeps rooms, reconnect re-emits them
580
+ (realtime as any).socket = undefined;
581
+ (realtime as any).socketHealthy = false;
582
+ (realtime as any).isConnecting = false;
583
+ await (realtime as any).connect();
584
+ const connectHandler = mockSocket.on.mock.calls.find(
585
+ (call: any[]) => call[0] === "connect",
586
+ )?.[1];
587
+ connectHandler?.();
588
+
589
+ expect(mockSocket.emit).toHaveBeenCalledWith("doc_subscribe", "Task", "TASK-001");
590
+ expect(mockSocket.emit).toHaveBeenCalledWith("doctype_subscribe", "Task");
591
+ });
592
+ });
593
+
594
+ describe("updateAuth", () => {
595
+ it("should reconnect and preserve handlers after auth refresh", async () => {
596
+ const handler = vi.fn();
597
+ // A live room keeps the socket warranted across the rotation.
598
+ await realtime.subscribeList("Task");
599
+ await realtime.on("doc_changed", handler);
600
+ await new Promise((r) => setTimeout(r, 10));
601
+
602
+ mockSocket.disconnect.mockClear();
603
+ mockSocket.on.mockClear();
604
+
605
+ await realtime.updateAuth({
606
+ useToken: true,
607
+ token: "new-token",
608
+ type: "token" as any,
609
+ });
610
+
611
+ // Soft disconnect tears down the socket but keeps handlers
612
+ expect(mockSocket.disconnect).toHaveBeenCalled();
613
+ // New connect should re-attach the preserved handler
614
+ const reattached = mockSocket.on.mock.calls.some((call: any[]) => call[0] === "doc_changed");
615
+ expect(reattached).toBe(true);
616
+ });
617
+
618
+ it("does not boot a socket on auth rotation while idle (no rooms)", async () => {
619
+ const handler = vi.fn();
620
+ await realtime.on("doc_changed", handler);
621
+ expect((realtime as any).socket).toBeUndefined();
622
+
623
+ await realtime.updateAuth({ useToken: true, token: "rotated" });
624
+
625
+ // Still idle: the next room join will connect with the fresh auth.
626
+ expect((realtime as any).socket).toBeUndefined();
627
+ expect(io).not.toHaveBeenCalled();
628
+ });
629
+
630
+ it("should reconnect when only room subscriptions exist (no handlers)", async () => {
631
+ mockSocket.connected = true;
632
+ (realtime as any).socketHealthy = true;
633
+ (realtime as any).socket = mockSocket;
634
+ await realtime.subscribeDoc("Task", "TASK-009");
635
+
636
+ mockSocket.disconnect.mockClear();
637
+ await realtime.updateAuth({ useToken: true, token: "rotated" });
638
+
639
+ expect(mockSocket.disconnect).toHaveBeenCalled();
640
+ // Rooms preserved → soft reconnect opened a new socket
641
+ expect((realtime as any).socket).toBeDefined();
642
+ expect((realtime as any).docRooms.size).toBe(1);
643
+ });
644
+ });
645
+
646
+ describe("subscribe before healthy", () => {
647
+ it("should emit doc_subscribe after the connect event (no race no-op)", async () => {
648
+ const subscribePromise = realtime.subscribeDoc("Task", "TASK-RACE");
649
+ // Connect handler is scheduled via setTimeout(0) in the mock
650
+ await subscribePromise;
651
+
652
+ expect(mockSocket.emit).toHaveBeenCalledWith("doc_subscribe", "Task", "TASK-RACE");
653
+ });
654
+ });
655
+
656
+ describe("idle teardown", () => {
657
+ it("tears the socket down when the last room is unsubscribed", async () => {
658
+ await realtime.subscribeDoc("Task", "TASK-001");
659
+ await new Promise((r) => setTimeout(r, 10));
660
+ expect((realtime as any).socket).toBeDefined();
661
+
662
+ mockSocket.disconnect.mockClear();
663
+ realtime.unsubscribeDoc("Task", "TASK-001");
664
+
665
+ expect(mockSocket.disconnect).toHaveBeenCalled();
666
+ expect((realtime as any).socket).toBeUndefined();
667
+ });
668
+
669
+ it("keeps the socket while any room remains", async () => {
670
+ await realtime.subscribeDoc("Task", "TASK-001");
671
+ await realtime.subscribeList("Task");
672
+ await new Promise((r) => setTimeout(r, 10));
673
+
674
+ mockSocket.disconnect.mockClear();
675
+ realtime.unsubscribeDoc("Task", "TASK-001");
676
+
677
+ // The doctype room still holds the socket open.
678
+ expect(mockSocket.disconnect).not.toHaveBeenCalled();
679
+ expect((realtime as any).socket).toBeDefined();
680
+ });
681
+
682
+ it("notifies lifecycle handlers on idle teardown", async () => {
683
+ const onDisconnect = vi.fn();
684
+ await realtime.on("disconnect", onDisconnect);
685
+ await realtime.subscribeList("Task");
686
+ await new Promise((r) => setTimeout(r, 10));
687
+
688
+ realtime.unsubscribeList("Task");
689
+
690
+ expect(onDisconnect).toHaveBeenCalledWith({ reason: "idle-teardown" });
691
+ });
692
+
693
+ it("reconnects with preserved handlers on the next subscription after teardown", async () => {
694
+ const handler = vi.fn();
695
+ await realtime.on("doc_update", handler);
696
+ await realtime.subscribeList("Task");
697
+ await new Promise((r) => setTimeout(r, 10));
698
+ realtime.unsubscribeList("Task");
699
+ expect((realtime as any).socket).toBeUndefined();
700
+
701
+ mockSocket.on.mockClear();
702
+ await realtime.subscribeList("ToDo");
703
+ await new Promise((r) => setTimeout(r, 10));
704
+
705
+ expect((realtime as any).socket).toBeDefined();
706
+ expect(mockSocket.on).toHaveBeenCalledWith("doc_update", expect.any(Function));
707
+ });
708
+ });
709
+
710
+ describe("connect_error", () => {
711
+ it("should forward connect_error to registered handlers", async () => {
712
+ const onError = vi.fn();
713
+ await (realtime as any).connect();
714
+ await realtime.on("connect_error", onError);
715
+
716
+ const errorHandler = mockSocket.on.mock.calls.find(
717
+ (call: any[]) => call[0] === "connect_error",
718
+ )?.[1];
719
+ const err = new Error("auth failed");
720
+ errorHandler?.(err);
721
+
722
+ expect(onError).toHaveBeenCalledWith(err);
723
+ });
724
+ });
725
+
726
+ describe("token auth handshake", () => {
727
+ function ioOptions(): Record<string, any> {
728
+ const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
729
+ return calls[calls.length - 1]?.[1] ?? {};
730
+ }
731
+
732
+ it("attaches Authorization (never Origin) and handshakes over polling on web", async () => {
733
+ mockSocket.io.opts = {};
734
+ const rt = new RealtimeModule({
735
+ baseURL: "http://localhost:3000",
736
+ auth: { useToken: true, token: async () => "tok-1" },
737
+ });
738
+ await (rt as any).connect();
739
+
740
+ const options = ioOptions();
741
+ // Browsers can only attach headers to the polling (XHR) handshake —
742
+ // websocket upgrade rides the established session afterwards.
743
+ expect(options.transports).toEqual(["polling", "websocket"]);
744
+ expect(options.extraHeaders.Authorization).toBe("Bearer tok-1");
745
+ // Origin is a forbidden browser header: the browser always sends the
746
+ // page origin itself, and attempting to set it spams "Attempt to set a
747
+ // forbidden header was denied: Origin" on every polling request.
748
+ expect(options.extraHeaders.Origin).toBeUndefined();
749
+ // Headers are mirrored per-transport for node websocket handshakes
750
+ expect(options.transportOptions.polling.extraHeaders.Authorization).toBe("Bearer tok-1");
751
+ expect(options.transportOptions.websocket.extraHeaders.Authorization).toBe("Bearer tok-1");
752
+ rt.disconnect();
753
+ });
754
+
755
+ it("sets no forbidden header on web in any transport option (Origin, Cookie)", async () => {
756
+ const rt = new RealtimeModule({
757
+ baseURL: "http://localhost:3000",
758
+ auth: { useToken: true, token: "key:secret", type: "token" as any, sessionId: "sid-x" },
759
+ });
760
+ await (rt as any).connect();
761
+
762
+ const options = ioOptions();
763
+ expect(options.extraHeaders.Origin).toBeUndefined();
764
+ expect(options.extraHeaders.Cookie).toBeUndefined();
765
+ expect(options.transportOptions.polling.extraHeaders.Origin).toBeUndefined();
766
+ expect(options.transportOptions.polling.extraHeaders.Cookie).toBeUndefined();
767
+ expect(options.transportOptions.websocket.extraHeaders.Origin).toBeUndefined();
768
+ rt.disconnect();
769
+ });
770
+
771
+ it("derives the socket host from baseURL (LAN page → LAN socket)", async () => {
772
+ // The dev wrapper rewrites a loopback baseURL to the page hostname
773
+ // (features/backoffice/shared/env.ts); the socket must follow that
774
+ // hostname with the socketPort swapped in — not stay on localhost.
775
+ const rt = new RealtimeModule({
776
+ baseURL: "http://10.236.0.10:8000",
777
+ socketPort: 9000,
778
+ });
779
+ await (rt as any).connect();
780
+
781
+ const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
782
+ expect(calls[calls.length - 1]?.[0]).toBe("http://10.236.0.10:9000/10.236.0.10");
783
+ rt.disconnect();
784
+ });
785
+
786
+ it("uses the token scheme when auth type is token", async () => {
787
+ const rt = new RealtimeModule({
788
+ baseURL: "http://localhost:3000",
789
+ auth: { useToken: true, token: "key:secret", type: "token" as any },
790
+ });
791
+ await (rt as any).connect();
792
+
793
+ expect(ioOptions().extraHeaders.Authorization).toBe("token key:secret");
794
+ rt.disconnect();
795
+ });
796
+
797
+ it("handshakes polling-first on web even without token auth", async () => {
798
+ // Cookie-session auth and reverse-proxy-injected Authorization only
799
+ // ride HTTP requests, and ws-upgrade-hostile dev proxies (vite
800
+ // middleware mode) hang raw upgrades — browsers always start on
801
+ // polling and let Socket.IO upgrade the established session.
802
+ const rt = new RealtimeModule({ baseURL: "http://localhost:3000" });
803
+ await (rt as any).connect();
804
+
805
+ expect(ioOptions().transports).toEqual(["polling", "websocket"]);
806
+ rt.disconnect();
807
+ });
808
+
809
+ it("keeps websocket-first transports off-web (node)", async () => {
810
+ const rt = new RealtimeModule({
811
+ baseURL: "http://localhost:3000",
812
+ platform: RealtimePlatform.Node,
813
+ });
814
+ await (rt as any).connect();
815
+
816
+ expect(ioOptions().transports).toEqual(["websocket", "polling"]);
817
+ rt.disconnect();
818
+ });
819
+
820
+ it("omits Authorization when the token getter resolves empty (signed out)", async () => {
821
+ const rt = new RealtimeModule({
822
+ baseURL: "http://localhost:3000",
823
+ auth: { useToken: true, token: async () => "" },
824
+ });
825
+ await (rt as any).connect();
826
+
827
+ expect(ioOptions().extraHeaders?.Authorization).toBeUndefined();
828
+ rt.disconnect();
829
+ });
830
+
831
+ it("re-resolves the token into manager opts on disconnect (refresh mid-session)", async () => {
832
+ let calls = 0;
833
+ const token = async () => (++calls === 1 ? "tok-1" : "tok-2");
834
+ mockSocket.io.opts = {};
835
+ const rt = new RealtimeModule({
836
+ baseURL: "http://localhost:3000",
837
+ auth: { useToken: true, token },
838
+ });
839
+ await (rt as any).connect();
840
+ expect(ioOptions().extraHeaders.Authorization).toBe("Bearer tok-1");
841
+
842
+ // Simulate a transport drop: the disconnect handler must refresh the
843
+ // credentials in the live manager opts before socket.io retries.
844
+ const disconnectHandler = mockSocket.on.mock.calls.find(
845
+ (call: any[]) => call[0] === "disconnect",
846
+ )?.[1];
847
+ disconnectHandler?.("transport close");
848
+ await (rt as any).refreshSocketAuth();
849
+
850
+ const opts = mockSocket.io.opts as any;
851
+ expect(opts.extraHeaders.Authorization).toBe("Bearer tok-2");
852
+ expect(opts.transportOptions.polling.extraHeaders.Authorization).toBe("Bearer tok-2");
853
+ rt.disconnect();
854
+ });
855
+
856
+ it("registers a reconnect_attempt refresh hook on the manager", async () => {
857
+ mockSocket.io.opts = {};
858
+ mockSocket.io.on.mockClear();
859
+ let calls = 0;
860
+ const token = async () => `tok-${++calls}`;
861
+ const rt = new RealtimeModule({
862
+ baseURL: "http://localhost:3000",
863
+ auth: { useToken: true, token },
864
+ });
865
+ await (rt as any).connect();
866
+
867
+ const reconnectHook = mockSocket.io.on.mock.calls.find(
868
+ (call: any[]) => call[0] === "reconnect_attempt",
869
+ )?.[1];
870
+ expect(reconnectHook).toBeDefined();
871
+
872
+ reconnectHook?.();
873
+ await (rt as any).refreshSocketAuth();
874
+
875
+ const opts = mockSocket.io.opts as any;
876
+ expect(opts.extraHeaders.Authorization).toBe("Bearer tok-2");
877
+ rt.disconnect();
878
+ });
879
+
880
+ it("preserves rooms across explicit token rotation (updateAuth)", async () => {
881
+ const rt = new RealtimeModule({
882
+ baseURL: "http://localhost:3000",
883
+ auth: { useToken: true, token: "old-token" },
884
+ });
885
+ await rt.subscribeDoc("Task", "TASK-100");
886
+ await rt.subscribeList("Task");
887
+ await new Promise((r) => setTimeout(r, 10));
888
+
889
+ await rt.updateAuth({ useToken: true, token: "new-token" });
890
+
891
+ expect((rt as any).docRooms.size).toBe(1);
892
+ expect((rt as any).listRooms.size).toBe(1);
893
+ expect(ioOptions().extraHeaders.Authorization).toBe("Bearer new-token");
894
+ rt.disconnect();
895
+ });
452
896
  });
453
897
  });