gitoriaLog in with ident

components

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Main branchmain3bc905c5components #15 (mission 003) 2/2: docs (README Look, STATUS, LOG), reportmremain/plugins/data/server.hl

2.6 KB

  1. \* hl:data — NEED EVALUATION, the one implementation every realm edge uses.
  2. A component's need is a member whose initializer calls a provider class
  3. (SPEC.md §9.2); the graph publishes each as { key, provider, method, args,
  4. project }. Evaluating one is: resolve the arguments against the caller's
  5. context — a folded constant, a route group's member, or a `session`
  6. field — call the provider method, and take the projected field. hl:web did
  7. this per request and per push; hl:ipc does it per peer push. It lived in
  8. hl:web until the second edge existed (2026-09-01), which is when "shared"
  9. stopped being a word and became this plugin. *\
  10. \* Every need of one component, against the provider instances of the calling
  11. edge. One memo per evaluation: two needs fed by the same call cost ONE call. *\
  12. runNeeds(
  13. Hybrid needs \\ the graph's need list for the component
  14. &providers \\ class name → provider instance (the edge module's)
  15. &params \\ route groups; {} for a peer that matched no route
  16. &sdata \\ the session bag; {} for a peer with no session
  17. ) {
  18. let out = {}
  19. let memo = {}
  20. for (need of needs) {
  21. out[need.key] = runNeed(&need, &providers, &params, &sdata, &memo)
  22. }
  23. return out
  24. }
  25. \* One need: the value its MEMBER holds. `need.project` is the field taken off
  26. the returned hybrid ("" = the member IS the return value). A provider read
  27. answers for null arguments (the 074 contract), so an anonymous caller
  28. evaluates the same needs and simply sees nothing of anyone. *\
  29. runNeed(&need, &providers, &params, &sdata, &memo) {
  30. let provider = providers[need.provider]
  31. if (provider == null) {
  32. return null
  33. }
  34. let args = []
  35. for (a of need.args) {
  36. if (a.group != null) {
  37. args[] = params[a.group]
  38. } else if (a.session != null) {
  39. if (a.session.length == 0) {
  40. args[] = sdata
  41. } else {
  42. args[] = sdata[a.session]
  43. }
  44. } else {
  45. args[] = a.value
  46. }
  47. }
  48. let ck = need.provider + "." + need.method + "(" + JSON.stringify(args) + ")"
  49. // a call that ANSWERED null is simply not memoized — repeating it is correct
  50. let result = memo[ck]
  51. if (result == null) {
  52. result = callProvider(&provider, need.method, &args)
  53. memo[ck] = result
  54. }
  55. if (need.project.length == 0) {
  56. return result
  57. }
  58. if (result == null) {
  59. return null
  60. }
  61. return result[need.project]
  62. }
  63. // The provider call itself — the method name is DATA, so the call is computed.
  64. callProvider(&provider, method, &args) {
  65. if (args.length == 0) {
  66. return provider[method]()
  67. }
  68. if (args.length == 1) {
  69. return provider[method](args[0])
  70. }
  71. if (args.length == 2) {
  72. return provider[method](args[0], args[1])
  73. }
  74. return provider[method](args[0], args[1], args[2])
  75. }

Branches

Latest commits

  • 3bc905c5components #15 (mission 003) 2/2: docs (README Look, STATUS, LOG), reportmre
  • 5a98d77ecomponents #15 (mission 003) 1/2: black/white base look — greys for nuances, no WorldAPI fallbacks, no decorative frames; site + icon black/white; gate 230/0mre
  • 3f93d716components code order (mission 002) 4/4: docs, tests/letcount.py, tests/same-output*, reportmre
  • e747cfa0components code order (mission 002) 3/4: let only where reassigned (257 dropped, 0 never-reassigned left); gate 220/0, layouts gate 73/0, same outputmre
  • 172914a3components code order (mission 002) 2/4: lib/uploads.hl (demo upload storage), thin demo handlers, project.hl map; gate 220/0, same outputmre
  • d29f35b1components code order (mission 002) 1/4: styles.hl -> components/styles.hl; gate 220/0, same outputmre
  • 09945750components: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, http1 773de63e); gate 220/0mre
  • ede4d19acomponents: Hybriel master 190aa11d (fc838894 GC correctness, #126 closure scopes, #127); gate 220/0mre
  • 2bb9a935components: Hybriel master 8efba065 (re-vendor round 069: #126 memory, #48 lambda copy)mre
  • e4f01768antcolony#40: mission references point to the moved missionsmre
  • d32b44e2antcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
  • 0fb80b57components: Hybriel master ff51cf46 (re-vendor round)mre
  • 57408b6ecomponents#14: installable app (manifest, service worker, offline index), own iconmre
  • 317bd09fdeploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
  • becbd59bcomponents#13: modal dialog (<dialog> based, focus wrap, backdrop/Esc/x close with reason, scroll lock, footer buttons)mre
  • 367dd19adeploy.sh: never send .git or .gitignore to Byrodinmre
  • 4b4dabe5State of 2026-09-27, before the move to gitoriamre