meadow 2.0.43 → 2.0.45

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 (62) hide show
  1. package/README.md +2 -3
  2. package/docs/architecture.md +10 -99
  3. package/docs/diagrams/create-waterfall.excalidraw +2016 -0
  4. package/docs/diagrams/create-waterfall.mmd +19 -0
  5. package/docs/diagrams/create-waterfall.svg +2 -0
  6. package/docs/diagrams/crud-behavior-flow.excalidraw +1305 -0
  7. package/docs/diagrams/crud-behavior-flow.mmd +13 -0
  8. package/docs/diagrams/crud-behavior-flow.svg +2 -0
  9. package/docs/diagrams/module-hierarchy.excalidraw +1582 -0
  10. package/docs/diagrams/module-hierarchy.mmd +15 -0
  11. package/docs/diagrams/module-hierarchy.svg +2 -0
  12. package/docs/diagrams/query-lifecycle.excalidraw +1808 -0
  13. package/docs/diagrams/query-lifecycle.mmd +21 -0
  14. package/docs/diagrams/query-lifecycle.svg +2 -0
  15. package/docs/diagrams/schema-system.excalidraw +2034 -0
  16. package/docs/diagrams/schema-system.mmd +21 -0
  17. package/docs/diagrams/schema-system.svg +2 -0
  18. package/docs/providers/README.md +6 -14
  19. package/docs/providers/diagrams/overview.excalidraw +1324 -0
  20. package/docs/providers/diagrams/overview.mmd +8 -0
  21. package/docs/providers/diagrams/overview.svg +2 -0
  22. package/docs/providers/diagrams/use-case-unified-client-server-interface.excalidraw +919 -0
  23. package/docs/providers/diagrams/use-case-unified-client-server-interface.mmd +12 -0
  24. package/docs/providers/diagrams/use-case-unified-client-server-interface.svg +2 -0
  25. package/docs/providers/meadow-endpoints.md +5 -17
  26. package/docs/providers/mongodb.md +2 -2
  27. package/docs/providers/mssql.md +1 -1
  28. package/docs/providers/mysql.md +1 -1
  29. package/docs/providers/postgresql.md +2 -2
  30. package/docs/providers/rocksdb.md +1 -1
  31. package/docs/providers/sqlite.md +1 -1
  32. package/docs/query/README.md +1 -1
  33. package/docs/query/count.md +2 -8
  34. package/docs/query/create.md +2 -12
  35. package/docs/query/diagrams/how-it-works-2.excalidraw +1097 -0
  36. package/docs/query/diagrams/how-it-works-2.mmd +10 -0
  37. package/docs/query/diagrams/how-it-works-2.svg +2 -0
  38. package/docs/query/diagrams/how-it-works-3.excalidraw +665 -0
  39. package/docs/query/diagrams/how-it-works-3.mmd +6 -0
  40. package/docs/query/diagrams/how-it-works-3.svg +2 -0
  41. package/docs/query/diagrams/how-it-works-4.excalidraw +881 -0
  42. package/docs/query/diagrams/how-it-works-4.mmd +8 -0
  43. package/docs/query/diagrams/how-it-works-4.svg +2 -0
  44. package/docs/query/diagrams/how-it-works-5.excalidraw +881 -0
  45. package/docs/query/diagrams/how-it-works-5.mmd +8 -0
  46. package/docs/query/diagrams/how-it-works-5.svg +2 -0
  47. package/docs/query/diagrams/how-it-works.excalidraw +665 -0
  48. package/docs/query/diagrams/how-it-works.mmd +6 -0
  49. package/docs/query/diagrams/how-it-works.svg +2 -0
  50. package/docs/query/read.md +4 -18
  51. package/docs/query/update.md +2 -10
  52. package/docs/query-dsl.md +1 -1
  53. package/docs/quick-start.md +1 -1
  54. package/docs/retold-catalog.json +1 -1
  55. package/docs/retold-keyword-index.json +1 -1
  56. package/docs/schema/README.md +2 -7
  57. package/docs/schema/diagrams/overview.excalidraw +834 -0
  58. package/docs/schema/diagrams/overview.mmd +5 -0
  59. package/docs/schema/diagrams/overview.svg +2 -0
  60. package/package.json +3 -3
  61. package/source/providers/Meadow-Provider-MeadowEndpoints.js +52 -7
  62. package/test/Meadow-Provider-MeadowEndpoints-Session_tests.js +198 -0
