talkdom 0.1.5 → 0.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.
package/README.md CHANGED
@@ -223,6 +223,39 @@ talkDOM.methods["show:"] = function (el, message) {
223
223
  };
224
224
  ```
225
225
 
226
+ ## Security
227
+
228
+ talkDOM does **not** sanitize HTML. Content from `get:apply:`, `post:apply:`, server triggers, and piped `apply:` is inserted via `innerHTML` / `insertAdjacentHTML` / `outerHTML` as-is. You are responsible for ensuring that server responses do not contain untrusted markup.
229
+
230
+ The `persist` attribute stores receiver content in `localStorage` in plain text. Do not use it for sensitive data.
231
+
232
+ CSRF tokens are read from `<meta name="csrf-token">` and sent automatically on non-GET requests. Make sure this tag is present if your server requires CSRF protection.
233
+
234
+ ## Browser compatibility
235
+
236
+ talkDOM works in all modern browsers. No polyfills needed.
237
+
238
+ | Browser | Minimum version |
239
+ |---------|-----------------|
240
+ | Chrome | 51+ |
241
+ | Firefox | 49+ |
242
+ | Safari | 10+ |
243
+ | Edge | 79+ (Chromium) |
244
+
245
+ IE is not supported.
246
+
247
+ ## Performance
248
+
249
+ Receiver lookups are cached and invalidated automatically via `MutationObserver`. Repeated dispatches to the same receiver name within a stable DOM hit the cache.
250
+
251
+ Polling is capped at 64 concurrent pollers by default (configurable via `talkDOM.maxPollers`). Pollers clean up automatically when their element is removed from the DOM. Method lookups are cached at poll setup time.
252
+
253
+ The CSRF meta tag element is cached after the first lookup and only re-queried if removed from the DOM.
254
+
255
+ Whitespace regex patterns are precompiled and shared across the library. Internal helpers like `receiverName` and `resolveTarget` avoid unnecessary allocations.
256
+
257
+ For most pages, talkDOM adds negligible overhead. On pages with thousands of receivers, keep in mind that `querySelectorAll` runs once per unique receiver name per DOM mutation cycle.
258
+
226
259
  ## License
227
260
 
228
261
  MIT. See [LICENSE](LICENSE).
@@ -1 +1 @@
1
- !function(){function e(e){for(var t=e.trim(),r=t.split(/\s+/),n=r[0],o=t.substring(n.length).trim(),i=r.slice(1),c=[],u=[],s=[],a=0;a<i.length;a++){var l=i[a];l.endsWith(":")?(c.length>0&&s.length>0?(u.push(s.join(" ")),s=[]):c.length>0&&u.push(""),c.push(l)):s.push(l)}return c.length>0&&u.push(s.join(" ")),{receiver:n,selector:c.join(""),keywords:c,args:u,body:o}}function t(e){return e.getAttribute("receiver").trim().split(/\s+/)[0]}var r={},n=!1;function o(e){if(n||(r={},n=!0),r[e])return r[e];var t=document.querySelectorAll('[receiver~="'+e+'"]');return r[e]=t,t}function i(e,r,n){if(function(e,t){var r=e.getAttribute("accepts");return!r||-1!==r.split(/\s+/).indexOf(t)}(e,r)){switch(r){case"inner":e.innerHTML=n;break;case"text":e.textContent=n;break;case"append":e.insertAdjacentHTML("beforeend",n);break;case"outer":e.outerHTML=n}return function(e,r){if(e.hasAttribute("receiver")&&e.hasAttribute("persist")){var n="talkDOM:"+t(e);"outer"===r?localStorage.setItem(n,JSON.stringify({op:r,content:e.outerHTML})):localStorage.setItem(n,JSON.stringify({op:r,content:e.innerHTML}))}}(e,r),n}console.error(t(e)+" does not accept "+r)}function c(e,t,r){var n,o={"X-TalkDOM-Request":"true","X-TalkDOM-Current-URL":location.href};if(r&&(o["X-TalkDOM-Receiver"]=r),"GET"!==e){var i=(n=document.querySelector('meta[name="csrf-token"]'))?n.getAttribute("content"):"";i?o["X-CSRF-Token"]=i:console.warn("talkDOM: no CSRF token found for "+e+" "+t)}return fetch(t,{method:e,headers:o}).then(function(r){if(!r.ok)return console.error("talkDOM: "+e+" "+t+" "+r.status),Promise.reject(r.status);var n=r.headers.get("X-TalkDOM-Trigger");return r.text().then(function(e){return n&&d(n),e})},function(r){return console.error("talkDOM: "+e+" "+t+" failed",r),Promise.reject(r)})}function u(e){return e.hasAttribute("receiver")?t(e):""}new MutationObserver(function(){n=!1}).observe(document,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["receiver"]});const s={"get:":function(e,t){return c("GET",t,u(e))},"post:":function(e,t){return c("POST",t,u(e))},"put:":function(e,t){return c("PUT",t,u(e))},"delete:":function(e,t){return c("DELETE",t,u(e))},"confirm:":function(e,t){if(!confirm(t))return Promise.reject("cancelled")},"apply:":function(e,t,r){return i(e,r,t)},"get:apply:":function(e,t,r){return c("GET",t,u(e)).then(function(t){return i(e,r,t)})},"post:apply:":function(e,t,r){return c("POST",t,u(e)).then(function(t){return i(e,r,t)})},"put:apply:":function(e,t,r){return c("PUT",t,u(e)).then(function(t){return i(e,r,t)})},"delete:apply:":function(e,t,r){return c("DELETE",t,u(e)).then(function(t){return i(e,r,t)})}};var a=!1;function l(e){e&&e.sender&&(a=!0,d(e.sender),a=!1)}function f(e,t){var r=o(e.receiver);if(0!==r.length){var n=s[e.selector];if(n){var i,c=void 0!==t?[t].concat(e.args):e.args;return r.forEach(function(t){var r={receiver:e.receiver,selector:e.selector,args:e.args},u=t.parentNode,s=t.nextElementSibling;function a(){return t.isConnected?t:(s&&s.isConnected?s.previousElementSibling:u&&u.isConnected?u.lastElementChild:null)||o(e.receiver)[0]}if((i=n(t,...c))&&"function"==typeof i.then)i.then(function(){var e=a();e&&e.dispatchEvent(new CustomEvent("talkdom:done",{bubbles:!0,detail:r}))},function(e){r.error=e;var t=a();t&&t.dispatchEvent(new CustomEvent("talkdom:error",{bubbles:!0,detail:r}))});else{var l=a();l&&l.dispatchEvent(new CustomEvent("talkdom:done",{bubbles:!0,detail:r}))}}),i}console.error(e.receiver+" does not understand "+e.selector)}else console.error(e.receiver+" not found")}function v(t){var r=t.split(";").map(function(t){var r=t.trim();if(!r)return Promise.resolve();var n=r.split("|").map(function(e){return e.trim()}).filter(Boolean);return 1===n.length?Promise.resolve(f(e(n[0]))):n.reduce(function(t,r){var n=e(r);return Promise.resolve(t).then(function(e){return f(n,e)})},void 0)});return Promise.all(r)}function d(e){v(e).catch(function(e){console.warn("talkDOM:",e)})}function h(t){var r=t.getAttribute("sender");d(r),a||function(t,r){if(t.hasAttribute("push-url")){var n=t.getAttribute("push-url");n||(n=e(r.split(";")[0].split("|")[0].trim()).args[0]||""),n&&location.pathname+location.search!==n&&history.pushState({sender:r},"",n)}}(t,r)}window.addEventListener("popstate",function(e){l(e.state)});var p=0,m=64;document.addEventListener("click",function(e){const t=e.target.closest("[sender]");t&&(e.preventDefault(),h(t))}),document.querySelectorAll("[persist]").forEach(function(e){if(e.hasAttribute("receiver")){var r=t(e),n=localStorage.getItem("talkDOM:"+r);if(n){var o;try{o=JSON.parse(n)}catch(e){return void localStorage.removeItem("talkDOM:"+r)}"outer"===o.op?e.outerHTML=o.content:e.innerHTML=o.content}}}),l(history.state),document.querySelectorAll("[receiver]").forEach(function(t){var r=e(t.getAttribute("receiver"));if("poll:"===r.keywords[r.keywords.length-1])if(p>=m)console.warn("talkDOM: max pollers ("+m+") reached, ignoring "+r.receiver);else{var n=function(e){var t=e.match(/^(\d+)(s|ms)$/);if(!t)return null;var r=parseInt(t[1],10);return"s"===t[2]?1e3*r:r}(r.args[r.args.length-1]);if(n){var i=r.keywords.slice(0,-1).join(""),c=r.args.slice(0,-1),u=r.receiver,a=o(u);p++;var l=setInterval(function(){if(!t.isConnected)return clearInterval(l),void p--;if(0!==a.length&&a[0].isConnected||(a=o(u)),0!==a.length){var e=s[i];e?a.forEach(function(t){e(t,...c)}):console.error(u+" does not understand "+i)}},n)}else console.error("poll: invalid interval for "+r.receiver)}}),window.talkDOM={methods:s,send:v,get maxPollers(){return m},set maxPollers(e){m=e}}}();
1
+ !function(){var e=/\s+/;function t(t){for(var r=t.trim(),n=r.split(e),o=n[0],i=r.substring(o.length).trim(),c=n.slice(1),u=[],s=[],a=[],l=0;l<c.length;l++){var f=c[l];f.endsWith(":")?(u.length>0&&a.length>0?(s.push(a.join(" ")),a=[]):u.length>0&&s.push(""),u.push(f)):a.push(f)}return u.length>0&&s.push(a.join(" ")),{receiver:o,selector:u.join(""),keywords:u,args:s,body:i}}function r(e){var t=e.getAttribute("receiver").trim(),r=t.indexOf(" ");return-1===r?t:t.substring(0,r)}var n={},o=!1;function i(e){if(o||(n={},o=!0),n[e])return n[e];var t=document.querySelectorAll('[receiver~="'+e+'"]');return n[e]=t,t}function c(t,n,o){if(function(t,r){var n=t.getAttribute("accepts");return!n||-1!==n.split(e).indexOf(r)}(t,n)){switch(n){case"inner":t.innerHTML=o;break;case"text":t.textContent=o;break;case"append":t.insertAdjacentHTML("beforeend",o);break;case"outer":t.outerHTML=o}return function(e,t){if(e.hasAttribute("receiver")&&e.hasAttribute("persist")){var n="talkDOM:"+r(e);"outer"===t?localStorage.setItem(n,JSON.stringify({op:t,content:e.outerHTML})):localStorage.setItem(n,JSON.stringify({op:t,content:e.innerHTML}))}}(t,n),o}console.error(r(t)+" does not accept "+n)}new MutationObserver(function(){o=!1}).observe(document,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["receiver"]});var u=null;function s(e,t,r){var n={"X-TalkDOM-Request":"true","X-TalkDOM-Current-URL":location.href};if(r&&(n["X-TalkDOM-Receiver"]=r),"GET"!==e){var o=(u&&u.isConnected||(u=document.querySelector('meta[name="csrf-token"]')),u?u.getAttribute("content"):"");o?n["X-CSRF-Token"]=o:console.warn("talkDOM: no CSRF token found for "+e+" "+t)}return fetch(t,{method:e,headers:n}).then(function(r){if(!r.ok)return console.error("talkDOM: "+e+" "+t+" "+r.status),Promise.reject(r.status);var n=r.headers.get("X-TalkDOM-Trigger");return r.text().then(function(e){return n&&m(n),e})},function(r){return console.error("talkDOM: "+e+" "+t+" failed",r),Promise.reject(r)})}function a(e){return e.hasAttribute("receiver")?r(e):""}const l={"get:":function(e,t){return s("GET",t,a(e))},"post:":function(e,t){return s("POST",t,a(e))},"put:":function(e,t){return s("PUT",t,a(e))},"delete:":function(e,t){return s("DELETE",t,a(e))},"confirm:":function(e,t){if(!confirm(t))return Promise.reject("cancelled")},"apply:":function(e,t,r){return c(e,r,t)},"get:apply:":function(e,t,r){return s("GET",t,a(e)).then(function(t){return c(e,r,t)})},"post:apply:":function(e,t,r){return s("POST",t,a(e)).then(function(t){return c(e,r,t)})},"put:apply:":function(e,t,r){return s("PUT",t,a(e)).then(function(t){return c(e,r,t)})},"delete:apply:":function(e,t,r){return s("DELETE",t,a(e)).then(function(t){return c(e,r,t)})}};var f=!1;function v(e){e&&e.sender&&(f=!0,m(e.sender),f=!1)}function d(e,t,r,n){return e.isConnected?e:(t&&t.isConnected?t.previousElementSibling:r&&r.isConnected?r.lastElementChild:null)||i(n)[0]}function h(e,t){var r=i(e.receiver);if(0!==r.length){var n=l[e.selector];if(n){var o,c=void 0!==t?[t].concat(e.args):e.args;return r.forEach(function(t){var r={receiver:e.receiver,selector:e.selector,args:e.args},i=t.parentNode,u=t.nextElementSibling;if((o=n(t,...c))&&"function"==typeof o.then)o.then(function(){var n=d(t,u,i,e.receiver);n&&n.dispatchEvent(new CustomEvent("talkdom:done",{bubbles:!0,detail:r}))},function(n){r.error=n;var o=d(t,u,i,e.receiver);o&&o.dispatchEvent(new CustomEvent("talkdom:error",{bubbles:!0,detail:r}))});else{var s=d(t,u,i,e.receiver);s&&s.dispatchEvent(new CustomEvent("talkdom:done",{bubbles:!0,detail:r}))}}),o}console.error(e.receiver+" does not understand "+e.selector)}else console.error(e.receiver+" not found")}function p(e){var r=e.split(";").map(function(e){var r=e.trim();if(!r)return Promise.resolve();var n=r.split("|").map(function(e){return e.trim()}).filter(Boolean);return 1===n.length?Promise.resolve(h(t(n[0]))):n.reduce(function(e,r){var n=t(r);return Promise.resolve(e).then(function(e){return h(n,e)})},void 0)});return Promise.all(r)}function m(e){p(e).catch(function(e){console.warn("talkDOM:",e)})}function g(e){var t=e.getAttribute("sender");m(t),f||function(e,t){if(e.hasAttribute("push-url")){var r=e.getAttribute("push-url");if(!r){var n=t.split(";")[0].split("|")[0].trim(),o=n.indexOf(":");-1!==o&&(r=n.substring(o+1).trim().split(/\s/)[0]||"")}r&&location.pathname+location.search!==r&&history.pushState({sender:t},"",r)}}(e,t)}window.addEventListener("popstate",function(e){v(e.state)});var b=0,k=64;document.addEventListener("click",function(e){const t=e.target.closest("[sender]");t&&(e.preventDefault(),g(t))}),document.querySelectorAll("[persist]").forEach(function(e){if(e.hasAttribute("receiver")){var t=r(e),n=localStorage.getItem("talkDOM:"+t);if(n){var o;try{o=JSON.parse(n)}catch(e){return void localStorage.removeItem("talkDOM:"+t)}"outer"===o.op?e.outerHTML=o.content:e.innerHTML=o.content}}}),v(history.state),document.querySelectorAll("[receiver]").forEach(function(e){var r=t(e.getAttribute("receiver"));if("poll:"===r.keywords[r.keywords.length-1])if(b>=k)console.warn("talkDOM: max pollers ("+k+") reached, ignoring "+r.receiver);else{var n=function(e){var t=e.match(/^(\d+)(s|ms)$/);if(!t)return null;var r=parseInt(t[1],10);return"s"===t[2]?1e3*r:r}(r.args[r.args.length-1]);if(n){var o=r.keywords.slice(0,-1).join(""),c=r.args.slice(0,-1),u=r.receiver,s=i(u),a=l[o];b++;var f=setInterval(function(){if(!e.isConnected)return clearInterval(f),void b--;0!==s.length&&s[0].isConnected||(s=i(u)),0!==s.length&&(a||(a=l[o]),a?s.forEach(function(e){a(e,...c)}):console.error(u+" does not understand "+o))},n)}else console.error("poll: invalid interval for "+r.receiver)}}),window.talkDOM={methods:l,send:p,get maxPollers(){return k},set maxPollers(e){k=e}}}();
@@ -1 +1 @@
1
- {"version":3,"names":["parseMessage","str","trimmed","trim","tokens","split","receiver","body","substring","length","rest","slice","keywords","args","currentArg","i","token","endsWith","push","join","selector","receiverName","el","getAttribute","receiverCache","cacheValid","findReceivers","name","result","document","querySelectorAll","apply","op","content","attr","indexOf","accepts","innerHTML","textContent","insertAdjacentHTML","outerHTML","hasAttribute","key","localStorage","setItem","JSON","stringify","persist","console","error","request","method","url","meta","headers","location","href","querySelector","warn","fetch","then","r","ok","status","Promise","reject","trigger","get","text","dispatchRaw","err","recName","MutationObserver","observe","childList","subtree","attributes","attributeFilter","methods","message","confirm","t","pushing","replayState","state","sender","send","msg","piped","els","undefined","concat","forEach","detail","parent","parentNode","next","nextElementSibling","resolveTarget","isConnected","previousElementSibling","lastElementChild","target","dispatchEvent","CustomEvent","bubbles","run","raw","chains","map","chain","resolve","steps","s","filter","Boolean","reduce","prev","step","all","catch","dispatch","senderEl","pathname","search","history","pushState","pushUrl","window","addEventListener","e","activePollers","maxPollers","closest","preventDefault","getItem","parse","removeItem","interval","match","n","parseInt","parseInterval","cachedTargets","id","setInterval","clearInterval","talkDOM"],"sources":["index.js"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["WS","parseMessage","str","trimmed","trim","tokens","split","receiver","body","substring","length","rest","slice","keywords","args","currentArg","i","token","endsWith","push","join","selector","receiverName","el","attr","getAttribute","sp","indexOf","receiverCache","cacheValid","findReceivers","name","result","document","querySelectorAll","apply","op","content","accepts","innerHTML","textContent","insertAdjacentHTML","outerHTML","hasAttribute","key","localStorage","setItem","JSON","stringify","persist","console","error","MutationObserver","observe","childList","subtree","attributes","attributeFilter","csrfMeta","request","method","url","headers","location","href","isConnected","querySelector","warn","fetch","then","r","ok","status","Promise","reject","trigger","get","text","dispatchRaw","err","recName","methods","message","confirm","t","pushing","replayState","state","sender","resolveTarget","next","parent","previousElementSibling","lastElementChild","send","msg","piped","els","undefined","concat","forEach","detail","parentNode","nextElementSibling","target","dispatchEvent","CustomEvent","bubbles","run","raw","chains","map","chain","resolve","steps","s","filter","Boolean","reduce","prev","step","all","catch","dispatch","senderEl","first","colonIdx","pathname","search","history","pushState","pushUrl","window","addEventListener","e","activePollers","maxPollers","closest","preventDefault","getItem","parse","removeItem","interval","match","n","parseInt","parseInterval","cachedTargets","id","setInterval","clearInterval","talkDOM"],"sources":["index.js"],"mappings":"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","ignoreList":[]}
package/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  (function () {
2
2
 
3
+ var WS = /\s+/;
4
+
3
5
  // Parse "receiver keyword: arg keyword: arg" into structured message object.
4
6
  // Tokens ending with ":" are keywords, everything else fills args.
5
7
  function parseMessage(str) {
6
8
  var trimmed = str.trim();
7
- var tokens = trimmed.split(/\s+/);
9
+ var tokens = trimmed.split(WS);
8
10
  var receiver = tokens[0];
9
11
  var body = trimmed.substring(receiver.length).trim();
10
12
  var rest = tokens.slice(1);
@@ -35,7 +37,9 @@
35
37
 
36
38
  // Extract the first word from the receiver attribute (the name).
37
39
  function receiverName(el) {
38
- return el.getAttribute("receiver").trim().split(/\s+/)[0];
40
+ var attr = el.getAttribute("receiver").trim();
41
+ var sp = attr.indexOf(" ");
42
+ return sp === -1 ? attr : attr.substring(0, sp);
39
43
  }
40
44
 
41
45
  // Receiver cache: maps name -> NodeList, invalidated by DOM mutations.
@@ -59,7 +63,7 @@
59
63
  function accepts(el, op) {
60
64
  var attr = el.getAttribute("accepts");
61
65
  if (!attr) return true;
62
- return attr.split(/\s+/).indexOf(op) !== -1;
66
+ return attr.split(WS).indexOf(op) !== -1;
63
67
  }
64
68
 
65
69
  // Save receiver content to localStorage after apply, keyed by receiver name.
@@ -107,9 +111,14 @@
107
111
  return content;
108
112
  }
109
113
 
114
+ var csrfMeta = null;
115
+
110
116
  function csrfToken() {
111
- var meta = document.querySelector('meta[name="csrf-token"]');
112
- return meta ? meta.getAttribute("content") : "";
117
+ // Cache the element reference; re-query only if not found yet or removed.
118
+ if (!csrfMeta || !csrfMeta.isConnected) {
119
+ csrfMeta = document.querySelector('meta[name="csrf-token"]');
120
+ }
121
+ return csrfMeta ? csrfMeta.getAttribute("content") : "";
113
122
  }
114
123
 
115
124
  // Perform a fetch with talkDOM headers. Returns a promise resolving to response text.
@@ -169,8 +178,14 @@
169
178
  if (!senderEl.hasAttribute("push-url")) return;
170
179
  var url = senderEl.getAttribute("push-url");
171
180
  if (!url) {
172
- var firstMsg = parseMessage(raw.split(";")[0].split("|")[0].trim());
173
- url = firstMsg.args[0] || "";
181
+ // Extract the first arg from the first step without a full parseMessage call.
182
+ // Pattern: "receiver keyword: arg ..." -- grab the token after the first ":"
183
+ var first = raw.split(";")[0].split("|")[0].trim();
184
+ var colonIdx = first.indexOf(":");
185
+ if (colonIdx !== -1) {
186
+ var afterColon = first.substring(colonIdx + 1).trim();
187
+ url = afterColon.split(/\s/)[0] || "";
188
+ }
174
189
  }
175
190
  if (url && (location.pathname + location.search) !== url) {
176
191
  history.pushState({ sender: raw }, "", url);
@@ -189,6 +204,16 @@
189
204
  replayState(e.state);
190
205
  });
191
206
 
207
+ // After an outer swap `el` is gone. Walk from the snapshotted sibling or
208
+ // parent to find the element that took its place; fall back to a fresh
209
+ // receiver query if the DOM was restructured.
210
+ function resolveTarget(el, next, parent, name) {
211
+ if (el.isConnected) return el;
212
+ var candidate = next && next.isConnected ? next.previousElementSibling
213
+ : parent && parent.isConnected ? parent.lastElementChild : null;
214
+ return candidate || findReceivers(name)[0];
215
+ }
216
+
192
217
  // Deliver a parsed message to all matching receivers. Fires talkdom:done or talkdom:error
193
218
  // lifecycle events on the receiver element (or its replacement if outer-swapped).
194
219
  function send(msg, piped) {
@@ -206,26 +231,23 @@
206
231
  var result;
207
232
  els.forEach(function (el) {
208
233
  var detail = { receiver: msg.receiver, selector: msg.selector, args: msg.args };
234
+ // Snapshot DOM neighbors before the method runs. If the method does an
235
+ // outer swap, `el` is replaced and disconnected, so we need these anchors
236
+ // to locate the replacement element for dispatching lifecycle events.
209
237
  var parent = el.parentNode;
210
238
  var next = el.nextElementSibling;
211
239
  result = method(el, ...args);
212
- function resolveTarget() {
213
- if (el.isConnected) return el;
214
- var candidate = next && next.isConnected ? next.previousElementSibling
215
- : parent && parent.isConnected ? parent.lastElementChild : null;
216
- return candidate || findReceivers(msg.receiver)[0];
217
- }
218
240
  if (result && typeof result.then === "function") {
219
241
  result.then(function () {
220
- var target = resolveTarget();
242
+ var target = resolveTarget(el, next, parent, msg.receiver);
221
243
  if (target) target.dispatchEvent(new CustomEvent("talkdom:done", { bubbles: true, detail: detail }));
222
244
  }, function (err) {
223
245
  detail.error = err;
224
- var target = resolveTarget();
246
+ var target = resolveTarget(el, next, parent, msg.receiver);
225
247
  if (target) target.dispatchEvent(new CustomEvent("talkdom:error", { bubbles: true, detail: detail }));
226
248
  });
227
249
  } else {
228
- var target = resolveTarget();
250
+ var target = resolveTarget(el, next, parent, msg.receiver);
229
251
  if (target) target.dispatchEvent(new CustomEvent("talkdom:done", { bubbles: true, detail: detail }));
230
252
  }
231
253
  });
@@ -235,13 +257,18 @@
235
257
  // Programmatic API: parse and execute a raw message string (supports pipes and semicolons).
236
258
  // Returns a promise that resolves when all chains complete.
237
259
  function run(raw) {
260
+ // Semicolons split into independent chains that run in parallel.
238
261
  var chains = raw.split(";").map(function (chain) {
239
262
  var trimmed = chain.trim();
240
263
  if (!trimmed) return Promise.resolve();
264
+ // Pipes split a chain into sequential steps where each step's return
265
+ // value is fed as the first argument to the next step.
241
266
  var steps = trimmed.split("|").map(function (s) { return s.trim(); }).filter(Boolean);
242
267
  if (steps.length === 1) {
243
268
  return Promise.resolve(send(parseMessage(steps[0])));
244
269
  }
270
+ // Reduce builds a promise chain: each step waits for the previous one,
271
+ // then passes its resolved value (piped) into send().
245
272
  return steps.reduce(function (prev, step) {
246
273
  var msg = parseMessage(step);
247
274
  return Promise.resolve(prev).then(function (piped) {
@@ -249,6 +276,7 @@
249
276
  });
250
277
  }, undefined);
251
278
  });
279
+ // All independent chains resolve together.
252
280
  return Promise.all(chains);
253
281
  }
254
282
 
@@ -293,6 +321,7 @@
293
321
  var args = msg.args.slice(0, -1);
294
322
  var name = msg.receiver;
295
323
  var cachedTargets = findReceivers(name);
324
+ var method = methods[selector];
296
325
  activePollers++;
297
326
  var id = setInterval(function () {
298
327
  if (!el.isConnected) { clearInterval(id); activePollers--; return; }
@@ -300,7 +329,7 @@
300
329
  cachedTargets = findReceivers(name);
301
330
  }
302
331
  if (cachedTargets.length === 0) return;
303
- var method = methods[selector];
332
+ if (!method) method = methods[selector];
304
333
  if (!method) {
305
334
  console.error(name + " does not understand " + selector);
306
335
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "talkdom",
3
- "version": "0.1.5",
3
+ "version": "0.3.0",
4
4
  "description": "Smalltalk-inspired message passing for the DOM",
5
5
  "main": "index.js",
6
6
  "jsdelivr": "dist/talkdom.min.js",