@@ -0,0 +1,5 @@
1
+ Schema Definition
2
+ ├── Column Schema (array) -> Defines columns, types, and sizes
3
+ ├── JSON Schema (object) -> Validates objects against JSON Schema v4
4
+ ├── Default Object (object) -> Template merged with new records on create
5
+ └── Authorizer (object) -> Role-based access control per operation
@@ -0,0 +1,2 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 792 188" width="792" height="188"><!-- svg-source:excalidraw --><metadata><!-- payload-type:application/vnd.excalidraw+json --><!-- payload-version:2 --><!-- payload-start -->eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXFtzmzhcdTAwMTR+z69gvC+7M3GKLkiQh53JzdvLtt1pOrtcdTAwMGY7fVBAsdlgYEBOmnb631fCjoVcdTAwMDFcdTAwMTewaUpakpkk6MbR0fehcz7kfD4wjJG4j/no2Fx1MDAxOPGPLlx1MDAwYnwvYXejQ1V+y5PUj0JZXHUwMDA1s+s0WiRu1nImRHz87Fx1MDAxOYD0yJTf4NiiXHUwMDE4gGUvXHUwMDFl8DlcdTAwMGZFKtv9K69ccuNz9lPW+J7qey3GYeTxsVx1MDAwNVDWIatam1x1MDAxMFx1MDAwNH6ccl3xUd1cdTAwMWSvL+/lJTLXl3e+J2ayyF6XzLg/nYmNXCJcdTAwMTZOXHUwMDAzNbjulookuuFnUVx1MDAxMCXqpr+cOcSEXHUwMDEzfdMr5t5Mk2hcdTAwMTF629tcXPtBcCnus5GlZ6TfRoXx/1lcdTAwMTlcdTAwMDeOcKFmWz95y+ks5Gm6YW1cdTAwMTQz11x1MDAxN2rmwNSlyr74hZe5+YO2KmFz/kL5OVxcXHUwMDA0QX7g0FtccrxRkXKuXHUwMDFhy7VYXHUwMDE3XHUwMDE1Vj1f9iZcbrP1XHUwMDA30CZcdTAwMTRAZOpcdTAwMTZ+ei5cdTAwMTdeZKNdsyDl2pnq3lx1MDAxNzlQaGtcdTAwMTexx5ZdXHUwMDAwtU1sOSagZm6OgVx1MDAxZt5cdTAwMTQtXHUwMDBlXCL3puIufuhxhZVcdTAwMTEzR1nZl8Nt4JNcdTAwMWVcdTAwMWGbZehcdP5RbOJcdTAwMGXTXHLcQVDCXHUwMDFkNElcdTAwMTl5sGPoiYSFacxcdTAwMTLpv53gt1x1MDAwM/jAY4JcdTAwMGZcdTAwMDPcXG58iFBMILJJb8CXQUd69NKd8Tkzzvm1XHUwMDFm+kLNQ/smXG7Fpf+JZ6DZKJ2wuVx1MDAxZihcdTAwMDdbXHUwMDFi451cdTAwMDT+VPlhXHUwMDE08OvcuktnXGJfPqbX1VwiinWtK8djfsiT8ipEiT/1Q1x1MDAxNryvt5UtRPSOp0trRbLgeZ/w51x1MDAwZjhcdTAwMDdHUJus+Vx1MDAwN2r4x4Or8e1cdTAwMTiUXHSoXHUwMDA2Lzz4NZMyXHUwMDA3lVx0qF25plx1MDAxZtJG1dPPPqFcdTAwMTNcbvek34y5s0XCtz//UaGm0fP/SM/jXHUwMDExSOiQXHUwMDEy4b5KQotcdTAwMDJcdTAwMDdcdTAwMTMzt1x1MDAxN39vXHUwMDEyalx1MDAwNObWM478fCiivvRfhlx1MDAwNkZ2sf77w2F9a2Tp5lx1MDAwN4Vuo4Cl4iyaz30hJ/eXsqHkdsFcdTAwMTJxKm32w2mxjofelpqs10mSRHczzkprLPttrYuj4H6arWnmtXqKznaiKHFKXHUwMDE0XHUwMDA1XHUwMDE1W6Re4IGiLSjaKkiDwLFcdTAwMWOLOHqB+sNQ9I1cdTAwMTiqsVZo/qMxNMuggGnBhimUtZlCXHUwMDExXHLcjlKoXHUwMDA2LC21+aFSKLVcdTAwMTitdlCIiVx1MDAwNUgvN1DcJIWq2Fx1MDAxZcopXHUwMDE03UyhLFLCXHUwMDFkzLltt1x1MDAxNFxunIJcdEQ/dVxu5Vjt8ndHhm9cYlx1MDAxMbs/+ftDXG4ll2wxXHUwMDBmjVV28itLXHUwMDEydv9bj9OoXHUwMDFhe/dLpaxcdTAwMWFcdTAwMWW6c9GMhohqZ2U+KodpXGJrXGJpXHUwMDFlaoA8UqD21HnYSsogjoOgNKZ/Ssb496UywFPDzVx1MDAxMJ5cdTAwMWVcdTAwMWFcbl7yXHUwMDE3XHUwMDBiPUNcdTAwMDE6rWRlLtr/jqxsZ/5+JCWN9I6KQK02mbLLu+Wgd3TEVFx1MDAwMuw87GqZXG5tXHUwMDFiUJpTKr83UzVcdTAwMDDpIHd0IXfswlBgakBcZnpH51x1MDAxNNVRSpOgXHUwMDE2QMtxXHUwMDAwIf1cdGo1R+1B8OhA8KCmXSZpXHUwMDEzvSOP0UHw6IaecjHa0Fx1MDAxM5rUsYlcdTAwMDNoXHUwMDFmXHUwMDA1XHUwMDBmp4ngUbFB1FxuXHUwMDFlTsU7Y1xcXHUwMDExxFxygkfLvcFstTcgi1x1MDAxMEox7M/W8JBovbx8+2atXHUwMDFlRFf/cVf0We74urn7JVInXHLUjkZcdTAwMWMsqlx1MDAxZE45SMNmxeN/UDvaXHUwMDA2aGZcdTAwMWVhdSSkjoNcdTAwMTFAuJdqx9/q5JtcdTAwMWM3NZaoTlxyNpWcSIWRh/wt7rfo0X5cdTAwMTb7Ufa0kfZRcc6vPrOqOG01iFx1MDAxZlx1MDAxZFx1MDAxMVx1MDAxN1x1MDAxMZKHX/2rKkBsXHUwMDA0bKuP6sfZoH50oX7sxFE0nPb4hlx1MDAxY9WZRFx1MDAxM47a6m2ySrF6yNHzQf3oQP3AXHUwMDE22VH9QMNxj67pia1WWyikwDFcdTAwMWS7R2/6NDsvmohcdTAwMWZcdTAwMTX7Q634XHUwMDAxYMVxXHUwMDBmapWRN6hcdTAwMWYt91x1MDAwNqvV3lx1MDAwME3bXCJcdTAwMTTiXHUwMDFlXHUwMDFkXHUwMDA1fMi8zvk1W1x1MDAwNMJ4m6UrT0FcdTAwMDGptXi/jGrSQFx1MDAwNGnExaJcYlx1MDAwMmA5WMOw6uMrg1xu0pKMrXRwgFx1MDAwMJFUNHukg+dkkPd8XHUwMDFlXHUwMDA3clxcY86TKfeMO1/MjJDfXHUwMDE5XHR3o8RLjSg03ITLXHUwMDE2/Vx1MDAxNkJ2mcd+xP2jkVx1MDAxNILL1K1PsypOTVZIIaDj+O3nSLMgbffhM2hSgm2I+/MmQUPw+WNIIcDWzVx1MDAwZlxu3Z56mrWUQnbiKFx1MDAxZFx1MDAwZYJ8Q47q2zXgqIMxIZj06GWfpuiLQVx06UBcdEGkgqONlJBcXNQ1KCFdXHSVrXZQiGxgXHUwMDEzp5efe3nZRFx0qYBevVx1MDAxMkIqzoHkXHUwMDEyskFcdNl1ayCttlx1MDAwNmhigJBcdHukkj8kXydcdTAwMGIxk4nMJ548XHUwMDA1XHUwMDE15KvW7pdIvWqggDTiYElcdTAwMDEh5Vx1MDAxOFxyOcM5kFx1MDAwZUjY7nWyXHUwMDAzsIVMQvvzOjmngLyLXHUwMDAyPr5iKfdcZua6ctKGokVcdTAwMTJcdTAwMDVGLMFcdTAwMWXJXHUwMDFmbOt/9uiN/NF6XHUwMDEy+1H2z1x1MDAxNWVcdTAwMGZWgeaIxfGlUOLK8YrAXHUwMDEycL5XeIIty1x1MDAwNI+1h7Ki1zLEu1xi2VVQXFyo0a3P704r4qvJ6YReXFysZrNa49eLQPiXXHUwMDEyVa6aqYLOZ2Vf9lhR5OOroi//XHUwMDAzo93UWSJ9<!-- payload-end --><pict-renderer-graph:source xmlns:pict-renderer-graph="https://fable-retold.github.io/pict-renderer-graph/ns/v1"><![CDATA[{"type":"filetree","mermaid":"Schema Definition\n ├── Column Schema (array) -> Defines columns, types, and sizes\n ├── JSON Schema (object) -> Validates objects against JSON Schema v4\n ├── Default Object (object) -> Template merged with new records on create\n └── Authorizer (object) -> Role-based access control per operation\n","style":"notebook"}]]></pict-renderer-graph:source></metadata><defs><style class="style-fonts">
2
+ @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); }</style></defs><g stroke-linecap="round" transform="translate(10 19) rotate(0 4 4)"><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="none" stroke-width="0" fill="var(--diagram-accent, #C9602F)"/><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="var(--diagram-accent, #C9602F)" stroke-width="1.4" fill="none"/></g><g transform="translate(33 10) rotate(0 103 14)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-accent, #C9602F)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Schema Definition</text></g><g stroke-linecap="round"><g transform="translate(14 40) rotate(0 -0.11730230889380344 17.5)"><path d="M0 0 C-0.28 7.47, -0.35 14.55, 0 35 M0 0 C0 9.13, -0.08 18.14, 0 35" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(14 58) rotate(0 8 0.02193744430524447)"><path d="M0 0 C3.58 0.08, 6.55 0.06, 16 0 M0 0 C5.46 0.13, 10.59 -0.05, 16 0" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round" transform="translate(40 54) rotate(0 4 4)"><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="none" stroke-width="0" fill="var(--diagram-deemphasis, #8A7F72)"/><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.4" fill="none"/></g><g transform="translate(63 45) rotate(0 126 14)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Column Schema (array)</text></g><g transform="translate(356 48) rotate(0 171.5 11)"><text x="0" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-deemphasis, #8A7F72)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">-&gt; Defines columns, types, and sizes</text></g><g stroke-linecap="round"><g transform="translate(14 75) rotate(0 0.017623624040256303 17.5)"><path d="M0 0 C-0.04 7.52, 0.11 14.4, 0 35 M0 0 C0.09 10.46, 0.01 20.4, 0 35" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(14 93) rotate(0 8 -0.02947472612343205)"><path d="M0 0 C2.97 0.15, 6.1 0.02, 16 0 M0 0 C5.71 -0.18, 11.79 -0.17, 16 0" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round" transform="translate(40 89) rotate(0 4 4)"><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="none" stroke-width="0" fill="var(--diagram-deemphasis, #8A7F72)"/><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.4" fill="none"/></g><g transform="translate(63 80) rotate(0 120 14)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">JSON Schema (object)</text></g><g transform="translate(356 83) rotate(0 204 11)"><text x="0" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-deemphasis, #8A7F72)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">-&gt; Validates objects against JSON Schema v4</text></g><g stroke-linecap="round"><g transform="translate(14 110) rotate(0 0.02587434698974711 17.5)"><path d="M0 0 C-0.13 6.75, 0.18 14.05, 0 35 M0 0 C0.23 12.03, -0.1 24.23, 0 35" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(14 128) rotate(0 8 0.02390454490115701)"><path d="M0 0 C2.95 0.33, 6.18 -0.24, 16 0 M0 0 C3.55 -0.14, 7.14 0.07, 16 0" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round" transform="translate(40 124) rotate(0 4 4)"><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="none" stroke-width="0" fill="var(--diagram-deemphasis, #8A7F72)"/><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.4" fill="none"/></g><g transform="translate(63 115) rotate(0 137.5 14)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Default Object (object)</text></g><g transform="translate(356 118) rotate(0 213 11)"><text x="0" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-deemphasis, #8A7F72)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">-&gt; Template merged with new records on create</text></g><g stroke-linecap="round"><g transform="translate(14 145) rotate(0 -0.016852893708810157 9)"><path d="M0 0 C0.18 3.2, -0.38 7.4, 0 18 M0 0 C0.17 5.76, 0.1 11.59, 0 18" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(14 163) rotate(0 8 0.0359022393515005)"><path d="M0 0 C3.17 0.22, 6.45 -0.01, 16 0 M0 0 C6.36 -0.09, 12.59 0.11, 16 0" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.3" fill="none"/></g></g><mask/><g stroke-linecap="round" transform="translate(40 159) rotate(0 4 4)"><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="none" stroke-width="0" fill="var(--diagram-deemphasis, #8A7F72)"/><path d="M8 4 C8 4.23, 7.98 4.47, 7.94 4.69 C7.9 4.92, 7.84 5.15, 7.76 5.37 C7.68 5.59, 7.58 5.8, 7.46 6 C7.35 6.2, 7.21 6.39, 7.06 6.57 C6.92 6.75, 6.75 6.92, 6.57 7.06 C6.39 7.21, 6.2 7.35, 6 7.46 C5.8 7.58, 5.59 7.68, 5.37 7.76 C5.15 7.84, 4.92 7.9, 4.69 7.94 C4.47 7.98, 4.23 8, 4 8 C3.77 8, 3.53 7.98, 3.31 7.94 C3.08 7.9, 2.85 7.84, 2.63 7.76 C2.41 7.68, 2.2 7.58, 2 7.46 C1.8 7.35, 1.61 7.21, 1.43 7.06 C1.25 6.92, 1.08 6.75, 0.94 6.57 C0.79 6.39, 0.65 6.2, 0.54 6 C0.42 5.8, 0.32 5.59, 0.24 5.37 C0.16 5.15, 0.1 4.92, 0.06 4.69 C0.02 4.47, 0 4.23, 0 4 C0 3.77, 0.02 3.53, 0.06 3.31 C0.1 3.08, 0.16 2.85, 0.24 2.63 C0.32 2.41, 0.42 2.2, 0.54 2 C0.65 1.8, 0.79 1.61, 0.94 1.43 C1.08 1.25, 1.25 1.08, 1.43 0.94 C1.61 0.79, 1.8 0.65, 2 0.54 C2.2 0.42, 2.41 0.32, 2.63 0.24 C2.85 0.16, 3.08 0.1, 3.31 0.06 C3.53 0.02, 3.77 0, 4 0 C4.23 0, 4.47 0.02, 4.69 0.06 C4.92 0.1, 5.15 0.16, 5.37 0.24 C5.59 0.32, 5.8 0.42, 6 0.54 C6.2 0.65, 6.39 0.79, 6.57 0.94 C6.75 1.08, 6.92 1.25, 7.06 1.43 C7.21 1.61, 7.35 1.8, 7.46 2 C7.58 2.2, 7.68 2.41, 7.76 2.63 C7.84 2.85, 7.9 3.08, 7.94 3.31 C7.98 3.53, 7.99 3.88, 8 4 C8.01 4.12, 8.01 3.88, 8 4" stroke="var(--diagram-deemphasis, #8A7F72)" stroke-width="1.4" fill="none"/></g><g transform="translate(63 150) rotate(0 114.5 14)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Authorizer (object)</text></g><g transform="translate(356 153) rotate(0 199 11)"><text x="0" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-deemphasis, #8A7F72)" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">-&gt; Role-based access control per operation</text></g></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meadow",
3
- "version": "2.0.43",
3
+ "version": "2.0.45",
4
4
  "description": "A data access library.",
5
5
  "main": "source/Meadow.js",
6
6
  "scripts": {
@@ -87,7 +87,7 @@
87
87
  "devDependencies": {
88
88
  "alasql": "^4.17.0",
89
89
  "dgraph-js-http": "^21.3.0",
90
- "fable": "^3.1.75",
90
+ "fable": "^3.1.77",
91
91
  "gulp-util": "^3.0.8",
92
92
  "meadow-connection-dgraph": "^1.0.3",
93
93
  "meadow-connection-mongodb": "^1.0.3",
@@ -102,7 +102,7 @@
102
102
  "mongodb": "^6.12.0",
103
103
  "mysql2": "^3.18.2",
104
104
  "oracledb": "^6.10.0",
105
- "pict-docuserve": "^1.4.12",
105
+ "pict-docuserve": "^1.4.19",
106
106
  "puppeteer": "^24.38.0",
107
107
  "quackage": "^1.3.0",
108
108
  "solr-client": "^0.9.0"
@@ -19,10 +19,10 @@ var MeadowProvider = function()
19
19
 
20
20
  var _Dialect = 'MeadowEndpoints';
21
21
 
22
- var _Headers = {};
23
- var _Cookies = [];
24
-
25
- var _EndpointSettings = (_Fable.settings.hasOwnProperty('MeadowEndpoints')) ? JSON.parse(JSON.stringify(_Fable.settings.MeadowEndpoints)) : (
22
+ // Static fallback configuration — used when no live connection instance
23
+ // is bound (standalone DAL usage). Settings are STATIC boot config:
24
+ // host/port/prefix only, never session state.
25
+ var _StaticEndpointSettings = (_Fable.settings.hasOwnProperty('MeadowEndpoints')) ? JSON.parse(JSON.stringify(_Fable.settings.MeadowEndpoints)) : (
26
26
  {
27
27
  ServerProtocol: 'http',
28
28
  ServerAddress: '127.0.0.1',
@@ -31,9 +31,39 @@ var MeadowProvider = function()
31
31
  }
32
32
  )
33
33
 
34
+ // Instance-driven configuration (preferred) — the same convention the
35
+ // SQL providers use (e.g. _Fable.MeadowMySQLProvider): the DAL's fable
36
+ // carries the live connection instance, which OWNS both the connection
37
+ // parameters and the session state (headers/cookies). Reading it per
38
+ // request means post-connect authentication and later cookie rotation
39
+ // always apply to the requests this provider makes.
40
+ var getConnectionInstance = function()
41
+ {
42
+ return (typeof(_Fable.MeadowMeadowEndpointsProvider) === 'object' && _Fable.MeadowMeadowEndpointsProvider !== null)
43
+ ? _Fable.MeadowMeadowEndpointsProvider : null;
44
+ };
45
+
46
+ var getEndpointSettings = function()
47
+ {
48
+ let tmpInstance = getConnectionInstance();
49
+ if (tmpInstance && typeof(tmpInstance.settings) === 'object' && tmpInstance.settings !== null)
50
+ {
51
+ return tmpInstance.settings;
52
+ }
53
+ return _StaticEndpointSettings;
54
+ };
55
+
34
56
  var buildURL = function(pAddress)
35
57
  {
36
- return `${_EndpointSettings.ServerProtocol}://${_EndpointSettings.ServerAddress}:${_EndpointSettings.ServerPort}/${_EndpointSettings.ServerEndpointPrefix}${pAddress}`;
58
+ let tmpEndpointSettings = getEndpointSettings();
59
+ let tmpURL = `${tmpEndpointSettings.ServerProtocol}://${tmpEndpointSettings.ServerAddress}:${tmpEndpointSettings.ServerPort}/${tmpEndpointSettings.ServerEndpointPrefix}${pAddress}`;
60
+ // e.g. 'skipDecoration=true' — lets machine-to-machine connections
61
+ // opt out of per-row presentation decoration the remote applies.
62
+ if (typeof(tmpEndpointSettings.AdditionalQueryString) === 'string' && tmpEndpointSettings.AdditionalQueryString.length > 0)
63
+ {
64
+ tmpURL += (tmpURL.indexOf('?') >= 0) ? `&${tmpEndpointSettings.AdditionalQueryString}` : `?${tmpEndpointSettings.AdditionalQueryString}`;
65
+ }
66
+ return tmpURL;
37
67
  };
38
68
 
39
69
  var buildRequestOptions = function(pQuery)
@@ -46,13 +76,28 @@ var MeadowProvider = function()
46
76
 
47
77
  let tmpURL = buildURL(pQuery.query.body);
48
78
 
79
+ let tmpInstance = getConnectionInstance();
80
+ let tmpHeaders = (tmpInstance && typeof(tmpInstance.headers) === 'object' && tmpInstance.headers !== null)
81
+ ? tmpInstance.headers : {};
82
+ let tmpCookies = (tmpInstance && Array.isArray(tmpInstance.cookies))
83
+ ? tmpInstance.cookies : [];
84
+
85
+ // Explicit timeout: Node 20+ installs a ~5s socket timeout on
86
+ // http.globalAgent; an explicit request timeout takes that default
87
+ // out of play (same workaround as fable's RestClient). Configurable
88
+ // per connection (settings.RequestTimeout) for slow decorated reads.
89
+ let tmpEndpointSettings = getEndpointSettings();
90
+ let tmpRequestTimeout = (typeof(tmpEndpointSettings.RequestTimeout) === 'number')
91
+ ? tmpEndpointSettings.RequestTimeout : 60000;
92
+
49
93
  let tmpRequestOptions = (
50
94
  {
51
95
  url: tmpURL,
52
- headers: _Fable.Utility.extend({cookie: ''}, _Headers)
96
+ headers: _Fable.Utility.extend({cookie: ''}, tmpHeaders),
97
+ timeout: tmpRequestTimeout
53
98
  });
54
99
 
55
- tmpRequestOptions.headers.cookie = _Cookies.join(';');
100
+ tmpRequestOptions.headers.cookie = tmpCookies.join(';');
56
101
 
57
102
 
58
103
  if (pQuery.logLevel > 0 ||
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Meadow MeadowEndpoints provider — instance-driven configuration tests.
3
+ *
4
+ * The provider follows the SQL-provider convention: the DAL's fable carries
5
+ * the live connection instance at fable.MeadowMeadowEndpointsProvider, which
6
+ * OWNS the connection parameters and the session state (headers/cookies) —
7
+ * read per request, so post-connect authentication and cookie rotation
8
+ * always apply. fable.settings.MeadowEndpoints remains the STATIC fallback
9
+ * for standalone DAL usage (host/port/prefix only; settings carry no session
10
+ * state).
11
+ *
12
+ * npx mocha test/Meadow-Provider-MeadowEndpoints-Session_tests.js -u tdd --exit
13
+ */
14
+
15
+ const Chai = require('chai');
16
+ const Expect = Chai.expect;
17
+ const libHttp = require('http');
18
+ const libFable = require('fable');
19
+ const libMeadow = require('../source/Meadow.js');
20
+
21
+ const ANIMAL_SCHEMA = require('./Animal.json');
22
+
23
+ let _Server = null;
24
+ let _ServerPort = 0;
25
+ let _LastRequest = null;
26
+
27
+ function startStubAPI()
28
+ {
29
+ return new Promise((fResolve) =>
30
+ {
31
+ _Server = libHttp.createServer((pRequest, pResponse) =>
32
+ {
33
+ _LastRequest = { URL: pRequest.url, Cookie: pRequest.headers.cookie || '', Headers: pRequest.headers };
34
+ pResponse.writeHead(200, { 'Content-Type': 'application/json' });
35
+ pResponse.end(JSON.stringify([ { IDAnimal: 1, Name: 'Stub' } ]));
36
+ });
37
+ _Server.listen(0, '127.0.0.1', () =>
38
+ {
39
+ _ServerPort = _Server.address().port;
40
+ fResolve();
41
+ });
42
+ });
43
+ }
44
+
45
+ function serverSettings()
46
+ {
47
+ return { ServerProtocol: 'http', ServerAddress: '127.0.0.1', ServerPort: String(_ServerPort), ServerEndpointPrefix: '1.0/' };
48
+ }
49
+
50
+ function buildDAL(pBoundInstance, pStaticSettings)
51
+ {
52
+ let tmpFable = new libFable(
53
+ {
54
+ Product: 'MeadowEndpointsInstanceTest',
55
+ LogStreams: [ { streamtype: 'console', level: 'fatal' } ],
56
+ MeadowEndpoints: pStaticSettings
57
+ });
58
+ if (pBoundInstance)
59
+ {
60
+ // The binding the dynamic-endpoint layer performs for live connections.
61
+ tmpFable.MeadowMeadowEndpointsProvider = pBoundInstance;
62
+ }
63
+ let tmpMeadow = libMeadow.new(tmpFable).loadFromPackageObject(ANIMAL_SCHEMA);
64
+ tmpMeadow.setProvider('MeadowEndpoints');
65
+ return tmpMeadow;
66
+ }
67
+
68
+ function readAnimals(pDAL)
69
+ {
70
+ return new Promise((fResolve) =>
71
+ {
72
+ pDAL.doReads(pDAL.query.clone().setCap(1), (pError, pQuery, pRecords) => fResolve({ Error: pError, Records: pRecords }));
73
+ });
74
+ }
75
+
76
+ suite('MeadowEndpoints provider instance-driven configuration', function ()
77
+ {
78
+ suiteSetup(async function () { await startStubAPI(); });
79
+ suiteTeardown(function () { if (_Server) { _Server.close(); } });
80
+ setup(function () { _LastRequest = null; });
81
+
82
+ test('a bound instance supplies connection parameters AND session cookies', async function ()
83
+ {
84
+ const tmpInstance = { settings: serverSettings(), headers: {}, cookies: [ 'UserSession=from-the-connector' ] };
85
+ await readAnimals(buildDAL(tmpInstance));
86
+ Expect(_LastRequest.Cookie).to.equal('UserSession=from-the-connector');
87
+ });
88
+
89
+ test('cookies set on the instance AFTER DAL init apply (post-connect auth)', async function ()
90
+ {
91
+ const tmpInstance = { settings: serverSettings(), headers: {}, cookies: [] };
92
+ const tmpDAL = buildDAL(tmpInstance);
93
+ tmpInstance.cookies.push('UserSession=established-later');
94
+ await readAnimals(tmpDAL);
95
+ Expect(_LastRequest.Cookie).to.equal('UserSession=established-later');
96
+ });
97
+
98
+ test('cookie ROTATION on the instance is visible on the next request', async function ()
99
+ {
100
+ const tmpInstance = { settings: serverSettings(), headers: {}, cookies: [ 'UserSession=first' ] };
101
+ const tmpDAL = buildDAL(tmpInstance);
102
+ await readAnimals(tmpDAL);
103
+ Expect(_LastRequest.Cookie).to.equal('UserSession=first');
104
+ tmpInstance.cookies.length = 0;
105
+ tmpInstance.cookies.push('UserSession=rotated');
106
+ await readAnimals(tmpDAL);
107
+ Expect(_LastRequest.Cookie).to.equal('UserSession=rotated');
108
+ });
109
+
110
+ test('instance headers ride along with requests', async function ()
111
+ {
112
+ const tmpInstance = { settings: serverSettings(), headers: { 'x-service-trust': 'instance-header' }, cookies: [] };
113
+ await readAnimals(buildDAL(tmpInstance));
114
+ Expect(_LastRequest.Headers['x-service-trust']).to.equal('instance-header');
115
+ });
116
+
117
+ test('without a bound instance, static settings supply the URL and requests are anonymous', async function ()
118
+ {
119
+ const tmpOutcome = await readAnimals(buildDAL(null, serverSettings()));
120
+ Expect(_LastRequest.Cookie).to.equal('');
121
+ Expect(Array.isArray(tmpOutcome.Records)).to.equal(true);
122
+ });
123
+ });
124
+
125
+ suite('MeadowEndpoints provider request timeout', function ()
126
+ {
127
+ suiteSetup(async function () { await startStubAPI(); });
128
+ suiteTeardown(function () { if (_Server) { _Server.close(); } });
129
+
130
+ test('an explicit request timeout is always set (Node 20+ globalAgent ~5s default workaround)', function (fDone)
131
+ {
132
+ // Intercept the socket-level options by reading from a slow-but-fine
133
+ // stub: the request must carry a timeout >= the configured value, so
134
+ // the platform default never applies.
135
+ const libHTTP = require('http');
136
+ const tmpOriginalRequest = libHTTP.request;
137
+ let tmpCapturedOptions = null;
138
+ libHTTP.request = function (pOptions, fResponseHandler)
139
+ {
140
+ tmpCapturedOptions = pOptions;
141
+ return tmpOriginalRequest.call(libHTTP, pOptions, fResponseHandler);
142
+ };
143
+ const tmpDAL = buildDAL(null, serverSettings());
144
+ readAnimals(tmpDAL).then((pOutcome) =>
145
+ {
146
+ libHTTP.request = tmpOriginalRequest;
147
+ Expect(tmpCapturedOptions).to.be.an('object');
148
+ Expect(tmpCapturedOptions.timeout).to.equal(60000, 'default 60s');
149
+ fDone();
150
+ }).catch((pError) => { libHTTP.request = tmpOriginalRequest; fDone(pError); });
151
+ });
152
+
153
+ test('the connection settings RequestTimeout overrides the default', function (fDone)
154
+ {
155
+ const libHTTP = require('http');
156
+ const tmpOriginalRequest = libHTTP.request;
157
+ let tmpCapturedOptions = null;
158
+ libHTTP.request = function (pOptions, fResponseHandler)
159
+ {
160
+ tmpCapturedOptions = pOptions;
161
+ return tmpOriginalRequest.call(libHTTP, pOptions, fResponseHandler);
162
+ };
163
+ const tmpSettings = Object.assign(serverSettings(), { RequestTimeout: 120000 });
164
+ const tmpDAL = buildDAL(null, tmpSettings);
165
+ readAnimals(tmpDAL).then(() =>
166
+ {
167
+ libHTTP.request = tmpOriginalRequest;
168
+ Expect(tmpCapturedOptions.timeout).to.equal(120000);
169
+ fDone();
170
+ }).catch((pError) => { libHTTP.request = tmpOriginalRequest; fDone(pError); });
171
+ });
172
+ });
173
+
174
+ suite('MeadowEndpoints provider additional query string', function ()
175
+ {
176
+ suiteSetup(async function () { await startStubAPI(); });
177
+ suiteTeardown(function () { if (_Server) { _Server.close(); } });
178
+
179
+ test('AdditionalQueryString is appended to read URLs (e.g. skipDecoration=true)', function (fDone)
180
+ {
181
+ const libHTTP = require('http');
182
+ const tmpOriginalRequest = libHTTP.request;
183
+ let tmpCapturedPath = null;
184
+ libHTTP.request = function (pOptions, fResponseHandler)
185
+ {
186
+ tmpCapturedPath = pOptions.path;
187
+ return tmpOriginalRequest.call(libHTTP, pOptions, fResponseHandler);
188
+ };
189
+ const tmpSettings = Object.assign(serverSettings(), { AdditionalQueryString: 'skipDecoration=true' });
190
+ const tmpDAL = buildDAL(null, tmpSettings);
191
+ readAnimals(tmpDAL).then(() =>
192
+ {
193
+ libHTTP.request = tmpOriginalRequest;
194
+ Expect(tmpCapturedPath).to.contain('?skipDecoration=true');
195
+ fDone();
196
+ }).catch((pError) => { libHTTP.request = tmpOriginalRequest; fDone(pError); });
197
+ });
198
+ });